From 037fe7d9bba80e31b9dacb9e26472f7f0890ddb0 Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 16 Apr 2024 10:51:16 +0000 Subject: [PATCH] [FEAT MERGE] Co-authored-by: cqliang1995 Co-authored-by: qingsuijiu <642782632@qq.com> Co-authored-by: yaojing624 --- deps/oblib/src/lib/ob_define.h | 4 + deps/oblib/src/lib/utility/ob_tracepoint.cpp | 6 + deps/oblib/src/lib/utility/ob_tracepoint.h | 698 +++--------------- .../oblib/src/lib/utility/ob_tracepoint_def.h | 539 ++++++++++++++ src/observer/CMakeLists.txt | 1 + src/observer/mysql/obmp_base.cpp | 7 +- src/observer/mysql/obmp_stmt_execute.cpp | 1 + src/observer/mysql/obmp_stmt_fetch.cpp | 1 + src/observer/ob_service.cpp | 13 +- .../ob_all_virtual_archive_dest_status.cpp | 4 +- .../ob_all_virtual_archive_dest_status.h | 2 +- .../ob_all_virtual_session_info.cpp | 49 +- .../ob_all_virtual_session_info.h | 8 +- .../ob_all_virtual_tracepoint_info.cpp | 152 ++++ .../ob_all_virtual_tracepoint_info.h | 56 ++ .../virtual_table/ob_show_processlist.cpp | 70 +- .../virtual_table/ob_show_processlist.h | 7 +- .../ob_virtual_table_iterator_factory.cpp | 11 + .../ob_inner_table_schema.10001_10050.cpp | 24 +- .../ob_inner_table_schema.11101_11150.cpp | 12 +- .../ob_inner_table_schema.12451_12500.cpp | 189 +++++ .../ob_inner_table_schema.15401_15450.cpp | 633 ++++++++++++++++ .../ob_inner_table_schema.20001_20050.cpp | 2 +- .../ob_inner_table_schema.21201_21250.cpp | 4 +- .../ob_inner_table_schema.21451_21500.cpp | 100 +++ .../ob_inner_table_schema.21501_21550.cpp | 100 +++ .../ob_inner_table_schema.28151_28200.cpp | 100 +++ .../ob_inner_table_schema.28201_28250.cpp | 100 +++ src/share/inner_table/ob_inner_table_schema.h | 65 +- .../ob_inner_table_schema_constants.h | 22 + .../inner_table/ob_inner_table_schema_def.py | 303 +++++++- src/share/inner_table/table_id_to_name | 13 + src/share/parameter/ob_parameter_seed.ipp | 3 + src/share/vector/ob_continuous_base.h | 8 +- src/share/vector/ob_fixed_length_base.h | 8 +- .../code_generator/ob_static_engine_cg.cpp | 88 ++- src/sql/code_generator/ob_static_engine_cg.h | 2 +- src/sql/code_generator/ob_tsc_cg_service.cpp | 21 +- src/sql/das/ob_das_task.cpp | 10 + src/sql/dtl/ob_dtl_channel_loop.cpp | 13 +- .../aggregate/ob_adaptive_bypass_ctrl.cpp | 26 +- .../aggregate/ob_adaptive_bypass_ctrl.h | 21 +- .../aggregate/ob_aggregate_processor.cpp | 14 + .../engine/aggregate/ob_aggregate_processor.h | 1 + .../aggregate/ob_exec_hash_struct_vec.cpp | 675 ++++++----------- .../aggregate/ob_exec_hash_struct_vec.h | 138 ++-- src/sql/engine/aggregate/ob_groupby_op.cpp | 3 +- src/sql/engine/aggregate/ob_groupby_op.h | 4 +- .../engine/aggregate/ob_hash_agg_variant.h | 54 -- .../engine/aggregate/ob_hash_groupby_op.cpp | 184 ++++- src/sql/engine/aggregate/ob_hash_groupby_op.h | 17 +- .../aggregate/ob_hash_groupby_vec_op.cpp | 160 +++- .../engine/aggregate/ob_hash_groupby_vec_op.h | 47 +- src/sql/engine/basic/ob_chunk_datum_store.cpp | 2 + src/sql/engine/basic/ob_chunk_datum_store.h | 62 +- src/sql/engine/basic/ob_compact_row.h | 1 - src/sql/engine/px/ob_px_row_store.cpp | 2 +- .../recursive_cte/ob_fake_cte_table_op.cpp | 277 ++++++- .../recursive_cte/ob_fake_cte_table_op.h | 55 +- .../ob_recursive_inner_data_op.cpp | 224 +++++- .../ob_recursive_inner_data_op.h | 38 +- .../ob_recursive_union_all_op.cpp | 14 +- .../recursive_cte/ob_recursive_union_all_op.h | 5 +- .../recursive_cte/ob_search_method_op.cpp | 412 ++++++++++- .../recursive_cte/ob_search_method_op.h | 80 +- src/sql/engine/table/ob_table_scan_op.cpp | 3 + .../executor/ob_remote_executor_processor.cpp | 3 +- src/sql/executor/ob_task.cpp | 9 + src/sql/ob_sql_utils.cpp | 3 + src/sql/optimizer/ob_log_set.cpp | 15 +- src/sql/optimizer/ob_log_set.h | 7 +- src/sql/optimizer/ob_log_table_scan.cpp | 49 +- src/sql/optimizer/ob_log_table_scan.h | 11 + src/sql/optimizer/ob_logical_operator.cpp | 18 + src/sql/optimizer/ob_optimizer_util.cpp | 31 + src/sql/optimizer/ob_optimizer_util.h | 2 + .../resolver/cmd/ob_alter_system_resolver.cpp | 24 +- src/sql/resolver/cmd/ob_show_resolver.cpp | 16 +- src/sql/resolver/expr/ob_raw_expr.cpp | 1 + src/sql/session/ob_basic_session_info.cpp | 12 +- src/sql/session/ob_basic_session_info.h | 33 +- .../r/mysql/information_schema.result | 12 + .../r/mysql/information_schema_desc.result | 4 +- .../all_virtual_sys_parameter_stat.result | 1 + .../r/mysql/desc_sys_views_in_mysql.result | 98 ++- .../r/mysql/desc_sys_views_in_sys.result | 98 ++- .../mysql/desc_virtual_table_in_mysql.result | 55 +- .../r/mysql/desc_virtual_table_in_sys.result | 23 +- .../r/mysql/inner_table_overall.result | 5 + 89 files changed, 4987 insertions(+), 1511 deletions(-) create mode 100644 deps/oblib/src/lib/utility/ob_tracepoint_def.h create mode 100644 src/observer/virtual_table/ob_all_virtual_tracepoint_info.cpp create mode 100644 src/observer/virtual_table/ob_all_virtual_tracepoint_info.h diff --git a/deps/oblib/src/lib/ob_define.h b/deps/oblib/src/lib/ob_define.h index bdc9c12e4a..c419f29d52 100644 --- a/deps/oblib/src/lib/ob_define.h +++ b/deps/oblib/src/lib/ob_define.h @@ -2083,6 +2083,10 @@ const int64_t ASYNC_CLOG = 1 << CLOG_BITS_SHIFT; const int64_t WITHOUT_ENCRYPTION = 0 << ENCRYPTION_BITS_SHIFT; const int64_t WITH_ENCRYPTION = 1 << ENCRYPTION_BITS_SHIFT; +// tracepoint, refer to OB_MAX_CONFIG_xxx +const int64_t OB_MAX_TRACEPOINT_NAME_LEN = 128; +const int64_t OB_MAX_TRACEPOINT_DESCRIBE_LEN = 4096; + // Need to manually maintain the replica_type_to_str function in utility.cpp, // Currently there are only three types: REPLICA_TYPE_FULL, REPLICA_TYPE_READONLY, and REPLICA_TYPE_LOGONLY enum ObReplicaType diff --git a/deps/oblib/src/lib/utility/ob_tracepoint.cpp b/deps/oblib/src/lib/utility/ob_tracepoint.cpp index 5cd0356b2e..b70e4d1690 100644 --- a/deps/oblib/src/lib/utility/ob_tracepoint.cpp +++ b/deps/oblib/src/lib/utility/ob_tracepoint.cpp @@ -12,6 +12,12 @@ #include "lib/utility/ob_tracepoint.h" +#define GLOBAL_ERRSIM_POINT_DEF(no, name, describe) \ +oceanbase::common::NamedEventItem oceanbase::common::EventTable::name( \ + no, #name, describe, oceanbase::common::EventTable::global_item_list()); +#include "lib/utility/ob_tracepoint_def.h" +#undef GLOBAL_ERRSIM_POINT_DEF + bool &get_tp_switch() { RLOCAL(bool, turn_off); diff --git a/deps/oblib/src/lib/utility/ob_tracepoint.h b/deps/oblib/src/lib/utility/ob_tracepoint.h index c02c42b2da..e1170ed107 100644 --- a/deps/oblib/src/lib/utility/ob_tracepoint.h +++ b/deps/oblib/src/lib/utility/ob_tracepoint.h @@ -101,17 +101,16 @@ private: } -#define EVENT_CALL(event_no, ...) ({ \ - EventItem &item = ::oceanbase::common::EventTable::instance().get_event(event_no); \ - item.call(SELECT(1, ##__VA_ARGS__)); }) +#define EVENT_CALL(name_event, ...) ({ name_event.item_.call(SELECT(1, ##__VA_ARGS__)); }) -#define EVENT_CODE(event_no, ...) ({ \ - EventItem &item = ::oceanbase::common::EventTable::instance().get_event(event_no); \ - item.get_event_code(); }) +#define EVENT_CODE(name_event, ...) ({ name_event.item_.get_event_code(); }) -#define ERRSIM_POINT_DEF(name) void name##name(){}; static oceanbase::common::NamedEventItem name( \ - #name, oceanbase::common::EventTable::global_item_list()); -#define ERRSIM_POINT_CALL(name) name?: +#define ERRSIM_POINT_DEF(name, ...) \ + static oceanbase::common::NamedEventItem name( \ + #name, SELECT(1, ##__VA_ARGS__, ""), \ + oceanbase::common::EventTable::global_item_list()); + +// latest doc: // doc: @@ -121,22 +120,22 @@ private: // if (E(50, session_id) OB_SUCCESS) { ... } // which means: // check whether event 50 of session_id was raised -#define OB_E(event_no, ...) \ - EVENT_CALL(event_no, ##__VA_ARGS__)?: +#define OB_E(name_event, ...) \ + EVENT_CALL(name_event, ##__VA_ARGS__)?: // to set a particular tracepoint -// example: TP_SET_EVENT(50, 4016, 1, 1) -// specify condition: TP_SET_EVENT(50, 4016, 1, 1, 3302201) +// example: TP_SET_EVENT(EventTable::EN_IO_GETEVENTS, 4016, 1, 1) +// specify condition: TP_SET_EVENT(EventTable::EN_IO_GETEVENTS, 4016, 1, 1, 3302201) // which means: // when session id is 3302201, trigger event 50 with error -4016 -#define TP_SET_EVENT(id, error_in, occur, trigger_freq, ...) \ - { \ - EventItem item; \ - item.error_code_ = error_in; \ - item.occur_ = occur; \ - item.trigger_freq_ = trigger_freq; \ - item.cond_ = SELECT(1, ##__VA_ARGS__, 0); \ - ::oceanbase::common::EventTable::instance().set_event(id, item); \ +#define TP_SET_EVENT(name, error_in, occur, trigger_freq, ...) \ + { \ + EventItem item; \ + item.error_code_ = error_in; \ + item.occur_ = occur; \ + item.trigger_freq_ = trigger_freq; \ + item.cond_ = SELECT(1, ##__VA_ARGS__, 0); \ + name.item_.set_event(item); \ } #define TP_SET(file_name, func_name, key, trace_func) \ @@ -219,17 +218,40 @@ inline void** tracepoint_get(const char* name) struct EventItem { + int64_t no_; + const char *name_; + const char *describe_; int64_t occur_; // number of occurrences int64_t trigger_freq_; // trigger frequency int64_t error_code_; // error code to return int64_t cond_; EventItem() - : occur_(0), + : no_(-1), + name_(nullptr), + describe_(nullptr), + occur_(0), trigger_freq_(0), error_code_(0), cond_(0) {} + EventItem(int64_t no, const char *name, const char *describe) + : no_(no), + name_(name), + describe_(describe), + occur_(0), + trigger_freq_(0), + error_code_(0), + cond_(0) {} + + void set_event(const EventItem& other) + { + occur_ = other.occur_; + trigger_freq_ = other.trigger_freq_; + error_code_ = other.error_code_; + cond_ = other.cond_; + } + int call(const int64_t v) { return cond_ == v ? call() : 0; } int call() { return static_cast(get_event_code()); } int64_t get_event_code() @@ -278,577 +300,81 @@ struct EventItem struct NamedEventItem : public ObDLinkBase { - NamedEventItem(const char *name, ObDList &l) : name_(name) + template + NamedEventItem(const char (&tp_name)[TP_NAME_LEN], + const char (&tp_describe)[TP_DESCRIBE_LEN], + ObDList &l): item_(-1, tp_name, tp_describe) { + STATIC_ASSERT(TP_NAME_LEN - 1 <= OB_MAX_TRACEPOINT_NAME_LEN, + "tp_name length longer than OB_MAX_TRACEPOINT_NAME_LEN(128) is not allowed!"); + STATIC_ASSERT(TP_DESCRIBE_LEN - 1 <= OB_MAX_TRACEPOINT_DESCRIBE_LEN, + "tp_describe length longer than OB_MAX_TRACEPOINT_DESCRIBE_LEN(4096) is not allowed!"); + l.add_last(this); + } + + template + NamedEventItem(const int64_t tp_no, + const char (&tp_name)[TP_NAME_LEN], + const char (&tp_describe)[TP_DESCRIBE_LEN], + ObDList &l) : item_(tp_no, tp_name, tp_describe) + { + STATIC_ASSERT(TP_NAME_LEN - 1 <= OB_MAX_TRACEPOINT_NAME_LEN, + "tp_name length longer than OB_MAX_TRACEPOINT_NAME_LEN(128) is not allowed!"); + STATIC_ASSERT(TP_DESCRIBE_LEN - 1 <= OB_MAX_TRACEPOINT_DESCRIBE_LEN, + "tp_describe length longer than OB_MAX_TRACEPOINT_DESCRIBE_LEN(4096) is not allowed!"); l.add_last(this); } operator int(void) { return item_.call(); } - - const char *name_; EventItem item_; }; class EventTable { - static const int SIZE_OF_EVENT_TABLE = 100000; // max number of tracepoints supported public: - EventTable() { - for (int64_t i = 0; i < SIZE_OF_EVENT_TABLE; ++i) { - memset(&(event_table_[i]), 0, sizeof(EventItem)); - } - } + EventTable() {} virtual ~EventTable() {} - // All tracepoints should be defined here before they can be used - enum { - EVENT_TABLE_INVALID = 0, - EN_1, - EN_2, - EN_3, - EN_4, - EN_5, - EN_6, - EN_7, - EN_8, - EN_9, - EN_IS_LOG_SYNC, // 10 - EN_POST_ADD_REPILICA_MC, // 11 - EN_MIGRATE_FETCH_MACRO_BLOCK, // 12 - EN_WRITE_BLOCK, // 13 - EN_COMMIT_SLOG, // 14 - EN_SCHEDULE_INDEX_DAG, // 15 - EN_INDEX_LOCAL_SORT_TASK, // 16 - EN_INDEX_MERGE_TASK, // 17 - EN_INDEX_WRITE_BLOCK, // 18 - EN_INDEX_COMMIT_SLOG, // 19 - EN_CHECK_CAN_DO_MERGE, // 20 - EN_SCHEDULE_MERGE, //21 - EN_MERGE_MACROBLOCK, //22 - EN_MERGE_CHECKSUM, //23 - EN_MERGE_FINISH, // 24 - EN_IO_SETUP, //25 - EN_FORCE_WRITE_SSTABLE_SECOND_INDEX = 26, - EN_SCHEDULE_MIGRATE = 27, - EN_TRANS_AFTER_COMMIT = 28, - EN_CHANGE_SCHEMA_VERSION_TO_ZERO = 29, - EN_POST_REMOVE_REPLICA_MC_MSG = 30, - EN_POST_ADD_REPLICA_MC_MSG = 31, - EN_CHECK_SUB_MIGRATION_TASK = 32, - EN_POST_GET_MEMBER_LIST_MSG = 33, - EN_WRITE_CHECKPOIRNT = 34, - EN_MERGE_SORT_READ_MSG = 35, - EN_IO_SUBMIT = 36, - EN_IO_GETEVENTS = 37, - EN_TRANS_LEADER_ACTIVE = 38, - EN_UNIT_MANAGER = 39, - EN_IO_CANCEL = 40, - EN_REPLAY_ROW = 41, - EN_BIG_ROW_REPLAY_FOR_MINORING = 42, - EN_START_STMT_INTERFACE_ERROR = 43, - EN_START_PARTICIPANT_INTERFACE_ERROR = 44, - EN_END_PARTICIPANT_INTERFACE_ERROR = 45, - EN_END_STMT_INTERFACE_ERROR = 46, - EN_GET_GTS_LEADER = 47, - ALLOC_LOG_ID_AND_TIMESTAMP_ERROR = 48, - AFTER_MIGRATE_FINISH_TASK = 49, - EN_VALID_MIGRATE_SRC = 52, - EN_BALANCE_TASK_EXE_ERR = 53, - EN_ADD_REBUILD_PARENT_SRC = 54, - EN_BAD_BLOCK_ERROR = 55, - EN_ADD_RESTORE_TASK_ERROR = 56, - EN_CTAS_FAIL_NO_DROP_ERROR = 57, - EN_IO_CHANNEL_QUEUE_ERROR = 58, - EN_GET_SCHE_CTX_ERROR = 59, - EN_CLOG_RESTORE_REPLAYED_LOG = 60, - EN_GEN_REBUILD_TASK = 61, - EN_IO_HANG_ERROR = 62, - EN_CREATE_TENANT_TRANS_ONE_FAILED = 63, - EN_CREATE_TENANT_TRANS_TWO_FAILED = 64, - EN_DELAY_REPLAY_SOURCE_SPLIT_LOG = 65, - EN_BLOCK_SPLIT_PROGRESS_RESPONSE = 66, - EN_RPC_ENCODE_SEGMENT_DATA_ERR = 67, - EN_RPC_ENCODE_RAW_DATA_ERR = 68, - EN_RPC_DECODE_COMPRESS_DATA_ERR = 69, - EN_RPC_DECODE_RAW_DATA_ERR = 70, - EN_BLOCK_SHUTDOWN_PARTITION = 71, - EN_BLOCK_SPLIT_SOURCE_PARTITION = 72, - EN_BLOCK_SUBMIT_SPLIT_SOURCE_LOG = 73, - EN_BLOCK_SPLIT_DEST_PARTITION = 74, - EN_CREATE_TENANT_TRANS_THREE_FAILED = 75, - EN_ALTER_CLUSTER_FAILED = 76, - EN_STANDBY_REPLAY_SCHEMA_FAIL = 77, - EN_STANDBY_REPLAY_CREATE_TABLE_FAIL = 78, - EN_STANDBY_REPLAY_CREATE_TENANT_FAIL = 79, - EN_STANDBY_REPLAY_CREATE_USER_FAIL = 80, - EN_CREATE_TENANT_BEFORE_PERSIST_MEMBER_LIST = 81, - EN_CREATE_TENANT_END_PERSIST_MEMBER_LIST = 82, - EN_BROADCAST_CLUSTER_STATUS_FAIL = 83, - EN_SET_FREEZE_INFO_FAILED = 84, - EN_UPDATE_MAJOR_SCHEMA_FAIL = 85, - EN_RENEW_SNAPSHOT_FAIL = 86, - EN_FOLLOWER_UPDATE_FREEZE_INFO_FAIL = 87, - EN_PARTITION_ITERATOR_FAIL = 88, - EN_REFRESH_INCREMENT_SCHEMA_PHASE_THREE_FAILED = 89, - EN_MIGRATE_LOGIC_TASK = 90, - EN_REPLAY_ADD_PARTITION_TO_PG_CLOG = 91, - EN_REPLAY_ADD_PARTITION_TO_PG_CLOG_AFTER_CREATE_SSTABLE = 92, - EN_BEFORE_RENEW_SNAPSHOT_FAIL = 93, - EN_BUILD_INDEX_RELEASE_SNAPSHOT_FAILED = 94, - EN_CREATE_PG_PARTITION_FAIL = 95, - EN_PUSH_TASK_FAILED = 96, - EN_PUSH_REFERENCE_TABLE_FAIL = 97, - EN_SLOG_WAIT_FLUSH_LOG = 98, - EN_SET_MEMBER_LIST_FAIL = 99, - EN_CREATE_TABLE_TRANS_END_FAIL = 100, - EN_ABROT_INDEX_FAIL = 101, - EN_DELAY_REPLAY_SOURCE_SPLIT_LOG_R_REPLICA = 102, - EN_SKIP_GLOBAL_SSTABLE_SCHEMA_VERSION = 103, - EN_STOP_ROOT_INSPECTION = 104, - EN_DROP_TENANT_FAILED = 105, - EN_SKIP_DROP_MEMTABLE = 106, - EN_SKIP_DROP_PG_PARTITION = 107, - EN_OBSERVER_CREATE_PARTITION_FAILED = 109, - EN_CREATE_PARTITION_WITH_OLD_MAJOR_TS = 110, - EN_PREPARE_SPLIT_FAILED = 111, - EN_REPLAY_SOURCE_SPLIT_LOG_FAILED = 112, - EN_SAVE_SPLIT_STATE_FAILED = 113, - EN_FORCE_REFRESH_TABLE = 114, - EN_REPLAY_SPLIT_DEST_LOG_FAILED = 116, - EN_PROCESS_TO_PRIMARY_ERR = 117, - EN_CREATE_PG_AFTER_CREATE_SSTBALES = 118, - EN_CREATE_PG_AFTER_REGISTER_TRANS_SERVICE = 119, - EN_CREATE_PG_AFTER_REGISTER_ELECTION_MGR = 120, - EN_CREATE_PG_AFTER_ADD_PARTITIONS_TO_MGR = 121, - EN_CREATE_PG_AFTER_ADD_PARTITIONS_TO_REPLAY_ENGINE = 122, - EN_CREATE_PG_AFTER_BATCH_START_PARTITION_ELECTION = 123, - EN_BACKUP_MACRO_BLOCK_SUBTASK_FAILED = 124, - EN_BACKUP_REPORT_RESULT_FAILED = 125, - EN_RESTORE_UPDATE_PARTITION_META_FAILED = 126, - EN_BACKUP_FILTER_TABLE_BY_SCHEMA = 127, - EN_FORCE_DFC_BLOCK = 128, - EN_SERVER_PG_META_WRITE_HALF_FAILED = 129, - EN_SERVER_TENANT_FILE_SUPER_BLOCK_WRITE_HALF_FAILED = 130, - EN_DTL_ONE_ROW_ONE_BUFFER = 131, - EN_LOG_ARCHIVE_PUSH_LOG_FAILED = 132, - - EN_BACKUP_DATA_VERSION_GAP_OVER_LIMIT = 133, - EN_LOG_ARHIVE_SCHEDULER_INTERRUPT = 134, - EN_BACKUP_IO_LIST_FILE = 135, - EN_BACKUP_IO_IS_EXIST = 136, - EN_BACKUP_IO_GET_FILE_LENGTH = 137, - EN_BACKUP_IO_BEFORE_DEL_FILE = 138, - EN_BACKUP_IO_AFTER_DEL_FILE = 139, - EN_BACKUP_IO_BEFORE_MKDIR = 140, - EN_BACKUP_IO_AFTER_MKDIR = 141, - EN_BACKUP_IO_UPDATE_FILE_MODIFY_TIME = 142, - EN_BACKUP_IO_BEFORE_WRITE_SINGLE_FILE = 143, - EN_BACKUP_IO_AFTER_WRITE_SINGLE_FILE = 144, - EN_BACKUP_IO_READER_OPEN = 145, - EN_BACKUP_IO_READER_PREAD = 146, - EN_BACKUP_IO_WRITE_OPEN = 147, - EN_BACKUP_IO_WRITE_WRITE = 148, - EN_BACKUP_IO_APPENDER_OPEN = 149, - EN_BACKUP_IO_APPENDER_WRITE = 150, - EN_ROOT_BACKUP_MAX_GENERATE_NUM = 151, - EN_ROOT_BACKUP_NEED_SWITCH_TENANT = 152, - EN_BACKUP_FILE_APPENDER_CLOSE = 153, - EN_RESTORE_MACRO_CRC_ERROR = 154, - EN_BACKUP_DELETE_HANDLE_LS_TASK = 155, - EN_BACKUP_DELETE_MARK_DELETING = 156, - EN_RESTORE_FETCH_CLOG_ERROR = 157, - EN_BACKUP_LEASE_CAN_TAKEOVER = 158, - EN_BACKUP_EXTERN_INFO_ERROR = 159, - EN_INCREMENTAL_BACKUP_NUM = 160, - EN_LOG_ARCHIVE_BEFORE_PUSH_LOG_FAILED = 161, - EN_BACKUP_META_INDEX_BUFFER_NOT_COMPLETED = 162, - EN_BACKUP_MACRO_INDEX_BUFFER_NOT_COMPLETED = 163, - EN_LOG_ARCHIVE_DATA_BUFFER_NOT_COMPLETED = 164, - EN_LOG_ARCHIVE_INDEX_BUFFER_NOT_COMPLETED = 165, - EN_FILE_SYSTEM_RENAME_ERROR = 166, - EN_BACKUP_OBSOLETE_INTERVAL = 167, - EN_BACKUP_BACKUP_LOG_ARCHIVE_INTERRUPTED = 168, - EN_BACKUP_BACKUPSET_EXTERN_INFO_ERROR = 169, - EN_BACKUP_SCHEDULER_GET_SCHEMA_VERSION_ERROR = 170, - EN_BACKUP_BACKUPSET_FILE_TASK = 171, - EN_LOG_ARCHIVE_RESTORE_ACCUM_CHECKSUM_TAMPERED = 172, - EN_BACKUP_BACKUPPIECE_FILE_TASK = 173, - EN_BACKUP_RS_BLOCK_FROZEN_PIECE = 174, - EN_LOG_ARCHIVE_BLOCK_SWITCH_PIECE = 175, - EN_BACKUP_ARCHIVELOG_RPC_FAILED = 176, - EN_BACKUP_AFTER_UPDATE_EXTERNAL_ROUND_INFO_FOR_USER = 177, - EN_BACKUP_AFTER_UPDATE_EXTERNAL_ROUND_INFO_FOR_SYS = 178, - EN_BACKUP_AFTER_UPDATE_EXTERNAL_BOTH_PIECE_INFO_FOR_USER = 179, - EN_BACKUP_AFTER_UPDATE_EXTERNAL_BOTH_PIECE_INFO_FOR_SYS = 180, - EN_BACKUP_BACKUPPIECE_FINISH_UPDATE_EXTERN_AND_INNER_INFO = 181, - EN_BACKUP_BACKUPPIECE_DO_SCHEDULE = 182, - EN_STOP_TENANT_LOG_ARCHIVE_BACKUP = 183, - EN_BACKUP_SERVER_DISK_IS_FULL = 184, - EN_CHANGE_TENANT_FAILED = 185, - EN_BACKUP_PERSIST_LS_FAILED = 186, - EN_BACKUP_VALIDATE_DO_FINISH = 189, - EN_BACKUP_SYS_META_TASK_FAILED = 190, - EN_BACKUP_SYS_TABLET_TASK_FAILED = 191, - EN_BACKUP_DATA_TABLET_MINOR_SSTABLE_TASK_FAILED = 192, - EN_BACKUP_DATA_TABLET_MAJOR_SSTABLE_TASK_FAILED = 193, - EN_BACKUP_BUILD_LS_LEVEL_INDEX_TASK_FAILED = 194, - EN_BACKUP_BUILD_TENANT_LEVEL_INDEX_TASK_FAILED = 195, - EN_BACKUP_PREFETCH_BACKUP_INFO_FAILED = 196, - EN_BACKUP_COMPLEMENT_LOG_TASK_FAILED = 197, - EN_BACKUP_USER_META_TASK_FAILED = 198, - EN_BACKUP_PREPARE_TASK_FAILED = 199, - EN_BACKUP_CHECK_TABLET_CONTINUITY_FAILED = 200, - // 下面请从201开始 - EN_CHECK_STANDBY_CLUSTER_SCHEMA_CONDITION = 201, - EN_ALLOCATE_LOB_BUF_FAILED = 202, - EN_ALLOCATE_DESERIALIZE_LOB_BUF_FAILED = 203, - EN_ENCRYPT_ALLOCATE_HASHMAP_FAILED = 204, - EN_ENCRYPT_ALLOCATE_ROW_BUF_FAILED = 205, - EN_ENCRYPT_GET_MASTER_KEY_FAILED = 206, - EN_DECRYPT_ALLOCATE_ROW_BUF_FAILED = 207, - EN_DECRYPT_GET_MASTER_KEY_FAILED = 208, - EN_FAST_MIGRATE_CHANGE_MEMBER_LIST_NOT_BEGIN = 209, - EN_FAST_MIGRATE_CHANGE_MEMBER_LIST_AFTER_REMOVE = 210, - EN_FAST_MIGRATE_CHANGE_MEMBER_LIST_SUCCESS_BUT_TIMEOUT = 211, - EN_SCHEDULE_DATA_MINOR_MERGE = 212, - EN_LOG_SYNC_SLOW = 213, - EN_WRITE_CONFIG_FILE_FAILED = 214, - EN_INVALID_ADDR_WEAK_READ_FAILED = 215, - EN_STACK_OVERFLOW_CHECK_EXPR_STACK_SIZE = 216, - EN_ENABLE_PDML_ALL_FEATURE = 217, - // slog checkpoint错误模拟占坑 218-230 - EN_SLOG_CKPT_ERROR = 218, - EN_FAST_RECOVERY_AFTER_ALLOC_FILE = 219, - EN_FAST_MIGRATE_ADD_MEMBER_FAIL = 220, - EN_FAST_RECOVERY_BEFORE_ADD_MEMBER = 221, - EN_FAST_RECOVERY_AFTER_ADD_MEMBER = 222, - EN_FAST_RECOVERY_AFTER_REMOVE_MEMBER = 223, - EN_OFS_IO_SUBMIT = 224, - EN_MIGRATE_ADD_PARTITION_FAILED = 225, - EN_PRINT_QUERY_SQL = 231, - EN_ADD_NEW_PG_TO_PARTITION_SERVICE = 232, - EN_DML_DISABLE_RANDOM_RESHUFFLE =233, - EN_RESIZE_PHYSICAL_FILE_FAILED = 234, - EN_ALLOCATE_RESIZE_MEMORY_FAILED = 235, - EN_WRITE_SUPER_BLOCK_FAILED = 236, - EN_GC_FAILED_PARTICIPANTS = 237, - EN_SSL_INVITE_NODES_FAILED = 238, - EN_ADD_TRIGGER_SKIP_MAP = 239, - EN_DEL_TRIGGER_SKIP_MAP = 240, - EN_RESET_FREE_MEMORY = 241, - EN_BKGD_TASK_REPORT_COMPLETE = 242, - EN_BKGD_TRANSMIT_CHECK_STATUS_PER_ROW = 243, - EN_OPEN_REMOTE_ASYNC_EXECUTION = 244, - EN_BACKUP_DELETE_EXCEPTION_HANDLING = 245, - EN_SORT_IMPL_FORCE_DO_DUMP = 246, - EN_ENFORCE_PUSH_DOWN_WF = 247, - EN_SORT_IMPL_TOPN_EAGER_FILTER = 248, - // - EN_TRANS_SHARED_LOCK_CONFLICT = 250, - EN_HASH_JOIN_OPTION = 251, - EN_SET_DISABLE_HASH_JOIN_BATCH = 252, - EN_INNER_SQL_CONN_LEAK_CHECK = 253, - EN_ADAPTIVE_GROUP_BY_SMALL_CACHE = 254, - - // only work for remote execute - EN_DISABLE_REMOTE_EXEC_WITH_PLAN = 255, - EN_REMOTE_EXEC_ERR = 256, - - EN_XA_PREPARE_ERROR = 260, - EN_XA_UPDATE_COORD_FAILED = 261, - EN_XA_PREPARE_RESP_LOST = 262, - EN_XA_RPC_TIMEOUT = 263, - EN_XA_COMMIT_ABORT_RESP_LOST = 264, - EN_XA_1PC_RESP_LOST = 265, - EN_DISK_ERROR = 266, - - - EN_CLOG_DUMP_ILOG_MEMSTORE_RENAME_FAILURE = 267, - EN_CLOG_ILOG_MEMSTORE_ALLOC_MEMORY_FAILURE = 268, - EN_CLOG_LOG_NOT_IN_SW = 269, - EN_CLOG_PARTITION_IS_NOT_SYNC = 270, - EN_CLOG_LOG_NOT_IN_ILOG_STORAGE = 271, - EN_CLOG_SW_OUT_OF_RANGE = 272, - EN_DFC_FACTOR = 273, - EN_LOGSERVICE_IO_TIMEOUT = 274, - - EN_PARTICIPANTS_SIZE_OVERFLOW = 275, - EN_UNDO_ACTIONS_SIZE_OVERFLOW = 276, - EN_PART_PLUS_UNDO_OVERFLOW = 277, - EN_HANDLE_PREPARE_MESSAGE_EAGAIN = 278, - EN_RC_ONLY_LEADER_TO_LEADER = 279, - EN_REPLAY_SERVICE_SUBMIT_TASK_SLEEP = 280, - - //simulate DAS errors 301-350 - EN_DAS_SCAN_RESULT_OVERFLOW = 301, - EN_DAS_DML_BUFFER_OVERFLOW = 302, - EN_DAS_SIMULATE_OPEN_ERROR = 303, - EN_DAS_WRITE_ROW_LIST_LEN = 304, - EN_DAS_SIMULATE_VT_CREATE_ERROR = 305, - EN_DAS_SIMULATE_LOOKUPOP_INIT_ERROR = 306, - EN_DAS_SIMULATE_ASYNC_RPC_TIMEOUT = 307, - EN_DAS_SIMULATE_DUMP_WRITE_BUFFER = 308, - EN_DAS_SIMULATE_AGG_TASK_BUFF_LIMIT = 309, - EN_DAS_ALL_PARALLEL_TASK_MEM_LIMIT = 310, - EN_DAS_SIMULATE_GROUP_SIZE = 311, - EN_DAS_SIMULATE_DAS_TASK_SIZE = 312, - EN_DAS_SIMULATE_AGG_TASK_MEM_LIMIT = 313, - EN_DAS_SIMULATE_AGG_TASK_RETRY_CODE = 314, - EN_DAS_GROUP_RESCAN_TEST_MODE = 315, - EN_DAS_SIMULATE_MAX_ROWSETS = 316, - - EN_REPLAY_STORAGE_SCHEMA_FAILURE = 351, - EN_SKIP_GET_STORAGE_SCHEMA = 352, - EN_DISABLE_RICH_FORMAT_IN_STORAGE = 353, - - EN_PREVENT_SYNC_REPORT = 360, - EN_PREVENT_ASYNC_REPORT = 361, - EN_REBALANCE_TASK_RETRY = 362, - EN_LOG_IDS_COUNT_ERROR = 363, - - EN_AMM_WASH_RATIO = 364, - EN_ENABLE_THREE_STAGE_AGGREGATE = 365, - EN_ROLLUP_ADAPTIVE_KEY_NUM = 366, - EN_ENABLE_OP_OUTPUT_DATUM_CHECK = 367, - EN_LEADER_STORAGE_ESTIMATION = 368, - - // SQL table_scan, index_look_up and other dml_op 400-500 - EN_TABLE_LOOKUP_BATCH_ROW_COUNT = 400, - EN_TABLE_REPLACE_BATCH_ROW_COUNT = 401, - EN_TABLE_INSERT_UP_BATCH_ROW_COUNT = 402, - EN_EXPLAIN_BATCHED_MULTI_STATEMENT = 403, - EN_INS_MULTI_VALUES_BATCH_OPT = 404, - EN_SQL_MEMORY_LABEL_HIGH64 = 405, - EN_SQL_MEMORY_LABEL_LOW64 = 406, - EN_SQL_MEMORY_DYNAMIC_LEAK_SIZE = 407, - - // DDL related 500-550 - EN_DATA_CHECKSUM_DDL_TASK = 501, - EN_HIDDEN_CHECKSUM_DDL_TASK = 502, - EN_SUBMIT_INDEX_TASK_ERROR_BEFORE_STAT_RECORD = 503, - EN_SUBMIT_INDEX_TASK_ERROR_AFTER_STAT_RECORD = 504, - EN_BUILD_LOCAL_INDEX_WITH_CORRUPTED_DATA = 505, - EN_BUILD_GLOBAL_INDEX_WITH_CORRUPTED_DATA = 506, - EN_EARLY_RESPONSE_SCHEDULER = 509, - EN_DDL_TASK_PROCESS_FAIL_STATUS = 510, - EN_DDL_TASK_PROCESS_FAIL_ERROR = 511, - EN_DDL_START_FAIL = 512, - EN_DDL_COMPACT_FAIL = 513, - EN_DDL_RELEASE_DDL_KV_FAIL = 514, - EN_DDL_REPORT_CHECKSUM_FAIL = 515, - EN_DDL_REPORT_REPLICA_BUILD_STATUS_FAIL = 516, - EN_DDL_DIRECT_LOAD_WAIT_TABLE_LOCK_FAIL = 517, - EN_DDL_LOBID_CACHE_SIZE_INJECTED = 518, - - // SQL Optimizer related 551-599 - EN_EXPLAIN_GENERATE_PLAN_WITH_OUTLINE = 551, - EN_ENABLE_AUTO_DOP_FORCE_PARALLEL_PLAN = 552, - EN_GENERATE_PLAN_WITH_RECONSTRUCT_SQL = 553, - EN_GENERATE_PLAN_WITH_NLJ = 554, - //EN_CHECK_OPERATOR_OUTPUT_ROWS = 555, - //EN_GENERATE_RANDOM_PLAN = 556, - //EN_COALESCE_AGGR_IGNORE_COST = 557, - - // 600-700 For PX use - EN_PX_SQC_EXECUTE_FAILED = 600, - EN_PX_SQC_INIT_FAILED = 601, - EN_PX_SQC_INIT_PROCESS_FAILED = 602, - EN_PX_PRINT_TARGET_MONITOR_LOG = 603, - EN_PX_SQC_NOT_REPORT_TO_QC = 604, - EN_PX_QC_EARLY_TERMINATE = 605, - EN_PX_SINGLE_DFO_NOT_ERASE_DTL_INTERM_RESULT = 606, - EN_PX_TEMP_TABLE_NOT_DESTROY_REMOTE_INTERM_RESULT = 607, - EN_PX_NOT_ERASE_P2P_DH_MSG = 608, - EN_PX_SLOW_PROCESS_SQC_FINISH_MSG = 609, - EN_PX_JOIN_FILTER_NOT_MERGE_MSG = 610, - EN_PX_P2P_MSG_REG_DM_FAILED= 611, - EN_PX_JOIN_FILTER_HOLD_MSG = 612, - EN_PX_DTL_TRACE_LOG_ENABLE = 613, - EN_PX_DISABLE_RUNTIME_FILTER_EXTRACT_QUERY_RANGE = 614, - EN_PX_MAX_IN_FILTER_QR_COUNT = 615, - EN_PX_DISABLE_WHITE_RUNTIME_FILTER = 616, - EN_PX_DISABLE_PD_TOPN_FILTER = 617, - // please add new trace point after 700 or before 600 - - // Compaction Related 700-750 - EN_COMPACTION_DIAGNOSE_TABLE_STORE_UNSAFE_FAILED = 700, - EN_COMPACTION_DIAGNOSE_CANNOT_MAJOR = 701, - EN_COMPACTION_MERGE_TASK = 702, - EN_MEDIUM_COMPACTION_SUBMIT_CLOG_FAILED = 703, - EN_MEDIUM_COMPACTION_UPDATE_CUR_SNAPSHOT_FAILED = 704, // not used - EN_MEDIUM_REPLICA_CHECKSUM_ERROR = 705, - EN_MEDIUM_CREATE_DAG = 706, - EN_MEDIUM_VERIFY_GROUP_SKIP_SET_VERIFY = 707, - EN_MEDIUM_VERIFY_GROUP_SKIP_COLUMN_CHECKSUM = 708, // not used - EN_SCHEDULE_MEDIUM_COMPACTION = 709, - EN_SCHEDULE_MAJOR_GET_TABLE_SCHEMA = 710, - EN_SKIP_INDEX_MAJOR = 711, - EN_BUILD_DATA_MICRO_BLOCK = 712, - EN_COMPACTION_CO_MERGE_EXE_FAILED = 713, - EN_COMPACTION_CO_MERGE_SCHEDULE_FAILED = 714, - EN_COMPACTION_MEDIUM_INIT_PARALLEL_RANGE = 715, - EN_RS_USER_INDEX_CHECKSUM_ERROR = 716, - EN_RS_CANT_GET_ALL_TABLET_CHECKSUM = 717, - EN_SWAP_TABLET_IN_COMPACTION = 718, - EN_COMPACTION_CO_MERGE_PREPARE_CTX_FAILED = 719, - EN_COMPACTION_CO_MERGE_PREPARE_FAILED = 720, - EN_COMPACTION_CO_MERGE_PREPARE_MINOR_FAILED = 721, - EN_COMPACTION_CO_MERGE_FINISH_FAILED = 722, - EN_COMPACTION_ITER_TABLET_NOT_EXIST = 723, - EN_COMPACTION_ITER_LS_NOT_EXIST = 724, - EN_COMPACTION_ITER_INVALID_TABLET_ID = 725, - EN_RS_CHECK_SPECIAL_TABLE = 726, - EN_COMPACTION_REPORT_ADD_TASK_FAILED = 727, - EN_COMPACTION_REPORT_PROCESS_TASK_FAILED = 728, - EN_RS_CHECK_MERGE_PROGRESS = 729, - EN_CAN_NOT_SCHEDULE_MINOR = 730, - EN_SCHEDULE_MEDIUM_FAILED = 731, - EN_SPECIAL_TABLE_HAVE_LARGER_SCN = 732, - EN_COMPACTION_CO_PUSH_TABLES_FAILED = 733, - EN_COMPACTION_CO_MERGE_PARTITION_LONG_TIME = 734, - EN_COMPACTION_SCHEDULE_META_MERGE = 735, - EN_COMPACTION_ESTIMATE_ROW_FAILED = 736, - EN_COMPACTION_UPDATE_REPORT_SCN = 737, - EN_CO_MREGE_DAG_READY_FOREVER = 738, - EN_CO_MREGE_DAG_SCHEDULE_REST = 739, - EN_COMPACTION_SCHEDULE_MEDIUM_MERGE_AFTER_MINI = 740, - EN_COMPACTION_MEDIUM_INIT_LARGE_PARALLEL_RANGE = 741, - EN_GET_TABLET_LS_PAIR_IN_RS = 742, - - // please add new trace point after 750 - EN_SESSION_LEAK_COUNT_THRESHOLD = 751, - EN_END_PARTICIPANT = 800, - - //LS Migration Related 900 - 1000 - EN_INITIAL_MIGRATION_TASK_FAILED = 900, - EN_START_MIGRATION_TASK_FAILED = 901, - EN_SYS_TABLETS_MIGRATION_TASK_FAILED = 902, - EN_DATA_TABLETS_MIGRATION_TASK_FAILED = 903, - EN_TABLET_GROUP_MIGRATION_TASK_FAILED = 904, - EN_TABLET_MIGRATION_TASK_FAILED = 905, - EN_MIGRATION_FINISH_TASK_FAILED = 906, - EN_MIGRATION_READ_REMOTE_MACRO_BLOCK_FAILED = 907, - EN_MIGRATION_ENABLE_LOG_FAILED = 908, - EN_MIGRATION_ENABLE_VOTE_RETRY = 909, - EN_MIGRATION_ENABLE_VOTE_FAILED = 910, - EN_MIGRATION_COPY_MACRO_BLOCK_NUM = 911, - EN_FINISH_TABLET_GROUP_RESTORE_FAILED = 912, - EN_MIGRATION_ONLINE_FAILED = 913, - EN_MIGRATION_GENERATE_SYS_TABLETS_DAG_FAILED = 914, - EN_COPY_MAJOR_SNAPSHOT_VERSION = 915, - EN_TABLET_MIGRATION_DAG_INNER_RETRY = 916, - EN_LS_REBUILD_PREPARE_FAILED = 917, - EN_TABLET_GC_TASK_FAILED = 918, - EN_UPDATE_TABLET_HA_STATUS_FAILED = 919, - EN_GENERATE_REBUILD_TASK_FAILED = 920, - EN_CHECK_TRANSFER_TASK_EXSIT = 921, - EN_TABLET_EMPTY_SHELL_TASK_FAILED = 922, - - // Log Archive and Restore 1001 - 1100 - EN_START_ARCHIVE_LOG_GAP = 1001, - EN_RESTORE_LOG_FAILED = 1002, - EN_RESTORE_LOG_FROM_SOURCE_FAILED = 1003, - EN_BACKUP_MULTIPLE_MACRO_BLOCK = 1004, - EN_RESTORE_FETCH_TABLET_INFO = 1005, - EN_RESTORE_COPY_MACRO_BLOCK_NUM = 1006, - - // START OF STORAGE HA - 1101 - 2000 - EN_BACKUP_META_REPORT_RESULT_FAILED = 1101, - EN_RESTORE_LS_INIT_PARAM_FAILED = 1102, - EN_RESTORE_TABLET_INIT_PARAM_FAILED = 1103, - EN_ADD_BACKUP_META_DAG_FAILED = 1104, - EN_ADD_BACKUP_DATA_DAG_FAILED = 1105, - EN_ADD_BACKUP_BUILD_INDEX_DAG_FAILED = 1106, - EN_ADD_BACKUP_PREPARE_DAG_FAILED = 1107, - EN_ADD_BACKUP_FINISH_DAG_FAILED = 1108, - EN_ADD_BACKUP_PREFETCH_DAG_FAILED = 1109, - EN_BACKUP_PERSIST_SET_TASK_FAILED = 1110, - EN_BACKUP_READ_MACRO_BLOCK_FAILED = 1111, - EN_FETCH_TABLE_INFO_RPC = 1112, - EN_RESTORE_TABLET_TASK_FAILED = 1113, - EN_INSERT_USER_RECOVER_JOB_FAILED = 1114, - EN_INSERT_AUX_TENANT_RESTORE_JOB_FAILED = 1115, - EN_RESTORE_CREATE_LS_FAILED = 1116, - // END OF STORAGE HA - 1101 - 2000 - - // sql parameterization 1170-1180 - EN_SQL_PARAM_FP_NP_NOT_SAME_ERROR = 1170, - EN_FLUSH_PC_NOT_CLEANUP_LEAK_MEM_ERROR = 1171, - EN_PC_NOT_SWALLOW_ERROR = 1172, - // END OF sql parameterization 1170-1180 - - // session info verification - // The types are used for error verification - EN_SESS_INFO_VERI_SYS_VAR_ERROR = 1180, - EN_SESS_INFO_VERI_APP_INFO_ERROR = 1181, - EN_SESS_INFO_VERI_APP_CTX_ERROR = 1182, - EN_SESS_INFO_VERI_CLIENT_ID_ERROR = 1183, - EN_SESS_INFO_VERI_CONTROL_INFO_ERROR = 1184, - EN_SESS_INFO_VERI_TXN_EXTRA_INFO_ERROR = 1185, - EN_SESS_POOL_MGR_CTRL = 1186, - // session info diagnosis control - // EN_SESS_INFO_DIAGNOSIS_CONTROL = 1187, - EN_SESS_CLEAN_KILL_MAP_TIME = 1188, - // sql audit background thread stuck - EN_SQL_AUDIT_RELEASE_BACK_THREAD_STUCK = 1189, - EN_SQL_AUDIT_CONSTRUCT_BACK_THREAD_STUCK = 1190, - EN_ENABLE_NEWSORT_FORCE = 1200, - - // Transaction // 2001 - 2100 - // Transaction free route - EN_TX_FREE_ROUTE_UPDATE_STATE_ERROR = 2001, - EN_TX_FREE_ROUTE_ENCODE_STATE_ERROR = 2002, - EN_TX_FREE_ROUTE_STATE_SIZE = 2003, - // Transaction common - EN_TX_RESULT_INCOMPLETE = 2011, - EN_CHECK_TX_CTX_LOCK = 2013, - EN_THREAD_HANG = 2022, - - EN_ENABLE_SET_TRACE_CONTROL_INFO = 2100, - EN_CHEN = 2101, - EN_ENABLE_TABLE_LOCK = 2102, - EN_ENABLE_ROWKEY_CONFLICT_CHECK = 2103, - EN_ENABLE_ORA_DECINT_CONST = 2104, - EN_ENABLE_CLEAN_INTERM_RES = 2105, - EN_UNIQ_TASK_QUEUE_GET_GROUP_FAIL = 2106, - - EN_DISABLE_VEC_SORT = 2200, - EN_DISABLE_VEC_HASH_DISTINCT = 2201, - EN_DISABLE_VEC_HASH_JOIN = 2202, - EN_DISABLE_VEC_HASH_GROUP_BY = 2203, - EN_DISABLE_VEC_SCALAR_GROUP_BY = 2204, - EN_DTL_OPTION = 2205, - EN_ENABLE_RANDOM_BATCH_SIZE = 2206, - EN_ENABLE_VECTOR_CAST = 2207, - EN_DISABLE_SORTKEY_SEPARATELY = 2208, - EN_ENABLE_VECTOR_IN = 2209, - EN_SQL_MEMORY_MRG_OPTION = 2210, - EN_ENABLE_RANDOM_TSC = 2211, - // WR && ASH - EN_CLOSE_ASH = 2301, - EN_DISABLE_HASH_BASE_DISTINCT = 2302, - - EVENT_TABLE_MAX = SIZE_OF_EVENT_TABLE - }; - - /* get an event value */ - inline EventItem &get_event(int64_t index) - { return (index >= 0 && index < SIZE_OF_EVENT_TABLE) ? event_table_[index] : event_table_[0]; } - /* set an event value */ - inline void set_event(int64_t index, const EventItem &item) + static inline int set_event(int64_t no, const EventItem &item) { - if (index >= 0 && index < SIZE_OF_EVENT_TABLE) { - event_table_[index] = item; - } - } - - static inline void set_event(const char *name, const EventItem &item) - { - DLIST_FOREACH_NORET(i, global_item_list()) { - if (NULL != i->name_ && NULL != name && strcmp(i->name_, name) == 0) { - i->item_ = item; + int ret = OB_SUCCESS; + if (no < 0) { + ret = OB_INVALID_ARGUMENT; + } else { + bool is_find = false; + DLIST_FOREACH_NORET(i, global_item_list()) { + if (i->item_.no_ == no) { + i->item_.set_event(item); + is_find = true; + break; + } + } + if (!is_find) { + ret = OB_INVALID_ARGUMENT; } } + return ret; + } + + static inline int set_event(const char *name, const EventItem &item) + { + int ret = OB_SUCCESS; + if (OB_ISNULL(name)) { + ret = OB_INVALID_ARGUMENT; + } else { + bool is_find = false; + DLIST_FOREACH_NORET(i, global_item_list()) { + if (OB_NOT_NULL(i->item_.name_) && strcasecmp(i->item_.name_, name) == 0) { + i->item_.set_event(item); + is_find = true; + break; + } + } + if (!is_find) { + ret = OB_INVALID_ARGUMENT; + } + } + return ret; } static ObDList &global_item_list() @@ -863,22 +389,12 @@ class EventTable return et; } - private: - /* - Array of error codes for all tracepoints. - For normal error code generation, the value should be the error code itself. - */ - EventItem event_table_[SIZE_OF_EVENT_TABLE]; + #define GLOBAL_ERRSIM_POINT_DEF(no, name, describe) \ + static oceanbase::common::NamedEventItem name + #include "lib/utility/ob_tracepoint_def.h" + #undef GLOBAL_ERRSIM_POINT_DEF }; -inline void event_access(int64_t index, /* tracepoint number */ - EventItem &item, - bool is_get) /* is a 'get' */ -{ - if (is_get) item = EventTable::instance().get_event(index); - else EventTable::instance().set_event(index, item); -} - } } diff --git a/deps/oblib/src/lib/utility/ob_tracepoint_def.h b/deps/oblib/src/lib/utility/ob_tracepoint_def.h new file mode 100644 index 0000000000..cbf52a0293 --- /dev/null +++ b/deps/oblib/src/lib/utility/ob_tracepoint_def.h @@ -0,0 +1,539 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#ifdef GLOBAL_ERRSIM_POINT_DEF +GLOBAL_ERRSIM_POINT_DEF(1, EN_1, ""); +GLOBAL_ERRSIM_POINT_DEF(2, EN_2, ""); +GLOBAL_ERRSIM_POINT_DEF(3, EN_3, ""); +GLOBAL_ERRSIM_POINT_DEF(4, EN_4, ""); +GLOBAL_ERRSIM_POINT_DEF(5, EN_5, ""); +GLOBAL_ERRSIM_POINT_DEF(6, EN_6, ""); +GLOBAL_ERRSIM_POINT_DEF(7, EN_7, ""); +GLOBAL_ERRSIM_POINT_DEF(8, EN_8, "Used to simulate the scenario of failure to write temporary files"); +GLOBAL_ERRSIM_POINT_DEF(9, EN_9, ""); +GLOBAL_ERRSIM_POINT_DEF(10, EN_IS_LOG_SYNC, ""); +GLOBAL_ERRSIM_POINT_DEF(11, EN_POST_ADD_REPILICA_MC, ""); +GLOBAL_ERRSIM_POINT_DEF(12, EN_MIGRATE_FETCH_MACRO_BLOCK, ""); +GLOBAL_ERRSIM_POINT_DEF(13, EN_WRITE_BLOCK, ""); +GLOBAL_ERRSIM_POINT_DEF(14, EN_COMMIT_SLOG, ""); +GLOBAL_ERRSIM_POINT_DEF(15, EN_SCHEDULE_INDEX_DAG, ""); +GLOBAL_ERRSIM_POINT_DEF(16, EN_INDEX_LOCAL_SORT_TASK, ""); +GLOBAL_ERRSIM_POINT_DEF(17, EN_INDEX_MERGE_TASK, ""); +GLOBAL_ERRSIM_POINT_DEF(18, EN_INDEX_WRITE_BLOCK, ""); +GLOBAL_ERRSIM_POINT_DEF(19, EN_INDEX_COMMIT_SLOG, ""); +GLOBAL_ERRSIM_POINT_DEF(20, EN_CHECK_CAN_DO_MERGE, ""); +GLOBAL_ERRSIM_POINT_DEF(21, EN_SCHEDULE_MERGE, ""); +GLOBAL_ERRSIM_POINT_DEF(22, EN_MERGE_MACROBLOCK, ""); +GLOBAL_ERRSIM_POINT_DEF(23, EN_MERGE_CHECKSUM, ""); +GLOBAL_ERRSIM_POINT_DEF(24, EN_MERGE_FINISH, ""); +GLOBAL_ERRSIM_POINT_DEF(25, EN_IO_SETUP, ""); +GLOBAL_ERRSIM_POINT_DEF(26, EN_FORCE_WRITE_SSTABLE_SECOND_INDEX, ""); +GLOBAL_ERRSIM_POINT_DEF(27, EN_SCHEDULE_MIGRATE, ""); +GLOBAL_ERRSIM_POINT_DEF(28, EN_TRANS_AFTER_COMMIT, ""); +GLOBAL_ERRSIM_POINT_DEF(29, EN_CHANGE_SCHEMA_VERSION_TO_ZERO, ""); +GLOBAL_ERRSIM_POINT_DEF(30, EN_POST_REMOVE_REPLICA_MC_MSG, ""); +GLOBAL_ERRSIM_POINT_DEF(31, EN_POST_ADD_REPLICA_MC_MSG, ""); +GLOBAL_ERRSIM_POINT_DEF(32, EN_CHECK_SUB_MIGRATION_TASK, ""); +GLOBAL_ERRSIM_POINT_DEF(33, EN_POST_GET_MEMBER_LIST_MSG, ""); +GLOBAL_ERRSIM_POINT_DEF(34, EN_WRITE_CHECKPOIRNT, ""); +GLOBAL_ERRSIM_POINT_DEF(35, EN_MERGE_SORT_READ_MSG, ""); +GLOBAL_ERRSIM_POINT_DEF(36, EN_IO_SUBMIT, ""); +GLOBAL_ERRSIM_POINT_DEF(37, EN_IO_GETEVENTS, ""); +GLOBAL_ERRSIM_POINT_DEF(38, EN_TRANS_LEADER_ACTIVE, ""); +GLOBAL_ERRSIM_POINT_DEF(39, EN_UNIT_MANAGER, ""); +GLOBAL_ERRSIM_POINT_DEF(40, EN_IO_CANCEL, ""); +GLOBAL_ERRSIM_POINT_DEF(41, EN_REPLAY_ROW, ""); +GLOBAL_ERRSIM_POINT_DEF(42, EN_BIG_ROW_REPLAY_FOR_MINORING, ""); +GLOBAL_ERRSIM_POINT_DEF(43, EN_START_STMT_INTERFACE_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(44, EN_START_PARTICIPANT_INTERFACE_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(45, EN_END_PARTICIPANT_INTERFACE_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(46, EN_END_STMT_INTERFACE_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(47, EN_GET_GTS_LEADER, ""); +GLOBAL_ERRSIM_POINT_DEF(48, ALLOC_LOG_ID_AND_TIMESTAMP_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(49, AFTER_MIGRATE_FINISH_TASK, ""); +GLOBAL_ERRSIM_POINT_DEF(52, EN_VALID_MIGRATE_SRC, ""); +GLOBAL_ERRSIM_POINT_DEF(53, EN_BALANCE_TASK_EXE_ERR, ""); +GLOBAL_ERRSIM_POINT_DEF(54, EN_ADD_REBUILD_PARENT_SRC, ""); +GLOBAL_ERRSIM_POINT_DEF(55, EN_BAD_BLOCK_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(56, EN_ADD_RESTORE_TASK_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(57, EN_CTAS_FAIL_NO_DROP_ERROR, "Used to simulate the scenario that create table as select failed and then drop internal table failed"); +GLOBAL_ERRSIM_POINT_DEF(58, EN_IO_CHANNEL_QUEUE_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(59, EN_GET_SCHE_CTX_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(60, EN_CLOG_RESTORE_REPLAYED_LOG, ""); +GLOBAL_ERRSIM_POINT_DEF(61, EN_GEN_REBUILD_TASK, ""); +GLOBAL_ERRSIM_POINT_DEF(62, EN_IO_HANG_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(63, EN_CREATE_TENANT_TRANS_ONE_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(64, EN_CREATE_TENANT_TRANS_TWO_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(65, EN_DELAY_REPLAY_SOURCE_SPLIT_LOG, ""); +GLOBAL_ERRSIM_POINT_DEF(66, EN_BLOCK_SPLIT_PROGRESS_RESPONSE, ""); +GLOBAL_ERRSIM_POINT_DEF(67, EN_RPC_ENCODE_SEGMENT_DATA_ERR, ""); +GLOBAL_ERRSIM_POINT_DEF(68, EN_RPC_ENCODE_RAW_DATA_ERR, ""); +GLOBAL_ERRSIM_POINT_DEF(69, EN_RPC_DECODE_COMPRESS_DATA_ERR, ""); +GLOBAL_ERRSIM_POINT_DEF(70, EN_RPC_DECODE_RAW_DATA_ERR, ""); +GLOBAL_ERRSIM_POINT_DEF(71, EN_BLOCK_SHUTDOWN_PARTITION, ""); +GLOBAL_ERRSIM_POINT_DEF(72, EN_BLOCK_SPLIT_SOURCE_PARTITION, ""); +GLOBAL_ERRSIM_POINT_DEF(73, EN_BLOCK_SUBMIT_SPLIT_SOURCE_LOG, ""); +GLOBAL_ERRSIM_POINT_DEF(74, EN_BLOCK_SPLIT_DEST_PARTITION, ""); +GLOBAL_ERRSIM_POINT_DEF(75, EN_CREATE_TENANT_TRANS_THREE_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(76, EN_ALTER_CLUSTER_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(77, EN_STANDBY_REPLAY_SCHEMA_FAIL, ""); +GLOBAL_ERRSIM_POINT_DEF(78, EN_STANDBY_REPLAY_CREATE_TABLE_FAIL, ""); +GLOBAL_ERRSIM_POINT_DEF(79, EN_STANDBY_REPLAY_CREATE_TENANT_FAIL, ""); +GLOBAL_ERRSIM_POINT_DEF(80, EN_STANDBY_REPLAY_CREATE_USER_FAIL, ""); +GLOBAL_ERRSIM_POINT_DEF(81, EN_CREATE_TENANT_BEFORE_PERSIST_MEMBER_LIST, ""); +GLOBAL_ERRSIM_POINT_DEF(82, EN_CREATE_TENANT_END_PERSIST_MEMBER_LIST, ""); +GLOBAL_ERRSIM_POINT_DEF(83, EN_BROADCAST_CLUSTER_STATUS_FAIL, ""); +GLOBAL_ERRSIM_POINT_DEF(84, EN_SET_FREEZE_INFO_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(85, EN_UPDATE_MAJOR_SCHEMA_FAIL, ""); +GLOBAL_ERRSIM_POINT_DEF(86, EN_RENEW_SNAPSHOT_FAIL, ""); +GLOBAL_ERRSIM_POINT_DEF(87, EN_FOLLOWER_UPDATE_FREEZE_INFO_FAIL, ""); +GLOBAL_ERRSIM_POINT_DEF(88, EN_PARTITION_ITERATOR_FAIL, ""); +GLOBAL_ERRSIM_POINT_DEF(89, EN_REFRESH_INCREMENT_SCHEMA_PHASE_THREE_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(90, EN_MIGRATE_LOGIC_TASK, ""); +GLOBAL_ERRSIM_POINT_DEF(91, EN_REPLAY_ADD_PARTITION_TO_PG_CLOG, ""); +GLOBAL_ERRSIM_POINT_DEF(92, EN_REPLAY_ADD_PARTITION_TO_PG_CLOG_AFTER_CREATE_SSTABLE, ""); +GLOBAL_ERRSIM_POINT_DEF(93, EN_BEFORE_RENEW_SNAPSHOT_FAIL, ""); +GLOBAL_ERRSIM_POINT_DEF(94, EN_BUILD_INDEX_RELEASE_SNAPSHOT_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(95, EN_CREATE_PG_PARTITION_FAIL, ""); +GLOBAL_ERRSIM_POINT_DEF(96, EN_PUSH_TASK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(97, EN_PUSH_REFERENCE_TABLE_FAIL, ""); +GLOBAL_ERRSIM_POINT_DEF(98, EN_SLOG_WAIT_FLUSH_LOG, ""); +GLOBAL_ERRSIM_POINT_DEF(99, EN_SET_MEMBER_LIST_FAIL, ""); +GLOBAL_ERRSIM_POINT_DEF(100, EN_CREATE_TABLE_TRANS_END_FAIL, ""); +GLOBAL_ERRSIM_POINT_DEF(101, EN_ABROT_INDEX_FAIL, ""); +GLOBAL_ERRSIM_POINT_DEF(102, EN_DELAY_REPLAY_SOURCE_SPLIT_LOG_R_REPLICA, ""); +GLOBAL_ERRSIM_POINT_DEF(103, EN_SKIP_GLOBAL_SSTABLE_SCHEMA_VERSION, ""); +GLOBAL_ERRSIM_POINT_DEF(104, EN_STOP_ROOT_INSPECTION, ""); +GLOBAL_ERRSIM_POINT_DEF(105, EN_DROP_TENANT_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(106, EN_SKIP_DROP_MEMTABLE, ""); +GLOBAL_ERRSIM_POINT_DEF(107, EN_SKIP_DROP_PG_PARTITION, ""); +GLOBAL_ERRSIM_POINT_DEF(109, EN_OBSERVER_CREATE_PARTITION_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(110, EN_CREATE_PARTITION_WITH_OLD_MAJOR_TS, ""); +GLOBAL_ERRSIM_POINT_DEF(111, EN_PREPARE_SPLIT_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(112, EN_REPLAY_SOURCE_SPLIT_LOG_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(113, EN_SAVE_SPLIT_STATE_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(114, EN_FORCE_REFRESH_TABLE, ""); +GLOBAL_ERRSIM_POINT_DEF(116, EN_REPLAY_SPLIT_DEST_LOG_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(117, EN_PROCESS_TO_PRIMARY_ERR, ""); +GLOBAL_ERRSIM_POINT_DEF(118, EN_CREATE_PG_AFTER_CREATE_SSTBALES, ""); +GLOBAL_ERRSIM_POINT_DEF(119, EN_CREATE_PG_AFTER_REGISTER_TRANS_SERVICE, ""); +GLOBAL_ERRSIM_POINT_DEF(120, EN_CREATE_PG_AFTER_REGISTER_ELECTION_MGR, ""); +GLOBAL_ERRSIM_POINT_DEF(121, EN_CREATE_PG_AFTER_ADD_PARTITIONS_TO_MGR, ""); +GLOBAL_ERRSIM_POINT_DEF(122, EN_CREATE_PG_AFTER_ADD_PARTITIONS_TO_REPLAY_ENGINE, ""); +GLOBAL_ERRSIM_POINT_DEF(123, EN_CREATE_PG_AFTER_BATCH_START_PARTITION_ELECTION, ""); +GLOBAL_ERRSIM_POINT_DEF(124, EN_BACKUP_MACRO_BLOCK_SUBTASK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(125, EN_BACKUP_REPORT_RESULT_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(126, EN_RESTORE_UPDATE_PARTITION_META_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(127, EN_BACKUP_FILTER_TABLE_BY_SCHEMA, ""); +GLOBAL_ERRSIM_POINT_DEF(128, EN_FORCE_DFC_BLOCK, ""); +GLOBAL_ERRSIM_POINT_DEF(129, EN_SERVER_PG_META_WRITE_HALF_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(130, EN_SERVER_TENANT_FILE_SUPER_BLOCK_WRITE_HALF_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(131, EN_DTL_ONE_ROW_ONE_BUFFER, ""); +GLOBAL_ERRSIM_POINT_DEF(132, EN_LOG_ARCHIVE_PUSH_LOG_FAILED, ""); + +GLOBAL_ERRSIM_POINT_DEF(133, EN_BACKUP_DATA_VERSION_GAP_OVER_LIMIT, ""); +GLOBAL_ERRSIM_POINT_DEF(134, EN_LOG_ARHIVE_SCHEDULER_INTERRUPT, ""); +GLOBAL_ERRSIM_POINT_DEF(135, EN_BACKUP_IO_LIST_FILE, ""); +GLOBAL_ERRSIM_POINT_DEF(136, EN_BACKUP_IO_IS_EXIST, ""); +GLOBAL_ERRSIM_POINT_DEF(137, EN_BACKUP_IO_GET_FILE_LENGTH, ""); +GLOBAL_ERRSIM_POINT_DEF(138, EN_BACKUP_IO_BEFORE_DEL_FILE, ""); +GLOBAL_ERRSIM_POINT_DEF(139, EN_BACKUP_IO_AFTER_DEL_FILE, ""); +GLOBAL_ERRSIM_POINT_DEF(140, EN_BACKUP_IO_BEFORE_MKDIR, ""); +GLOBAL_ERRSIM_POINT_DEF(141, EN_BACKUP_IO_AFTER_MKDIR, ""); +GLOBAL_ERRSIM_POINT_DEF(142, EN_BACKUP_IO_UPDATE_FILE_MODIFY_TIME, ""); +GLOBAL_ERRSIM_POINT_DEF(143, EN_BACKUP_IO_BEFORE_WRITE_SINGLE_FILE, ""); +GLOBAL_ERRSIM_POINT_DEF(144, EN_BACKUP_IO_AFTER_WRITE_SINGLE_FILE, ""); +GLOBAL_ERRSIM_POINT_DEF(145, EN_BACKUP_IO_READER_OPEN, ""); +GLOBAL_ERRSIM_POINT_DEF(146, EN_BACKUP_IO_READER_PREAD, ""); +GLOBAL_ERRSIM_POINT_DEF(147, EN_BACKUP_IO_WRITE_OPEN, ""); +GLOBAL_ERRSIM_POINT_DEF(148, EN_BACKUP_IO_WRITE_WRITE, ""); +GLOBAL_ERRSIM_POINT_DEF(149, EN_BACKUP_IO_APPENDER_OPEN, ""); +GLOBAL_ERRSIM_POINT_DEF(150, EN_BACKUP_IO_APPENDER_WRITE, ""); +GLOBAL_ERRSIM_POINT_DEF(151, EN_ROOT_BACKUP_MAX_GENERATE_NUM, ""); +GLOBAL_ERRSIM_POINT_DEF(152, EN_ROOT_BACKUP_NEED_SWITCH_TENANT, ""); +GLOBAL_ERRSIM_POINT_DEF(153, EN_BACKUP_FILE_APPENDER_CLOSE, ""); +GLOBAL_ERRSIM_POINT_DEF(154, EN_RESTORE_MACRO_CRC_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(155, EN_BACKUP_DELETE_HANDLE_LS_TASK, ""); +GLOBAL_ERRSIM_POINT_DEF(156, EN_BACKUP_DELETE_MARK_DELETING, ""); +GLOBAL_ERRSIM_POINT_DEF(157, EN_RESTORE_FETCH_CLOG_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(158, EN_BACKUP_LEASE_CAN_TAKEOVER, ""); +GLOBAL_ERRSIM_POINT_DEF(159, EN_BACKUP_EXTERN_INFO_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(160, EN_INCREMENTAL_BACKUP_NUM, ""); +GLOBAL_ERRSIM_POINT_DEF(161, EN_LOG_ARCHIVE_BEFORE_PUSH_LOG_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(162, EN_BACKUP_META_INDEX_BUFFER_NOT_COMPLETED, ""); +GLOBAL_ERRSIM_POINT_DEF(163, EN_BACKUP_MACRO_INDEX_BUFFER_NOT_COMPLETED, ""); +GLOBAL_ERRSIM_POINT_DEF(164, EN_LOG_ARCHIVE_DATA_BUFFER_NOT_COMPLETED, ""); +GLOBAL_ERRSIM_POINT_DEF(165, EN_LOG_ARCHIVE_INDEX_BUFFER_NOT_COMPLETED, ""); +GLOBAL_ERRSIM_POINT_DEF(166, EN_FILE_SYSTEM_RENAME_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(167, EN_BACKUP_OBSOLETE_INTERVAL, ""); +GLOBAL_ERRSIM_POINT_DEF(168, EN_BACKUP_BACKUP_LOG_ARCHIVE_INTERRUPTED, ""); +GLOBAL_ERRSIM_POINT_DEF(169, EN_BACKUP_BACKUPSET_EXTERN_INFO_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(170, EN_BACKUP_SCHEDULER_GET_SCHEMA_VERSION_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(171, EN_BACKUP_BACKUPSET_FILE_TASK, ""); +GLOBAL_ERRSIM_POINT_DEF(172, EN_LOG_ARCHIVE_RESTORE_ACCUM_CHECKSUM_TAMPERED, ""); +GLOBAL_ERRSIM_POINT_DEF(173, EN_BACKUP_BACKUPPIECE_FILE_TASK, ""); +GLOBAL_ERRSIM_POINT_DEF(174, EN_BACKUP_RS_BLOCK_FROZEN_PIECE, ""); +GLOBAL_ERRSIM_POINT_DEF(175, EN_LOG_ARCHIVE_BLOCK_SWITCH_PIECE, ""); +GLOBAL_ERRSIM_POINT_DEF(176, EN_BACKUP_ARCHIVELOG_RPC_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(177, EN_BACKUP_AFTER_UPDATE_EXTERNAL_ROUND_INFO_FOR_USER, ""); +GLOBAL_ERRSIM_POINT_DEF(178, EN_BACKUP_AFTER_UPDATE_EXTERNAL_ROUND_INFO_FOR_SYS, ""); +GLOBAL_ERRSIM_POINT_DEF(179, EN_BACKUP_AFTER_UPDATE_EXTERNAL_BOTH_PIECE_INFO_FOR_USER, ""); +GLOBAL_ERRSIM_POINT_DEF(180, EN_BACKUP_AFTER_UPDATE_EXTERNAL_BOTH_PIECE_INFO_FOR_SYS, ""); +GLOBAL_ERRSIM_POINT_DEF(181, EN_BACKUP_BACKUPPIECE_FINISH_UPDATE_EXTERN_AND_INNER_INFO, ""); +GLOBAL_ERRSIM_POINT_DEF(182, EN_BACKUP_BACKUPPIECE_DO_SCHEDULE, ""); +GLOBAL_ERRSIM_POINT_DEF(183, EN_STOP_TENANT_LOG_ARCHIVE_BACKUP, ""); +GLOBAL_ERRSIM_POINT_DEF(184, EN_BACKUP_SERVER_DISK_IS_FULL, ""); +GLOBAL_ERRSIM_POINT_DEF(185, EN_CHANGE_TENANT_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(186, EN_BACKUP_PERSIST_LS_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(189, EN_BACKUP_VALIDATE_DO_FINISH, ""); +GLOBAL_ERRSIM_POINT_DEF(190, EN_BACKUP_SYS_META_TASK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(191, EN_BACKUP_SYS_TABLET_TASK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(192, EN_BACKUP_DATA_TABLET_MINOR_SSTABLE_TASK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(193, EN_BACKUP_DATA_TABLET_MAJOR_SSTABLE_TASK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(194, EN_BACKUP_BUILD_LS_LEVEL_INDEX_TASK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(195, EN_BACKUP_BUILD_TENANT_LEVEL_INDEX_TASK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(196, EN_BACKUP_PREFETCH_BACKUP_INFO_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(197, EN_BACKUP_COMPLEMENT_LOG_TASK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(198, EN_BACKUP_USER_META_TASK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(199, EN_BACKUP_PREPARE_TASK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(200, EN_BACKUP_CHECK_TABLET_CONTINUITY_FAILED, ""); +// 下面请从201开始 +GLOBAL_ERRSIM_POINT_DEF(201, EN_CHECK_STANDBY_CLUSTER_SCHEMA_CONDITION, ""); +GLOBAL_ERRSIM_POINT_DEF(202, EN_ALLOCATE_LOB_BUF_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(203, EN_ALLOCATE_DESERIALIZE_LOB_BUF_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(204, EN_ENCRYPT_ALLOCATE_HASHMAP_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(205, EN_ENCRYPT_ALLOCATE_ROW_BUF_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(206, EN_ENCRYPT_GET_MASTER_KEY_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(207, EN_DECRYPT_ALLOCATE_ROW_BUF_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(208, EN_DECRYPT_GET_MASTER_KEY_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(209, EN_FAST_MIGRATE_CHANGE_MEMBER_LIST_NOT_BEGIN, ""); +GLOBAL_ERRSIM_POINT_DEF(210, EN_FAST_MIGRATE_CHANGE_MEMBER_LIST_AFTER_REMOVE, ""); +GLOBAL_ERRSIM_POINT_DEF(211, EN_FAST_MIGRATE_CHANGE_MEMBER_LIST_SUCCESS_BUT_TIMEOUT, ""); +GLOBAL_ERRSIM_POINT_DEF(212, EN_SCHEDULE_DATA_MINOR_MERGE, ""); +GLOBAL_ERRSIM_POINT_DEF(213, EN_LOG_SYNC_SLOW, ""); +GLOBAL_ERRSIM_POINT_DEF(214, EN_WRITE_CONFIG_FILE_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(215, EN_INVALID_ADDR_WEAK_READ_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(216, EN_STACK_OVERFLOW_CHECK_EXPR_STACK_SIZE, "Discarded"); +GLOBAL_ERRSIM_POINT_DEF(217, EN_ENABLE_PDML_ALL_FEATURE, ""); +// slog checkpoint错误模拟占坑 218-230 +GLOBAL_ERRSIM_POINT_DEF(218, EN_SLOG_CKPT_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(219, EN_FAST_RECOVERY_AFTER_ALLOC_FILE, ""); +GLOBAL_ERRSIM_POINT_DEF(220, EN_FAST_MIGRATE_ADD_MEMBER_FAIL, ""); +GLOBAL_ERRSIM_POINT_DEF(221, EN_FAST_RECOVERY_BEFORE_ADD_MEMBER, ""); +GLOBAL_ERRSIM_POINT_DEF(222, EN_FAST_RECOVERY_AFTER_ADD_MEMBER, ""); +GLOBAL_ERRSIM_POINT_DEF(223, EN_FAST_RECOVERY_AFTER_REMOVE_MEMBER, ""); +GLOBAL_ERRSIM_POINT_DEF(224, EN_OFS_IO_SUBMIT, "For debugging purposes, deprecated."); +GLOBAL_ERRSIM_POINT_DEF(225, EN_MIGRATE_ADD_PARTITION_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(231, EN_PRINT_QUERY_SQL, ""); +GLOBAL_ERRSIM_POINT_DEF(232, EN_ADD_NEW_PG_TO_PARTITION_SERVICE, ""); +GLOBAL_ERRSIM_POINT_DEF(233, EN_DML_DISABLE_RANDOM_RESHUFFLE, ""); +GLOBAL_ERRSIM_POINT_DEF(234, EN_RESIZE_PHYSICAL_FILE_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(235, EN_ALLOCATE_RESIZE_MEMORY_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(236, EN_WRITE_SUPER_BLOCK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(237, EN_GC_FAILED_PARTICIPANTS, ""); +GLOBAL_ERRSIM_POINT_DEF(238, EN_SSL_INVITE_NODES_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(239, EN_ADD_TRIGGER_SKIP_MAP, ""); +GLOBAL_ERRSIM_POINT_DEF(240, EN_DEL_TRIGGER_SKIP_MAP, ""); +GLOBAL_ERRSIM_POINT_DEF(241, EN_RESET_FREE_MEMORY, ""); +GLOBAL_ERRSIM_POINT_DEF(242, EN_BKGD_TASK_REPORT_COMPLETE, ""); +GLOBAL_ERRSIM_POINT_DEF(243, EN_BKGD_TRANSMIT_CHECK_STATUS_PER_ROW, ""); +GLOBAL_ERRSIM_POINT_DEF(244, EN_OPEN_REMOTE_ASYNC_EXECUTION, ""); +GLOBAL_ERRSIM_POINT_DEF(245, EN_BACKUP_DELETE_EXCEPTION_HANDLING, ""); +GLOBAL_ERRSIM_POINT_DEF(246, EN_SORT_IMPL_FORCE_DO_DUMP, "Used to simulate the scenario of failure to write temporary files"); +GLOBAL_ERRSIM_POINT_DEF(247, EN_ENFORCE_PUSH_DOWN_WF, "Used to enforce pushdown window function regardless of ndv and dop"); +GLOBAL_ERRSIM_POINT_DEF(248, EN_SORT_IMPL_TOPN_EAGER_FILTER, "Used to control whether to use eager filtering to accelerate the top-N operator"); +// +GLOBAL_ERRSIM_POINT_DEF(250, EN_TRANS_SHARED_LOCK_CONFLICT, ""); +GLOBAL_ERRSIM_POINT_DEF(251, EN_HASH_JOIN_OPTION, "Cache aware hash join switch (value & 0x2), and extra bloom filter in hash join switch (value & 0x4)."); +GLOBAL_ERRSIM_POINT_DEF(252, EN_SET_DISABLE_HASH_JOIN_BATCH, ""); +GLOBAL_ERRSIM_POINT_DEF(253, EN_INNER_SQL_CONN_LEAK_CHECK, ""); +GLOBAL_ERRSIM_POINT_DEF(254, EN_ADAPTIVE_GROUP_BY_SMALL_CACHE, "Used to simulate a scenario where hash gby quickly enters the adaptive state"); + +// only work for remote execute +GLOBAL_ERRSIM_POINT_DEF(255, EN_DISABLE_REMOTE_EXEC_WITH_PLAN, ""); +GLOBAL_ERRSIM_POINT_DEF(256, EN_REMOTE_EXEC_ERR, ""); + +GLOBAL_ERRSIM_POINT_DEF(260, EN_XA_PREPARE_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(261, EN_XA_UPDATE_COORD_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(262, EN_XA_PREPARE_RESP_LOST, ""); +GLOBAL_ERRSIM_POINT_DEF(263, EN_XA_RPC_TIMEOUT, ""); +GLOBAL_ERRSIM_POINT_DEF(264, EN_XA_COMMIT_ABORT_RESP_LOST, ""); +GLOBAL_ERRSIM_POINT_DEF(265, EN_XA_1PC_RESP_LOST, ""); +GLOBAL_ERRSIM_POINT_DEF(266, EN_DISK_ERROR, "Deprecated variable"); + + +GLOBAL_ERRSIM_POINT_DEF(267, EN_CLOG_DUMP_ILOG_MEMSTORE_RENAME_FAILURE, ""); +GLOBAL_ERRSIM_POINT_DEF(268, EN_CLOG_ILOG_MEMSTORE_ALLOC_MEMORY_FAILURE, ""); +GLOBAL_ERRSIM_POINT_DEF(269, EN_CLOG_LOG_NOT_IN_SW, ""); +GLOBAL_ERRSIM_POINT_DEF(270, EN_CLOG_PARTITION_IS_NOT_SYNC, ""); +GLOBAL_ERRSIM_POINT_DEF(271, EN_CLOG_LOG_NOT_IN_ILOG_STORAGE, ""); +GLOBAL_ERRSIM_POINT_DEF(272, EN_CLOG_SW_OUT_OF_RANGE, ""); +GLOBAL_ERRSIM_POINT_DEF(273, EN_DFC_FACTOR, ""); +GLOBAL_ERRSIM_POINT_DEF(274, EN_LOGSERVICE_IO_TIMEOUT, ""); + +GLOBAL_ERRSIM_POINT_DEF(275, EN_PARTICIPANTS_SIZE_OVERFLOW, ""); +GLOBAL_ERRSIM_POINT_DEF(276, EN_UNDO_ACTIONS_SIZE_OVERFLOW, ""); +GLOBAL_ERRSIM_POINT_DEF(277, EN_PART_PLUS_UNDO_OVERFLOW, ""); +GLOBAL_ERRSIM_POINT_DEF(278, EN_HANDLE_PREPARE_MESSAGE_EAGAIN, ""); +GLOBAL_ERRSIM_POINT_DEF(279, EN_RC_ONLY_LEADER_TO_LEADER, ""); +GLOBAL_ERRSIM_POINT_DEF(280, EN_REPLAY_SERVICE_SUBMIT_TASK_SLEEP, ""); + +//simulate DAS errors 301-350 +GLOBAL_ERRSIM_POINT_DEF(301, EN_DAS_SCAN_RESULT_OVERFLOW, ""); +GLOBAL_ERRSIM_POINT_DEF(302, EN_DAS_DML_BUFFER_OVERFLOW, ""); +GLOBAL_ERRSIM_POINT_DEF(303, EN_DAS_SIMULATE_OPEN_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(304, EN_DAS_WRITE_ROW_LIST_LEN, ""); +GLOBAL_ERRSIM_POINT_DEF(305, EN_DAS_SIMULATE_VT_CREATE_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(306, EN_DAS_SIMULATE_LOOKUPOP_INIT_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(307, EN_DAS_SIMULATE_ASYNC_RPC_TIMEOUT, ""); +GLOBAL_ERRSIM_POINT_DEF(308, EN_DAS_SIMULATE_DUMP_WRITE_BUFFER, ""); +GLOBAL_ERRSIM_POINT_DEF(309, EN_DAS_SIMULATE_AGG_TASK_BUFF_LIMIT, ""); +GLOBAL_ERRSIM_POINT_DEF(310, EN_DAS_ALL_PARALLEL_TASK_MEM_LIMIT, ""); +GLOBAL_ERRSIM_POINT_DEF(311, EN_DAS_SIMULATE_GROUP_SIZE, ""); +GLOBAL_ERRSIM_POINT_DEF(312, EN_DAS_SIMULATE_DAS_TASK_SIZE, ""); +GLOBAL_ERRSIM_POINT_DEF(313, EN_DAS_SIMULATE_AGG_TASK_MEM_LIMIT, ""); +GLOBAL_ERRSIM_POINT_DEF(314, EN_DAS_SIMULATE_AGG_TASK_RETRY_CODE, ""); +GLOBAL_ERRSIM_POINT_DEF(315, EN_DAS_GROUP_RESCAN_TEST_MODE, ""); +GLOBAL_ERRSIM_POINT_DEF(316, EN_DAS_SIMULATE_MAX_ROWSETS, ""); + +GLOBAL_ERRSIM_POINT_DEF(351, EN_REPLAY_STORAGE_SCHEMA_FAILURE, ""); +GLOBAL_ERRSIM_POINT_DEF(352, EN_SKIP_GET_STORAGE_SCHEMA, ""); +GLOBAL_ERRSIM_POINT_DEF(353, EN_DISABLE_RICH_FORMAT_IN_STORAGE, ""); + +GLOBAL_ERRSIM_POINT_DEF(360, EN_PREVENT_SYNC_REPORT, ""); +GLOBAL_ERRSIM_POINT_DEF(361, EN_PREVENT_ASYNC_REPORT, ""); +GLOBAL_ERRSIM_POINT_DEF(362, EN_REBALANCE_TASK_RETRY, ""); +GLOBAL_ERRSIM_POINT_DEF(363, EN_LOG_IDS_COUNT_ERROR, ""); + +GLOBAL_ERRSIM_POINT_DEF(364, EN_AMM_WASH_RATIO, "Calculate the maximum coarse granularity of washable size"); +GLOBAL_ERRSIM_POINT_DEF(365, EN_ENABLE_THREE_STAGE_AGGREGATE, ""); +GLOBAL_ERRSIM_POINT_DEF(366, EN_ROLLUP_ADAPTIVE_KEY_NUM, ""); +GLOBAL_ERRSIM_POINT_DEF(367, EN_ENABLE_OP_OUTPUT_DATUM_CHECK, "Used to check whether the datum ptr of the operator output is valid"); +GLOBAL_ERRSIM_POINT_DEF(368, EN_LEADER_STORAGE_ESTIMATION, ""); + +// SQL table_scan, index_look_up and other dml_op 400-500 +GLOBAL_ERRSIM_POINT_DEF(400, EN_TABLE_LOOKUP_BATCH_ROW_COUNT, ""); +GLOBAL_ERRSIM_POINT_DEF(401, EN_TABLE_REPLACE_BATCH_ROW_COUNT, ""); +GLOBAL_ERRSIM_POINT_DEF(402, EN_TABLE_INSERT_UP_BATCH_ROW_COUNT, ""); +GLOBAL_ERRSIM_POINT_DEF(403, EN_EXPLAIN_BATCHED_MULTI_STATEMENT, ""); +GLOBAL_ERRSIM_POINT_DEF(404, EN_INS_MULTI_VALUES_BATCH_OPT, ""); +GLOBAL_ERRSIM_POINT_DEF(405, EN_SQL_MEMORY_LABEL_HIGH64, ""); +GLOBAL_ERRSIM_POINT_DEF(406, EN_SQL_MEMORY_LABEL_LOW64, ""); +GLOBAL_ERRSIM_POINT_DEF(407, EN_SQL_MEMORY_DYNAMIC_LEAK_SIZE, ""); + +// DDL related 500-550 +GLOBAL_ERRSIM_POINT_DEF(501, EN_DATA_CHECKSUM_DDL_TASK, ""); +GLOBAL_ERRSIM_POINT_DEF(502, EN_HIDDEN_CHECKSUM_DDL_TASK, ""); +GLOBAL_ERRSIM_POINT_DEF(503, EN_SUBMIT_INDEX_TASK_ERROR_BEFORE_STAT_RECORD, ""); +GLOBAL_ERRSIM_POINT_DEF(504, EN_SUBMIT_INDEX_TASK_ERROR_AFTER_STAT_RECORD, ""); +GLOBAL_ERRSIM_POINT_DEF(505, EN_BUILD_LOCAL_INDEX_WITH_CORRUPTED_DATA, ""); +GLOBAL_ERRSIM_POINT_DEF(506, EN_BUILD_GLOBAL_INDEX_WITH_CORRUPTED_DATA, ""); +GLOBAL_ERRSIM_POINT_DEF(509, EN_EARLY_RESPONSE_SCHEDULER, ""); +GLOBAL_ERRSIM_POINT_DEF(510, EN_DDL_TASK_PROCESS_FAIL_STATUS, ""); +GLOBAL_ERRSIM_POINT_DEF(511, EN_DDL_TASK_PROCESS_FAIL_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(512, EN_DDL_START_FAIL, ""); +GLOBAL_ERRSIM_POINT_DEF(513, EN_DDL_COMPACT_FAIL, ""); +GLOBAL_ERRSIM_POINT_DEF(514, EN_DDL_RELEASE_DDL_KV_FAIL, ""); +GLOBAL_ERRSIM_POINT_DEF(515, EN_DDL_REPORT_CHECKSUM_FAIL, ""); +GLOBAL_ERRSIM_POINT_DEF(516, EN_DDL_REPORT_REPLICA_BUILD_STATUS_FAIL, ""); +GLOBAL_ERRSIM_POINT_DEF(517, EN_DDL_DIRECT_LOAD_WAIT_TABLE_LOCK_FAIL, ""); + +// SQL Optimizer related 551-599 +GLOBAL_ERRSIM_POINT_DEF(551, EN_EXPLAIN_GENERATE_PLAN_WITH_OUTLINE, "Used to enable outline validity check for explain query"); +GLOBAL_ERRSIM_POINT_DEF(552, EN_ENABLE_AUTO_DOP_FORCE_PARALLEL_PLAN, "Used to generate parallel plan with random dop"); +GLOBAL_ERRSIM_POINT_DEF(553, EN_GENERATE_PLAN_WITH_RECONSTRUCT_SQL, "wether to use reconstructed sql to generate plan"); +GLOBAL_ERRSIM_POINT_DEF(554, EN_GENERATE_PLAN_WITH_NLJ, ""); +GLOBAL_ERRSIM_POINT_DEF(555, EN_CHECK_OPERATOR_OUTPUT_ROWS, ""); +GLOBAL_ERRSIM_POINT_DEF(556, EN_GENERATE_RANDOM_PLAN, "Whether the optimizer generates random plans"); +GLOBAL_ERRSIM_POINT_DEF(557, EN_COALESCE_AGGR_IGNORE_COST, ""); + +// 600-700 For PX use +GLOBAL_ERRSIM_POINT_DEF(600, EN_PX_SQC_EXECUTE_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(601, EN_PX_SQC_INIT_FAILED, "Used to simulate the scenario of failure to init sub query coordinator"); +GLOBAL_ERRSIM_POINT_DEF(602, EN_PX_SQC_INIT_PROCESS_FAILED, "Inject error: let sqc init failed"); +GLOBAL_ERRSIM_POINT_DEF(603, EN_PX_PRINT_TARGET_MONITOR_LOG, "whether print debug log of px target monitor module"); +GLOBAL_ERRSIM_POINT_DEF(604, EN_PX_SQC_NOT_REPORT_TO_QC, "Inject error: let sqc not send finish message to qc"); +GLOBAL_ERRSIM_POINT_DEF(605, EN_PX_QC_EARLY_TERMINATE, "Inject error: let PX coordinator quit fastly"); +GLOBAL_ERRSIM_POINT_DEF(606, EN_PX_SINGLE_DFO_NOT_ERASE_DTL_INTERM_RESULT, "Inject error: skip the erase interm result process"); +GLOBAL_ERRSIM_POINT_DEF(607, EN_PX_TEMP_TABLE_NOT_DESTROY_REMOTE_INTERM_RESULT, "Inject error: let interm result of temp table not be cleared"); +GLOBAL_ERRSIM_POINT_DEF(608, EN_PX_NOT_ERASE_P2P_DH_MSG, "Inject error: let runtime filter msg not be erased by PX coordinator"); +GLOBAL_ERRSIM_POINT_DEF(609, EN_PX_SLOW_PROCESS_SQC_FINISH_MSG, "Inject error: let PX slowly process the sqc finish message"); +GLOBAL_ERRSIM_POINT_DEF(610, EN_PX_JOIN_FILTER_NOT_MERGE_MSG, "Inject error: let runtime filter skip the merge process."); +GLOBAL_ERRSIM_POINT_DEF(611, EN_PX_P2P_MSG_REG_DM_FAILED, "Inject error: let runtime filter failed to register into DM."); +GLOBAL_ERRSIM_POINT_DEF(612, EN_PX_JOIN_FILTER_HOLD_MSG, "Inject error: let runtime filter destroy later for a long time."); +GLOBAL_ERRSIM_POINT_DEF(613, EN_PX_DTL_TRACE_LOG_ENABLE, "Deprecated variable"); +GLOBAL_ERRSIM_POINT_DEF(614, EN_PX_DISABLE_RUNTIME_FILTER_EXTRACT_QUERY_RANGE, "Switch: use to disable the feature runtime filter extracting query range"); +GLOBAL_ERRSIM_POINT_DEF(615, EN_PX_MAX_IN_FILTER_QR_COUNT, "Switch: control the max number of query range extract by runtime in filter"); +GLOBAL_ERRSIM_POINT_DEF(616, EN_PX_DISABLE_WHITE_RUNTIME_FILTER, "Switch: used to disable runtime filter pushdown as white filter."); +GLOBAL_ERRSIM_POINT_DEF(617, EN_PX_DISABLE_PD_TOPN_FILTER, ""); +// please add new trace point after 700 or before 600 + +// Compaction Related 700-750 +GLOBAL_ERRSIM_POINT_DEF(700, EN_COMPACTION_DIAGNOSE_TABLE_STORE_UNSAFE_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(701, EN_COMPACTION_DIAGNOSE_CANNOT_MAJOR, ""); +GLOBAL_ERRSIM_POINT_DEF(702, EN_COMPACTION_MERGE_TASK, ""); +GLOBAL_ERRSIM_POINT_DEF(703, EN_MEDIUM_COMPACTION_SUBMIT_CLOG_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(704, EN_MEDIUM_COMPACTION_UPDATE_CUR_SNAPSHOT_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(705, EN_MEDIUM_REPLICA_CHECKSUM_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(706, EN_MEDIUM_CREATE_DAG, ""); +GLOBAL_ERRSIM_POINT_DEF(707, EN_MEDIUM_VERIFY_GROUP_SKIP_SET_VERIFY, ""); +GLOBAL_ERRSIM_POINT_DEF(708, EN_MEDIUM_VERIFY_GROUP_SKIP_COLUMN_CHECKSUM, ""); +GLOBAL_ERRSIM_POINT_DEF(709, EN_SCHEDULE_MEDIUM_COMPACTION, ""); +GLOBAL_ERRSIM_POINT_DEF(710, EN_SCHEDULE_MAJOR_GET_TABLE_SCHEMA, ""); +GLOBAL_ERRSIM_POINT_DEF(711, EN_SKIP_INDEX_MAJOR, ""); +GLOBAL_ERRSIM_POINT_DEF(712, EN_BUILD_DATA_MICRO_BLOCK, ""); +GLOBAL_ERRSIM_POINT_DEF(713, EN_COMPACTION_CO_MERGE_EXE_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(714, EN_COMPACTION_CO_MERGE_SCHEDULE_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(715, EN_COMPACTION_MEDIUM_INIT_PARALLEL_RANGE, ""); +GLOBAL_ERRSIM_POINT_DEF(716, EN_RS_USER_INDEX_CHECKSUM_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(717, EN_RS_CANT_GET_ALL_TABLET_CHECKSUM, ""); +GLOBAL_ERRSIM_POINT_DEF(718, EN_SWAP_TABLET_IN_COMPACTION, ""); +GLOBAL_ERRSIM_POINT_DEF(719, EN_COMPACTION_CO_MERGE_PREPARE_CTX_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(720, EN_COMPACTION_CO_MERGE_PREPARE_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(721, EN_COMPACTION_CO_MERGE_PREPARE_MINOR_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(722, EN_COMPACTION_CO_MERGE_FINISH_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(723, EN_COMPACTION_ITER_TABLET_NOT_EXIST, ""); +GLOBAL_ERRSIM_POINT_DEF(724, EN_COMPACTION_ITER_LS_NOT_EXIST, ""); +GLOBAL_ERRSIM_POINT_DEF(725, EN_COMPACTION_ITER_INVALID_TABLET_ID, ""); +GLOBAL_ERRSIM_POINT_DEF(726, EN_RS_CHECK_SPECIAL_TABLE, ""); +GLOBAL_ERRSIM_POINT_DEF(727, EN_COMPACTION_REPORT_ADD_TASK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(728, EN_COMPACTION_REPORT_PROCESS_TASK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(729, EN_RS_CHECK_MERGE_PROGRESS, ""); +GLOBAL_ERRSIM_POINT_DEF(730, EN_CAN_NOT_SCHEDULE_MINOR, ""); +GLOBAL_ERRSIM_POINT_DEF(731, EN_SCHEDULE_MEDIUM_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(732, EN_SPECIAL_TABLE_HAVE_LARGER_SCN, ""); +GLOBAL_ERRSIM_POINT_DEF(733, EN_COMPACTION_CO_PUSH_TABLES_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(734, EN_COMPACTION_CO_MERGE_PARTITION_LONG_TIME, ""); +GLOBAL_ERRSIM_POINT_DEF(735, EN_COMPACTION_SCHEDULE_META_MERGE, ""); +GLOBAL_ERRSIM_POINT_DEF(736, EN_COMPACTION_ESTIMATE_ROW_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(737, EN_COMPACTION_UPDATE_REPORT_SCN, ""); +GLOBAL_ERRSIM_POINT_DEF(738, EN_CO_MREGE_DAG_READY_FOREVER, ""); +GLOBAL_ERRSIM_POINT_DEF(739, EN_CO_MREGE_DAG_SCHEDULE_REST, ""); +GLOBAL_ERRSIM_POINT_DEF(740, EN_COMPACTION_SCHEDULE_MEDIUM_MERGE_AFTER_MINI, ""); +GLOBAL_ERRSIM_POINT_DEF(741, EN_COMPACTION_MEDIUM_INIT_LARGE_PARALLEL_RANGE, ""); +GLOBAL_ERRSIM_POINT_DEF(742, EN_GET_TABLET_LS_PAIR_IN_RS, ""); + +// please add new trace point after 750 +GLOBAL_ERRSIM_POINT_DEF(751, EN_SESSION_LEAK_COUNT_THRESHOLD, "used to control the threshold of report session leak ERROR"); +GLOBAL_ERRSIM_POINT_DEF(800, EN_END_PARTICIPANT, ""); + +//LS Migration Related 900 - 1000 +GLOBAL_ERRSIM_POINT_DEF(900, EN_INITIAL_MIGRATION_TASK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(901, EN_START_MIGRATION_TASK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(902, EN_SYS_TABLETS_MIGRATION_TASK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(903, EN_DATA_TABLETS_MIGRATION_TASK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(904, EN_TABLET_GROUP_MIGRATION_TASK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(905, EN_TABLET_MIGRATION_TASK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(906, EN_MIGRATION_FINISH_TASK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(907, EN_MIGRATION_READ_REMOTE_MACRO_BLOCK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(908, EN_MIGRATION_ENABLE_LOG_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(909, EN_MIGRATION_ENABLE_VOTE_RETRY, ""); +GLOBAL_ERRSIM_POINT_DEF(910, EN_MIGRATION_ENABLE_VOTE_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(911, EN_MIGRATION_COPY_MACRO_BLOCK_NUM, ""); +GLOBAL_ERRSIM_POINT_DEF(912, EN_FINISH_TABLET_GROUP_RESTORE_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(913, EN_MIGRATION_ONLINE_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(914, EN_MIGRATION_GENERATE_SYS_TABLETS_DAG_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(915, EN_COPY_MAJOR_SNAPSHOT_VERSION, ""); +GLOBAL_ERRSIM_POINT_DEF(916, EN_TABLET_MIGRATION_DAG_INNER_RETRY, ""); +GLOBAL_ERRSIM_POINT_DEF(917, EN_LS_REBUILD_PREPARE_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(918, EN_TABLET_GC_TASK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(919, EN_UPDATE_TABLET_HA_STATUS_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(920, EN_GENERATE_REBUILD_TASK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(921, EN_CHECK_TRANSFER_TASK_EXSIT, ""); +GLOBAL_ERRSIM_POINT_DEF(922, EN_TABLET_EMPTY_SHELL_TASK_FAILED, ""); + +// Log Archive and Restore 1001 - 1100 +GLOBAL_ERRSIM_POINT_DEF(1001, EN_START_ARCHIVE_LOG_GAP, ""); +GLOBAL_ERRSIM_POINT_DEF(1002, EN_RESTORE_LOG_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(1003, EN_RESTORE_LOG_FROM_SOURCE_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(1004, EN_BACKUP_MULTIPLE_MACRO_BLOCK, ""); +GLOBAL_ERRSIM_POINT_DEF(1005, EN_RESTORE_FETCH_TABLET_INFO, ""); +GLOBAL_ERRSIM_POINT_DEF(1006, EN_RESTORE_COPY_MACRO_BLOCK_NUM, ""); + +// START OF STORAGE HA - 1101 - 2000 +GLOBAL_ERRSIM_POINT_DEF(1101, EN_BACKUP_META_REPORT_RESULT_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(1102, EN_RESTORE_LS_INIT_PARAM_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(1103, EN_RESTORE_TABLET_INIT_PARAM_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(1104, EN_ADD_BACKUP_META_DAG_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(1105, EN_ADD_BACKUP_DATA_DAG_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(1106, EN_ADD_BACKUP_BUILD_INDEX_DAG_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(1107, EN_ADD_BACKUP_PREPARE_DAG_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(1108, EN_ADD_BACKUP_FINISH_DAG_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(1109, EN_ADD_BACKUP_PREFETCH_DAG_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(1110, EN_BACKUP_PERSIST_SET_TASK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(1111, EN_BACKUP_READ_MACRO_BLOCK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(1112, EN_FETCH_TABLE_INFO_RPC, ""); +GLOBAL_ERRSIM_POINT_DEF(1113, EN_RESTORE_TABLET_TASK_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(1114, EN_INSERT_USER_RECOVER_JOB_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(1115, EN_INSERT_AUX_TENANT_RESTORE_JOB_FAILED, ""); +GLOBAL_ERRSIM_POINT_DEF(1116, EN_RESTORE_CREATE_LS_FAILED, ""); +// END OF STORAGE HA - 1101 - 2000 + +// sql parameterization 1170-1180 +GLOBAL_ERRSIM_POINT_DEF(1170, EN_SQL_PARAM_FP_NP_NOT_SAME_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(1171, EN_FLUSH_PC_NOT_CLEANUP_LEAK_MEM_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(1172, EN_PC_NOT_SWALLOW_ERROR, ""); +// END OF sql parameterization 1170-1180 + +// session info verification +// The types are used for error verification +GLOBAL_ERRSIM_POINT_DEF(1180, EN_SESS_INFO_VERI_SYS_VAR_ERROR, "Used for session self-verification"); +GLOBAL_ERRSIM_POINT_DEF(1181, EN_SESS_INFO_VERI_APP_INFO_ERROR, "Used for session self-verification"); +GLOBAL_ERRSIM_POINT_DEF(1182, EN_SESS_INFO_VERI_APP_CTX_ERROR, "Used for session self-verification"); +GLOBAL_ERRSIM_POINT_DEF(1183, EN_SESS_INFO_VERI_CLIENT_ID_ERROR, "Used for session self-verification"); +GLOBAL_ERRSIM_POINT_DEF(1184, EN_SESS_INFO_VERI_CONTROL_INFO_ERROR, "Used for session self-verification"); +GLOBAL_ERRSIM_POINT_DEF(1185, EN_SESS_INFO_VERI_TXN_EXTRA_INFO_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(1186, EN_SESS_POOL_MGR_CTRL, "Used for session pool use"); +// session info diagnosis control +GLOBAL_ERRSIM_POINT_DEF(1187, EN_SESS_INFO_DIAGNOSIS_CONTROL, ""); +GLOBAL_ERRSIM_POINT_DEF(1188, EN_SESS_CLEAN_KILL_MAP_TIME, "Used to clean up kill session map time control"); + // sql audit background thread stuck +GLOBAL_ERRSIM_POINT_DEF(1189, EN_SQL_AUDIT_RELEASE_BACK_THREAD_STUCK, ""); +GLOBAL_ERRSIM_POINT_DEF(1190, EN_SQL_AUDIT_CONSTRUCT_BACK_THREAD_STUCK, ""); +GLOBAL_ERRSIM_POINT_DEF(1200, EN_ENABLE_NEWSORT_FORCE, ""); + +// Transaction // 2001 - 2100 +// Transaction free route +GLOBAL_ERRSIM_POINT_DEF(2001, EN_TX_FREE_ROUTE_UPDATE_STATE_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(2002, EN_TX_FREE_ROUTE_ENCODE_STATE_ERROR, ""); +GLOBAL_ERRSIM_POINT_DEF(2003, EN_TX_FREE_ROUTE_STATE_SIZE, ""); +// Transaction common +GLOBAL_ERRSIM_POINT_DEF(2011, EN_TX_RESULT_INCOMPLETE, ""); +GLOBAL_ERRSIM_POINT_DEF(2013, EN_CHECK_TX_CTX_LOCK, ""); +GLOBAL_ERRSIM_POINT_DEF(2022, EN_THREAD_HANG, ""); + +GLOBAL_ERRSIM_POINT_DEF(2100, EN_ENABLE_SET_TRACE_CONTROL_INFO, ""); +GLOBAL_ERRSIM_POINT_DEF(2101, EN_CHEN, ""); +GLOBAL_ERRSIM_POINT_DEF(2102, EN_ENABLE_TABLE_LOCK, ""); +GLOBAL_ERRSIM_POINT_DEF(2103, EN_ENABLE_ROWKEY_CONFLICT_CHECK, ""); +GLOBAL_ERRSIM_POINT_DEF(2104, EN_ENABLE_ORA_DECINT_CONST, "wether to parse constant numerics as ObDecimalIntType in orace mode"); +GLOBAL_ERRSIM_POINT_DEF(2105, EN_ENABLE_CLEAN_INTERM_RES, "Used to control whether interm results are cleaned up in exceptional circumstances."); +GLOBAL_ERRSIM_POINT_DEF(2106, EN_UNIQ_TASK_QUEUE_GET_GROUP_FAIL, ""); + +GLOBAL_ERRSIM_POINT_DEF(2200, EN_DISABLE_VEC_SORT, "Used to control whether to turn off the vectorization 2.0 sort operator. It is turned on by default."); +GLOBAL_ERRSIM_POINT_DEF(2201, EN_DISABLE_VEC_HASH_DISTINCT, "Used to control whether to turn off the vectorization 2.0 hash distinct operator. It is turned on by default."); +GLOBAL_ERRSIM_POINT_DEF(2202, EN_DISABLE_VEC_HASH_JOIN, "Used to control whether to turn off the vectorization 2.0 when use Hash Join Operator"); +GLOBAL_ERRSIM_POINT_DEF(2203, EN_DISABLE_VEC_HASH_GROUP_BY, "Used to control whether to turn off the vectorization 2.0 when use Hash Group By Operator"); +GLOBAL_ERRSIM_POINT_DEF(2204, EN_DISABLE_VEC_SCALAR_GROUP_BY, "wether to use scalar groupby operator of vectorization 2.0"); +GLOBAL_ERRSIM_POINT_DEF(2205, EN_DTL_OPTION, "Control DTL Vectorization 2.0 format"); +GLOBAL_ERRSIM_POINT_DEF(2206, EN_ENABLE_RANDOM_BATCH_SIZE, "Used to random batch size in vectorization"); +GLOBAL_ERRSIM_POINT_DEF(2207, EN_ENABLE_VECTOR_CAST, "wether to use casting functions of vectorization 2.0"); +GLOBAL_ERRSIM_POINT_DEF(2208, EN_DISABLE_SORTKEY_SEPARATELY, "Used to control whether to turn off the separate storage of sort keys and addon fields. It is enabled by default."); +GLOBAL_ERRSIM_POINT_DEF(2209, EN_ENABLE_VECTOR_IN, "Used to control whether the capability for in-expr vectorization 2.0 is enabled."); +GLOBAL_ERRSIM_POINT_DEF(2210, EN_SQL_MEMORY_MRG_OPTION, "Control automatic memory management global bound size"); +GLOBAL_ERRSIM_POINT_DEF(2211, EN_ENABLE_RANDOM_TSC, "wether to randomize batch_size & skips of table scan's output "); +// WR && ASH +GLOBAL_ERRSIM_POINT_DEF(2301, EN_CLOSE_ASH, ""); +GLOBAL_ERRSIM_POINT_DEF(2302, EN_DISABLE_HASH_BASE_DISTINCT, ""); +GLOBAL_ERRSIM_POINT_DEF(2304, EN_TRACEPOINT_TEST, "For testing new versions of tracepoint"); + +#endif /*GLOBAL_ERRSIM_POINT_DEF*/ \ No newline at end of file diff --git a/src/observer/CMakeLists.txt b/src/observer/CMakeLists.txt index f9fefecc45..9097e6c5e5 100644 --- a/src/observer/CMakeLists.txt +++ b/src/observer/CMakeLists.txt @@ -254,6 +254,7 @@ ob_set_subtarget(ob_server virtual_table virtual_table/ob_all_virtual_ls_info.cpp virtual_table/ob_all_virtual_ls_snapshot.cpp virtual_table/ob_all_virtual_timestamp_service.cpp + virtual_table/ob_all_virtual_tracepoint_info.cpp virtual_table/ob_all_virtual_transaction_freeze_checkpoint.cpp virtual_table/ob_all_virtual_transaction_checkpoint.cpp virtual_table/ob_all_virtual_checkpoint.cpp diff --git a/src/observer/mysql/obmp_base.cpp b/src/observer/mysql/obmp_base.cpp index 5c1b86ff4b..07fca0e0b7 100644 --- a/src/observer/mysql/obmp_base.cpp +++ b/src/observer/mysql/obmp_base.cpp @@ -390,7 +390,12 @@ int ObMPBase::do_after_process(sql::ObSQLSessionInfo &session, bool async_resp_used) const { int ret = OB_SUCCESS; - + if (session.get_is_in_retry()) { + // do nothing. + } else { + session.set_is_request_end(true); + session.set_retry_active_time(0); + } // reset warning buffers // 注意,此处req_has_wokenup_可能为true,不能再访问req对象 // @todo 重构wb逻辑 diff --git a/src/observer/mysql/obmp_stmt_execute.cpp b/src/observer/mysql/obmp_stmt_execute.cpp index c31a5bb88b..12e4c684a7 100644 --- a/src/observer/mysql/obmp_stmt_execute.cpp +++ b/src/observer/mysql/obmp_stmt_execute.cpp @@ -1039,6 +1039,7 @@ int ObMPStmtExecute::set_session_active(ObSQLSessionInfo &session) const session.set_query_start_time(get_receive_timestamp()); session.set_mysql_cmd(obmysql::COM_STMT_EXECUTE); session.update_last_active_time(); + session.set_is_request_end(false); } return ret; } diff --git a/src/observer/mysql/obmp_stmt_fetch.cpp b/src/observer/mysql/obmp_stmt_fetch.cpp index d3c68ad2f9..5586ecdca4 100644 --- a/src/observer/mysql/obmp_stmt_fetch.cpp +++ b/src/observer/mysql/obmp_stmt_fetch.cpp @@ -151,6 +151,7 @@ int ObMPStmtFetch::set_session_active(ObSQLSessionInfo &session) const session.set_query_start_time(get_receive_timestamp()); session.set_mysql_cmd(obmysql::COM_STMT_FETCH); session.update_last_active_time(); + session.set_is_request_end(false); } return ret; } diff --git a/src/observer/ob_service.cpp b/src/observer/ob_service.cpp index 950ac211da..9520b97baf 100644 --- a/src/observer/ob_service.cpp +++ b/src/observer/ob_service.cpp @@ -2126,15 +2126,20 @@ int ObService::set_tracepoint(const obrpc::ObAdminSetTPArg &arg) ret = OB_NOT_INIT; LOG_WARN("not init", K(ret)); } else { + EventItem item; + item.error_code_ = arg.error_code_; + item.occur_ = arg.occur_; + item.trigger_freq_ = arg.trigger_freq_; + item.cond_ = arg.cond_; if (arg.event_name_.length() > 0) { ObSqlString str; if (OB_FAIL(str.assign(arg.event_name_))) { LOG_WARN("string assign failed", K(ret)); - } else { - TP_SET_EVENT(str.ptr(), arg.error_code_, arg.occur_, arg.trigger_freq_, arg.cond_); + } else if (OB_FAIL(EventTable::instance().set_event(str.ptr(), item))) { + LOG_WARN("Failed to set tracepoint event, tp_name does not exist.", K(ret), K(arg.event_name_)); } - } else { - TP_SET_EVENT(arg.event_no_, arg.error_code_, arg.occur_, arg.trigger_freq_, arg.cond_); + } else if (OB_FAIL(EventTable::instance().set_event(arg.event_no_, item))) { + LOG_WARN("Failed to set tracepoint event, tp_no does not exist.", K(ret), K(arg.event_no_)); } LOG_INFO("set event", K(arg)); } diff --git a/src/observer/virtual_table/ob_all_virtual_archive_dest_status.cpp b/src/observer/virtual_table/ob_all_virtual_archive_dest_status.cpp index 7638fd1e51..0828bbe882 100644 --- a/src/observer/virtual_table/ob_all_virtual_archive_dest_status.cpp +++ b/src/observer/virtual_table/ob_all_virtual_archive_dest_status.cpp @@ -19,12 +19,14 @@ #include "lib/ob_errno.h" #include "lib/oblog/ob_log_module.h" #include "lib/string/ob_sql_string.h" +#include "lib/mysqlclient/ob_mysql_result.h" #include "lib/mysqlclient/ob_mysql_proxy.h" #include "ob_all_virtual_ls_archive_stat.h" #include "logservice/archiveservice/ob_archive_service.h" #include "share/backup/ob_archive_struct.h" using namespace oceanbase::share; +using namespace oceanbase::common::sqlclient; namespace oceanbase { @@ -646,4 +648,4 @@ int ObVirtualArchiveDestStatus::get_log_archive_used_piece_id_(const uint64_t te return ret; } }// end namespace observer -}// end namespace oceanbase \ No newline at end of file +}// end namespace oceanbase diff --git a/src/observer/virtual_table/ob_all_virtual_archive_dest_status.h b/src/observer/virtual_table/ob_all_virtual_archive_dest_status.h index 908271c6e4..23a98e9641 100644 --- a/src/observer/virtual_table/ob_all_virtual_archive_dest_status.h +++ b/src/observer/virtual_table/ob_all_virtual_archive_dest_status.h @@ -98,4 +98,4 @@ private: }; }//end namespace observer }//end namespace oceanbase -#endif //OCEANBASE_OBSERVER_OB_ALL_VIRTUAL_ARCHIVE_DEST_STATUS_H_ \ No newline at end of file +#endif //OCEANBASE_OBSERVER_OB_ALL_VIRTUAL_ARCHIVE_DEST_STATUS_H_ diff --git a/src/observer/virtual_table/ob_all_virtual_session_info.cpp b/src/observer/virtual_table/ob_all_virtual_session_info.cpp index ac2a9fce37..9cbf613161 100644 --- a/src/observer/virtual_table/ob_all_virtual_session_info.cpp +++ b/src/observer/virtual_table/ob_all_virtual_session_info.cpp @@ -54,7 +54,8 @@ int ObAllVirtualSessionInfo::inner_get_next_row(ObNewRow *&row) session_, &cur_row_, output_column_ids_, - schema_guard_))) { + schema_guard_, + table_schema_))) { SERVER_LOG(WARN, "init fill_scanner fail", K(ret)); } else if (OB_FAIL(session_mgr_->for_each_hold_session(fill_scanner_))) { SERVER_LOG(WARN, "fill scanner fail", K(ret)); @@ -110,11 +111,23 @@ int ObAllVirtualSessionInfo::FillScanner::operator()( char peer_buf[common::OB_IP_PORT_STR_BUFF]; char sql_id[common::OB_MAX_SQL_ID_LENGTH + 1]; //If you are in system tenant, you can see all thread. - if (true) { + if ((OB_SYS_TENANT_ID == my_session_->get_priv_tenant_id()) + || (sess_info->get_priv_tenant_id() == my_session_->get_priv_tenant_id())) { ObSQLSessionInfo::LockGuard lock_guard(sess_info->get_thread_data_lock()); const int64_t col_count = output_column_ids_.count(); ObCharsetType default_charset = ObCharset::get_default_charset(); ObCollationType default_collation = ObCharset::get_default_collation(default_charset); + // for compatibility,the time type of the new version is converted from int to double + bool type_is_double = true; + const ObColumnSchemaV2 *tmp_column_schema = NULL; + if (OB_ISNULL(table_schema_) || + OB_ISNULL(tmp_column_schema = table_schema_->get_column_schema("TIME"))) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "table or column schema is null", KR(ret), KP(table_schema_), KP(tmp_column_schema)); + } else { + type_is_double = tmp_column_schema->get_meta_type().is_double(); + } + int64_t current_time = ::oceanbase::common::ObTimeUtility::current_time(); for (int64_t i = 0; OB_SUCC(ret) && i < col_count; ++i) { uint64_t col_id = output_column_ids_.at(i); switch(col_id) { @@ -173,8 +186,14 @@ int ObAllVirtualSessionInfo::FillScanner::operator()( break; } case TIME: { - int64_t time_sec = (::oceanbase::common::ObTimeUtility::current_time() - sess_info->get_cur_state_start_time()) / 1000000; - cur_row_->cells_[cell_idx].set_int(time_sec); + if (type_is_double) { + double time_sec = (static_cast (current_time - sess_info->get_cur_state_start_time())) / 1000000; + cur_row_->cells_[cell_idx].set_double(time_sec); + cur_row_->cells_[cell_idx].set_scale(6); + } else { + int64_t time_sec = (current_time - sess_info->get_cur_state_start_time()) / 1000000; + cur_row_->cells_[cell_idx].set_int(time_sec); + } break; } case STATE: { @@ -304,7 +323,14 @@ int ObAllVirtualSessionInfo::FillScanner::operator()( break; } case TOTAL_CPU_TIME: { - cur_row_->cells_[cell_idx].set_double(0); + if (ObSQLSessionState::QUERY_ACTIVE == sess_info->get_session_state()) { + // time_sec = current time - sql packet received from easy time + double time_sec = (static_cast (sess_info->get_retry_active_time() + current_time - sess_info->get_cur_state_start_time())) / 1000000; + cur_row_->cells_[cell_idx].set_double(time_sec); + } else { + double time_sec = (static_cast (sess_info->get_retry_active_time())) / 1000000; + cur_row_->cells_[cell_idx].set_double(time_sec); + } cur_row_->cells_[cell_idx].set_scale(6); break; } @@ -334,7 +360,9 @@ void ObAllVirtualSessionInfo::FillScanner::reset() cur_row_ = NULL; my_session_ = NULL; trace_id_[0] = '\0'; + schema_guard_ = NULL; output_column_ids_.reset(); + table_schema_ = NULL; } int ObAllVirtualSessionInfo::FillScanner::init(ObIAllocator *allocator, @@ -342,16 +370,19 @@ int ObAllVirtualSessionInfo::FillScanner::init(ObIAllocator *allocator, sql::ObSQLSessionInfo *session_info, common::ObNewRow *cur_row, const ObIArray &column_ids, - share::schema::ObSchemaGetterGuard* schema_guard) + share::schema::ObSchemaGetterGuard* schema_guard, + const share::schema::ObTableSchema *table_schema) { int ret = OB_SUCCESS; if (OB_UNLIKELY(NULL == allocator || NULL == scanner || NULL == cur_row - || NULL == session_info)) { + || NULL == session_info + || NULL == table_schema)) { ret = OB_NOT_INIT; SERVER_LOG(WARN, - "some parameter is NULL", K(ret), K(allocator), K(scanner), K(cur_row), K(session_info)); + "some parameter is NULL", K(ret), K(allocator), K(scanner), K(cur_row), + K(session_info), K(table_schema)); } else if (OB_FAIL(output_column_ids_.assign(column_ids))) { SQL_ENG_LOG(WARN, "fail to assign output column ids", K(ret), K(column_ids)); } else { @@ -360,7 +391,7 @@ int ObAllVirtualSessionInfo::FillScanner::init(ObIAllocator *allocator, cur_row_ = cur_row; my_session_ = session_info; schema_guard_ = schema_guard; - + table_schema_ = table_schema; } return ret; } diff --git a/src/observer/virtual_table/ob_all_virtual_session_info.h b/src/observer/virtual_table/ob_all_virtual_session_info.h index d72b6af3f7..93bc8324f5 100644 --- a/src/observer/virtual_table/ob_all_virtual_session_info.h +++ b/src/observer/virtual_table/ob_all_virtual_session_info.h @@ -73,7 +73,9 @@ private: scanner_(NULL), cur_row_(NULL), my_session_(NULL), - output_column_ids_() + schema_guard_(NULL), + output_column_ids_(), + table_schema_(NULL) { trace_id_[0] = '\0'; } @@ -84,7 +86,8 @@ private: sql::ObSQLSessionInfo * session_info, common::ObNewRow *cur_row, const ObIArray &column_ids, - share::schema::ObSchemaGetterGuard* schema_guard); + share::schema::ObSchemaGetterGuard* schema_guard, + const share::schema::ObTableSchema *table_schema); inline void reset(); private: ObIAllocator *allocator_; @@ -94,6 +97,7 @@ private: share::schema::ObSchemaGetterGuard* schema_guard_; ObSEArray output_column_ids_; char trace_id_[common::OB_MAX_TRACE_ID_BUFFER_SIZE]; + const share::schema::ObTableSchema *table_schema_; DISALLOW_COPY_AND_ASSIGN(FillScanner); }; sql::ObSQLSessionMgr *session_mgr_; diff --git a/src/observer/virtual_table/ob_all_virtual_tracepoint_info.cpp b/src/observer/virtual_table/ob_all_virtual_tracepoint_info.cpp new file mode 100644 index 0000000000..690679be32 --- /dev/null +++ b/src/observer/virtual_table/ob_all_virtual_tracepoint_info.cpp @@ -0,0 +1,152 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#include "observer/virtual_table/ob_all_virtual_tracepoint_info.h" +#include "observer/ob_server_utils.h" + +namespace oceanbase +{ +using namespace common; +using namespace sql; +namespace observer +{ + +ObAllTracepointInfo::ObAllTracepointInfo(): addr_(NULL) +{ +} + +ObAllTracepointInfo::~ObAllTracepointInfo() +{ +} + +void ObAllTracepointInfo::reset() +{ + addr_ = NULL; +} + +int ObAllTracepointInfo::get_rows_from_tracepoint_info_list() +{ + int ret = OB_SUCCESS; + ObString addr_ip; + ObObj *cells = NULL; + if (OB_FAIL(ObServerUtils::get_server_ip(allocator_, addr_ip))) { + SERVER_LOG(ERROR, "get server ip failed", K(ret)); + } else if (OB_ISNULL(cells = cur_row_.cells_)) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "cur row cell is NULL", K(ret)); + } else { + DLIST_FOREACH_NORET(cur_tp_event, EventTable::global_item_list()) { + for (int64_t cell_idx = 0; OB_SUCC(ret) && + cell_idx < output_column_ids_.count(); ++cell_idx) { + const uint64_t column_id = output_column_ids_.at(cell_idx); + switch (column_id) { + case ObAllTracepointInfo::INSPECT_COLUMN::SVR_IP: { + cells[cell_idx].set_varchar(addr_ip); + cells[cell_idx].set_collation_type( + ObCharset::get_default_collation(ObCharset::get_default_charset())); + break; + } + case ObAllTracepointInfo::INSPECT_COLUMN::SVR_PORT: { + cells[cell_idx].set_int(addr_->get_port()); + break; + } + case ObAllTracepointInfo::INSPECT_COLUMN::TP_NO: { + cells[cell_idx].set_int(cur_tp_event->item_.no_); + break; + } + case ObAllTracepointInfo::INSPECT_COLUMN::TP_NAME: { + cells[cell_idx].set_varchar(cur_tp_event->item_.name_); + cells[cell_idx].set_collation_type( + ObCharset::get_default_collation(ObCharset::get_default_charset())); + break; + } + case ObAllTracepointInfo::INSPECT_COLUMN::TP_DESCRIBE: { + cells[cell_idx].set_varchar(cur_tp_event->item_.describe_); + cells[cell_idx].set_collation_type( + ObCharset::get_default_collation(ObCharset::get_default_charset())); + break; + } + case ObAllTracepointInfo::INSPECT_COLUMN::TP_FREQUENCY: { + cells[cell_idx].set_int(cur_tp_event->item_.trigger_freq_); + break; + } + case ObAllTracepointInfo::INSPECT_COLUMN::TP_ERROR_CODE: { + cells[cell_idx].set_int(cur_tp_event->item_.error_code_); + break; + } + case ObAllTracepointInfo::INSPECT_COLUMN::TP_OCCUR: { + cells[cell_idx].set_int(cur_tp_event->item_.occur_); + break; + } + case ObAllTracepointInfo::INSPECT_COLUMN::TP_MATCH: { + cells[cell_idx].set_int(cur_tp_event->item_.cond_); + break; + } + default: { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "invalid column id", K(cell_idx), + K_(output_column_ids), K(ret)); + break; + } + } + } + if (OB_SUCC(ret) && OB_FAIL(scanner_.add_row(cur_row_))) { + SERVER_LOG(WARN, "fail to add row", K(ret), K(cur_row_)); + } + } + } + return ret; +} + +int ObAllTracepointInfo::inner_get_next_row(ObNewRow *&row) +{ + int ret = OB_SUCCESS; + ObObj *cells = cur_row_.cells_; + if (!start_to_read_) { + if (OB_FAIL(fill_scanner())) { + SERVER_LOG(WARN, "fill scanner failed", K(ret)); + } else { + start_to_read_ = true; + } + } + + if (OB_SUCC(ret) && start_to_read_) { + if (OB_FAIL(scanner_it_.get_next_row(cur_row_))) { + if (OB_ITER_END != ret) { + SERVER_LOG(WARN, "fail to get next row", K(ret)); + } + } else { + row = &cur_row_; + } + } + return ret; +} + +int ObAllTracepointInfo::fill_scanner() +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(allocator_) || OB_ISNULL(addr_) || OB_ISNULL(session_)) { + ret = OB_NOT_INIT; + SERVER_LOG(WARN, "allocator_ or addr_ is null", K_(allocator), K_(addr), K(ret)); + } else { + if (OB_FAIL(get_rows_from_tracepoint_info_list())) { + SERVER_LOG(WARN, "get rows from tracepoint_info_list failed", K(ret)); + } else { + scanner_it_ = scanner_.begin(); + start_to_read_ = true; + } + } + return ret; +} + +}/* ns observer*/ +}/* ns oceanbase */ diff --git a/src/observer/virtual_table/ob_all_virtual_tracepoint_info.h b/src/observer/virtual_table/ob_all_virtual_tracepoint_info.h new file mode 100644 index 0000000000..20ed46bd49 --- /dev/null +++ b/src/observer/virtual_table/ob_all_virtual_tracepoint_info.h @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#ifndef OCEANBASE_OBSERVER_VIRTUAL_TABLE_ALL_TRACEPOINT_INFO_ +#define OCEANBASE_OBSERVER_VIRTUAL_TABLE_ALL_TRACEPOINT_INFO_ + +#include "share/ob_virtual_table_scanner_iterator.h" +#include "lib/net/ob_addr.h" +#include "lib/utility/ob_tracepoint.h" + +namespace oceanbase +{ +namespace observer +{ + +class ObAllTracepointInfo : public common::ObVirtualTableScannerIterator +{ +public: + ObAllTracepointInfo(); + virtual ~ObAllTracepointInfo(); + virtual void reset(); + virtual int inner_get_next_row(common::ObNewRow *&row) override; + inline void set_addr(common::ObAddr &addr) { addr_ = &addr; } +private: + common::ObAddr *addr_; + enum INSPECT_COLUMN + { + SVR_IP = common::OB_APP_MIN_COLUMN_ID, + SVR_PORT, + TP_NO, + TP_NAME, + TP_DESCRIBE, + TP_FREQUENCY, + TP_ERROR_CODE, + TP_OCCUR, + TP_MATCH, + }; +private: + int fill_scanner(); + int get_rows_from_tracepoint_info_list(); + DISALLOW_COPY_AND_ASSIGN(ObAllTracepointInfo); +}; + + +} // namespace observer +} // namespace oceanbase +#endif // OCEANBASE_OBSERVER_VIRTUAL_TABLE_ALL_TRACEPOINT_INFO_ diff --git a/src/observer/virtual_table/ob_show_processlist.cpp b/src/observer/virtual_table/ob_show_processlist.cpp index cbb7b678b7..abf82c0481 100644 --- a/src/observer/virtual_table/ob_show_processlist.cpp +++ b/src/observer/virtual_table/ob_show_processlist.cpp @@ -57,7 +57,8 @@ int ObShowProcesslist::inner_get_next_row(ObNewRow *&row) session_, &cur_row_, output_column_ids_, - schema_guard_))) { + schema_guard_, + table_schema_))) { SERVER_LOG(WARN, "init fill_scanner fail", K(ret)); } else if (OB_FAIL(session_mgr_->for_each_session(fill_scanner_))) { SERVER_LOG(WARN, "fill scanner fail", K(ret)); @@ -136,6 +137,16 @@ bool ObShowProcesslist::FillScanner::operator()(sql::ObSQLSessionMgr::Key key, O char ip_buf[common::OB_IP_STR_BUFF]; char peer_buf[common::OB_IP_PORT_STR_BUFF]; char sql_id[common::OB_MAX_SQL_ID_LENGTH + 1]; + // for compatibility,the time type of the new version is converted from int to double + bool type_is_double = true; + const ObColumnSchemaV2 *tmp_column_schema = NULL; + if (OB_ISNULL(table_schema_) || + OB_ISNULL(tmp_column_schema = table_schema_->get_column_schema("TIME"))) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "table or column schema is null", KR(ret), KP(table_schema_), KP(tmp_column_schema)); + } else { + type_is_double = tmp_column_schema->get_meta_type().is_double(); + } //If you are in system tenant, you can see all thread. //Otherwise, you can show only the threads at the same Tenant with you. //If you have the PROCESS privilege, you can show all threads at your Tenant. @@ -151,6 +162,7 @@ bool ObShowProcesslist::FillScanner::operator()(sql::ObSQLSessionMgr::Key key, O const int64_t col_count = output_column_ids_.count(); ObCharsetType default_charset = ObCharset::get_default_charset(); ObCollationType default_collation = ObCharset::get_default_collation(default_charset); + int64_t current_time = ::oceanbase::common::ObTimeUtility::current_time(); for (int64_t i = 0; OB_SUCC(ret) && i < col_count; ++i) { uint64_t col_id = output_column_ids_.at(i); switch(col_id) { @@ -216,8 +228,15 @@ bool ObShowProcesslist::FillScanner::operator()(sql::ObSQLSessionMgr::Key key, O break; } case TIME: { - int64_t time_sec = (::oceanbase::common::ObTimeUtility::current_time() - sess_info->get_cur_state_start_time()) / 1000000; - cur_row_->cells_[cell_idx].set_int(time_sec); + if (type_is_double) { + double time_sec = (static_cast (current_time - sess_info->get_cur_state_start_time())) / 1000000; + cur_row_->cells_[cell_idx].set_double(time_sec); + cur_row_->cells_[cell_idx].set_scale(6); + } else { + int64_t time_sec = (current_time - sess_info->get_cur_state_start_time()) / 1000000; + cur_row_->cells_[cell_idx].set_int(time_sec); + } + break; } case STATE: { @@ -335,13 +354,26 @@ bool ObShowProcesslist::FillScanner::operator()(sql::ObSQLSessionMgr::Key key, O break; } case TOTAL_TIME: { - if (ObSQLSessionState::QUERY_ACTIVE == sess_info->get_session_state()) { - // time_sec = current time - sql packet received from easy time - int64_t time_sec = (::oceanbase::common::ObTimeUtility::current_time() - sess_info->get_query_start_time()) / 1000000; - cur_row_->cells_[cell_idx].set_int(time_sec); + if (type_is_double) { + // indicates that the request is in progress + if (!sess_info->get_is_request_end()) { + // time_sec = current time - sql packet received from easy time + double time_sec = (static_cast (current_time - sess_info->get_query_start_time())) / 1000000; + cur_row_->cells_[cell_idx].set_double(time_sec); + } else { + double time_sec = (static_cast (current_time - sess_info->get_cur_state_start_time())) / 1000000; + cur_row_->cells_[cell_idx].set_double(time_sec); + } + cur_row_->cells_[cell_idx].set_scale(6); } else { - int64_t time_sec = (::oceanbase::common::ObTimeUtility::current_time() - sess_info->get_cur_state_start_time()) / 1000000; - cur_row_->cells_[cell_idx].set_int(time_sec); + if (ObSQLSessionState::QUERY_ACTIVE == sess_info->get_session_state()) { + // time_sec = current time - sql packet received from easy time + int64_t time_sec = (current_time - sess_info->get_query_start_time()) / 1000000; + cur_row_->cells_[cell_idx].set_int(time_sec); + } else { + int64_t time_sec = (current_time - sess_info->get_cur_state_start_time()) / 1000000; + cur_row_->cells_[cell_idx].set_int(time_sec); + } } break; } @@ -457,7 +489,14 @@ bool ObShowProcesslist::FillScanner::operator()(sql::ObSQLSessionMgr::Key key, O break; } case TOTAL_CPU_TIME: { - cur_row_->cells_[cell_idx].set_double(0); + if (ObSQLSessionState::QUERY_ACTIVE == sess_info->get_session_state()) { + // time_sec = current time - sql packet received from easy time + double time_sec = (static_cast (sess_info->get_retry_active_time() + current_time - sess_info->get_cur_state_start_time())) / 1000000; + cur_row_->cells_[cell_idx].set_double(time_sec); + } else { + double time_sec = (static_cast (sess_info->get_retry_active_time())) / 1000000; + cur_row_->cells_[cell_idx].set_double(time_sec); + } cur_row_->cells_[cell_idx].set_scale(6); break; } @@ -495,16 +534,19 @@ int ObShowProcesslist::FillScanner::init(ObIAllocator *allocator, sql::ObSQLSessionInfo *session_info, common::ObNewRow *cur_row, const ObIArray &column_ids, - share::schema::ObSchemaGetterGuard* schema_guard) + share::schema::ObSchemaGetterGuard* schema_guard, + const share::schema::ObTableSchema *table_schema) { int ret = OB_SUCCESS; if (OB_UNLIKELY(NULL == allocator || NULL == scanner || NULL == cur_row - || NULL == session_info)) { + || NULL == session_info + || NULL == table_schema)) { ret = OB_NOT_INIT; SERVER_LOG(WARN, - "some parameter is NULL", K(ret), K(allocator), K(scanner), K(cur_row), K(session_info)); + "some parameter is NULL", K(ret), K(allocator), K(scanner), + K(cur_row), K(session_info), K(table_schema)); } else if (OB_FAIL(output_column_ids_.assign(column_ids))) { SQL_ENG_LOG(WARN, "fail to assign output column ids", K(ret), K(column_ids)); } else { @@ -513,7 +555,7 @@ int ObShowProcesslist::FillScanner::init(ObIAllocator *allocator, cur_row_ = cur_row; my_session_ = session_info; schema_guard_ = schema_guard; - + table_schema_ = table_schema; } return ret; } diff --git a/src/observer/virtual_table/ob_show_processlist.h b/src/observer/virtual_table/ob_show_processlist.h index 56578e56a5..00179c475a 100644 --- a/src/observer/virtual_table/ob_show_processlist.h +++ b/src/observer/virtual_table/ob_show_processlist.h @@ -92,7 +92,8 @@ private: cur_row_(NULL), my_session_(NULL), schema_guard_(NULL), - output_column_ids_() + output_column_ids_(), + table_schema_(NULL) { trace_id_[0] = '\0'; } @@ -103,7 +104,8 @@ private: sql::ObSQLSessionInfo * session_info, common::ObNewRow *cur_row, const ObIArray &column_ids, - share::schema::ObSchemaGetterGuard* schema_guard); + share::schema::ObSchemaGetterGuard* schema_guard, + const share::schema::ObTableSchema *table_schema); inline void reset(); public: bool has_process_privilege(); @@ -115,6 +117,7 @@ private: share::schema::ObSchemaGetterGuard* schema_guard_; ObSEArray output_column_ids_; char trace_id_[common::OB_MAX_TRACE_ID_BUFFER_SIZE]; + const share::schema::ObTableSchema *table_schema_; DISALLOW_COPY_AND_ASSIGN(FillScanner); }; sql::ObSQLSessionMgr *session_mgr_; diff --git a/src/observer/virtual_table/ob_virtual_table_iterator_factory.cpp b/src/observer/virtual_table/ob_virtual_table_iterator_factory.cpp index a0b8f3b52a..b82c65ae75 100644 --- a/src/observer/virtual_table/ob_virtual_table_iterator_factory.cpp +++ b/src/observer/virtual_table/ob_virtual_table_iterator_factory.cpp @@ -224,6 +224,7 @@ #include "observer/virtual_table/ob_tenant_show_restore_preview.h" #include "observer/virtual_table/ob_all_virtual_kv_connection.h" #include "observer/virtual_table/ob_tenant_show_restore_preview.h" +#include "observer/virtual_table/ob_all_virtual_tracepoint_info.h" #include "observer/virtual_table/ob_all_virtual_nic_info.h" #include "observer/virtual_table/ob_all_virtual_sys_variable_default_value.h" #include "observer/virtual_table/ob_information_schema_enable_roles_table.h" @@ -2521,6 +2522,16 @@ int ObVTIterCreator::create_vt_iter(ObVTableScanParam ¶ms, } break; } + case OB_ALL_VIRTUAL_TRACEPOINT_INFO_TID: { + ObAllTracepointInfo *tp_info = NULL; + if (OB_FAIL(NEW_VIRTUAL_TABLE(ObAllTracepointInfo, tp_info))) { + SERVER_LOG(ERROR, "failed to init ObAllTracepointInfo", K(ret)); + } else { + tp_info->set_addr(addr_); + vt_iter = static_cast(tp_info); + } + break; + } case OB_ALL_VIRTUAL_DTL_INTERM_RESULT_MONITOR_TID: { ObAllDtlIntermResultMonitor *dtl_interm_result_monitor = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObAllDtlIntermResultMonitor, dtl_interm_result_monitor))) { diff --git a/src/share/inner_table/ob_inner_table_schema.10001_10050.cpp b/src/share/inner_table/ob_inner_table_schema.10001_10050.cpp index 135788e290..5cadb04de0 100644 --- a/src/share/inner_table/ob_inner_table_schema.10001_10050.cpp +++ b/src/share/inner_table/ob_inner_table_schema.10001_10050.cpp @@ -1497,22 +1497,18 @@ int ObInnerTableSchema::all_virtual_processlist_schema(ObTableSchema &table_sche } if (OB_SUCC(ret)) { - ObObj time_default; - time_default.set_int(0); - ADD_COLUMN_SCHEMA_T("time", //column_name + ADD_COLUMN_SCHEMA("time", //column_name ++column_id, //column_id 0, //rowkey_id 0, //index_id 0, //part_key_pos - ObIntType, //column_type + ObDoubleType, //column_type CS_TYPE_INVALID, //column_collation_type - sizeof(int64_t), //column_length + sizeof(double), //column_length -1, //column_precision -1, //column_scale false, //is_nullable - false, //is_autoincrement - time_default, - time_default); //default_value + false); //is_autoincrement } if (OB_SUCC(ret)) { @@ -1730,22 +1726,18 @@ int ObInnerTableSchema::all_virtual_processlist_schema(ObTableSchema &table_sche } if (OB_SUCC(ret)) { - ObObj total_time_default; - total_time_default.set_int(0); - ADD_COLUMN_SCHEMA_T("total_time", //column_name + ADD_COLUMN_SCHEMA("total_time", //column_name ++column_id, //column_id 0, //rowkey_id 0, //index_id 0, //part_key_pos - ObIntType, //column_type + ObDoubleType, //column_type CS_TYPE_INVALID, //column_collation_type - sizeof(int64_t), //column_length + sizeof(double), //column_length -1, //column_precision -1, //column_scale false, //is_nullable - false, //is_autoincrement - total_time_default, - total_time_default); //default_value + false); //is_autoincrement } if (OB_SUCC(ret)) { diff --git a/src/share/inner_table/ob_inner_table_schema.11101_11150.cpp b/src/share/inner_table/ob_inner_table_schema.11101_11150.cpp index 5242d7d4cf..717ffa3780 100644 --- a/src/share/inner_table/ob_inner_table_schema.11101_11150.cpp +++ b/src/share/inner_table/ob_inner_table_schema.11101_11150.cpp @@ -1946,22 +1946,18 @@ int ObInnerTableSchema::all_virtual_session_info_schema(ObTableSchema &table_sch } if (OB_SUCC(ret)) { - ObObj time_default; - time_default.set_int(0); - ADD_COLUMN_SCHEMA_T("time", //column_name + ADD_COLUMN_SCHEMA("time", //column_name ++column_id, //column_id 0, //rowkey_id 0, //index_id 0, //part_key_pos - ObIntType, //column_type + ObDoubleType, //column_type CS_TYPE_INVALID, //column_collation_type - sizeof(int64_t), //column_length + sizeof(double), //column_length -1, //column_precision -1, //column_scale false, //is_nullable - false, //is_autoincrement - time_default, - time_default); //default_value + false); //is_autoincrement } if (OB_SUCC(ret)) { diff --git a/src/share/inner_table/ob_inner_table_schema.12451_12500.cpp b/src/share/inner_table/ob_inner_table_schema.12451_12500.cpp index aa03c1b31a..1c2a13d178 100644 --- a/src/share/inner_table/ob_inner_table_schema.12451_12500.cpp +++ b/src/share/inner_table/ob_inner_table_schema.12451_12500.cpp @@ -2143,6 +2143,195 @@ int ObInnerTableSchema::enabled_roles_schema(ObTableSchema &table_schema) return ret; } +int ObInnerTableSchema::all_virtual_tracepoint_info_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_TRACEPOINT_INFO_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_TRACEPOINT_INFO_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("svr_ip", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 1, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("svr_port", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 2, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tp_no", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tp_name", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + OB_MAX_TRACEPOINT_NAME_LEN, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tp_describe", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + OB_MAX_TRACEPOINT_DESCRIBE_LEN, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tp_frequency", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tp_error_code", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tp_occur", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tp_match", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + if (OB_SUCC(ret)) { + table_schema.get_part_option().set_part_num(1); + table_schema.set_part_level(PARTITION_LEVEL_ONE); + table_schema.get_part_option().set_part_func_type(PARTITION_FUNC_TYPE_LIST_COLUMNS); + if (OB_FAIL(table_schema.get_part_option().set_part_expr("svr_ip, svr_port"))) { + LOG_WARN("set_part_expr failed", K(ret)); + } else if (OB_FAIL(table_schema.mock_list_partition_array())) { + LOG_WARN("mock list partition array failed", K(ret)); + } + } + table_schema.set_index_using_type(USING_HASH); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_virtual_nic_info_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.15401_15450.cpp b/src/share/inner_table/ob_inner_table_schema.15401_15450.cpp index 23382ad393..9e5f471e8b 100644 --- a/src/share/inner_table/ob_inner_table_schema.15401_15450.cpp +++ b/src/share/inner_table/ob_inner_table_schema.15401_15450.cpp @@ -502,6 +502,450 @@ int ObInnerTableSchema::all_virtual_tenant_scheduler_job_run_detail_real_agent_o return ret; } +int ObInnerTableSchema::all_virtual_session_info_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_SESSION_INFO_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_SESSION_INFO_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCollationType::CS_TYPE_UTF8MB4_BIN); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("USER", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + OB_MAX_USERNAME_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TENANT", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + OB_MAX_TENANT_NAME_LENGTH_STORE, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("HOST", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + OB_MAX_HOST_NAME_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("DB", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + OB_MAX_DATABASE_NAME_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("COMMAND", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + OB_MAX_COMMAND_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SQL_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + OB_MAX_SQL_ID_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TIME", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("STATE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + OB_MAX_SESSION_STATE_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("INFO", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + MAX_COLUMN_VARCHAR_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SVR_IP", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 1, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SVR_PORT", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 2, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SQL_PORT", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("PROXY_SESSID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("MASTER_SESSID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("USER_CLIENT_IP", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("USER_HOST", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + OB_MAX_HOST_NAME_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TRANS_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("THREAD_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SSL_CIPHER", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + OB_MAX_COMMAND_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TRACE_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + OB_MAX_TRACE_ID_BUFFER_SIZE, //column_length + 2, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("REF_COUNT", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("BACKTRACE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 16384, //column_length + 2, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TRANS_STATE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + OB_MAX_TRANS_STATE_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("USER_CLIENT_PORT", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TOTAL_CPU_TIME", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + if (OB_SUCC(ret)) { + table_schema.get_part_option().set_part_num(1); + table_schema.set_part_level(PARTITION_LEVEL_ONE); + table_schema.get_part_option().set_part_func_type(PARTITION_FUNC_TYPE_LIST); + if (OB_FAIL(table_schema.get_part_option().set_part_expr("SVR_IP, SVR_PORT"))) { + LOG_WARN("set_part_expr failed", K(ret)); + } else if (OB_FAIL(table_schema.mock_list_partition_array())) { + LOG_WARN("mock list partition array failed", K(ret)); + } + } + table_schema.set_index_using_type(USING_HASH); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_virtual_tenant_scheduler_job_class_real_agent_ora_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; @@ -6321,6 +6765,195 @@ int ObInnerTableSchema::all_virtual_index_usage_info_real_agent_ora_schema(ObTab return ret; } +int ObInnerTableSchema::all_virtual_tracepoint_info_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_TRACEPOINT_INFO_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_TRACEPOINT_INFO_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCollationType::CS_TYPE_UTF8MB4_BIN); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SVR_IP", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 1, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SVR_PORT", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 2, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TP_NO", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TP_NAME", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + OB_MAX_TRACEPOINT_NAME_LEN, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TP_DESCRIBE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + OB_MAX_TRACEPOINT_DESCRIBE_LEN, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TP_FREQUENCY", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TP_ERROR_CODE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TP_OCCUR", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TP_MATCH", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + if (OB_SUCC(ret)) { + table_schema.get_part_option().set_part_num(1); + table_schema.set_part_level(PARTITION_LEVEL_ONE); + table_schema.get_part_option().set_part_func_type(PARTITION_FUNC_TYPE_LIST); + if (OB_FAIL(table_schema.get_part_option().set_part_expr("SVR_IP, SVR_PORT"))) { + LOG_WARN("set_part_expr failed", K(ret)); + } else if (OB_FAIL(table_schema.mock_list_partition_array())) { + LOG_WARN("mock list partition array failed", K(ret)); + } + } + table_schema.set_index_using_type(USING_HASH); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + } // end namespace share } // end namespace oceanbase diff --git a/src/share/inner_table/ob_inner_table_schema.20001_20050.cpp b/src/share/inner_table/ob_inner_table_schema.20001_20050.cpp index ee7b5550af..f2c2c2d4aa 100644 --- a/src/share/inner_table/ob_inner_table_schema.20001_20050.cpp +++ b/src/share/inner_table/ob_inner_table_schema.20001_20050.cpp @@ -560,7 +560,7 @@ int ObInnerTableSchema::processlist_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT id AS ID, user AS USER, concat(user_client_ip, ':', user_client_port) AS HOST, db AS DB, command AS COMMAND, time AS TIME, state AS STATE, info AS INFO FROM oceanbase.__all_virtual_processlist WHERE is_serving_tenant(svr_ip, svr_port, effective_tenant_id()) )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT id AS ID, user AS USER, concat(user_client_ip, ':', user_client_port) AS HOST, db AS DB, command AS COMMAND, cast(time as SIGNED) AS TIME, state AS STATE, info AS INFO FROM oceanbase.__all_virtual_processlist WHERE is_serving_tenant(svr_ip, svr_port, effective_tenant_id()) )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.21201_21250.cpp b/src/share/inner_table/ob_inner_table_schema.21201_21250.cpp index bf4e9df3be..9f815fef7d 100644 --- a/src/share/inner_table/ob_inner_table_schema.21201_21250.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21201_21250.cpp @@ -1060,7 +1060,7 @@ int ObInnerTableSchema::gv_ob_processlist_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SVR_IP, SVR_PORT, SQL_PORT, ID, USER, HOST, DB, TENANT, COMMAND, TIME, TOTAL_TIME, STATE, INFO, PROXY_SESSID, MASTER_SESSID, USER_CLIENT_IP, USER_HOST, RETRY_CNT, RETRY_INFO, SQL_ID, TRANS_ID, THREAD_ID, SSL_CIPHER, TRACE_ID, TRANS_STATE, ACTION, MODULE, CLIENT_INFO, LEVEL, SAMPLE_PERCENTAGE, RECORD_POLICY, LB_VID, LB_VIP, LB_VPORT, IN_BYTES, OUT_BYTES, USER_CLIENT_PORT FROM oceanbase.__all_virtual_processlist )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SVR_IP, SVR_PORT, SQL_PORT, ID, USER, HOST, DB, TENANT, COMMAND, TIME, TOTAL_TIME, STATE, INFO, PROXY_SESSID, MASTER_SESSID, USER_CLIENT_IP, USER_HOST, RETRY_CNT, RETRY_INFO, SQL_ID, TRANS_ID, THREAD_ID, SSL_CIPHER, TRACE_ID, TRANS_STATE, ACTION, MODULE, CLIENT_INFO, LEVEL, SAMPLE_PERCENTAGE, RECORD_POLICY, LB_VID, LB_VIP, LB_VPORT, IN_BYTES, OUT_BYTES, USER_CLIENT_PORT, cast(total_cpu_time as SIGNED) as TOTAL_CPU_TIME FROM oceanbase.__all_virtual_processlist )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1110,7 +1110,7 @@ int ObInnerTableSchema::v_ob_processlist_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SVR_IP, SVR_PORT, SQL_PORT, ID, USER, HOST, DB, TENANT, COMMAND, TIME, TOTAL_TIME, STATE, INFO, PROXY_SESSID, MASTER_SESSID, USER_CLIENT_IP, USER_HOST, RETRY_CNT, RETRY_INFO, SQL_ID, TRANS_ID, THREAD_ID, SSL_CIPHER, TRACE_ID, TRANS_STATE, ACTION, MODULE, CLIENT_INFO, LEVEL, SAMPLE_PERCENTAGE, RECORD_POLICY, LB_VID, LB_VIP, LB_VPORT, IN_BYTES, OUT_BYTES, USER_CLIENT_PORT FROM oceanbase.GV$OB_PROCESSLIST WHERE SVR_IP = host_ip() AND SVR_PORT = rpc_port() )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT SVR_IP, SVR_PORT, SQL_PORT, ID, USER, HOST, DB, TENANT, COMMAND, TIME, TOTAL_TIME, STATE, INFO, PROXY_SESSID, MASTER_SESSID, USER_CLIENT_IP, USER_HOST, RETRY_CNT, RETRY_INFO, SQL_ID, TRANS_ID, THREAD_ID, SSL_CIPHER, TRACE_ID, TRANS_STATE, ACTION, MODULE, CLIENT_INFO, LEVEL, SAMPLE_PERCENTAGE, RECORD_POLICY, LB_VID, LB_VIP, LB_VPORT, IN_BYTES, OUT_BYTES, USER_CLIENT_PORT, cast(total_cpu_time as SIGNED) as TOTAL_CPU_TIME FROM oceanbase.GV$OB_PROCESSLIST WHERE SVR_IP = host_ip() AND SVR_PORT = rpc_port() )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.21451_21500.cpp b/src/share/inner_table/ob_inner_table_schema.21451_21500.cpp index dbb88fe8ab..bc0dca4e02 100644 --- a/src/share/inner_table/ob_inner_table_schema.21451_21500.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21451_21500.cpp @@ -25,6 +25,106 @@ using namespace common; namespace share { +int ObInnerTableSchema::gv_ob_session_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_GV_OB_SESSION_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_GV_OB_SESSION_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select id as ID, user as USER, tenant as TENANT, host as HOST, db as DB, command as COMMAND, sql_id as SQL_ID, cast(time as SIGNED) as TIME, state as STATE, info as INFO, svr_ip as SVR_IP, svr_port as SVR_PORT, sql_port as SQL_PORT, proxy_sessid as PROXY_SESSID, user_client_ip as USER_CLIENT_IP, user_host as USER_HOST, trans_id as TRANS_ID, thread_id as THREAD_ID, trace_id as TRACE_ID, ref_count as REF_COUNT, backtrace as BACKTRACE, trans_state as TRANS_STATE, user_client_port as USER_CLIENT_PORT, cast(total_cpu_time as SIGNED) as TOTAL_CPU_TIME from oceanbase.__all_virtual_session_info )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::v_ob_session_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_V_OB_SESSION_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_V_OB_SESSION_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT id as ID, user as USER, tenant as TENANT, host as HOST, db as DB, command as COMMAND, sql_id as SQL_ID, cast(time as SIGNED) as TIME, state as STATE, info as INFO, svr_ip as SVR_IP, svr_port as SVR_PORT, sql_port as SQL_PORT, proxy_sessid as PROXY_SESSID, user_client_ip as USER_CLIENT_IP, user_host as USER_HOST, trans_id as TRANS_ID, thread_id as THREAD_ID, trace_id as TRACE_ID, ref_count as REF_COUNT, backtrace as BACKTRACE, trans_state as TRANS_STATE, user_client_port as USER_CLIENT_PORT, cast(total_cpu_time as SIGNED) as TOTAL_CPU_TIME FROM oceanbase.gv$ob_session WHERE svr_ip=HOST_IP() AND svr_port=RPC_PORT() )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::gv_ob_pl_cache_object_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.21501_21550.cpp b/src/share/inner_table/ob_inner_table_schema.21501_21550.cpp index fb4e057353..b5de08e16d 100644 --- a/src/share/inner_table/ob_inner_table_schema.21501_21550.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21501_21550.cpp @@ -1525,6 +1525,106 @@ int ObInnerTableSchema::dba_mvref_stmt_stats_schema(ObTableSchema &table_schema) return ret; } +int ObInnerTableSchema::gv_ob_tracepoint_info_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_GV_OB_TRACEPOINT_INFO_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_GV_OB_TRACEPOINT_INFO_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT SVR_IP, SVR_PORT, TP_NO, TP_NAME, TP_DESCRIBE, TP_FREQUENCY, TP_ERROR_CODE, TP_OCCUR, TP_MATCH FROM oceanbase.__all_virtual_tracepoint_info )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::v_ob_tracepoint_info_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_V_OB_TRACEPOINT_INFO_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_V_OB_TRACEPOINT_INFO_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT SVR_IP, SVR_PORT, TP_NO, TP_NAME, TP_DESCRIBE, TP_FREQUENCY, TP_ERROR_CODE, TP_OCCUR, TP_MATCH FROM OCEANBASE.GV$OB_TRACEPOINT_INFO WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + } // end namespace share } // end namespace oceanbase diff --git a/src/share/inner_table/ob_inner_table_schema.28151_28200.cpp b/src/share/inner_table/ob_inner_table_schema.28151_28200.cpp index 8bece71d57..ec6cf40659 100644 --- a/src/share/inner_table/ob_inner_table_schema.28151_28200.cpp +++ b/src/share/inner_table/ob_inner_table_schema.28151_28200.cpp @@ -1525,6 +1525,106 @@ int ObInnerTableSchema::gv_ob_flt_trace_config_ora_schema(ObTableSchema &table_s return ret; } +int ObInnerTableSchema::gv_ob_session_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_GV_OB_SESSION_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_GV_OB_SESSION_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT id ID, "USER", tenant TENANT, host HOST, db DB, command COMMAND, sql_id SQL_ID, CAST(time AS INT) TIME, state STATE, info INFO, svr_ip SVR_IP, svr_port SVR_PORT, sql_port SQL_PORT, proxy_sessid PROXY_SESSID, user_client_ip as USER_CLIENT_IP, user_host as USER_HOST, trans_id as TRANS_ID, thread_id as THREAD_ID, trace_id as TRACE_ID, ref_count as REF_COUNT, backtrace as BACKTRACE, trans_state as TRANS_STATE, user_client_port as USER_CLIENT_PORT, CAST(total_cpu_time AS INT) as TOTAL_CPU_TIME FROM SYS.ALL_VIRTUAL_SESSION_INFO )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::v_ob_session_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_V_OB_SESSION_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_V_OB_SESSION_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT id ID, "USER", tenant TENANT, host HOST, db DB, command COMMAND, sql_id SQL_ID, CAST(time AS INT) TIME, state STATE, info INFO, svr_ip SVR_IP, svr_port SVR_PORT, sql_port SQL_PORT, proxy_sessid PROXY_SESSID, user_client_ip as USER_CLIENT_IP, user_host as USER_HOST, trans_id as TRANS_ID, thread_id as THREAD_ID, trace_id as TRACE_ID, ref_count as REF_COUNT, backtrace as BACKTRACE, trans_state as TRANS_STATE, user_client_port as USER_CLIENT_PORT, CAST(total_cpu_time AS INT) as TOTAL_CPU_TIME FROM SYS.GV$OB_SESSION WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::gv_ob_pl_cache_object_ora_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.28201_28250.cpp b/src/share/inner_table/ob_inner_table_schema.28201_28250.cpp index 626b921197..db6f10d1ce 100644 --- a/src/share/inner_table/ob_inner_table_schema.28201_28250.cpp +++ b/src/share/inner_table/ob_inner_table_schema.28201_28250.cpp @@ -375,6 +375,106 @@ int ObInnerTableSchema::v_ob_ls_snapshots_ora_schema(ObTableSchema &table_schema return ret; } +int ObInnerTableSchema::gv_ob_tracepoint_info_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_GV_OB_TRACEPOINT_INFO_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_GV_OB_TRACEPOINT_INFO_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT SVR_IP, SVR_PORT, TP_NO, TP_NAME, TP_DESCRIBE, TP_FREQUENCY, TP_ERROR_CODE, TP_OCCUR, TP_MATCH FROM SYS.ALL_VIRTUAL_TRACEPOINT_INFO )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::v_ob_tracepoint_info_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_V_OB_TRACEPOINT_INFO_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_V_OB_TRACEPOINT_INFO_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT SVR_IP, SVR_PORT, TP_NO, TP_NAME, TP_DESCRIBE, TP_FREQUENCY, TP_ERROR_CODE, TP_OCCUR, TP_MATCH FROM SYS.GV$OB_TRACEPOINT_INFO WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::gv_ob_nic_info_ora_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.h b/src/share/inner_table/ob_inner_table_schema.h index 946ba84104..7aaa39752a 100644 --- a/src/share/inner_table/ob_inner_table_schema.h +++ b/src/share/inner_table/ob_inner_table_schema.h @@ -1022,6 +1022,7 @@ public: static int all_virtual_column_privilege_history_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_tenant_snapshot_ls_replica_history_schema(share::schema::ObTableSchema &table_schema); static int enabled_roles_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_tracepoint_info_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_nic_info_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_sql_audit_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_plan_stat_ora_schema(share::schema::ObTableSchema &table_schema); @@ -1271,6 +1272,7 @@ public: static int all_virtual_ls_real_agent_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_flt_config_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_tenant_scheduler_job_run_detail_real_agent_ora_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_session_info_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_tenant_scheduler_job_class_real_agent_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_recover_table_job_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_recover_table_job_history_ora_schema(share::schema::ObTableSchema &table_schema); @@ -1287,6 +1289,7 @@ public: static int all_virtual_transfer_partition_task_history_real_agent_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_ls_snapshot_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_index_usage_info_real_agent_ora_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_tracepoint_info_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_nic_info_ora_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_plan_cache_stat_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_plan_cache_plan_stat_schema(share::schema::ObTableSchema &table_schema); @@ -1641,6 +1644,8 @@ public: static int dba_ob_tenant_event_history_schema(share::schema::ObTableSchema &table_schema); static int cdb_ob_tenant_event_history_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_flt_trace_config_schema(share::schema::ObTableSchema &table_schema); + static int gv_ob_session_schema(share::schema::ObTableSchema &table_schema); + static int v_ob_session_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_pl_cache_object_schema(share::schema::ObTableSchema &table_schema); static int v_ob_pl_cache_object_schema(share::schema::ObTableSchema &table_schema); static int cdb_ob_recover_table_jobs_schema(share::schema::ObTableSchema &table_schema); @@ -1693,6 +1698,8 @@ public: static int dba_mvref_change_stats_schema(share::schema::ObTableSchema &table_schema); static int cdb_mvref_stmt_stats_schema(share::schema::ObTableSchema &table_schema); static int dba_mvref_stmt_stats_schema(share::schema::ObTableSchema &table_schema); + static int gv_ob_tracepoint_info_schema(share::schema::ObTableSchema &table_schema); + static int v_ob_tracepoint_info_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_nic_info_schema(share::schema::ObTableSchema &table_schema); static int v_ob_nic_info_schema(share::schema::ObTableSchema &table_schema); static int dba_synonyms_schema(share::schema::ObTableSchema &table_schema); @@ -2137,6 +2144,8 @@ public: static int v_ob_timestamp_service_ora_schema(share::schema::ObTableSchema &table_schema); static int v_ob_ls_log_restore_status_ora_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_flt_trace_config_ora_schema(share::schema::ObTableSchema &table_schema); + static int gv_ob_session_ora_schema(share::schema::ObTableSchema &table_schema); + static int v_ob_session_ora_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_pl_cache_object_ora_schema(share::schema::ObTableSchema &table_schema); static int v_ob_pl_cache_object_ora_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_cgroup_config_ora_schema(share::schema::ObTableSchema &table_schema); @@ -2146,6 +2155,8 @@ public: static int dba_index_usage_ora_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_ls_snapshots_ora_schema(share::schema::ObTableSchema &table_schema); static int v_ob_ls_snapshots_ora_schema(share::schema::ObTableSchema &table_schema); + static int gv_ob_tracepoint_info_ora_schema(share::schema::ObTableSchema &table_schema); + static int v_ob_tracepoint_info_ora_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_nic_info_ora_schema(share::schema::ObTableSchema &table_schema); static int v_ob_nic_info_ora_schema(share::schema::ObTableSchema &table_schema); static int all_table_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); @@ -3673,6 +3684,7 @@ const schema_create_func virtual_table_schema_creators [] = { ObInnerTableSchema::all_virtual_column_privilege_history_schema, ObInnerTableSchema::all_virtual_tenant_snapshot_ls_replica_history_schema, ObInnerTableSchema::enabled_roles_schema, + ObInnerTableSchema::all_virtual_tracepoint_info_schema, ObInnerTableSchema::all_virtual_nic_info_schema, ObInnerTableSchema::all_virtual_ash_all_virtual_ash_i1_schema, ObInnerTableSchema::all_virtual_sql_plan_monitor_all_virtual_sql_plan_monitor_i1_schema, @@ -3932,6 +3944,7 @@ const schema_create_func virtual_table_schema_creators [] = { ObInnerTableSchema::all_virtual_ls_real_agent_ora_schema, ObInnerTableSchema::all_virtual_flt_config_ora_schema, ObInnerTableSchema::all_virtual_tenant_scheduler_job_run_detail_real_agent_ora_schema, + ObInnerTableSchema::all_virtual_session_info_ora_schema, ObInnerTableSchema::all_virtual_tenant_scheduler_job_class_real_agent_ora_schema, ObInnerTableSchema::all_virtual_recover_table_job_ora_schema, ObInnerTableSchema::all_virtual_recover_table_job_history_ora_schema, @@ -3948,6 +3961,7 @@ const schema_create_func virtual_table_schema_creators [] = { ObInnerTableSchema::all_virtual_transfer_partition_task_history_real_agent_ora_schema, ObInnerTableSchema::all_virtual_ls_snapshot_ora_schema, ObInnerTableSchema::all_virtual_index_usage_info_real_agent_ora_schema, + ObInnerTableSchema::all_virtual_tracepoint_info_ora_schema, ObInnerTableSchema::all_virtual_nic_info_ora_schema, ObInnerTableSchema::all_virtual_table_real_agent_ora_idx_data_table_id_real_agent_schema, ObInnerTableSchema::all_virtual_table_real_agent_ora_idx_db_tb_name_real_agent_schema, @@ -4386,6 +4400,8 @@ const schema_create_func sys_view_schema_creators [] = { ObInnerTableSchema::dba_ob_tenant_event_history_schema, ObInnerTableSchema::cdb_ob_tenant_event_history_schema, ObInnerTableSchema::gv_ob_flt_trace_config_schema, + ObInnerTableSchema::gv_ob_session_schema, + ObInnerTableSchema::v_ob_session_schema, ObInnerTableSchema::gv_ob_pl_cache_object_schema, ObInnerTableSchema::v_ob_pl_cache_object_schema, ObInnerTableSchema::cdb_ob_recover_table_jobs_schema, @@ -4438,6 +4454,8 @@ const schema_create_func sys_view_schema_creators [] = { ObInnerTableSchema::dba_mvref_change_stats_schema, ObInnerTableSchema::cdb_mvref_stmt_stats_schema, ObInnerTableSchema::dba_mvref_stmt_stats_schema, + ObInnerTableSchema::gv_ob_tracepoint_info_schema, + ObInnerTableSchema::v_ob_tracepoint_info_schema, ObInnerTableSchema::gv_ob_nic_info_schema, ObInnerTableSchema::v_ob_nic_info_schema, ObInnerTableSchema::dba_synonyms_schema, @@ -4882,6 +4900,8 @@ const schema_create_func sys_view_schema_creators [] = { ObInnerTableSchema::v_ob_timestamp_service_ora_schema, ObInnerTableSchema::v_ob_ls_log_restore_status_ora_schema, ObInnerTableSchema::gv_ob_flt_trace_config_ora_schema, + ObInnerTableSchema::gv_ob_session_ora_schema, + ObInnerTableSchema::v_ob_session_ora_schema, ObInnerTableSchema::gv_ob_pl_cache_object_ora_schema, ObInnerTableSchema::v_ob_pl_cache_object_ora_schema, ObInnerTableSchema::gv_ob_cgroup_config_ora_schema, @@ -4891,6 +4911,8 @@ const schema_create_func sys_view_schema_creators [] = { ObInnerTableSchema::dba_index_usage_ora_schema, ObInnerTableSchema::gv_ob_ls_snapshots_ora_schema, ObInnerTableSchema::v_ob_ls_snapshots_ora_schema, + ObInnerTableSchema::gv_ob_tracepoint_info_ora_schema, + ObInnerTableSchema::v_ob_tracepoint_info_ora_schema, ObInnerTableSchema::gv_ob_nic_info_ora_schema, ObInnerTableSchema::v_ob_nic_info_ora_schema, NULL,}; @@ -5347,6 +5369,7 @@ const uint64_t tenant_space_tables [] = { OB_ALL_VIRTUAL_TABLET_COMPACTION_PROGRESS_TID, OB_ALL_VIRTUAL_COMPACTION_DIAGNOSE_INFO_TID, OB_ALL_VIRTUAL_COMPACTION_SUGGESTION_TID, + OB_ALL_VIRTUAL_SESSION_INFO_TID, OB_ALL_VIRTUAL_TABLET_COMPACTION_HISTORY_TID, OB_ALL_VIRTUAL_SERVER_COMPACTION_EVENT_HISTORY_TID, OB_ALL_VIRTUAL_TABLET_STAT_TID, @@ -5503,6 +5526,7 @@ const uint64_t tenant_space_tables [] = { OB_ALL_VIRTUAL_LS_SNAPSHOT_TID, OB_ALL_VIRTUAL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_TID, OB_ENABLED_ROLES_TID, + OB_ALL_VIRTUAL_TRACEPOINT_INFO_TID, OB_ALL_VIRTUAL_NIC_INFO_TID, OB_ALL_VIRTUAL_SQL_AUDIT_ORA_TID, OB_ALL_VIRTUAL_SQL_AUDIT_ORA_ALL_VIRTUAL_SQL_AUDIT_I1_TID, @@ -5761,6 +5785,7 @@ const uint64_t tenant_space_tables [] = { OB_ALL_VIRTUAL_LS_REAL_AGENT_ORA_TID, OB_ALL_VIRTUAL_FLT_CONFIG_ORA_TID, OB_ALL_VIRTUAL_TENANT_SCHEDULER_JOB_RUN_DETAIL_REAL_AGENT_ORA_TID, + OB_ALL_VIRTUAL_SESSION_INFO_ORA_TID, OB_ALL_VIRTUAL_TENANT_SCHEDULER_JOB_CLASS_REAL_AGENT_ORA_TID, OB_ALL_VIRTUAL_RECOVER_TABLE_JOB_ORA_TID, OB_ALL_VIRTUAL_RECOVER_TABLE_JOB_HISTORY_ORA_TID, @@ -5777,6 +5802,7 @@ const uint64_t tenant_space_tables [] = { OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_HISTORY_REAL_AGENT_ORA_TID, OB_ALL_VIRTUAL_LS_SNAPSHOT_ORA_TID, OB_ALL_VIRTUAL_INDEX_USAGE_INFO_REAL_AGENT_ORA_TID, + OB_ALL_VIRTUAL_TRACEPOINT_INFO_ORA_TID, OB_ALL_VIRTUAL_NIC_INFO_ORA_TID, OB_GV_OB_PLAN_CACHE_STAT_TID, OB_GV_OB_PLAN_CACHE_PLAN_STAT_TID, @@ -6035,6 +6061,8 @@ const uint64_t tenant_space_tables [] = { OB_DBA_OB_LS_HISTORY_TID, OB_DBA_OB_TENANT_EVENT_HISTORY_TID, OB_GV_OB_FLT_TRACE_CONFIG_TID, + OB_GV_OB_SESSION_TID, + OB_V_OB_SESSION_TID, OB_GV_OB_PL_CACHE_OBJECT_TID, OB_V_OB_PL_CACHE_OBJECT_TID, OB_DBA_OB_RECOVER_TABLE_JOBS_TID, @@ -6064,6 +6092,8 @@ const uint64_t tenant_space_tables [] = { OB_DBA_MVREF_STATS_TID, OB_DBA_MVREF_CHANGE_STATS_TID, OB_DBA_MVREF_STMT_STATS_TID, + OB_GV_OB_TRACEPOINT_INFO_TID, + OB_V_OB_TRACEPOINT_INFO_TID, OB_GV_OB_NIC_INFO_TID, OB_V_OB_NIC_INFO_TID, OB_DBA_SYNONYMS_TID, @@ -6508,6 +6538,8 @@ const uint64_t tenant_space_tables [] = { OB_V_OB_TIMESTAMP_SERVICE_ORA_TID, OB_V_OB_LS_LOG_RESTORE_STATUS_ORA_TID, OB_GV_OB_FLT_TRACE_CONFIG_ORA_TID, + OB_GV_OB_SESSION_ORA_TID, + OB_V_OB_SESSION_ORA_TID, OB_GV_OB_PL_CACHE_OBJECT_ORA_TID, OB_V_OB_PL_CACHE_OBJECT_ORA_TID, OB_GV_OB_CGROUP_CONFIG_ORA_TID, @@ -6517,6 +6549,8 @@ const uint64_t tenant_space_tables [] = { OB_DBA_INDEX_USAGE_ORA_TID, OB_GV_OB_LS_SNAPSHOTS_ORA_TID, OB_V_OB_LS_SNAPSHOTS_ORA_TID, + OB_GV_OB_TRACEPOINT_INFO_ORA_TID, + OB_V_OB_TRACEPOINT_INFO_ORA_TID, OB_GV_OB_NIC_INFO_ORA_TID, OB_V_OB_NIC_INFO_ORA_TID, OB_ALL_TABLE_IDX_DATA_TABLE_ID_TID, @@ -7355,6 +7389,7 @@ const uint64_t all_ora_mapping_virtual_table_org_tables [] = { OB_ALL_VIRTUAL_WR_CONTROL_TID, OB_ALL_VIRTUAL_TENANT_EVENT_HISTORY_TID, OB_ALL_VIRTUAL_FLT_CONFIG_TID, + OB_ALL_VIRTUAL_SESSION_INFO_TID, OB_ALL_VIRTUAL_RECOVER_TABLE_JOB_TID, OB_ALL_VIRTUAL_RECOVER_TABLE_JOB_HISTORY_TID, OB_ALL_VIRTUAL_IMPORT_TABLE_JOB_TID, @@ -7365,6 +7400,7 @@ const uint64_t all_ora_mapping_virtual_table_org_tables [] = { OB_ALL_VIRTUAL_CGROUP_CONFIG_TID, OB_ALL_VIRTUAL_SYS_VARIABLE_DEFAULT_VALUE_TID, OB_ALL_VIRTUAL_LS_SNAPSHOT_TID, + OB_ALL_VIRTUAL_TRACEPOINT_INFO_TID, OB_ALL_VIRTUAL_NIC_INFO_TID, }; const uint64_t all_ora_mapping_virtual_tables [] = { OB_ALL_VIRTUAL_SQL_AUDIT_ORA_TID @@ -7497,6 +7533,7 @@ const uint64_t all_ora_mapping_virtual_tables [] = { OB_ALL_VIRTUAL_SQL_AUDIT_O , OB_ALL_VIRTUAL_WR_CONTROL_ORA_TID , OB_ALL_VIRTUAL_TENANT_EVENT_HISTORY_ORA_TID , OB_ALL_VIRTUAL_FLT_CONFIG_ORA_TID +, OB_ALL_VIRTUAL_SESSION_INFO_ORA_TID , OB_ALL_VIRTUAL_RECOVER_TABLE_JOB_ORA_TID , OB_ALL_VIRTUAL_RECOVER_TABLE_JOB_HISTORY_ORA_TID , OB_ALL_VIRTUAL_IMPORT_TABLE_JOB_ORA_TID @@ -7507,6 +7544,7 @@ const uint64_t all_ora_mapping_virtual_tables [] = { OB_ALL_VIRTUAL_SQL_AUDIT_O , OB_ALL_VIRTUAL_CGROUP_CONFIG_ORA_TID , OB_ALL_VIRTUAL_SYS_VARIABLE_DEFAULT_VALUE_ORA_TID , OB_ALL_VIRTUAL_LS_SNAPSHOT_ORA_TID +, OB_ALL_VIRTUAL_TRACEPOINT_INFO_ORA_TID , OB_ALL_VIRTUAL_NIC_INFO_ORA_TID , }; @@ -7857,6 +7895,7 @@ const char* const tenant_space_table_names [] = { OB_ALL_VIRTUAL_TABLET_COMPACTION_PROGRESS_TNAME, OB_ALL_VIRTUAL_COMPACTION_DIAGNOSE_INFO_TNAME, OB_ALL_VIRTUAL_COMPACTION_SUGGESTION_TNAME, + OB_ALL_VIRTUAL_SESSION_INFO_TNAME, OB_ALL_VIRTUAL_TABLET_COMPACTION_HISTORY_TNAME, OB_ALL_VIRTUAL_SERVER_COMPACTION_EVENT_HISTORY_TNAME, OB_ALL_VIRTUAL_TABLET_STAT_TNAME, @@ -8013,6 +8052,7 @@ const char* const tenant_space_table_names [] = { OB_ALL_VIRTUAL_LS_SNAPSHOT_TNAME, OB_ALL_VIRTUAL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_TNAME, OB_ENABLED_ROLES_TNAME, + OB_ALL_VIRTUAL_TRACEPOINT_INFO_TNAME, OB_ALL_VIRTUAL_NIC_INFO_TNAME, OB_ALL_VIRTUAL_SQL_AUDIT_ORA_TNAME, OB_ALL_VIRTUAL_SQL_AUDIT_ORA_ALL_VIRTUAL_SQL_AUDIT_I1_TNAME, @@ -8271,6 +8311,7 @@ const char* const tenant_space_table_names [] = { OB_ALL_VIRTUAL_LS_REAL_AGENT_ORA_TNAME, OB_ALL_VIRTUAL_FLT_CONFIG_ORA_TNAME, OB_ALL_VIRTUAL_TENANT_SCHEDULER_JOB_RUN_DETAIL_REAL_AGENT_ORA_TNAME, + OB_ALL_VIRTUAL_SESSION_INFO_ORA_TNAME, OB_ALL_VIRTUAL_TENANT_SCHEDULER_JOB_CLASS_REAL_AGENT_ORA_TNAME, OB_ALL_VIRTUAL_RECOVER_TABLE_JOB_ORA_TNAME, OB_ALL_VIRTUAL_RECOVER_TABLE_JOB_HISTORY_ORA_TNAME, @@ -8287,6 +8328,7 @@ const char* const tenant_space_table_names [] = { OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_HISTORY_REAL_AGENT_ORA_TNAME, OB_ALL_VIRTUAL_LS_SNAPSHOT_ORA_TNAME, OB_ALL_VIRTUAL_INDEX_USAGE_INFO_REAL_AGENT_ORA_TNAME, + OB_ALL_VIRTUAL_TRACEPOINT_INFO_ORA_TNAME, OB_ALL_VIRTUAL_NIC_INFO_ORA_TNAME, OB_GV_OB_PLAN_CACHE_STAT_TNAME, OB_GV_OB_PLAN_CACHE_PLAN_STAT_TNAME, @@ -8545,6 +8587,8 @@ const char* const tenant_space_table_names [] = { OB_DBA_OB_LS_HISTORY_TNAME, OB_DBA_OB_TENANT_EVENT_HISTORY_TNAME, OB_GV_OB_FLT_TRACE_CONFIG_TNAME, + OB_GV_OB_SESSION_TNAME, + OB_V_OB_SESSION_TNAME, OB_GV_OB_PL_CACHE_OBJECT_TNAME, OB_V_OB_PL_CACHE_OBJECT_TNAME, OB_DBA_OB_RECOVER_TABLE_JOBS_TNAME, @@ -8574,6 +8618,8 @@ const char* const tenant_space_table_names [] = { OB_DBA_MVREF_STATS_TNAME, OB_DBA_MVREF_CHANGE_STATS_TNAME, OB_DBA_MVREF_STMT_STATS_TNAME, + OB_GV_OB_TRACEPOINT_INFO_TNAME, + OB_V_OB_TRACEPOINT_INFO_TNAME, OB_GV_OB_NIC_INFO_TNAME, OB_V_OB_NIC_INFO_TNAME, OB_DBA_SYNONYMS_TNAME, @@ -9018,6 +9064,8 @@ const char* const tenant_space_table_names [] = { OB_V_OB_TIMESTAMP_SERVICE_ORA_TNAME, OB_V_OB_LS_LOG_RESTORE_STATUS_ORA_TNAME, OB_GV_OB_FLT_TRACE_CONFIG_ORA_TNAME, + OB_GV_OB_SESSION_ORA_TNAME, + OB_V_OB_SESSION_ORA_TNAME, OB_GV_OB_PL_CACHE_OBJECT_ORA_TNAME, OB_V_OB_PL_CACHE_OBJECT_ORA_TNAME, OB_GV_OB_CGROUP_CONFIG_ORA_TNAME, @@ -9027,6 +9075,8 @@ const char* const tenant_space_table_names [] = { OB_DBA_INDEX_USAGE_ORA_TNAME, OB_GV_OB_LS_SNAPSHOTS_ORA_TNAME, OB_V_OB_LS_SNAPSHOTS_ORA_TNAME, + OB_GV_OB_TRACEPOINT_INFO_ORA_TNAME, + OB_V_OB_TRACEPOINT_INFO_ORA_TNAME, OB_GV_OB_NIC_INFO_ORA_TNAME, OB_V_OB_NIC_INFO_ORA_TNAME, OB_ALL_TABLE_IDX_DATA_TABLE_ID_TNAME, @@ -9760,7 +9810,6 @@ const uint64_t cluster_distributed_vtables [] = { OB_ALL_VIRTUAL_MASTER_KEY_VERSION_INFO_TID, OB_ALL_VIRTUAL_DAG_TID, OB_ALL_VIRTUAL_DAG_SCHEDULER_TID, - OB_ALL_VIRTUAL_SESSION_INFO_TID, OB_ALL_VIRTUAL_IO_CALIBRATION_STATUS_TID, OB_ALL_VIRTUAL_IO_BENCHMARK_TID, OB_ALL_VIRTUAL_IO_QUOTA_TID, @@ -9832,6 +9881,7 @@ const uint64_t tenant_distributed_vtables [] = { OB_ALL_VIRTUAL_TABLET_COMPACTION_PROGRESS_TID, OB_ALL_VIRTUAL_COMPACTION_DIAGNOSE_INFO_TID, OB_ALL_VIRTUAL_COMPACTION_SUGGESTION_TID, + OB_ALL_VIRTUAL_SESSION_INFO_TID, OB_ALL_VIRTUAL_TABLET_COMPACTION_HISTORY_TID, OB_ALL_VIRTUAL_SERVER_COMPACTION_EVENT_HISTORY_TID, OB_ALL_VIRTUAL_TABLET_STAT_TID, @@ -9885,6 +9935,7 @@ const uint64_t tenant_distributed_vtables [] = { OB_ALL_VIRTUAL_CHECKPOINT_DIAGNOSE_CHECKPOINT_UNIT_INFO_TID, OB_ALL_VIRTUAL_CHECKPOINT_DIAGNOSE_INFO_TID, OB_ALL_VIRTUAL_LS_SNAPSHOT_TID, + OB_ALL_VIRTUAL_TRACEPOINT_INFO_TID, OB_ALL_VIRTUAL_NIC_INFO_TID, OB_ALL_VIRTUAL_SQL_AUDIT_ORA_TID, OB_ALL_VIRTUAL_SQL_AUDIT_ORA_ALL_VIRTUAL_SQL_AUDIT_I1_TID, @@ -9952,9 +10003,11 @@ const uint64_t tenant_distributed_vtables [] = { OB_ALL_VIRTUAL_PX_P2P_DATAHUB_ORA_TID, OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_ORA_TID, OB_ALL_VIRTUAL_LS_LOG_RESTORE_STATUS_ORA_TID, + OB_ALL_VIRTUAL_SESSION_INFO_ORA_TID, OB_ALL_VIRTUAL_LS_INFO_ORA_TID, OB_ALL_VIRTUAL_CGROUP_CONFIG_ORA_TID, OB_ALL_VIRTUAL_LS_SNAPSHOT_ORA_TID, + OB_ALL_VIRTUAL_TRACEPOINT_INFO_ORA_TID, OB_ALL_VIRTUAL_NIC_INFO_ORA_TID, }; const uint64_t restrict_access_virtual_tables[] = { @@ -10068,6 +10121,7 @@ const uint64_t restrict_access_virtual_tables[] = { OB_ALL_VIRTUAL_DBMS_LOCK_ALLOCATED_REAL_AGENT_ORA_TID, OB_ALL_VIRTUAL_WR_CONTROL_ORA_TID, OB_ALL_VIRTUAL_FLT_CONFIG_ORA_TID, + OB_ALL_VIRTUAL_SESSION_INFO_ORA_TID, OB_ALL_VIRTUAL_RECOVER_TABLE_JOB_ORA_TID, OB_ALL_VIRTUAL_RECOVER_TABLE_JOB_HISTORY_ORA_TID, OB_ALL_VIRTUAL_IMPORT_TABLE_JOB_ORA_TID, @@ -10079,6 +10133,7 @@ const uint64_t restrict_access_virtual_tables[] = { OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_HISTORY_REAL_AGENT_ORA_TID, OB_ALL_VIRTUAL_LS_SNAPSHOT_ORA_TID, OB_ALL_VIRTUAL_INDEX_USAGE_INFO_REAL_AGENT_ORA_TID, + OB_ALL_VIRTUAL_TRACEPOINT_INFO_ORA_TID, OB_ALL_VIRTUAL_NIC_INFO_ORA_TID }; @@ -12592,11 +12647,11 @@ static inline int get_sys_table_lob_aux_schema(const uint64_t tid, const int64_t OB_CORE_TABLE_COUNT = 4; const int64_t OB_SYS_TABLE_COUNT = 288; -const int64_t OB_VIRTUAL_TABLE_COUNT = 796; -const int64_t OB_SYS_VIEW_COUNT = 860; -const int64_t OB_SYS_TENANT_TABLE_COUNT = 1949; +const int64_t OB_VIRTUAL_TABLE_COUNT = 799; +const int64_t OB_SYS_VIEW_COUNT = 868; +const int64_t OB_SYS_TENANT_TABLE_COUNT = 1960; const int64_t OB_CORE_SCHEMA_VERSION = 1; -const int64_t OB_BOOTSTRAP_SCHEMA_VERSION = 1952; +const int64_t OB_BOOTSTRAP_SCHEMA_VERSION = 1963; } // end namespace share } // end namespace oceanbase diff --git a/src/share/inner_table/ob_inner_table_schema_constants.h b/src/share/inner_table/ob_inner_table_schema_constants.h index c2bf66b86c..e844c62147 100644 --- a/src/share/inner_table/ob_inner_table_schema_constants.h +++ b/src/share/inner_table/ob_inner_table_schema_constants.h @@ -758,6 +758,7 @@ const uint64_t OB_ALL_VIRTUAL_COLUMN_PRIVILEGE_TID = 12462; // "__all_virtual_co const uint64_t OB_ALL_VIRTUAL_COLUMN_PRIVILEGE_HISTORY_TID = 12463; // "__all_virtual_column_privilege_history" const uint64_t OB_ALL_VIRTUAL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_TID = 12464; // "__all_virtual_tenant_snapshot_ls_replica_history" const uint64_t OB_ENABLED_ROLES_TID = 12466; // "ENABLED_ROLES" +const uint64_t OB_ALL_VIRTUAL_TRACEPOINT_INFO_TID = 12469; // "__all_virtual_tracepoint_info" const uint64_t OB_ALL_VIRTUAL_NIC_INFO_TID = 12487; // "__all_virtual_nic_info" const uint64_t OB_ALL_VIRTUAL_SQL_AUDIT_ORA_TID = 15009; // "ALL_VIRTUAL_SQL_AUDIT_ORA" const uint64_t OB_ALL_VIRTUAL_PLAN_STAT_ORA_TID = 15010; // "ALL_VIRTUAL_PLAN_STAT_ORA" @@ -1007,6 +1008,7 @@ const uint64_t OB_ALL_VIRTUAL_TENANT_EVENT_HISTORY_ORA_TID = 15399; // "ALL_VIRT const uint64_t OB_ALL_VIRTUAL_LS_REAL_AGENT_ORA_TID = 15402; // "ALL_VIRTUAL_LS_REAL_AGENT_ORA" const uint64_t OB_ALL_VIRTUAL_FLT_CONFIG_ORA_TID = 15403; // "ALL_VIRTUAL_FLT_CONFIG_ORA" const uint64_t OB_ALL_VIRTUAL_TENANT_SCHEDULER_JOB_RUN_DETAIL_REAL_AGENT_ORA_TID = 15404; // "ALL_VIRTUAL_TENANT_SCHEDULER_JOB_RUN_DETAIL_REAL_AGENT_ORA" +const uint64_t OB_ALL_VIRTUAL_SESSION_INFO_ORA_TID = 15405; // "ALL_VIRTUAL_SESSION_INFO_ORA" const uint64_t OB_ALL_VIRTUAL_TENANT_SCHEDULER_JOB_CLASS_REAL_AGENT_ORA_TID = 15406; // "ALL_VIRTUAL_TENANT_SCHEDULER_JOB_CLASS_REAL_AGENT_ORA" const uint64_t OB_ALL_VIRTUAL_RECOVER_TABLE_JOB_ORA_TID = 15407; // "ALL_VIRTUAL_RECOVER_TABLE_JOB_ORA" const uint64_t OB_ALL_VIRTUAL_RECOVER_TABLE_JOB_HISTORY_ORA_TID = 15408; // "ALL_VIRTUAL_RECOVER_TABLE_JOB_HISTORY_ORA" @@ -1023,6 +1025,7 @@ const uint64_t OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_REAL_AGENT_ORA_TID = 15430 const uint64_t OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_HISTORY_REAL_AGENT_ORA_TID = 15431; // "ALL_VIRTUAL_TRANSFER_PARTITION_TASK_HISTORY_REAL_AGENT_ORA" const uint64_t OB_ALL_VIRTUAL_LS_SNAPSHOT_ORA_TID = 15439; // "ALL_VIRTUAL_LS_SNAPSHOT_ORA" const uint64_t OB_ALL_VIRTUAL_INDEX_USAGE_INFO_REAL_AGENT_ORA_TID = 15440; // "ALL_VIRTUAL_INDEX_USAGE_INFO_REAL_AGENT_ORA" +const uint64_t OB_ALL_VIRTUAL_TRACEPOINT_INFO_ORA_TID = 15445; // "ALL_VIRTUAL_TRACEPOINT_INFO_ORA" const uint64_t OB_ALL_VIRTUAL_NIC_INFO_ORA_TID = 15456; // "ALL_VIRTUAL_NIC_INFO_ORA" const uint64_t OB_GV_OB_PLAN_CACHE_STAT_TID = 20001; // "GV$OB_PLAN_CACHE_STAT" const uint64_t OB_GV_OB_PLAN_CACHE_PLAN_STAT_TID = 20002; // "GV$OB_PLAN_CACHE_PLAN_STAT" @@ -1377,6 +1380,8 @@ const uint64_t OB_CDB_OB_LS_HISTORY_TID = 21446; // "CDB_OB_LS_HISTORY" const uint64_t OB_DBA_OB_TENANT_EVENT_HISTORY_TID = 21447; // "DBA_OB_TENANT_EVENT_HISTORY" const uint64_t OB_CDB_OB_TENANT_EVENT_HISTORY_TID = 21448; // "CDB_OB_TENANT_EVENT_HISTORY" const uint64_t OB_GV_OB_FLT_TRACE_CONFIG_TID = 21449; // "GV$OB_FLT_TRACE_CONFIG" +const uint64_t OB_GV_OB_SESSION_TID = 21459; // "GV$OB_SESSION" +const uint64_t OB_V_OB_SESSION_TID = 21460; // "V$OB_SESSION" const uint64_t OB_GV_OB_PL_CACHE_OBJECT_TID = 21461; // "GV$OB_PL_CACHE_OBJECT" const uint64_t OB_V_OB_PL_CACHE_OBJECT_TID = 21462; // "V$OB_PL_CACHE_OBJECT" const uint64_t OB_CDB_OB_RECOVER_TABLE_JOBS_TID = 21463; // "CDB_OB_RECOVER_TABLE_JOBS" @@ -1429,6 +1434,8 @@ const uint64_t OB_CDB_MVREF_CHANGE_STATS_TID = 21537; // "CDB_MVREF_CHANGE_STATS const uint64_t OB_DBA_MVREF_CHANGE_STATS_TID = 21538; // "DBA_MVREF_CHANGE_STATS" const uint64_t OB_CDB_MVREF_STMT_STATS_TID = 21539; // "CDB_MVREF_STMT_STATS" const uint64_t OB_DBA_MVREF_STMT_STATS_TID = 21540; // "DBA_MVREF_STMT_STATS" +const uint64_t OB_GV_OB_TRACEPOINT_INFO_TID = 21543; // "GV$OB_TRACEPOINT_INFO" +const uint64_t OB_V_OB_TRACEPOINT_INFO_TID = 21544; // "V$OB_TRACEPOINT_INFO" const uint64_t OB_GV_OB_NIC_INFO_TID = 21580; // "GV$OB_NIC_INFO" const uint64_t OB_V_OB_NIC_INFO_TID = 21581; // "V$OB_NIC_INFO" const uint64_t OB_DBA_SYNONYMS_TID = 25001; // "DBA_SYNONYMS" @@ -1873,6 +1880,8 @@ const uint64_t OB_V_OB_ARBITRATION_SERVICE_STATUS_ORA_TID = 28192; // "V$OB_ARBI const uint64_t OB_V_OB_TIMESTAMP_SERVICE_ORA_TID = 28193; // "V$OB_TIMESTAMP_SERVICE_ORA" const uint64_t OB_V_OB_LS_LOG_RESTORE_STATUS_ORA_TID = 28194; // "V$OB_LS_LOG_RESTORE_STATUS_ORA" const uint64_t OB_GV_OB_FLT_TRACE_CONFIG_ORA_TID = 28195; // "GV$OB_FLT_TRACE_CONFIG_ORA" +const uint64_t OB_GV_OB_SESSION_ORA_TID = 28196; // "GV$OB_SESSION_ORA" +const uint64_t OB_V_OB_SESSION_ORA_TID = 28197; // "V$OB_SESSION_ORA" const uint64_t OB_GV_OB_PL_CACHE_OBJECT_ORA_TID = 28198; // "GV$OB_PL_CACHE_OBJECT_ORA" const uint64_t OB_V_OB_PL_CACHE_OBJECT_ORA_TID = 28199; // "V$OB_PL_CACHE_OBJECT_ORA" const uint64_t OB_GV_OB_CGROUP_CONFIG_ORA_TID = 28200; // "GV$OB_CGROUP_CONFIG_ORA" @@ -1882,6 +1891,8 @@ const uint64_t OB_DBA_OB_SYS_VARIABLES_ORA_TID = 28211; // "DBA_OB_SYS_VARIABLES const uint64_t OB_DBA_INDEX_USAGE_ORA_TID = 28214; // "DBA_INDEX_USAGE_ORA" const uint64_t OB_GV_OB_LS_SNAPSHOTS_ORA_TID = 28215; // "GV$OB_LS_SNAPSHOTS_ORA" const uint64_t OB_V_OB_LS_SNAPSHOTS_ORA_TID = 28216; // "V$OB_LS_SNAPSHOTS_ORA" +const uint64_t OB_GV_OB_TRACEPOINT_INFO_ORA_TID = 28221; // "GV$OB_TRACEPOINT_INFO_ORA" +const uint64_t OB_V_OB_TRACEPOINT_INFO_ORA_TID = 28222; // "V$OB_TRACEPOINT_INFO_ORA" const uint64_t OB_GV_OB_NIC_INFO_ORA_TID = 28230; // "GV$OB_NIC_INFO_ORA" const uint64_t OB_V_OB_NIC_INFO_ORA_TID = 28231; // "V$OB_NIC_INFO_ORA" const uint64_t OB_ALL_TABLE_AUX_LOB_META_TID = 50003; // "__all_table_aux_lob_meta" @@ -3393,6 +3404,7 @@ const char *const OB_ALL_VIRTUAL_COLUMN_PRIVILEGE_TNAME = "__all_virtual_column_ const char *const OB_ALL_VIRTUAL_COLUMN_PRIVILEGE_HISTORY_TNAME = "__all_virtual_column_privilege_history"; const char *const OB_ALL_VIRTUAL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_TNAME = "__all_virtual_tenant_snapshot_ls_replica_history"; const char *const OB_ENABLED_ROLES_TNAME = "ENABLED_ROLES"; +const char *const OB_ALL_VIRTUAL_TRACEPOINT_INFO_TNAME = "__all_virtual_tracepoint_info"; const char *const OB_ALL_VIRTUAL_NIC_INFO_TNAME = "__all_virtual_nic_info"; const char *const OB_ALL_VIRTUAL_SQL_AUDIT_ORA_TNAME = "ALL_VIRTUAL_SQL_AUDIT"; const char *const OB_ALL_VIRTUAL_PLAN_STAT_ORA_TNAME = "ALL_VIRTUAL_PLAN_STAT"; @@ -3642,6 +3654,7 @@ const char *const OB_ALL_VIRTUAL_TENANT_EVENT_HISTORY_ORA_TNAME = "ALL_VIRTUAL_T const char *const OB_ALL_VIRTUAL_LS_REAL_AGENT_ORA_TNAME = "ALL_VIRTUAL_LS_REAL_AGENT"; const char *const OB_ALL_VIRTUAL_FLT_CONFIG_ORA_TNAME = "ALL_VIRTUAL_FLT_CONFIG"; const char *const OB_ALL_VIRTUAL_TENANT_SCHEDULER_JOB_RUN_DETAIL_REAL_AGENT_ORA_TNAME = "ALL_VIRTUAL_TENANT_SCHEDULER_JOB_RUN_DETAIL_REAL_AGENT"; +const char *const OB_ALL_VIRTUAL_SESSION_INFO_ORA_TNAME = "ALL_VIRTUAL_SESSION_INFO"; const char *const OB_ALL_VIRTUAL_TENANT_SCHEDULER_JOB_CLASS_REAL_AGENT_ORA_TNAME = "ALL_VIRTUAL_TENANT_SCHEDULER_JOB_CLASS_REAL_AGENT"; const char *const OB_ALL_VIRTUAL_RECOVER_TABLE_JOB_ORA_TNAME = "ALL_VIRTUAL_RECOVER_TABLE_JOB"; const char *const OB_ALL_VIRTUAL_RECOVER_TABLE_JOB_HISTORY_ORA_TNAME = "ALL_VIRTUAL_RECOVER_TABLE_JOB_HISTORY"; @@ -3658,6 +3671,7 @@ const char *const OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_REAL_AGENT_ORA_TNAME = const char *const OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_HISTORY_REAL_AGENT_ORA_TNAME = "ALL_VIRTUAL_TRANSFER_PARTITION_TASK_HISTORY_REAL_AGENT"; const char *const OB_ALL_VIRTUAL_LS_SNAPSHOT_ORA_TNAME = "ALL_VIRTUAL_LS_SNAPSHOT"; const char *const OB_ALL_VIRTUAL_INDEX_USAGE_INFO_REAL_AGENT_ORA_TNAME = "ALL_VIRTUAL_INDEX_USAGE_INFO_REAL_AGENT"; +const char *const OB_ALL_VIRTUAL_TRACEPOINT_INFO_ORA_TNAME = "ALL_VIRTUAL_TRACEPOINT_INFO"; const char *const OB_ALL_VIRTUAL_NIC_INFO_ORA_TNAME = "ALL_VIRTUAL_NIC_INFO"; const char *const OB_GV_OB_PLAN_CACHE_STAT_TNAME = "GV$OB_PLAN_CACHE_STAT"; const char *const OB_GV_OB_PLAN_CACHE_PLAN_STAT_TNAME = "GV$OB_PLAN_CACHE_PLAN_STAT"; @@ -4012,6 +4026,8 @@ const char *const OB_CDB_OB_LS_HISTORY_TNAME = "CDB_OB_LS_HISTORY"; const char *const OB_DBA_OB_TENANT_EVENT_HISTORY_TNAME = "DBA_OB_TENANT_EVENT_HISTORY"; const char *const OB_CDB_OB_TENANT_EVENT_HISTORY_TNAME = "CDB_OB_TENANT_EVENT_HISTORY"; const char *const OB_GV_OB_FLT_TRACE_CONFIG_TNAME = "GV$OB_FLT_TRACE_CONFIG"; +const char *const OB_GV_OB_SESSION_TNAME = "GV$OB_SESSION"; +const char *const OB_V_OB_SESSION_TNAME = "V$OB_SESSION"; const char *const OB_GV_OB_PL_CACHE_OBJECT_TNAME = "GV$OB_PL_CACHE_OBJECT"; const char *const OB_V_OB_PL_CACHE_OBJECT_TNAME = "V$OB_PL_CACHE_OBJECT"; const char *const OB_CDB_OB_RECOVER_TABLE_JOBS_TNAME = "CDB_OB_RECOVER_TABLE_JOBS"; @@ -4064,6 +4080,8 @@ const char *const OB_CDB_MVREF_CHANGE_STATS_TNAME = "CDB_MVREF_CHANGE_STATS"; const char *const OB_DBA_MVREF_CHANGE_STATS_TNAME = "DBA_MVREF_CHANGE_STATS"; const char *const OB_CDB_MVREF_STMT_STATS_TNAME = "CDB_MVREF_STMT_STATS"; const char *const OB_DBA_MVREF_STMT_STATS_TNAME = "DBA_MVREF_STMT_STATS"; +const char *const OB_GV_OB_TRACEPOINT_INFO_TNAME = "GV$OB_TRACEPOINT_INFO"; +const char *const OB_V_OB_TRACEPOINT_INFO_TNAME = "V$OB_TRACEPOINT_INFO"; const char *const OB_GV_OB_NIC_INFO_TNAME = "GV$OB_NIC_INFO"; const char *const OB_V_OB_NIC_INFO_TNAME = "V$OB_NIC_INFO"; const char *const OB_DBA_SYNONYMS_TNAME = "DBA_SYNONYMS"; @@ -4508,6 +4526,8 @@ const char *const OB_V_OB_ARBITRATION_SERVICE_STATUS_ORA_TNAME = "V$OB_ARBITRATI const char *const OB_V_OB_TIMESTAMP_SERVICE_ORA_TNAME = "V$OB_TIMESTAMP_SERVICE"; const char *const OB_V_OB_LS_LOG_RESTORE_STATUS_ORA_TNAME = "V$OB_LS_LOG_RESTORE_STATUS"; const char *const OB_GV_OB_FLT_TRACE_CONFIG_ORA_TNAME = "GV$OB_FLT_TRACE_CONFIG"; +const char *const OB_GV_OB_SESSION_ORA_TNAME = "GV$OB_SESSION"; +const char *const OB_V_OB_SESSION_ORA_TNAME = "V$OB_SESSION"; const char *const OB_GV_OB_PL_CACHE_OBJECT_ORA_TNAME = "GV$OB_PL_CACHE_OBJECT"; const char *const OB_V_OB_PL_CACHE_OBJECT_ORA_TNAME = "V$OB_PL_CACHE_OBJECT"; const char *const OB_GV_OB_CGROUP_CONFIG_ORA_TNAME = "GV$OB_CGROUP_CONFIG"; @@ -4517,6 +4537,8 @@ const char *const OB_DBA_OB_SYS_VARIABLES_ORA_TNAME = "DBA_OB_SYS_VARIABLES"; const char *const OB_DBA_INDEX_USAGE_ORA_TNAME = "DBA_INDEX_USAGE"; const char *const OB_GV_OB_LS_SNAPSHOTS_ORA_TNAME = "GV$OB_LS_SNAPSHOTS"; const char *const OB_V_OB_LS_SNAPSHOTS_ORA_TNAME = "V$OB_LS_SNAPSHOTS"; +const char *const OB_GV_OB_TRACEPOINT_INFO_ORA_TNAME = "GV$OB_TRACEPOINT_INFO"; +const char *const OB_V_OB_TRACEPOINT_INFO_ORA_TNAME = "V$OB_TRACEPOINT_INFO"; const char *const OB_GV_OB_NIC_INFO_ORA_TNAME = "GV$OB_NIC_INFO"; const char *const OB_V_OB_NIC_INFO_ORA_TNAME = "V$OB_NIC_INFO"; const char *const OB_ALL_TABLE_AUX_LOB_META_TNAME = "__all_table_aux_lob_meta"; diff --git a/src/share/inner_table/ob_inner_table_schema_def.py b/src/share/inner_table/ob_inner_table_schema_def.py index a8199e7e43..4f0ebcb4d1 100644 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -7298,7 +7298,7 @@ def_table_schema( ('db', 'varchar:OB_MAX_DATABASE_NAME_LENGTH', 'true'), ('command', 'varchar:OB_MAX_COMMAND_LENGTH', 'false', ''), ('sql_id', 'varchar:OB_MAX_SQL_ID_LENGTH', 'false', ''), - ('time', 'int', 'false', '0'), + ('time', 'double', 'false'), ('state', 'varchar:OB_MAX_SESSION_STATE_LENGTH', 'true'), ('info', 'varchar:MAX_COLUMN_VARCHAR_LENGTH', 'true'), ('svr_ip', 'varchar:MAX_IP_ADDR_LENGTH'), @@ -7313,7 +7313,7 @@ def_table_schema( ('ssl_cipher', 'varchar:OB_MAX_COMMAND_LENGTH', 'true'), ('trace_id', 'varchar:OB_MAX_TRACE_ID_BUFFER_SIZE', 'true', ''), ('trans_state', 'varchar:OB_MAX_TRANS_STATE_LENGTH', 'true'), - ('total_time', 'int', 'false', '0'), + ('total_time', 'double', 'false'), ('retry_cnt', 'int', 'false', '0'), ('retry_info', 'int', 'false', '0'), ('action', 'varchar:MAX_VALUE_LENGTH', 'true', ''), @@ -9568,6 +9568,7 @@ def_table_schema( table_type = 'VIRTUAL_TABLE', gm_columns = [], rowkey_columns = [], + in_tenant_space = True, normal_columns = [ ('id', 'uint', 'false', '0'), @@ -9577,7 +9578,7 @@ def_table_schema( ('db', 'varchar:OB_MAX_DATABASE_NAME_LENGTH', 'true'), ('command', 'varchar:OB_MAX_COMMAND_LENGTH', 'false', ''), ('sql_id', 'varchar:OB_MAX_SQL_ID_LENGTH', 'false', ''), - ('time', 'int', 'false', '0'), + ('time', 'double', 'false'), ('state', 'varchar:OB_MAX_SESSION_STATE_LENGTH', 'true'), ('info', 'varchar:MAX_COLUMN_VARCHAR_LENGTH', 'true'), ('svr_ip', 'varchar:MAX_IP_ADDR_LENGTH'), @@ -14119,7 +14120,30 @@ def_table_schema( # 12467: __all_virtual_ls_replica_task_history # 12468: __all_virtual_session_ps_info -# 12469: __all_virtual_tracepoint_info +def_table_schema( + owner = 'fy373789', + tablegroup_id = 'OB_INVALID_ID', + table_name = '__all_virtual_tracepoint_info', + table_id = '12469', + table_type = 'VIRTUAL_TABLE', + gm_columns = [], + in_tenant_space = True, + rowkey_columns = [], + + normal_columns = [ + ('svr_ip', 'varchar:MAX_IP_ADDR_LENGTH'), + ('svr_port', 'int'), + ('tp_no', 'int'), + ('tp_name', 'varchar:OB_MAX_TRACEPOINT_NAME_LEN'), + ('tp_describe', 'varchar:OB_MAX_TRACEPOINT_DESCRIBE_LEN'), + ('tp_frequency', 'int'), + ('tp_error_code', 'int'), + ('tp_occur', 'int'), + ('tp_match', 'int'), + ], + partition_columns = ['svr_ip', 'svr_port'], + vtable_route_policy = 'distributed', +) # 12470: __all_virtual_ls_compaction_status # 12471: __all_virtual_tablet_compaction_status # 12472: __all_virtual_tablet_checksum_error_info @@ -14575,7 +14599,7 @@ def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15403' def_table_schema(**gen_oracle_mapping_real_virtual_table_def('15404', all_def_keywords['__all_tenant_scheduler_job_run_detail'])) -# 15405: __all_virtual_session_info +def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15405', all_def_keywords['__all_virtual_session_info']))) def_table_schema(**gen_oracle_mapping_real_virtual_table_def('15406', all_def_keywords['__all_tenant_scheduler_job_class'])) def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15407', all_def_keywords['__all_virtual_recover_table_job']))) @@ -14620,7 +14644,7 @@ def_table_schema(**no_direct_access(gen_oracle_mapping_real_virtual_table_def('1 # 15442: __all_virtual_column_group # 15443: __all_virtual_ls_replica_task_history # 15444: __all_virtual_session_ps_info -# 15445: __all_virtual_tracepoint_info +def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15445', all_def_keywords['__all_virtual_tracepoint_info']))) # 15446: __all_user_proxy_info # 15447: __all_user_proxy_role_info # 15448: idx_user_proxy_info_proxy_user_id_real_agent @@ -15163,7 +15187,7 @@ def_table_schema( table_type = 'SYSTEM_VIEW', gm_columns = [], rowkey_columns = [], - view_definition = """SELECT id AS ID, user AS USER, concat(user_client_ip, ':', user_client_port) AS HOST, db AS DB, command AS COMMAND, time AS TIME, state AS STATE, info AS INFO FROM oceanbase.__all_virtual_processlist WHERE is_serving_tenant(svr_ip, svr_port, effective_tenant_id()) + view_definition = """SELECT id AS ID, user AS USER, concat(user_client_ip, ':', user_client_port) AS HOST, db AS DB, command AS COMMAND, cast(time as SIGNED) AS TIME, state AS STATE, info AS INFO FROM oceanbase.__all_virtual_processlist WHERE is_serving_tenant(svr_ip, svr_port, effective_tenant_id()) """.replace("\n", " "), in_tenant_space = True, @@ -23296,7 +23320,8 @@ SELECT LB_VPORT, IN_BYTES, OUT_BYTES, - USER_CLIENT_PORT + USER_CLIENT_PORT, + cast(total_cpu_time as SIGNED) as TOTAL_CPU_TIME FROM oceanbase.__all_virtual_processlist """.replace("\n", " ") ) @@ -23345,7 +23370,8 @@ def_table_schema( LB_VPORT, IN_BYTES, OUT_BYTES, - USER_CLIENT_PORT + USER_CLIENT_PORT, + cast(total_cpu_time as SIGNED) as TOTAL_CPU_TIME FROM oceanbase.GV$OB_PROCESSLIST WHERE SVR_IP = host_ip() AND SVR_PORT = rpc_port() """.replace("\n", " ") @@ -31524,8 +31550,85 @@ def_table_schema( WHERE a.tenant_id = b.tenant_id """.replace("\n", " ") ) + +def_table_schema( + owner = 'jingfeng.jf', + table_name = 'GV$OB_SESSION', + table_id = '21459', + gm_columns = [], + rowkey_columns = [], + table_type = 'SYSTEM_VIEW', + in_tenant_space = True, + view_definition = """select + id as ID, + user as USER, + tenant as TENANT, + host as HOST, + db as DB, + command as COMMAND, + sql_id as SQL_ID, + cast(time as SIGNED) as TIME, + state as STATE, + info as INFO, + svr_ip as SVR_IP, + svr_port as SVR_PORT, + sql_port as SQL_PORT, + proxy_sessid as PROXY_SESSID, + user_client_ip as USER_CLIENT_IP, + user_host as USER_HOST, + trans_id as TRANS_ID, + thread_id as THREAD_ID, + trace_id as TRACE_ID, + ref_count as REF_COUNT, + backtrace as BACKTRACE, + trans_state as TRANS_STATE, + user_client_port as USER_CLIENT_PORT, + cast(total_cpu_time as SIGNED) as TOTAL_CPU_TIME + from oceanbase.__all_virtual_session_info +""".replace("\n", " "), + normal_columns = [], +) +def_table_schema( + owner = 'jingfeng.jf', + table_name = 'V$OB_SESSION', + table_id = '21460', + gm_columns = [], + rowkey_columns = [], + table_type = 'SYSTEM_VIEW', + in_tenant_space = True, + view_definition = """SELECT + id as ID, + user as USER, + tenant as TENANT, + host as HOST, + db as DB, + command as COMMAND, + sql_id as SQL_ID, + cast(time as SIGNED) as TIME, + state as STATE, + info as INFO, + svr_ip as SVR_IP, + svr_port as SVR_PORT, + sql_port as SQL_PORT, + proxy_sessid as PROXY_SESSID, + user_client_ip as USER_CLIENT_IP, + user_host as USER_HOST, + trans_id as TRANS_ID, + thread_id as THREAD_ID, + trace_id as TRACE_ID, + ref_count as REF_COUNT, + backtrace as BACKTRACE, + trans_state as TRANS_STATE, + user_client_port as USER_CLIENT_PORT, + cast(total_cpu_time as SIGNED) as TOTAL_CPU_TIME FROM oceanbase.gv$ob_session WHERE svr_ip=HOST_IP() AND svr_port=RPC_PORT() +""".replace("\n", " "), + normal_columns = [], +) + # 21459:GV$OB_SESSION # 21460:V$OB_SESSION +# 21461: GV$OB_PL_CACHE_OBJECT +# 21462: V$OB_PL_CACHE_OBJECT def_table_schema( owner = 'hr351303', @@ -33659,8 +33762,52 @@ def_table_schema( # 21541: GV$OB_SESSION_PS_INFO # 21542: V$OB_SESSION_PS_INFO -# 21543: GV$OB_TRACEPOINT_INFO -# 21544: V$OB_TRACEPOINT_INFO +def_table_schema( + owner = 'fy373789', + table_name = 'GV$OB_TRACEPOINT_INFO', + table_id = '21543', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + in_tenant_space = True, + view_definition = """SELECT + SVR_IP, + SVR_PORT, + TP_NO, + TP_NAME, + TP_DESCRIBE, + TP_FREQUENCY, + TP_ERROR_CODE, + TP_OCCUR, + TP_MATCH + FROM oceanbase.__all_virtual_tracepoint_info +""".replace("\n", " ") +) + +def_table_schema( + owner = 'fy373789', + table_name = 'V$OB_TRACEPOINT_INFO', + table_id = '21544', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + in_tenant_space = True, + view_definition = """SELECT + SVR_IP, + SVR_PORT, + TP_NO, + TP_NAME, + TP_DESCRIBE, + TP_FREQUENCY, + TP_ERROR_CODE, + TP_OCCUR, + TP_MATCH + FROM OCEANBASE.GV$OB_TRACEPOINT_INFO + WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() +""".replace("\n", " ") +) # 21545: V$OB_COMPATIBILITY_CONTROL # 21546: DBA_OB_RSRC_DIRECTIVES # 21547: CDB_OB_RSRC_DIRECTIVES @@ -60638,8 +60785,90 @@ def_table_schema( WHERE a.TENANT_ID = b.TENANT_ID; """.replace("\n", " ") ) + +def_table_schema( + owner = 'jingfeng.jf', + table_name = 'GV$OB_SESSION', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '28196', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + in_tenant_space = True, + view_definition = """SELECT + id ID, + "USER", + tenant TENANT, + host HOST, + db DB, + command COMMAND, + sql_id SQL_ID, + CAST(time AS INT) TIME, + state STATE, + info INFO, + svr_ip SVR_IP, + svr_port SVR_PORT, + sql_port SQL_PORT, + proxy_sessid PROXY_SESSID, + user_client_ip as USER_CLIENT_IP, + user_host as USER_HOST, + trans_id as TRANS_ID, + thread_id as THREAD_ID, + trace_id as TRACE_ID, + ref_count as REF_COUNT, + backtrace as BACKTRACE, + trans_state as TRANS_STATE, + user_client_port as USER_CLIENT_PORT, + CAST(total_cpu_time AS INT) as TOTAL_CPU_TIME + FROM SYS.ALL_VIRTUAL_SESSION_INFO +""".replace("\n", " ") +) +def_table_schema( + owner = 'jingfeng.jf', + table_name = 'V$OB_SESSION', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '28197', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + in_tenant_space = True, + view_definition = """SELECT + id ID, + "USER", + tenant TENANT, + host HOST, + db DB, + command COMMAND, + sql_id SQL_ID, + CAST(time AS INT) TIME, + state STATE, + info INFO, + svr_ip SVR_IP, + svr_port SVR_PORT, + sql_port SQL_PORT, + proxy_sessid PROXY_SESSID, + user_client_ip as USER_CLIENT_IP, + user_host as USER_HOST, + trans_id as TRANS_ID, + thread_id as THREAD_ID, + trace_id as TRACE_ID, + ref_count as REF_COUNT, + backtrace as BACKTRACE, + trans_state as TRANS_STATE, + user_client_port as USER_CLIENT_PORT, + CAST(total_cpu_time AS INT) as TOTAL_CPU_TIME + FROM SYS.GV$OB_SESSION WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() +""".replace("\n", " ") +) + # 28196: GV$OB_SESSION # 28197: V$OB_SESSION +# 28198: GV$OB_PL_CACHE_OBJECT +# 28199: V$OB_PL_CACHE_OBJECT def_table_schema( owner = 'hr351303', @@ -60956,8 +61185,56 @@ def_table_schema( # 28218: V$OB_SHARED_STORAGE_QUOTA # 28219: GV$OB_SESSION_PS_INFO # 28220: V$OB_SESSION_PS_INFO -# 28221: GV$OB_TRACEPOINT_INFO -# 28222: V$OB_TRACEPOINT_INFO +def_table_schema( + owner = 'fy373789', + table_name = 'GV$OB_TRACEPOINT_INFO', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '28221', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + in_tenant_space = True, + rowkey_columns = [], + normal_columns = [], + view_definition = """SELECT + SVR_IP, + SVR_PORT, + TP_NO, + TP_NAME, + TP_DESCRIBE, + TP_FREQUENCY, + TP_ERROR_CODE, + TP_OCCUR, + TP_MATCH + FROM SYS.ALL_VIRTUAL_TRACEPOINT_INFO +""".replace("\n", " ") +) + +def_table_schema( + owner = 'fy373789', + table_name = 'V$OB_TRACEPOINT_INFO', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '28222', + table_type = 'SYSTEM_VIEW', + gm_columns = [], + in_tenant_space = True, + rowkey_columns = [], + normal_columns = [], + view_definition = """SELECT + SVR_IP, + SVR_PORT, + TP_NO, + TP_NAME, + TP_DESCRIBE, + TP_FREQUENCY, + TP_ERROR_CODE, + TP_OCCUR, + TP_MATCH + FROM SYS.GV$OB_TRACEPOINT_INFO + WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() +""".replace("\n", " ") +) # 28223: DBA_OB_RSRC_DIRECTIVES # 28224: GV$OB_TENANT_RESOURCE_LIMIT # 28225: V$OB_TENANT_RESOURCE_LIMIT diff --git a/src/share/inner_table/table_id_to_name b/src/share/inner_table/table_id_to_name index 83b8769c33..18d0e425c5 100644 --- a/src/share/inner_table/table_id_to_name +++ b/src/share/inner_table/table_id_to_name @@ -1092,6 +1092,7 @@ # 12464: __all_virtual_tenant_snapshot_ls_replica_history # 12464: __all_tenant_snapshot_ls_replica_history # BASE_TABLE_NAME # 12466: ENABLED_ROLES +# 12469: __all_virtual_tracepoint_info # 12487: __all_virtual_nic_info # 15009: ALL_VIRTUAL_SQL_AUDIT # 15009: __all_virtual_sql_audit # BASE_TABLE_NAME @@ -1641,6 +1642,8 @@ # 15403: __all_virtual_flt_config # BASE_TABLE_NAME # 15404: ALL_VIRTUAL_TENANT_SCHEDULER_JOB_RUN_DETAIL_REAL_AGENT # 15404: __all_tenant_scheduler_job_run_detail # BASE_TABLE_NAME +# 15405: ALL_VIRTUAL_SESSION_INFO +# 15405: __all_virtual_session_info # BASE_TABLE_NAME # 15406: ALL_VIRTUAL_TENANT_SCHEDULER_JOB_CLASS_REAL_AGENT # 15406: __all_tenant_scheduler_job_class # BASE_TABLE_NAME # 15407: ALL_VIRTUAL_RECOVER_TABLE_JOB @@ -1680,6 +1683,8 @@ # 15439: __all_virtual_ls_snapshot # BASE_TABLE_NAME # 15440: ALL_VIRTUAL_INDEX_USAGE_INFO_REAL_AGENT # 15440: __all_index_usage_info # BASE_TABLE_NAME +# 15445: ALL_VIRTUAL_TRACEPOINT_INFO +# 15445: __all_virtual_tracepoint_info # BASE_TABLE_NAME # 15456: ALL_VIRTUAL_NIC_INFO # 15456: __all_virtual_nic_info # BASE_TABLE_NAME # 20001: GV$OB_PLAN_CACHE_STAT @@ -2035,6 +2040,8 @@ # 21447: DBA_OB_TENANT_EVENT_HISTORY # 21448: CDB_OB_TENANT_EVENT_HISTORY # 21449: GV$OB_FLT_TRACE_CONFIG +# 21459: GV$OB_SESSION +# 21460: V$OB_SESSION # 21461: GV$OB_PL_CACHE_OBJECT # 21462: V$OB_PL_CACHE_OBJECT # 21463: CDB_OB_RECOVER_TABLE_JOBS @@ -2087,6 +2094,8 @@ # 21538: DBA_MVREF_CHANGE_STATS # 21539: CDB_MVREF_STMT_STATS # 21540: DBA_MVREF_STMT_STATS +# 21543: GV$OB_TRACEPOINT_INFO +# 21544: V$OB_TRACEPOINT_INFO # 21580: GV$OB_NIC_INFO # 21581: V$OB_NIC_INFO # 25001: DBA_SYNONYMS @@ -2531,6 +2540,8 @@ # 28193: V$OB_TIMESTAMP_SERVICE # 28194: V$OB_LS_LOG_RESTORE_STATUS # 28195: GV$OB_FLT_TRACE_CONFIG +# 28196: GV$OB_SESSION +# 28197: V$OB_SESSION # 28198: GV$OB_PL_CACHE_OBJECT # 28199: V$OB_PL_CACHE_OBJECT # 28200: GV$OB_CGROUP_CONFIG @@ -2540,6 +2551,8 @@ # 28214: DBA_INDEX_USAGE # 28215: GV$OB_LS_SNAPSHOTS # 28216: V$OB_LS_SNAPSHOTS +# 28221: GV$OB_TRACEPOINT_INFO +# 28222: V$OB_TRACEPOINT_INFO # 28230: GV$OB_NIC_INFO # 28231: V$OB_NIC_INFO # 14999: __idx_11003_all_virtual_plan_cache_stat_i1 diff --git a/src/share/parameter/ob_parameter_seed.ipp b/src/share/parameter/ob_parameter_seed.ipp index e7f7c25e84..f85204c2e8 100644 --- a/src/share/parameter/ob_parameter_seed.ipp +++ b/src/share/parameter/ob_parameter_seed.ipp @@ -1686,6 +1686,9 @@ DEF_CAP(_pdml_thread_cache_size, OB_CLUSTER_PARAMETER, "2M", "[1B,)", "The cache size of per pdml thread." "Range:[1B, )", ObParameterAttr(Section::OBSERVER, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); +DEF_BOOL(_enable_hgby_llc_ndv_adaptive, OB_TENANT_PARAMETER, "True", + "specifies whether llc ndv adptive is activated", + ObParameterAttr(Section::TENANT, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); DEF_BOOL(_enable_reserved_user_dcl_restriction, OB_CLUSTER_PARAMETER, "False", "specifies whether to forbid non-reserved user to modify reserved users", ObParameterAttr(Section::OBSERVER, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); diff --git a/src/share/vector/ob_continuous_base.h b/src/share/vector/ob_continuous_base.h index a6d5657380..c61c84188e 100644 --- a/src/share/vector/ob_continuous_base.h +++ b/src/share/vector/ob_continuous_base.h @@ -38,9 +38,11 @@ public: { has_null_ = has_null; nulls_->reset(read_rows); - for (int64_t i = 0; i < read_rows; ++i) { - if (nulls.at(start_idx + i)) { - nulls_->set(i); + if (has_null) { + for (int64_t i = 0; i < read_rows; ++i) { + if (nulls.at(start_idx + i)) { + nulls_->set(i); + } } } offsets_ = offsets + start_idx; diff --git a/src/share/vector/ob_fixed_length_base.h b/src/share/vector/ob_fixed_length_base.h index 4d6ad09f44..320f2a0783 100644 --- a/src/share/vector/ob_fixed_length_base.h +++ b/src/share/vector/ob_fixed_length_base.h @@ -45,9 +45,11 @@ public: // TODO: fix deep copy bug //nulls_->deep_copy(nulls, start_idx, start_idx + read_rows); nulls_->reset(read_rows); - for (int64_t i = 0; i < read_rows; ++i) { - if (nulls.at(start_idx + i)) { - nulls_->set(i); + if (has_null) { + for (int64_t i = 0; i < read_rows; ++i) { + if (nulls.at(start_idx + i)) { + nulls_->set(i); + } } } len_ = static_cast (fixed_len); diff --git a/src/sql/code_generator/ob_static_engine_cg.cpp b/src/sql/code_generator/ob_static_engine_cg.cpp index 97f579cf7b..c3141c3974 100644 --- a/src/sql/code_generator/ob_static_engine_cg.cpp +++ b/src/sql/code_generator/ob_static_engine_cg.cpp @@ -1764,37 +1764,79 @@ int ObStaticEngineCG::generate_recursive_union_all_spec(ObLogSet &op, ObRecursiv { int ret = OB_SUCCESS; uint64_t last_cte_table_id = OB_INVALID_ID; + ObOpSpec* cte_spec = nullptr; ObOpSpec *left = nullptr; ObOpSpec *right = nullptr; + uint64_t min_cluster_version = GET_MIN_CLUSTER_VERSION(); + bool bulk_search = (min_cluster_version >= CLUSTER_VERSION_4_2_2_0 + && min_cluster_version < CLUSTER_VERSION_4_3_0_0) + || (min_cluster_version >= CLUSTER_VERSION_4_3_1_0); + bool add_extra_column = bulk_search && lib::is_oracle_mode() && op.is_breadth_search(); if (OB_UNLIKELY(spec.get_child_cnt() != 2) || OB_ISNULL(left = spec.get_child(0)) || OB_ISNULL(right = spec.get_child(1)) - || OB_UNLIKELY(left->get_output_count() != right->get_output_count()) + || OB_UNLIKELY(left->get_output_count() + add_extra_column != right->get_output_count()) || OB_UNLIKELY(op.get_output_exprs().count() < left->get_output_count())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("recursive union all spec should have two children", K(ret), K(spec.get_child_cnt())); } else { - for (int64_t i = 0; OB_SUCC(ret) && i < left->get_output_count(); i++) { - if (left->output_.at(i)->datum_meta_.type_ != right->output_.at(i)->datum_meta_.type_) { + int64_t identify_seq_offset = -1; + int64_t left_pos = 0, right_pos = 0; + for (int64_t i = 0; OB_SUCC(ret) && i < right->get_output_count(); ++i) { + ObExpr *left_expr = nullptr; + ObExpr *right_expr = nullptr; + if (right_pos >= right->output_.count()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("right pos out of range", K(ret), K(right_pos)); + } else if (OB_ISNULL(right_expr = right->output_.at(right_pos))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("right expr is nullptr", K(ret), K(right_pos), K(right_expr)); + } else if (T_PSEUDO_IDENTIFY_SEQ == right_expr->type_) { + identify_seq_offset = right_pos; + right_pos++; + } else if (left_pos >= left->output_.count()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("left pos out of range", K(ret), K(left_pos)); + } else if (OB_ISNULL(left_expr = left->output_.at(left_pos))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("left expr is nullptr", K(ret), K(left_pos), K(left_expr)); + } else if (left_expr->datum_meta_.type_ != right_expr->datum_meta_.type_) { ret = OB_ERR_UNEXPECTED; LOG_WARN("left and right of recursive union all should have same output data type", K(ret)); + } else { + left_pos++; + right_pos++; + } + } + if (OB_SUCC(ret) && add_extra_column) { + if (identify_seq_offset < 0 || identify_seq_offset >= right->get_output_count()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("calc identify seq offset failed", K(ret), K(identify_seq_offset)); + } else { + spec.set_identify_seq_offset(identify_seq_offset); } } } + if (OB_FAIL(ret)) { } else if (OB_FAIL(generate_cte_pseudo_column_row_desc(op, spec))) { LOG_WARN("Failed to generate cte pseudo", K(ret)); - } else if (OB_FAIL(fake_cte_tables_.pop_back(last_cte_table_id))) { + } else if (OB_FAIL(fake_cte_specs_.pop_back(cte_spec))) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("Failed to pop last cte table op", K(ret), K(&fake_cte_tables_), K(fake_cte_tables_)); - } else if (OB_UNLIKELY(OB_INVALID_ID == last_cte_table_id)) { + LOG_WARN("Failed to pop last cte table spec", K(ret)); + } else if (OB_ISNULL(cte_spec)) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("Last cte table op cann't be null!", K(ret)); + LOG_WARN("Last cte table spec cann't be null!", K(ret)); } else { - spec.set_fake_cte_table(last_cte_table_id); - if (op.is_breadth_search()) { + spec.set_fake_cte_table(static_cast(cte_spec)->get_id()); + if (op.is_breadth_search() && bulk_search) { + static_cast(cte_spec)->is_bulk_search_ = true; + spec.set_search_strategy(ObRecursiveInnerDataOp::SearchStrategyType::BREADTH_FIRST_BULK); + } else if (op.is_breadth_search() && !bulk_search) { + static_cast(cte_spec)->is_bulk_search_ = false; spec.set_search_strategy(ObRecursiveInnerDataOp::SearchStrategyType::BREADTH_FRIST); } else { + static_cast(cte_spec)->is_bulk_search_ = false; spec.set_search_strategy(ObRecursiveInnerDataOp::SearchStrategyType::DEPTH_FRIST); } @@ -3666,7 +3708,7 @@ int ObStaticEngineCG::generate_basic_receive_spec(ObLogExchange &op, ObPxReceive } if (OB_FAIL(spec.child_exprs_.init(spec.get_child()->output_.count()))) { LOG_WARN("failed to init child exprs", K(ret)); - } else if (spec.bloom_filter_id_array_.assign(op.get_bloom_filter_ids())) { + } else if (OB_FAIL(spec.bloom_filter_id_array_.assign(op.get_bloom_filter_ids()))) { LOG_WARN("failed to append bloom filter ids", K(ret)); } else if (OB_FAIL(spec.child_exprs_.assign(spec.get_child()->output_))) { LOG_WARN("failed to append child exprs", K(ret)); @@ -4241,7 +4283,7 @@ int ObStaticEngineCG::generate_spec(ObLogTableScan &op, ObFakeCTETableSpec &spec int ObStaticEngineCG::generate_cte_table_spec(ObLogTableScan &op, ObFakeCTETableSpec &spec) { int ret = OB_SUCCESS; - if (OB_FAIL(fake_cte_tables_.push_back(spec.get_id()))) { + if (OB_FAIL(fake_cte_specs_.push_back(&spec))) { LOG_WARN("fake cte table push back failed", K(ret)); } else { const ObIArray &access_exprs = op.get_access_exprs(); @@ -4255,9 +4297,10 @@ int ObStaticEngineCG::generate_cte_table_spec(ObLogTableScan &op, ObFakeCTETable ret = OB_ERR_UNEXPECTED; LOG_WARN("expr is null", K(expr)); } else if (expr->has_flag(IS_CONST)) { - } else if (OB_UNLIKELY(!expr->is_column_ref_expr())) { + } else if (OB_UNLIKELY(!expr->is_column_ref_expr()) + && OB_UNLIKELY(!expr->is_op_pseudo_column_expr())) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("expected basic column", K(ret)); + LOG_WARN("expected basic column or pseudo column", K(ret)); } else if (OB_FAIL(generate_rt_expr(*expr, rt_expr))) { LOG_WARN("Fail to generate rt expr", KPC(expr), K(rt_expr)); } else if (OB_ISNULL(rt_expr)) { @@ -4265,7 +4308,7 @@ int ObStaticEngineCG::generate_cte_table_spec(ObLogTableScan &op, ObFakeCTETable LOG_WARN("rt expr is null", K(ret)); } else if (OB_FAIL(mark_expr_self_produced(expr))) { // access_exprs in convert_cte_pump need to set IS_COLUMNLIZED flag LOG_WARN("mark expr self produced failed", K(ret)); - } else { + } else if (expr->is_column_ref_expr()) { ObColumnRefRawExpr *col_expr = static_cast(expr); int64_t column_offset = col_expr->get_cte_generate_column_projector_offset(); if (OB_FAIL(spec.column_involved_offset_.push_back(column_offset))) { @@ -4273,8 +4316,17 @@ int ObStaticEngineCG::generate_cte_table_spec(ObLogTableScan &op, ObFakeCTETable } else if (OB_FAIL(spec.column_involved_exprs_.push_back(rt_expr))) { LOG_WARN("Fail to add column expr", K(ret)); } + } else if (expr->is_op_pseudo_column_expr()) { + spec.identify_seq_expr_ = rt_expr; } } // end for + + if (OB_SUCC(ret) && OB_NOT_NULL(op.get_identify_seq_expr())) { + if (OB_ISNULL(spec.identify_seq_expr_ )) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("identify seq rt expr is null", K(ret)); + } + } } return ret; } @@ -4319,6 +4371,7 @@ int ObStaticEngineCG::generate_spec(ObLogGroupBy &op, ObScalarAggregateSpec &spe LOG_WARN("failed to generate distinct aggregate function duplicate columns", K(ret)); } else { spec.by_pass_enabled_ = false; + spec.llc_ndv_est_enabled_ = false; OZ(set_3stage_info(op, spec)); } LOG_DEBUG("finish generate_spec", K(spec), K(ret)); @@ -4348,6 +4401,7 @@ int ObStaticEngineCG::generate_spec(ObLogGroupBy &op, ObMergeGroupBySpec &spec, } else { spec.set_rollup(op.has_rollup()); spec.by_pass_enabled_ = false; + spec.llc_ndv_est_enabled_ = false; OZ(set_3stage_info(op, spec)); OZ(set_rollup_adaptive_info(op, spec)); if (OB_FAIL(ret)) { @@ -4608,6 +4662,11 @@ int ObStaticEngineCG::generate_spec(ObLogGroupBy &op, ObHashGroupBySpec &spec, spec.set_est_group_cnt(op.get_distinct_card()); OZ(set_3stage_info(op, spec)); spec.by_pass_enabled_ = op.is_adaptive_aggregate(); + int64_t tenant_id = op.get_plan()->get_optimizer_context().get_session_info()->get_effective_tenant_id(); + omt::ObTenantConfigGuard tenant_config(TENANT_CONF(tenant_id)); + if (tenant_config.is_valid()) { + spec.llc_ndv_est_enabled_ = tenant_config->_enable_hgby_llc_ndv_adaptive; + } if (OB_FAIL(ret)) { } else if (OB_FAIL(generate_dist_aggr_distinct_columns(op, spec))) { LOG_WARN("failed to generate distinct aggregate function duplicate columns", K(ret)); @@ -6879,6 +6938,7 @@ int ObStaticEngineCG::generate_spec(ObLogLinkScan &op, ObLinkScanSpec &spec, con ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected null ptr", K(ret)); } else if (OB_ISNULL(phy_plan_)) { + ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected null ptr", K(ret)); } else if (lib::is_oracle_mode() && 0 != op.get_dblink_id() && diff --git a/src/sql/code_generator/ob_static_engine_cg.h b/src/sql/code_generator/ob_static_engine_cg.h index 17e9fbc845..6993496c7f 100644 --- a/src/sql/code_generator/ob_static_engine_cg.h +++ b/src/sql/code_generator/ob_static_engine_cg.h @@ -589,7 +589,7 @@ private: // all self_produced exprs of current operator ObSEArray cur_op_self_produced_exprs_; //仅供递归cte使用,因为oracle的cte是不允许嵌套的,所以可以采用这种方式 - common::ObSEArray fake_cte_tables_; + common::ObSEArray fake_cte_specs_; ObDmlCgService dml_cg_service_; ObTscCgService tsc_cg_service_; uint64_t cur_cluster_version_; diff --git a/src/sql/code_generator/ob_tsc_cg_service.cpp b/src/sql/code_generator/ob_tsc_cg_service.cpp index 8895f29ca5..a3a1945500 100644 --- a/src/sql/code_generator/ob_tsc_cg_service.cpp +++ b/src/sql/code_generator/ob_tsc_cg_service.cpp @@ -273,7 +273,7 @@ int ObTscCgService::generate_das_result_output(const ObIArray &output_ } if (OB_SUCC(ret) && include_agg) { for (int64_t i = 0; OB_SUCC(ret) && i < agg_expr_cnt; ++i) { - if (scan_ctdef.result_output_.push_back(agg_exprs.at(i))) { + if (OB_FAIL(scan_ctdef.result_output_.push_back(agg_exprs.at(i)))) { LOG_WARN("store agg expr to result output exprs failed", K(ret), K(agg_expr_cnt)); } } @@ -324,9 +324,14 @@ int ObTscCgService::generate_agent_vt_access_meta(const ObLogTableScan &op, ObTa ret = OB_ERR_UNEXPECTED; LOG_WARN("expr is null", K(ret), K(expr)); } else if (T_ORA_ROWSCN == expr->get_expr_type()) { - ret = OB_NOT_SUPPORTED; - LOG_WARN("rowscan not supported", K(ret)); - LOG_USER_ERROR(OB_NOT_SUPPORTED, "rowscan not supported"); + column_id = OB_HIDDEN_TRANS_VERSION_COLUMN_ID; + ObObjMeta obj_meta; + obj_meta.set_type(ObIntType); + if (OB_FAIL(agent_vt_meta.access_column_ids_.push_back(column_id))) { + LOG_WARN("store access column id failed", K(ret)); + } else if (OB_FAIL(agent_vt_meta.access_row_types_.push_back(obj_meta))) { + LOG_WARN("failed to push back row types", K(ret)); + } } else { ObColumnRefRawExpr* col_expr = static_cast(expr); column_id = col_expr->get_column_id(); @@ -591,9 +596,7 @@ int ObTscCgService::extract_das_access_exprs(const ObLogTableScan &op, ret = OB_ERR_UNEXPECTED; LOG_WARN("expr is null", K(ret), K(expr)); } else if (T_ORA_ROWSCN == expr->get_expr_type()) { - ret = OB_NOT_SUPPORTED; - LOG_WARN("rowscan not supported", K(ret)); - LOG_USER_ERROR(OB_NOT_SUPPORTED, "rowscan not supported"); + // keep orign expr as access expr } else if (OB_ISNULL(mapping_expr = op.get_real_expr(expr))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("mapping expr is null", K(ret), KPC(expr)); @@ -932,7 +935,9 @@ int ObTscCgService::extract_das_output_column_ids(const ObLogTableScan &op, //for virtual agent table, DAS scan need the colum of the mapping real table for (int64_t i = 0; OB_SUCC(ret) && i < das_output_cols.count(); ++i) { ObRawExpr *mapping_expr = op.get_real_expr(das_output_cols.at(i)); - if (!mapping_expr->is_column_ref_expr()) { + if (T_ORA_ROWSCN == mapping_expr->get_expr_type()) { + OZ (output_cids.push_back(OB_HIDDEN_TRANS_VERSION_COLUMN_ID)); + } else if (!mapping_expr->is_column_ref_expr()) { ret = OB_ERR_UNEXPECTED; LOG_WARN("mapping expr type is invalid", K(ret), KPC(mapping_expr), KPC(das_output_cols.at(i))); } else if (OB_FAIL(output_cids.push_back(static_cast(mapping_expr)->get_column_id()))) { diff --git a/src/sql/das/ob_das_task.cpp b/src/sql/das/ob_das_task.cpp index 4d63091c0a..d89cc8be65 100644 --- a/src/sql/das/ob_das_task.cpp +++ b/src/sql/das/ob_das_task.cpp @@ -135,6 +135,16 @@ OB_DEF_DESERIALIZE(ObDASRemoteInfo) // } // EVENT_INC(ACTIVE_SESSIONS); } + + if (OB_FAIL(ret)) { + } else if (OB_FAIL(des_exec_ctx->get_my_session()->set_session_state(QUERY_ACTIVE))) { + LOG_WARN("set session state failed", K(ret)); + } else if (OB_FAIL(des_exec_ctx->get_my_session()->store_query_string( + ObString::make_string("DAS REMOTE SCHEDULING")))) { + LOG_WARN("store query string failed", K(ret)); + } else { + des_exec_ctx->get_my_session()->set_mysql_cmd(obmysql::COM_QUERY); + } } OZ(exec_ctx_->create_physical_plan_ctx()); if (OB_SUCC(ret) && has_expr_) { diff --git a/src/sql/dtl/ob_dtl_channel_loop.cpp b/src/sql/dtl/ob_dtl_channel_loop.cpp index 83bfd9f939..0733d66d09 100644 --- a/src/sql/dtl/ob_dtl_channel_loop.cpp +++ b/src/sql/dtl/ob_dtl_channel_loop.cpp @@ -250,8 +250,12 @@ int ObDtlChannelLoop::process_base(ObIDltChannelLoopPred *pred, int64_t &hinted_ last_dump_channel_time_ = last_dump_channel_time_ < process_query_time_ ? process_query_time_ : last_dump_channel_time_; int64_t curr_time = ::oceanbase::common::ObTimeUtility::current_time(); if (OB_UNLIKELY(curr_time - last_dump_channel_time_ >= static_cast (100_s))) { + if (0 != process_query_time_) { + LOG_INFO("dump channel loop info for query which active for more than 100 seconds", + K(process_query_time_), K(curr_time), + K(timeout), K(timeout_), K(query_timeout_ts_)); + } last_dump_channel_time_ = curr_time; - LOG_INFO("dump channel loop info for query which active for more than 100 seconds", K(process_query_time_), K(curr_time), K(timeout), K(timeout_), K(query_timeout_ts_)); int64_t idx = -1; int64_t last_in_msg_time = INT64_MAX; // Find a channel that has not received data for the longest time @@ -266,9 +270,12 @@ int ObDtlChannelLoop::process_base(ObIDltChannelLoopPred *pred, int64_t &hinted_ } if (-1 == idx) { LOG_WARN("no channel exists"); - } else { + } else if (0 != process_query_time_) { ObDtlBasicChannel *channel = static_cast (chans_.at(idx)); - LOG_INFO("dump channel info for query which active for more than 100 seconds", K(idx), K(channel->get_id()), K(channel->get_peer_id()), K(channel->get_peer()), K(channel->get_op_metric())); + LOG_INFO("dump channel info for query which active for more than 100 seconds", + K(idx), K(channel->get_id()), + K(channel->get_peer_id()), K(channel->get_peer()), + K(channel->get_op_metric())); } } } diff --git a/src/sql/engine/aggregate/ob_adaptive_bypass_ctrl.cpp b/src/sql/engine/aggregate/ob_adaptive_bypass_ctrl.cpp index f624a5379f..c2c490a62e 100644 --- a/src/sql/engine/aggregate/ob_adaptive_bypass_ctrl.cpp +++ b/src/sql/engine/aggregate/ob_adaptive_bypass_ctrl.cpp @@ -33,14 +33,22 @@ void ObAdaptiveByPassCtrl::gby_process_state(int64_t probe_cnt, } else if (0 == probe_cnt) { } else if (STATE_L2_INSERT == state_) { // insert until exceed l2 cache - if (!in_l2_cache(row_cnt, mem_size)) { + if (!in_cache_mem_bound(row_cnt, mem_size, INIT_L2_CACHE_SIZE)) { state_ = STATE_ANALYZE; } } else if (STATE_L3_INSERT == state_) { // insert until exceed l3 cache - if (!in_l3_cache(row_cnt, mem_size)) { + if (!in_cache_mem_bound(row_cnt, mem_size, INIT_L3_CACHE_SIZE)) { state_ = STATE_ANALYZE; } + } else if (STATE_MAX_MEM_INSERT == state_) { + if (row_cnt > scaled_llc_est_ndv_ && + (static_cast(row_cnt) / probe_cnt) > (1 / static_cast(cut_ratio_))) { + state_ = STATE_PROCESS_HT; + set_max_rebuild_times(); + int ret = OB_SUCCESS;//no use, just for LOG_TRACE. + LOG_TRACE("STATE_MAX_MEM_INSERT goto STATE_PROCESS_HT", K(ret), K(probe_cnt), K(row_cnt)); + } } else if (STATE_ANALYZE == state_) { double ratio = MIN_RATIO_FOR_L3; probe_cnt_for_period_[round_times_ % MAX_REBUILD_TIMES] = probe_cnt; @@ -51,7 +59,9 @@ void ObAdaptiveByPassCtrl::gby_process_state(int64_t probe_cnt, std::max(ratio, 1 - (1 / static_cast (cut_ratio_)))) { // very good distinct rate, can expend hash map to l3 cache rebuild_times_ = 0; - if (in_l3_cache(row_cnt, mem_size)) { + if (scaled_llc_est_ndv_) { + state_ = STATE_PROCESS_HT; + } else if (in_cache_mem_bound(row_cnt, mem_size, INIT_L3_CACHE_SIZE)) { state_ = STATE_L3_INSERT; need_resize_hash_table_ = true; } else { @@ -71,7 +81,9 @@ void ObAdaptiveByPassCtrl::gby_process_state(int64_t probe_cnt, if (new_ratio >= std::max(ratio, 1 - (1 / static_cast (cut_ratio_)))) { // very good distinct rate, can expend hash map to l3 cache rebuild_times_ = 0; - if (in_l3_cache(row_cnt, mem_size)) { + if (scaled_llc_est_ndv_) { + state_ = STATE_PROCESS_HT; + } else if (in_cache_mem_bound(row_cnt, mem_size, INIT_L3_CACHE_SIZE)) { state_ = STATE_L3_INSERT; need_resize_hash_table_ = true; } else { @@ -85,6 +97,9 @@ void ObAdaptiveByPassCtrl::gby_process_state(int64_t probe_cnt, // distinct rate is not good // prepare to release curr hash table state_ = STATE_PROCESS_HT; + if (scaled_llc_est_ndv_) { + set_max_rebuild_times(); + } } LOG_TRACE("adaptive groupby try redefine ratio", K(select_rows), K(rows), K(ndv), K(new_ndv), K(new_ratio), K(state_), K(processed_cnt_)); @@ -97,6 +112,9 @@ void ObAdaptiveByPassCtrl::gby_process_state(int64_t probe_cnt, // distinct rate is not good // prepare to release curr hash table state_ = STATE_PROCESS_HT; + if (scaled_llc_est_ndv_) { + set_max_rebuild_times(); + } } LOG_TRACE("adaptive groupby generate new state", K(state_), K(rebuild_times_), K(cut_ratio_), K(mem_size), K(op_id_), K(row_cnt), diff --git a/src/sql/engine/aggregate/ob_adaptive_bypass_ctrl.h b/src/sql/engine/aggregate/ob_adaptive_bypass_ctrl.h index 6a0b8d38d4..1ebb4e530d 100644 --- a/src/sql/engine/aggregate/ob_adaptive_bypass_ctrl.h +++ b/src/sql/engine/aggregate/ob_adaptive_bypass_ctrl.h @@ -32,6 +32,7 @@ public: typedef enum { STATE_L2_INSERT = 0, STATE_L3_INSERT, + STATE_MAX_MEM_INSERT, // Use the maximum available memory for data deduplication STATE_PROBE, STATE_ANALYZE, STATE_PROCESS_HT, @@ -42,10 +43,11 @@ public: period_cnt_(MIN_PERIOD_CNT), probe_cnt_(0), exists_cnt_(0), rebuild_times_(0), cut_ratio_(INIT_CUT_RATIO), by_pass_ctrl_enabled_(false), small_row_cnt_(0), op_id_(-1), need_resize_hash_table_(false), - round_times_(0) {} + round_times_(0), scaled_llc_est_ndv_(0) {} inline void reset() { by_pass_ = false; processed_cnt_ = 0; + scaled_llc_est_ndv_ = 0; // reset scaled_llc_est_ndv_ before reset_state() reset_state(); period_cnt_ = MIN_PERIOD_CNT; probe_cnt_ = 0; @@ -53,16 +55,16 @@ public: rebuild_times_ = 0; need_resize_hash_table_ = false; } - inline void reset_state() { state_ = STATE_L2_INSERT; } + inline void reset_state() { state_ = (scaled_llc_est_ndv_ ? STATE_MAX_MEM_INSERT : STATE_L2_INSERT); } + inline void set_max_mem_insert_state() { state_ = STATE_MAX_MEM_INSERT; } + inline bool is_max_mem_insert_state() { return STATE_MAX_MEM_INSERT == state_; } + inline void set_analyze_state() { state_ = STATE_ANALYZE; } + inline bool is_analyze_state() { return STATE_ANALYZE == state_; } inline void start_process_ht() { state_ = STATE_PROCESS_HT; } inline bool processing_ht() { return STATE_PROCESS_HT == state_; } - inline bool in_l2_cache(int64_t row_cnt, int64_t mem_size) + inline bool in_cache_mem_bound(int64_t row_cnt, int64_t mem_size, int64_t mem_bound) { - return 0 != small_row_cnt_ ? (row_cnt < small_row_cnt_) : (mem_size < INIT_L2_CACHE_SIZE); - } - inline bool in_l3_cache(int64_t row_cnt, int64_t mem_size) - { - return 0 != small_row_cnt_ ? (row_cnt < small_row_cnt_) : (mem_size < INIT_L3_CACHE_SIZE); + return 0 != small_row_cnt_ ? (row_cnt < small_row_cnt_) : (mem_size < mem_bound); } void gby_process_state(int64_t probe_cnt, int64_t row_cnt, int64_t mem_size); inline void inc_processed_cnt(int64_t new_processed_cnt) { processed_cnt_ += new_processed_cnt; } @@ -72,7 +74,9 @@ public: inline void set_cut_ratio(uint64_t cut_ratio) { cut_ratio_ = cut_ratio; } inline bool by_passing() { return by_pass_; } inline void start_by_pass() { by_pass_ = true; } + inline void stop_by_pass() { by_pass_ = false; } inline void reset_rebuild_times() { rebuild_times_ = 0; } + inline void bypass_rebackto_insert(uint64_t llc_est_ndv) { scaled_llc_est_ndv_ = llc_est_ndv / 2 * 3; stop_by_pass(); start_process_ht(); reset_rebuild_times(); round_times_ = 0; need_resize_hash_table_ = false; } inline bool rebuild_times_exceeded() { return rebuild_times_ >= MAX_REBUILD_TIMES; } inline void set_max_rebuild_times() { rebuild_times_ = MAX_REBUILD_TIMES + 1; } inline void open_by_pass_ctrl() { by_pass_ctrl_enabled_ = true; } @@ -94,6 +98,7 @@ public: int64_t probe_cnt_for_period_[MAX_REBUILD_TIMES]; int64_t ndv_cnt_for_period_[MAX_REBUILD_TIMES]; int64_t round_times_; + uint64_t scaled_llc_est_ndv_; }; } // end namespace sql diff --git a/src/sql/engine/aggregate/ob_aggregate_processor.cpp b/src/sql/engine/aggregate/ob_aggregate_processor.cpp index 36cbc26805..2cb6edb17b 100644 --- a/src/sql/engine/aggregate/ob_aggregate_processor.cpp +++ b/src/sql/engine/aggregate/ob_aggregate_processor.cpp @@ -6067,6 +6067,20 @@ int ObAggregateProcessor::llc_init(AggrCell &aggr_cell) return ret; } +int ObAggregateProcessor::llc_init_empty(char *&llc_map, int64_t &llc_map_size, common::ObIAllocator &alloc) +{ + int ret = OB_SUCCESS; + llc_map_size = get_llc_size(); + OB_ASSERT(llc_map_size > 0); + if (OB_ISNULL(llc_map = static_cast (alloc.alloc(llc_map_size)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to alloc llc map", K(ret), K(llc_map_size)); + } else { + MEMSET(llc_map, 0, llc_map_size); + } + return ret; +} + int ObAggregateProcessor::llc_init_empty(ObExpr &expr, ObEvalCtx &eval_ctx) { int ret = OB_SUCCESS; diff --git a/src/sql/engine/aggregate/ob_aggregate_processor.h b/src/sql/engine/aggregate/ob_aggregate_processor.h index 177f25d412..63a8cb0f5c 100644 --- a/src/sql/engine/aggregate/ob_aggregate_processor.h +++ b/src/sql/engine/aggregate/ob_aggregate_processor.h @@ -791,6 +791,7 @@ public: inline void set_support_fast_single_row_agg(const bool flag) { support_fast_single_row_agg_ = flag; } void set_need_advance_collect() { need_advance_collect_ = true; } bool get_need_advance_collect() const { return need_advance_collect_; } + static int llc_init_empty(char *&llc_map, int64_t &llc_map_size, common::ObIAllocator &alloc); static int llc_add_value(const uint64_t value, char *llc_bitmap_buf, int64_t size); private: template diff --git a/src/sql/engine/aggregate/ob_exec_hash_struct_vec.cpp b/src/sql/engine/aggregate/ob_exec_hash_struct_vec.cpp index 7bc7528e0f..5d1a480e2d 100644 --- a/src/sql/engine/aggregate/ob_exec_hash_struct_vec.cpp +++ b/src/sql/engine/aggregate/ob_exec_hash_struct_vec.cpp @@ -49,94 +49,6 @@ int ShortStringAggregator::fallback_calc_hash_value_batch(const common::ObIArray return ret; } -template -int ObExtendHashTableVec::get(const int64_t batch_idx, uint64_t hash_val, char *&aggr_row) -{ - aggr_row = NULL; - int ret = OB_SUCCESS; - bool result = false; - locate_bucket_ = nullptr; - ++probe_cnt_; - locate_bucket_ = const_cast (&locate_bucket(*buckets_, hash_val)); - if (locate_bucket_->is_valid()) { - ObGroupRowItemVec *it = &locate_bucket_->get_item(); - while (OB_SUCC(ret) && nullptr != it) { - if (OB_FAIL((this->*likely_equal_function_)(group_store_.get_row_meta(), *it, batch_idx, result))) { - LOG_WARN("failed to cmp", K(ret)); - } else if (result) { - aggr_row = it->get_aggr_row(group_store_.get_row_meta()); - break; - } - if (OB_SUCC(ret)) { - if (nullptr != it->next(group_store_.get_row_meta())) { - it = it->next(group_store_.get_row_meta()); - } else { - break; - } - } - } - } - return ret; -} - -template -int ObExtendHashTableVec::append(const common::ObIArray &gby_exprs, - const int64_t batch_idx, - const uint64_t hash_value, - const ObIArray &lengths, - char *&get_row, - bool need_reinit_vectors /*false*/) -{ - int ret = OB_SUCCESS; - ObCompactRow *srow = nullptr; - uint16_t idx = static_cast (batch_idx); - if (!is_inited_vec_ || need_reinit_vectors) { - for (int64_t i = 0; i < gby_exprs.count(); ++i) { - if (nullptr == gby_exprs.at(i)) { - vector_ptrs_.at(i) = nullptr; - } else { - vector_ptrs_.at(i) = gby_exprs.at(i)->get_vector(*eval_ctx_); - } - } - is_inited_vec_ = true; - } - if (OB_FAIL(group_store_.add_batch(vector_ptrs_, &idx, 1, &srow, &lengths))) { - LOG_WARN("failed to add store row", K(ret), K(idx)); - } else if (auto_extend_ && OB_UNLIKELY(size_ * SIZE_BUCKET_SCALE >= get_bucket_num())) { - if (OB_FAIL(extend())) { - SQL_ENG_LOG(WARN, "extend failed", K(ret)); - } else { - //relocate bucket - locate_bucket_ = const_cast(&locate_bucket(*buckets_, hash_value)); - } - } - LOG_DEBUG("append new row", "new row", - CompactRow2STR(group_store_.get_row_meta(), *srow, &gby_exprs)); - if (OB_SUCC(ret)) { - if (OB_ISNULL(locate_bucket_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("failed to get locate bucket", K(ret)); - } else if (!locate_bucket_->is_valid()) { - locate_bucket_->set_hash(hash_value); - locate_bucket_->set_valid(); - locate_bucket_->set_bkt_seq(size_); - static_cast (srow[0]).set_next(nullptr, group_store_.get_row_meta()); - locate_bucket_->set_item(static_cast (srow[0])); - get_row = locate_bucket_->get_item().get_aggr_row(group_store_.get_row_meta()); - CK (OB_NOT_NULL(get_row)); - } else { - ObGroupRowItemVec *new_item = static_cast (&srow[0]); - new_item->set_next(locate_bucket_->get_item().next(group_store_.get_row_meta()), - group_store_.get_row_meta()); - locate_bucket_->get_item().set_next(new_item, group_store_.get_row_meta()); - get_row = new_item->get_aggr_row(group_store_.get_row_meta()); - CK (OB_NOT_NULL(get_row)); - } - size_ += 1; - } - return ret; -} - template int ObExtendHashTableVec::set_unique_batch(const common::ObIArray &gby_exprs, const ObBatchRows &child_brs, @@ -160,19 +72,11 @@ int ObExtendHashTableVec::set_unique_batch(const common::ObIArra } ObCompactRow &srow = const_cast (share::aggregate::Processor:: get_groupby_stored_row(group_store_.get_row_meta(), batch_new_rows[i])); - GroupRowBucket *bucket = const_cast (&locate_bucket(*buckets_, hash_values[i])); - if (!bucket->is_valid()) { - bucket->set_hash(hash_values[i]); - bucket->set_valid(); - bucket->set_bkt_seq(size_); - static_cast (srow).set_next(nullptr, group_store_.get_row_meta()); - bucket->set_item(static_cast (srow)); - } else { - ObGroupRowItemVec *new_item = static_cast (&srow); - new_item->set_next(bucket->get_item().next(group_store_.get_row_meta()), - group_store_.get_row_meta()); - bucket->get_item().set_next(new_item, group_store_.get_row_meta()); - } + GroupRowBucket *bucket = const_cast (&locate_empty_bucket(*buckets_, hash_values[i])); + bucket->set_hash(hash_values[i]); + bucket->set_valid(); + bucket->set_bkt_seq(size_); + bucket->set_item(static_cast (srow)); size_ += 1; } return ret; @@ -215,20 +119,13 @@ int ObExtendHashTableVec::append_batch(const common::ObIArrayis_valid()) { + } else { curr_bkt->set_hash(hash_values[new_row_selector_.at(i)]); curr_bkt->set_valid(); curr_bkt->set_bkt_seq(size_ + i); - static_cast (*curr_row).set_next(nullptr, group_store_.get_row_meta()); curr_bkt->set_item(static_cast (*curr_row)); get_row = curr_bkt->get_item().get_aggr_row(group_store_.get_row_meta()); CK (OB_NOT_NULL(get_row)); - } else { - ObGroupRowItemVec *new_item = static_cast (curr_row); - new_item->set_next(curr_bkt->get_item().next(group_store_.get_row_meta()), group_store_.get_row_meta()); - curr_bkt->get_item().set_next(new_item, group_store_.get_row_meta()); - get_row = new_item->get_aggr_row(group_store_.get_row_meta()); - CK (OB_NOT_NULL(get_row)); } LOG_DEBUG("append new row", "new row", CompactRow2STR(group_store_.get_row_meta(), *curr_row, &gby_exprs)); @@ -284,115 +181,13 @@ int ObExtendHashTableVec::process_batch(const common::ObIArrayat(curr_idx) - || is_dumped[curr_idx] - || (nullptr != bloom_filter - && !bloom_filter->exist(ObGroupRowBucketBase::HASH_VAL_MASK & hash_values[curr_idx]))) { - continue; - } - locate_buckets_[curr_idx] = const_cast (&locate_bucket(*buckets_, hash_values[curr_idx])); - if (locate_buckets_[curr_idx]->is_valid()) { - ++probe_cnt_; - ++agg_row_cnt; - bool result = false; - ObGroupRowItemVec *it = &locate_buckets_[curr_idx]->get_item(); - while (OB_SUCC(ret) && nullptr != it) { - if (OB_FAIL((this->*likely_equal_function_)(group_store_.get_row_meta(), *it, curr_idx, result))) { - LOG_WARN("failed to cmp", K(ret)); - } else if (result) { - batch_old_rows[curr_idx] = it->get_aggr_row(group_store_.get_row_meta()); - if (batch_aggr_rows && batch_aggr_rows->is_valid()) { - if (size_ > BatchAggrRowsTable::MAX_REORDER_GROUPS) { - batch_aggr_rows->set_invalid(); - } else { - int64_t ser_num = locate_buckets_[curr_idx]->get_bkt_seq(); - batch_aggr_rows->aggr_rows_[ser_num] = batch_old_rows[curr_idx]; - batch_aggr_rows->selectors_[ser_num][batch_aggr_rows->selectors_item_cnt_[ser_num]++] = curr_idx; - } - } - break; - } - if (OB_SUCC(ret)) { - if (nullptr != it->next(group_store_.get_row_meta())) { - it = it->next(group_store_.get_row_meta()); - } else { - break; - } - } - } - if (!batch_old_rows[curr_idx]) { - //hash value crash, can not add batch - hash_crash = true; - if (batch_aggr_rows && batch_aggr_rows->is_valid()) { - batch_aggr_rows->set_invalid(); - } - break; - } - } else if (locate_buckets_[curr_idx]->is_occupyed()) { - batch_duplicate = true; - break; - } else if (can_append_batch) { - //occupy empty bucket - locate_buckets_[curr_idx]->set_occupyed(); - new_row_selector_.at(new_row_selector_cnt_++) = curr_idx; - ++probe_cnt_; - ++agg_row_cnt; - } - } - if (OB_SUCC(ret)) { - if (can_append_batch - && new_row_selector_cnt_ > 0 - && OB_FAIL(append_batch(gby_exprs, child_brs, is_dumped, hash_values, - lengths, batch_new_rows, agg_group_cnt, - need_reinit_vectors))) { - LOG_WARN("failed to append batch", K(ret)); - } else { - new_row_selector_cnt_ = 0; - } - } - } - if (OB_FAIL(ret)) { - } else if (hash_crash) { - int64_t real_batch_size = child_brs.size_; - const_cast (child_brs).size_ = curr_idx; - if (can_append_batch - && new_row_selector_cnt_ > 0 - && OB_FAIL(append_batch(gby_exprs, child_brs, is_dumped, hash_values, - lengths, batch_new_rows, agg_group_cnt, - need_reinit_vectors))) { - LOG_WARN("failed to append batch", K(ret)); - } - const_cast (child_brs).size_ = real_batch_size; - // then get && append 1 by 1 - --probe_cnt_; - --agg_row_cnt; - for (; OB_SUCC(ret) && curr_idx < child_brs.size_; ++curr_idx) { - if (child_brs.skip_->at(curr_idx) || is_dumped[curr_idx]) { - continue; - } - char *aggr_row = nullptr; - char *new_row = nullptr; - if (OB_FAIL(get(curr_idx, hash_values[curr_idx], aggr_row))) { - LOG_WARN("failed to get row", K(ret)); - } else if (NULL != aggr_row) { - ++agg_row_cnt; - batch_old_rows[curr_idx] = aggr_row; - } else if (can_append_batch) { - ++agg_row_cnt; - ++agg_group_cnt; - if (OB_FAIL(append(gby_exprs, curr_idx, hash_values[curr_idx], - lengths, new_row, need_reinit_vectors))) { - LOG_WARN("failed to append new item", K(ret)); - } else { - batch_new_rows[curr_idx] = new_row; - } - } + if (OB_SUCC(ret)) { + if (OB_FAIL(inner_process_batch(gby_exprs, child_brs, is_dumped, + hash_values, lengths, can_append_batch, + bloom_filter, batch_old_rows, batch_new_rows, + agg_row_cnt, agg_group_cnt, batch_aggr_rows, + need_reinit_vectors))) { + LOG_WARN("failed to process batch", K(ret)); } } } else { @@ -414,6 +209,119 @@ int ObExtendHashTableVec::process_batch(const common::ObIArray +int ObExtendHashTableVec::inner_process_batch(const common::ObIArray &gby_exprs, + const ObBatchRows &child_brs, + const bool *is_dumped, + const uint64_t *hash_values, + const common::ObIArray &lengths, + const bool can_append_batch, + const ObGbyBloomFilterVec *bloom_filter, + char **batch_old_rows, + char **batch_new_rows, + int64_t &agg_row_cnt, + int64_t &agg_group_cnt, + BatchAggrRowsTable *batch_aggr_rows, + bool need_reinit_vectors) +{ + int ret = OB_SUCCESS; + int64_t curr_idx = 0; + while (OB_SUCC(ret) && curr_idx < child_brs.size_) { + bool batch_duplicate = false; + new_row_selector_cnt_ = 0; + for (; OB_SUCC(ret) && !batch_duplicate && curr_idx < child_brs.size_; ++curr_idx) { + if (child_brs.skip_->at(curr_idx) + || is_dumped[curr_idx] + || (nullptr != bloom_filter + && !bloom_filter->exist(ObGroupRowBucketBase::HASH_VAL_MASK & hash_values[curr_idx]))) { + continue; + } + int64_t curr_pos = -1; + bool find_bkt = false; + while (OB_SUCC(ret) && !find_bkt) { + locate_buckets_[curr_idx] = const_cast (&locate_next_bucket(*buckets_, hash_values[curr_idx], curr_pos)); + if (locate_buckets_[curr_idx]->is_valid()) { + ++probe_cnt_; + ++agg_row_cnt; + bool result = true; + ObGroupRowItemVec *it = &locate_buckets_[curr_idx]->get_item(); + for (int64_t i = 0; OB_SUCC(ret) && result && i < gby_exprs.count(); ++i) { + bool null_equal = (nullptr == gby_exprs.at(i)); + if (!null_equal) { + ObIVector *r_vec = gby_exprs.at(i)->get_vector(*eval_ctx_); + const bool l_isnull = it->is_null(i); + const bool r_isnull = r_vec->is_null(curr_idx); + if (l_isnull != r_isnull) { + result = false; + } else if (l_isnull && r_isnull) { + result = true; + } else { + const int64_t l_len = it->get_length(group_store_.get_row_meta(), i); + const int64_t r_len = r_vec->get_length(curr_idx); + if (l_len == r_len + && 0 == memcmp(it->get_cell_payload(group_store_.get_row_meta(), i), + r_vec->get_payload(curr_idx), + r_len)) { + result = true; + } else { + int cmp_res = 0; + if (OB_FAIL(r_vec->null_last_cmp(*gby_exprs.at(i), curr_idx, false, + it->get_cell_payload(group_store_.get_row_meta(), i), + l_len, cmp_res))) { + LOG_WARN("failed to cmp left and right", K(ret)); + } else { + result = (0 == cmp_res); + } + } + } + } + } + if (OB_SUCC(ret) && result) { + batch_old_rows[curr_idx] = it->get_aggr_row(group_store_.get_row_meta()); + if (batch_aggr_rows && batch_aggr_rows->is_valid()) { + if (size_ > BatchAggrRowsTable::MAX_REORDER_GROUPS) { + batch_aggr_rows->set_invalid(); + } else { + int64_t ser_num = locate_buckets_[curr_idx]->get_bkt_seq(); + batch_aggr_rows->aggr_rows_[ser_num] = batch_old_rows[curr_idx]; + batch_aggr_rows->selectors_[ser_num][batch_aggr_rows->selectors_item_cnt_[ser_num]++] = curr_idx; + } + } + find_bkt = true; + } + } else if (locate_buckets_[curr_idx]->is_occupyed()) { + batch_duplicate = true; + find_bkt = true; + } else if (can_append_batch) { + //occupy empty bucket + locate_buckets_[curr_idx]->set_occupyed(); + new_row_selector_.at(new_row_selector_cnt_++) = curr_idx; + ++probe_cnt_; + ++agg_row_cnt; + find_bkt = true; + } else { + find_bkt = true; + } + } + if (batch_duplicate) { + break; + } + } + if (OB_SUCC(ret)) { + if (can_append_batch + && new_row_selector_cnt_ > 0 + && OB_FAIL(append_batch(gby_exprs, child_brs, is_dumped, hash_values, + lengths, batch_new_rows, agg_group_cnt, + need_reinit_vectors))) { + LOG_WARN("failed to append batch", K(ret)); + } else { + new_row_selector_cnt_ = 0; + } + } + } + return ret; +} + template int ObExtendHashTableVec::init(ObIAllocator *allocator, lib::ObMemAttr &mem_attr, @@ -455,15 +363,6 @@ int ObExtendHashTableVec::init(ObIAllocator *allocator, ret = OB_ALLOCATE_MEMORY_FAILED; SQL_ENG_LOG(WARN, "failed to allocate memory", K(ret)); } else { - if (!nullable && all_int64) { - likely_equal_function_ = &ObExtendHashTableVec::likely_equal_fixed64; - } else if (!nullable) { - likely_equal_function_ = &ObExtendHashTableVec::likely_equal; - } else if (all_int64) { - likely_equal_function_ = &ObExtendHashTableVec::likely_equal_fixed64_nullable; - } else { - likely_equal_function_ = &ObExtendHashTableVec::likely_equal_nullable; - } buckets_ = new(buckets_buf)BucketArray(allocator_); buckets_->set_tenant_id(tenant_id_); initial_bucket_num_ = common::next_pow2(initial_size * SIZE_BUCKET_SCALE); @@ -484,69 +383,6 @@ int ObExtendHashTableVec::init(ObIAllocator *allocator, return ret; } -template -int ObExtendHashTableVec::set_distinct(const RowMeta &row_meta, - const uint16_t batch_idx, - uint64_t hash_value, - StoreRowFunc sf) -{ - int ret = OB_SUCCESS; - GroupRowBucket *bucket = nullptr; - if (OB_UNLIKELY(NULL == buckets_)) { - // do nothing - } else if (auto_extend_ && OB_UNLIKELY(size_ * SIZE_BUCKET_SCALE >= get_bucket_num())) { - if (OB_FAIL(extend())) { - SQL_ENG_LOG(WARN, "failed to extend hash table", K(ret)); - } - } - if (OB_SUCC(ret)) { - bool result = false; - bool need_insert = true; - ObCompactRow *srow = nullptr; - if (!is_inited_vec_) { - for (int64_t i = 0; i < gby_exprs_->count(); ++i) { - vector_ptrs_.at(i) = gby_exprs_->at(i)->get_vector(*eval_ctx_); - } - is_inited_vec_ = true; - } - bucket = const_cast (&locate_bucket(*buckets_, hash_value)); - if (bucket->is_valid()) { - RowItemType *it = &(bucket->get_item()); - while (OB_SUCC(ret) && nullptr != it) { - if (OB_FAIL((this->*likely_equal_function_)(row_meta, static_cast(*it), batch_idx, result))) { - LOG_WARN("failed to cmp", K(ret)); - } else if (result) { - need_insert = false; - ret = OB_HASH_EXIST; - LOG_DEBUG("entry exist", K(ret)); - break; - } - it = it->next(row_meta); - } - if (OB_SUCC(ret) && need_insert) { - if (OB_FAIL(sf(vector_ptrs_, &batch_idx, 1, &srow))) { - LOG_WARN("failed to store row", K(ret)); - } else { - RowItemType *new_item = static_cast (&srow[0]); - new_item->set_next(bucket->get_item().next(row_meta), row_meta); - bucket->get_item().set_next(new_item, row_meta); - ++size_; - } - } - } else { - if (OB_FAIL(sf(vector_ptrs_, &batch_idx, 1, &srow))) { - LOG_WARN("failed to store row", K(ret)); - } else { - bucket->set_hash(hash_value); - bucket->set_valid(); - bucket->set_item(static_cast (srow[0])); - ++size_; - } - } - } - return ret; -} - template int ObExtendHashTableVec::set_distinct_batch(const RowMeta &row_meta, const int64_t batch_size, @@ -588,39 +424,40 @@ int ObExtendHashTableVec::set_distinct_batch(const RowMeta &row_ if (OB_SUCC(ret)) { int64_t curr_idx = 0; - bool hash_crash = false; - while (OB_SUCC(ret) && !hash_crash && curr_idx < batch_size) { + while (OB_SUCC(ret) && curr_idx < batch_size) { bool batch_duplicate = false; new_row_selector_cnt_ = 0; - for (; OB_SUCC(ret) && !batch_duplicate && !hash_crash && curr_idx < batch_size; ++curr_idx) { + for (; OB_SUCC(ret) && !batch_duplicate && curr_idx < batch_size; ++curr_idx) { if (OB_NOT_NULL(child_skip) && child_skip->at(curr_idx)) { my_skip.set(curr_idx); continue; } - locate_buckets_[curr_idx] = const_cast (&locate_bucket(*buckets_, hash_values[curr_idx])); - if (locate_buckets_[curr_idx]->is_valid()) { - bool result = false; - RowItemType *it = &(locate_buckets_[curr_idx]->get_item()); - while (OB_SUCC(ret) && nullptr != it) { - if (OB_FAIL((this->*likely_equal_function_)(row_meta, static_cast(*it), curr_idx, result))) { + int64_t curr_pos = -1; + bool find_bkt = false; + while (OB_SUCC(ret) && !find_bkt) { + locate_buckets_[curr_idx] = const_cast (&locate_next_bucket(*buckets_, hash_values[curr_idx], curr_pos)); + if (locate_buckets_[curr_idx]->is_valid()) { + bool result = false; + RowItemType *it = &(locate_buckets_[curr_idx]->get_item()); + if (OB_FAIL(likely_equal_nullable(row_meta, static_cast(*it), curr_idx, result))) { LOG_WARN("failed to cmp", K(ret)); } else if (result) { my_skip.set(curr_idx); + find_bkt = true; break; } - it = it->next(row_meta); + } else if (locate_buckets_[curr_idx]->is_occupyed()) { + batch_duplicate = true; + find_bkt = true; + } else { + //occupy empty bucket + locate_buckets_[curr_idx]->set_occupyed(); + new_row_selector_.at(new_row_selector_cnt_++) = curr_idx; + find_bkt = true; } - if (!result) { - hash_crash = true; - break; - } - } else if (locate_buckets_[curr_idx]->is_occupyed()) { - batch_duplicate = true; + } + if (batch_duplicate) { break; - } else { - //occupy empty bucket - locate_buckets_[curr_idx]->set_occupyed(); - new_row_selector_.at(new_row_selector_cnt_++) = curr_idx; } } if (OB_FAIL(ret) || 0 == new_row_selector_cnt_) { @@ -637,156 +474,92 @@ int ObExtendHashTableVec::set_distinct_batch(const RowMeta &row_ new_row_selector_cnt_ = 0; } } + } + return ret; +} - if (OB_FAIL(ret)) { - } else if (hash_crash) { - if (new_row_selector_cnt_ > 0) { - // first append remain rows - if (OB_FAIL(sf(vector_ptrs_, &new_row_selector_.at(0), new_row_selector_cnt_, srows_))) { - LOG_WARN("failed to append batch", K(ret)); - } else { - for (int64_t i = 0; i < new_row_selector_cnt_; ++i) { - int64_t idx = new_row_selector_.at(i); - locate_buckets_[idx]->set_hash(hash_values[idx]); - locate_buckets_[idx]->set_valid(); - locate_buckets_[idx]->set_item(static_cast (*srows_[i])); - ++size_; - } - } +template +int ObExtendHashTableVec::inner_process_batch(const RowMeta &row_meta, + const int64_t batch_size, + const ObBitVector *child_skip, + ObBitVector &my_skip, + uint64_t *hash_values, + StoreRowFunc sf) +{ + int ret = OB_SUCCESS; + int64_t curr_idx = 0; + while (OB_SUCC(ret) && curr_idx < batch_size) { + bool batch_duplicate = false; + new_row_selector_cnt_ = 0; + for (; OB_SUCC(ret) && !batch_duplicate && curr_idx < batch_size; ++curr_idx) { + if (OB_NOT_NULL(child_skip) && child_skip->at(curr_idx)) { + my_skip.set(curr_idx); + continue; } - ObEvalCtx::BatchInfoScopeGuard batch_info_guard(*eval_ctx_); - batch_info_guard.set_batch_size(batch_size); - // then get && append 1 by 1 - for (; OB_SUCC(ret) && curr_idx < batch_size; ++curr_idx) { - if (OB_NOT_NULL(child_skip) && child_skip->at(curr_idx)) { - my_skip.set(curr_idx); - continue; - } - batch_info_guard.set_batch_idx(curr_idx); - if (OB_FAIL(set_distinct(row_meta, curr_idx, hash_values[curr_idx], sf))) { - if (OB_HASH_EXIST == ret) { - ret = OB_SUCCESS; + int64_t curr_pos = -1; + bool find_bkt = false; + while (OB_SUCC(ret) && !find_bkt) { + locate_buckets_[curr_idx] = const_cast (&locate_next_bucket(*buckets_, hash_values[curr_idx], curr_pos)); + if (locate_buckets_[curr_idx]->is_valid()) { + bool result = true; + RowItemType *it = &locate_buckets_[curr_idx]->get_item(); + for (int64_t i = 0; OB_SUCC(ret) && result && i < hash_expr_cnt_; ++i) { + ObIVector *r_vec = gby_exprs_->at(i)->get_vector(*eval_ctx_); + const bool l_isnull = it->is_null(i); + const bool r_isnull = r_vec->is_null(curr_idx); + if (l_isnull != r_isnull) { + result = false; + } else if (l_isnull && r_isnull) { + result = true; + } else { + const int64_t l_len = it->get_length(row_meta, i); + const int64_t r_len = r_vec->get_length(curr_idx); + if (l_len == r_len && (0 == memcmp(it->get_cell_payload(row_meta, i), + r_vec->get_payload(curr_idx), + l_len))) { + result = true; + } else { + int cmp_res = 0; + if (OB_FAIL(r_vec->null_last_cmp(*gby_exprs_->at(i), curr_idx, false, + it->get_cell_payload(row_meta, i), + l_len, cmp_res))) { + LOG_WARN("failed to cmp left and right", K(ret)); + } else { + result = (0 == cmp_res); + } + } + } + } + if (OB_SUCC(ret) && result) { my_skip.set(curr_idx); - } else { - SQL_ENG_LOG(WARN, "failed to set distinct value into hash table", K(ret)); + find_bkt = true; } + } else if (locate_buckets_[curr_idx]->is_occupyed()) { + batch_duplicate = true; + find_bkt = true; + } else { + //occupy empty bucket + locate_buckets_[curr_idx]->set_occupyed(); + new_row_selector_.at(new_row_selector_cnt_++) = curr_idx; + find_bkt = true; } } + if (batch_duplicate) { + break; + } } - } - return ret; -} - -template -int ObExtendHashTableVec::likely_equal_fixed64(const RowMeta &row_meta, - const ObCompactRow &left_row, - const int64_t right_idx, - bool &result) const -{ - // All rows is in one group, when no group by columns (group by const expr), - // so the default %result is true - int ret = OB_SUCCESS; - result = true; - const int64_t fixed_length = 8; - for (int64_t i = 0; OB_SUCC(ret) && result && i < hash_expr_cnt_; ++i) { - bool null_equal = (nullptr == gby_exprs_->at(i)); - if (!null_equal) { - ObIVector *r_vec = gby_exprs_->at(i)->get_vector(*eval_ctx_); - if (0 == memcmp(left_row.get_cell_payload(row_meta, i), - r_vec->get_payload(right_idx), - fixed_length)) { - result = true; - } else { - int cmp_res = 0; - if (OB_FAIL(r_vec->null_last_cmp(*gby_exprs_->at(i), right_idx, false, - left_row.get_cell_payload(row_meta, i), - fixed_length, cmp_res))) { - LOG_WARN("failed to cmp left and right", K(ret)); - } else { - result = (0 == cmp_res); - } - } + if (OB_FAIL(ret) || 0 == new_row_selector_cnt_) { + } else if (OB_FAIL(sf(vector_ptrs_, &new_row_selector_.at(0), new_row_selector_cnt_, srows_))) { + LOG_WARN("failed to append batch", K(ret)); } else { - result = true; - } - } - return ret; -} - -template -int ObExtendHashTableVec::likely_equal_fixed64_nullable(const RowMeta &row_meta, - const ObCompactRow &left_row, - const int64_t right_idx, - bool &result) const -{ - // All rows is in one group, when no group by columns (group by const expr), - // so the default %result is true - int ret = OB_SUCCESS; - result = true; - const int64_t fixed_length = 8; - for (int64_t i = 0; OB_SUCC(ret) && result && i < hash_expr_cnt_; ++i) { - bool null_equal = (nullptr == gby_exprs_->at(i)); - if (!null_equal) { - ObIVector *r_vec = gby_exprs_->at(i)->get_vector(*eval_ctx_); - const bool l_isnull = left_row.is_null(i); - const bool r_isnull = r_vec->is_null(right_idx); - if (l_isnull != r_isnull) { - result = false; - } else if (l_isnull && r_isnull) { - result = true; - } else if (0 == memcmp(left_row.get_cell_payload(row_meta, i), - r_vec->get_payload(right_idx), - fixed_length)) { - result = true; - } else { - int cmp_res = 0; - if (OB_FAIL(r_vec->null_last_cmp(*gby_exprs_->at(i), right_idx, false, - left_row.get_cell_payload(row_meta, i), - fixed_length, cmp_res))) { - LOG_WARN("failed to cmp left and right", K(ret)); - } else { - result = (0 == cmp_res); - } + for (int64_t i = 0; i < new_row_selector_cnt_; ++i) { + int64_t idx = new_row_selector_.at(i); + locate_buckets_[idx]->set_hash(hash_values[idx]); + locate_buckets_[idx]->set_valid(); + locate_buckets_[idx]->set_item(static_cast (*srows_[i])); + ++size_; } - } else { - result = true; - } - } - return ret; -} - -template -int ObExtendHashTableVec::likely_equal(const RowMeta &row_meta, - const ObCompactRow &left_row, - const int64_t right_idx, - bool &result) const -{ - // All rows is in one group, when no group by columns (group by const expr), - // so the default %result is true - int ret = OB_SUCCESS; - result = true; - for (int64_t i = 0; OB_SUCC(ret) && result && i < hash_expr_cnt_; ++i) { - bool null_equal = (nullptr == gby_exprs_->at(i)); - if (!null_equal) { - ObIVector *r_vec = gby_exprs_->at(i)->get_vector(*eval_ctx_); - const int64_t l_len = left_row.get_length(row_meta, i); - const int64_t r_len = r_vec->get_length(right_idx); - if (l_len == r_len && (0 == memcmp(left_row.get_cell_payload(row_meta, i), - r_vec->get_payload(right_idx), - l_len))) { - result = true; - } else { - int cmp_res = 0; - if (OB_FAIL(r_vec->null_last_cmp(*gby_exprs_->at(i), right_idx, false, - left_row.get_cell_payload(row_meta, i), - l_len, cmp_res))) { - LOG_WARN("failed to cmp left and right", K(ret)); - } else { - result = (0 == cmp_res); - } - } - } else { - result = true; + new_row_selector_cnt_ = 0; } } return ret; diff --git a/src/sql/engine/aggregate/ob_exec_hash_struct_vec.h b/src/sql/engine/aggregate/ob_exec_hash_struct_vec.h index 8d0c9b25dd..106c6940d0 100644 --- a/src/sql/engine/aggregate/ob_exec_hash_struct_vec.h +++ b/src/sql/engine/aggregate/ob_exec_hash_struct_vec.h @@ -81,7 +81,7 @@ enum BucketState { }; /* -| |extra: aggr row + next ptr| | +| |extra: aggr row | | compat row */ class ObGroupRowItemVec : public ObCompactRow @@ -93,18 +93,7 @@ public: { return static_cast(this->get_extra_payload(row_meta)); } - ObGroupRowItemVec *next(const RowMeta &row_meta) - { - return reinterpret_cast(*reinterpret_cast( - (static_cast(this->get_extra_payload(row_meta)) + row_meta.extra_size_ - get_sizeof_next_ptr()))); - } - void set_next(const ObGroupRowItemVec *next, const RowMeta &row_meta) - { - *reinterpret_cast(static_cast(this->get_extra_payload(row_meta)) - + row_meta.extra_size_ - get_sizeof_next_ptr()) = reinterpret_cast(next); - } const ObCompactRow *get_groupby_row() const { return this; } - static int64_t get_sizeof_next_ptr() { return sizeof(ObGroupRowItemVec *); } }; static_assert(sizeof(ObGroupRowItemVec) == sizeof(RowHeader), @@ -159,7 +148,7 @@ struct ObGroupRowBucketInline : public ObGroupRowBucketBase } OB_INLINE ObGroupRowBucketInline &operator =(const ObGroupRowBucketInline &other) { - hash_ = other.hash_; + info_ = other.info_; MEMCPY(buffer_, other.buffer_, INLINE_SIZE); return *this; } @@ -562,7 +551,6 @@ public: change_valid_idx_(), change_valid_idx_cnt_(0), srows_(nullptr), - likely_equal_function_(nullptr), op_id_(-1), sstr_aggr_(group_store_) { @@ -596,6 +584,7 @@ public: } else if (OB_UNLIKELY(!inited_)) { inited_ = true; curr_bkt_idx_ = 0; + scan_cnt_ = 0; while (curr_bkt_idx_ < hash_set_.buckets_->count() && !hash_set_.buckets_->at(curr_bkt_idx_).is_valid()) { ++curr_bkt_idx_; } @@ -611,21 +600,14 @@ public: } if (OB_SUCC(ret)) { for (int64_t i = read_idx; !iter_end_ && i < max_rows; ++i) { - if (OB_LIKELY(nullptr == curr_item_->next(meta_))) { - do { - ++curr_bkt_idx_; - if (curr_bkt_idx_ >= hash_set_.buckets_->count()) { - iter_end_ = true; - } - } while(!iter_end_ && !hash_set_.buckets_->at(curr_bkt_idx_).is_valid()); - if (!iter_end_) { - rows[i] = &hash_set_.buckets_->at(curr_bkt_idx_).get_item(); - curr_item_ = const_cast (static_cast (rows[i])); - ++scan_cnt_; - ++read_rows; + do { + ++curr_bkt_idx_; + if (curr_bkt_idx_ >= hash_set_.buckets_->count()) { + iter_end_ = true; } - } else { - rows[i] = curr_item_->next(meta_); + } while(!iter_end_ && !hash_set_.buckets_->at(curr_bkt_idx_).is_valid()); + if (!iter_end_) { + rows[i] = &hash_set_.buckets_->at(curr_bkt_idx_).get_item(); curr_item_ = const_cast (static_cast (rows[i])); ++scan_cnt_; ++read_rows; @@ -633,7 +615,9 @@ public: } if (iter_end_ && scan_cnt_ != hash_set_.size()) { ret = OB_ERR_UNEXPECTED; - SQL_ENG_LOG(WARN, "scan cnt is not match", K(ret), K(scan_cnt_), K(hash_set_.size())); + SQL_ENG_LOG(WARN, "scan cnt is not match", K(ret), K(read_rows), K(scan_cnt_), + K(hash_set_.size()), K(curr_bkt_idx_), + K(hash_set_.get_bucket_num())); } else if (!iter_end_ && read_rows != max_rows) { ret = OB_ERR_UNEXPECTED; SQL_ENG_LOG(WARN, "read rows is not match", K(ret), K(read_rows), K(max_rows)); @@ -668,10 +652,8 @@ public: bool iter_end_; }; friend class ObExtendHashTableVec::Iterator; - static int calc_extra_size(int64_t aggr_row_size) { return aggr_row_size + sizeof(ObGroupRowItemVec *); } + static int calc_extra_size(int64_t aggr_row_size) { return aggr_row_size; } bool is_inited() const { return sstr_aggr_.is_valid() || NULL != buckets_; } - // return the first item which equal to, NULL for none exist. - int get(const int64_t batch_idx, uint64_t hash_val, char *&aggr_row); int init(ObIAllocator *allocator, lib::ObMemAttr &mem_attr, @@ -686,12 +668,6 @@ public: int64_t aggr_row_size, int64_t initial_size, bool auto_extend); - int append(const common::ObIArray &gby_exprs, - const int64_t batch_idx, - const uint64_t hash_value, - const common::ObIArray &lengths, - char *&get_row, - bool need_reinit_vectors = false); int append_batch(const common::ObIArray &gby_exprs, const ObBatchRows &child_brs, const bool *is_dumped, @@ -717,6 +693,19 @@ public: int64_t &agg_group_cnt, BatchAggrRowsTable *batch_aggr_rows, bool need_reinit_vectors); + int inner_process_batch(const common::ObIArray &gby_exprs, + const ObBatchRows &child_brs, + const bool *is_dumped, + const uint64_t *hash_values, + const common::ObIArray &lengths, + const bool can_append_batch, + const ObGbyBloomFilterVec *bloom_filter, + char **batch_old_rows, + char **batch_new_rows, + int64_t &agg_row_cnt, + int64_t &agg_group_cnt, + BatchAggrRowsTable *batch_aggr_rows, + bool need_reinit_vectors); void prefetch(const ObBatchRows &brs, uint64_t *hash_vals) const; // Link item to hash table, extend buckets if needed. // (Do not check item is exist or not) @@ -833,52 +822,61 @@ public: } return ret; } - int set_distinct(const RowMeta &row_meta, - const uint16_t batch_idx, - uint64_t hash_value, - StoreRowFunc sf); int set_distinct_batch(const RowMeta &row_meta, const int64_t batch_size, const ObBitVector *child_skip, ObBitVector &my_skip, uint64_t *hash_values, StoreRowFunc sf); + int inner_process_batch(const RowMeta &row_meta, + const int64_t batch_size, + const ObBitVector *child_skip, + ObBitVector &my_skip, + uint64_t *hash_values, + StoreRowFunc sf); int get(const RowMeta &row_meta, const int64_t batch_idx, uint64_t hash_val, const RowItemType *&item); typedef int (ObExtendHashTableVec::*CMP_FUNC)(const RowMeta &row_meta, const ObCompactRow &left, const int64_t right_idx, bool &result) const; - int likely_equal(const RowMeta &row_meta, - const ObCompactRow &left, - const int64_t right_idx, - bool &result) const; int likely_equal_nullable(const RowMeta &row_meta, const ObCompactRow &left, const int64_t right_idx, bool &result) const; - int likely_equal_fixed64(const RowMeta &row_meta, - const ObCompactRow &left, - const int64_t right_idx, - bool &result) const; - int likely_equal_fixed64_nullable(const RowMeta &row_meta, - const ObCompactRow &left, - const int64_t right_idx, - bool &result) const; int extend(const int64_t new_bucket_num); const BucketArray *get_buckets() const { return buckets_; } protected: // Locate the bucket with the same hash value, or empty bucket if not found. // The returned empty bucket is the insert position for the %hash_val - OB_INLINE const GroupRowBucket &locate_bucket(const BucketArray &buckets, - const uint64_t hash_val) const + OB_INLINE const GroupRowBucket &locate_next_bucket(const BucketArray &buckets, + const uint64_t hash_val, + int64_t &curr_pos) const + { + const GroupRowBucket *bucket = nullptr; + const int64_t cnt = buckets.count(); + uint64_t mask_hash = (hash_val & ObGroupRowBucketBase::HASH_VAL_MASK); + if (OB_LIKELY(curr_pos < 0)) { + // relocate bkt + curr_pos = mask_hash & (cnt - 1); + bucket = &buckets.at(curr_pos); + } else { + bucket = &buckets.at((++curr_pos) & (cnt - 1)); + } + while (!bucket->check_hash(mask_hash) && bucket->is_valid()) { + bucket = &buckets.at((++curr_pos) & (cnt - 1)); + } + return *bucket; + } + // used for extend + OB_INLINE const GroupRowBucket &locate_empty_bucket(const BucketArray &buckets, + const uint64_t hash_val) const { const int64_t cnt = buckets.count(); uint64_t mask_hash = (hash_val & ObGroupRowBucketBase::HASH_VAL_MASK); - int64_t pos = mask_hash & (cnt - 1); - const GroupRowBucket *bucket = &buckets.at(pos); - // The extend logical make sure the bucket never full, loop count will always less than %cnt - while (!bucket->check_hash(mask_hash) && bucket->is_valid()) { - bucket = &buckets.at((++pos) & (cnt - 1)); + int64_t curr_pos = mask_hash & (cnt - 1); + const GroupRowBucket * bucket = &buckets.at(curr_pos); + while (bucket->is_valid()) { + bucket = &buckets.at((++curr_pos) & (cnt - 1)); } return *bucket; } @@ -912,7 +910,6 @@ protected: common::ObFixedArray change_valid_idx_; int64_t change_valid_idx_cnt_; ObCompactRow **srows_; - CMP_FUNC likely_equal_function_; int64_t op_id_; ShortStringAggregator sstr_aggr_; }; @@ -988,7 +985,7 @@ int ObExtendHashTableVec::extend(const int64_t new_bucket_num) for (int64_t i = 0; i < size; i++) { const GroupRowBucket &old = buckets_->at(i); if (old.is_valid()) { - const_cast(locate_bucket(*new_buckets, old.get_hash())) = old; + const_cast(locate_empty_bucket(*new_buckets, old.get_hash())) = old; } else if (old.is_occupyed()) { ret = OB_ERR_UNEXPECTED; LOG_WARN("extend is prepare allocated", K(old.get_hash())); @@ -1042,17 +1039,20 @@ int ObExtendHashTableVec::get(const RowMeta &row_meta, if (OB_UNLIKELY(NULL == buckets_)) { // do nothing } else { - bucket = const_cast (&locate_bucket(*buckets_, hash_val)); - if (bucket->is_valid()) { - RowItemType *it = &(bucket->get_item()); - while (OB_SUCC(ret) && nullptr != it) { + int64_t curr_pos = -1; + bool find_bkt = false; + while (OB_SUCC(ret) && !find_bkt) { + bucket = const_cast (&locate_next_bucket(*buckets_, hash_val, curr_pos)); + if (!bucket->is_valid()) { + find_bkt = true; + } else { + RowItemType *it = &(bucket->get_item()); if (OB_FAIL(likely_equal_nullable(row_meta, static_cast(*it), batch_idx, result))) { LOG_WARN("failed to cmp", K(ret)); } else if (result) { item = it; - break; + find_bkt = true; } - it = it->next(row_meta); } } } diff --git a/src/sql/engine/aggregate/ob_groupby_op.cpp b/src/sql/engine/aggregate/ob_groupby_op.cpp index 0a10b68bfc..03298edffd 100644 --- a/src/sql/engine/aggregate/ob_groupby_op.cpp +++ b/src/sql/engine/aggregate/ob_groupby_op.cpp @@ -33,7 +33,8 @@ OB_SERIALIZE_MEMBER((ObGroupBySpec, ObOpSpec), aggr_code_idx_, aggr_code_expr_, by_pass_enabled_, - support_fast_single_row_agg_); + support_fast_single_row_agg_, + llc_ndv_est_enabled_); DEF_TO_STRING(ObGroupBySpec) { diff --git a/src/sql/engine/aggregate/ob_groupby_op.h b/src/sql/engine/aggregate/ob_groupby_op.h index 4bedf8e952..c6dbd67e0b 100644 --- a/src/sql/engine/aggregate/ob_groupby_op.h +++ b/src/sql/engine/aggregate/ob_groupby_op.h @@ -35,7 +35,8 @@ public: aggr_code_idx_(OB_INVALID_INDEX_INT64), aggr_code_expr_(nullptr), by_pass_enabled_(false), - support_fast_single_row_agg_(false) + support_fast_single_row_agg_(false), + llc_ndv_est_enabled_(false) { } DECLARE_VIRTUAL_TO_STRING; @@ -58,6 +59,7 @@ public: bool by_pass_enabled_; // COUNT/SUM/MIN/MAX can use fast single row agg bool support_fast_single_row_agg_; + bool llc_ndv_est_enabled_; }; //modifiable diff --git a/src/sql/engine/aggregate/ob_hash_agg_variant.h b/src/sql/engine/aggregate/ob_hash_agg_variant.h index cc1949af1a..b5433affaf 100644 --- a/src/sql/engine/aggregate/ob_hash_agg_variant.h +++ b/src/sql/engine/aggregate/ob_hash_agg_variant.h @@ -202,21 +202,6 @@ struct GetRowMetaVisitor : public boost::static_visitor } }; -struct GetVisitor : public boost::static_visitor -{ - GetVisitor(const int64_t batch_idx, uint64_t hash_val, char *&aggr_row) - : batch_idx_(batch_idx), hash_val_(hash_val), - aggr_row_(aggr_row) {} - template - int operator() (T &t) - { - return t->get(batch_idx_, hash_val_, aggr_row_); - } - int64_t batch_idx_; - uint64_t hash_val_; - char *&aggr_row_; -}; - struct GetNextBatchVisitor : public boost::static_visitor { GetNextBatchVisitor(const ObCompactRow **rows, @@ -233,29 +218,6 @@ struct GetNextBatchVisitor : public boost::static_visitor int64_t &read_rows_; }; -struct AppendVisitor : public boost::static_visitor -{ - AppendVisitor(const common::ObIArray &gby_exprs, - const int64_t batch_idx, - uint64_t hash_val, - const common::ObIArray &lengths, - char *&get_row, bool need_reinit_vectors) - : gby_exprs_(gby_exprs), batch_idx_(batch_idx), - hash_val_(hash_val), lengths_(lengths), get_row_(get_row), - need_reinit_vectors_(need_reinit_vectors) {} - template - int operator() (T &t) - { - return t->append(gby_exprs_, batch_idx_, hash_val_, lengths_, get_row_, need_reinit_vectors_); - } - const common::ObIArray &gby_exprs_; - int64_t batch_idx_; - uint64_t hash_val_; - const common::ObIArray &lengths_; - char *&get_row_; - const bool need_reinit_vectors_; -}; - struct AppendBatchVisitor : public boost::static_visitor { AppendBatchVisitor(const common::ObIArray &gby_exprs, @@ -486,22 +448,6 @@ public: return boost::apply_visitor(visitor, hash_table_ptr_); } - int get(const int64_t batch_idx, uint64_t hash_val, char *&aggr_row) - { - GetVisitor visitor(batch_idx, hash_val, aggr_row); - return boost::apply_visitor(visitor, hash_table_ptr_); - } - - int append(const common::ObIArray &gby_exprs, - const int64_t batch_idx, - const uint64_t hash_val, - const common::ObIArray &lengths, - char *&get_row, - bool need_reinit_vectors = false) - { - AppendVisitor visitor(gby_exprs, batch_idx, hash_val, lengths, get_row, need_reinit_vectors); - return boost::apply_visitor(visitor, hash_table_ptr_); - } int append_batch(const common::ObIArray &gby_exprs, const ObBatchRows &child_brs, const bool *is_dumped, diff --git a/src/sql/engine/aggregate/ob_hash_groupby_op.cpp b/src/sql/engine/aggregate/ob_hash_groupby_op.cpp index 1c6a0c78d6..489e501e8b 100644 --- a/src/sql/engine/aggregate/ob_hash_groupby_op.cpp +++ b/src/sql/engine/aggregate/ob_hash_groupby_op.cpp @@ -227,7 +227,13 @@ int ObHashGroupByOp::inner_open() LOG_WARN("failed to init group store", K(ret)); } else if (MY_SPEC.by_pass_enabled_ && OB_FAIL(init_by_pass_op())) { LOG_WARN("failed to init by pass op", K(ret)); + } else if (bypass_ctrl_.by_pass_ctrl_enabled_ && + MY_SPEC.llc_ndv_est_enabled_ && + OB_FAIL(llc_est_.init_llc_map(mem_context_->get_arena_allocator()))) { + LOG_WARN("failed to init llc map", K(ret)); } else { + llc_est_.enabled_ = MY_SPEC.by_pass_enabled_ && MY_SPEC.llc_ndv_est_enabled_ && !force_by_pass_; + LOG_TRACE("gby switch", K(MY_SPEC.id_), K(llc_est_.enabled_), K(MY_SPEC.by_pass_enabled_), K(MY_SPEC.llc_ndv_est_enabled_), K(bypass_ctrl_.by_pass_ctrl_enabled_), K(ret)); enable_dump_ = (!(aggr_processor_.has_distinct() || aggr_processor_.has_order_by()) && GCONF.is_sql_operator_dump_enabled()); group_store_.set_dir_id(sql_mem_processor_.get_dir_id()); @@ -447,6 +453,7 @@ int ObHashGroupByOp::inner_rescan() LOG_WARN("failed to rescan", K(ret)); } else { iter_end_ = false; + llc_est_.enabled_ = MY_SPEC.by_pass_enabled_ && MY_SPEC.llc_ndv_est_enabled_ && !force_by_pass_; // keep lc_est_.enabled_ same as inner_open() } return ret; @@ -510,6 +517,7 @@ int ObHashGroupByOp::inner_get_next_row() bypass_ctrl_.start_by_pass(); bypass_ctrl_.reset_rebuild_times(); bypass_ctrl_.reset_state(); + calc_avg_group_mem(); } if (!bypass_ctrl_.by_passing()) { if (OB_FAIL(by_pass_restart_round())) { @@ -718,7 +726,8 @@ int ObHashGroupByOp::init_distinct_info(bool is_part) int64_t est_bucket_num = distinct_data_set_.est_bucket_count(est_rows, MY_SPEC.width_, MIN_GROUP_HT_INIT_SIZE, MAX_GROUP_HT_INIT_SIZE); - if (OB_FAIL(distinct_data_set_.set_funcs(&hash_funcs_, &sort_collations_, + if (OB_FAIL(ret)) { + } else if (OB_FAIL(distinct_data_set_.set_funcs(&hash_funcs_, &sort_collations_, &cmp_funcs_, &eval_ctx_))) { LOG_WARN("failed to set funcs", K(ret)); } else if (OB_FAIL(distinct_data_set_.start_round())) { @@ -1068,6 +1077,15 @@ int ObHashGroupByOp::load_data() ret = OB_SUCCESS; LOG_DEBUG("debug iter end load data", K(ret), K(cur_part), K(use_distinct_data_)); } + + if (OB_SUCC(ret) && llc_est_.enabled_) { + if (OB_FAIL(local_group_rows_.add_hashval_to_llc_map(llc_est_))) { + LOG_WARN("failed add llc map from ht", K(ret)); + } else { + llc_est_.est_cnt_ += agged_row_cnt_; + LOG_TRACE("llc map succ to add hash val from insert state", K(ret), K(llc_est_.est_cnt_), K(agged_row_cnt_), K(agged_group_cnt_)); + } + } if (OB_SUCC(ret) && NULL == cur_part && !use_distinct_data_ && OB_FAIL(finish_insert_distinct_data())) { LOG_WARN("failed to finish insert distinct data", K(ret)); @@ -1265,6 +1283,7 @@ int ObHashGroupByOp::calc_groupby_exprs_hash(ObIArray &groupby_exprs, bool ObHashGroupByOp::need_start_dump(const int64_t input_rows, int64_t &est_part_cnt, const bool check_dump) { + bool actual_need_dump = false; bool need_dump = false; const int64_t mem_used = get_mem_used_size(); const int64_t mem_bound = get_mem_bound_size(); @@ -1304,11 +1323,26 @@ bool ObHashGroupByOp::need_start_dump(const int64_t input_rows, int64_t &est_par K(agged_group_cnt_)); } } - if ((need_dump || force_dump_) && MY_SPEC.by_pass_enabled_) { - bypass_ctrl_.start_process_ht(); - bypass_ctrl_.set_max_rebuild_times(); + if ((need_dump || force_dump_)) { + actual_need_dump = true; + if (bypass_ctrl_.scaled_llc_est_ndv_) { + if (bypass_ctrl_.is_max_mem_insert_state()) { + bypass_ctrl_.set_analyze_state(); + } else { + // do nothing + } + actual_need_dump = false; + int ret = OB_SUCCESS; // no use + LOG_TRACE("max insert is about to dump, stop it", K(ret), K(get_actual_mem_used_size()), K(get_mem_bound_size()), K(sql_mem_processor_.get_data_ratio())); + } else if (MY_SPEC.by_pass_enabled_) { + bypass_ctrl_.start_process_ht(); + bypass_ctrl_.set_max_rebuild_times(); + actual_need_dump = false; + } else { + // do nothing + } } - return bypass_ctrl_.processing_ht() ? false : (need_dump || force_dump_); + return actual_need_dump; } int ObHashGroupByOp::setup_dump_env(const int64_t part_id, const int64_t input_rows, @@ -1543,6 +1577,7 @@ int ObHashGroupByOp::inner_get_next_batch(const int64_t max_row_cnt) bypass_ctrl_.reset_rebuild_times(); bypass_ctrl_.reset_state(); by_pass_brs_holder_.restore(); + calc_avg_group_mem(); } if (!bypass_ctrl_.by_passing()) { if (OB_FAIL(by_pass_restart_round())) { @@ -1686,6 +1721,14 @@ int ObHashGroupByOp::load_data_batch(int64_t max_row_cnt) } // while end row_store_iter.reset(); + if (OB_SUCC(ret) && llc_est_.enabled_) { + if (OB_FAIL(local_group_rows_.add_hashval_to_llc_map(llc_est_))) { + LOG_WARN("failed add llc map from ht", K(ret)); + } else { + llc_est_.est_cnt_ += agged_row_cnt_; + LOG_TRACE("llc map succ to add hash val from insert state", K(ret), K(llc_est_.est_cnt_), K(agged_row_cnt_), K(agged_group_cnt_)); + } + } if (OB_FAIL(ret)) { } else if (NULL == cur_part && !use_distinct_data_ && OB_FAIL(finish_insert_distinct_data())) { LOG_WARN("failed to finish insert distinct data", K(ret)); @@ -2508,6 +2551,19 @@ int ObHashGroupByOp::load_one_row() got_row = true; } } + + if (OB_SUCC(ret) && llc_est_.enabled_) { + const ObChunkDatumStore::StoredRow *srow = NULL; + uint64_t hash_val = 0; + if (OB_FAIL(calc_groupby_exprs_hash(dup_groupby_exprs_, srow, hash_val))) { + LOG_WARN("failed to calc hash", K(ret), K(llc_est_.enabled_)); + } else if (OB_FAIL(bypass_add_llc_map(hash_val, + ObThreeStageAggrStage::FIRST_STAGE == MY_SPEC.aggr_stage_ ? + by_pass_nth_group_ == MY_SPEC.dist_col_group_idxs_.count() : true))) { + LOG_WARN("failed to add llc map", K(ret)); + } + } + if (OB_FAIL(ret) || no_non_distinct_aggr_) { } else if (OB_ISNULL(by_pass_group_row_) || OB_ISNULL(by_pass_group_row_->group_row_)) { @@ -2559,6 +2615,20 @@ int ObHashGroupByOp::by_pass_prepare_one_batch(const int64_t batch_size) insert_group_ht))) { LOG_WARN("failed to get next permutation row", K(ret)); } + + if (OB_SUCC(ret) && llc_est_.enabled_) { + const ObChunkDatumStore::StoredRow **store_rows = NULL; + if (OB_FAIL(eval_groupby_exprs_batch(store_rows, brs_))) { + LOG_WARN("fail to calc groupby exprs hash batch", K(ret)); + } else { + calc_groupby_exprs_hash_batch(dup_groupby_exprs_, brs_); + if (OB_FAIL(bypass_add_llc_map_batch(ObThreeStageAggrStage::FIRST_STAGE == MY_SPEC.aggr_stage_ ? + by_pass_nth_group_ == MY_SPEC.dist_col_group_idxs_.count() : true))) { + LOG_WARN("failed to add llc map batch", K(ret)); + } + } + } + if (OB_FAIL(ret) || no_non_distinct_aggr_) { } else if (OB_ISNULL(by_pass_group_batch_) || by_pass_batch_size_ <= 0) { @@ -2749,5 +2819,109 @@ int64_t ObHashGroupByOp::get_input_size() const return res; } +void ObHashGroupByOp::calc_avg_group_mem() +{ + if (0 == llc_est_.avg_group_mem_ && llc_est_.enabled_) + { + int64_t row_cnt = local_group_rows_.size(); + int64_t part_cnt = detect_part_cnt(row_cnt); + int64_t data_size = get_actual_mem_used_size(); + int64_t est_extra_size = data_size + part_cnt * ObHashGroupByOp::FIX_SIZE_PER_PART; + double data_ratio = (0 == est_extra_size) ? 0 : (data_size * 1.0 / est_extra_size); + llc_est_.avg_group_mem_ = (0 == row_cnt || 0 == data_ratio) ? 128 : (data_size * data_ratio / row_cnt); + } +} + +int ObGroupRowHashTable::add_hashval_to_llc_map(LlcEstimate &llc_est) +{ + int ret = OB_SUCCESS; + if (!is_inited()) { //check if buckets_ is NULL + ret = OB_ERR_UNEXPECTED; + LOG_WARN("ObGroupRowHashTable is not inited", K(ret)); + } else { + for (int64_t i = 0; i < get_bucket_num(); ++i) { + ObGroupRowItem *item = buckets_->at(i).item_; + if (OB_NOT_NULL(item)) { + ObAggregateProcessor::llc_add_value(item->hash_, llc_est.llc_map_); + } + } + } + return ret; +} + + +int ObHashGroupByOp::check_llc_ndv() +{ + int ret = OB_SUCCESS; + int64_t ndv = -1; + int64_t global_bound_size = 0; + bool ndv_ratio_is_small_enough = false; + bool has_enough_mem_for_deduplication = false; + ObTenantSqlMemoryManager * tenant_sql_mem_manager = NULL; + tenant_sql_mem_manager = MTL(ObTenantSqlMemoryManager*); + ObExprEstimateNdv::llc_estimate_ndv(ndv, llc_est_.llc_map_); + if (0 == llc_est_.est_cnt_) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpect zero cnt", K(llc_est_.est_cnt_), K(ret)); + } else if (FALSE_IT(ndv_ratio_is_small_enough = (ndv * 1.0 / llc_est_.est_cnt_) < LlcEstimate::LLC_NDV_RATIO_)) { + } else if (FALSE_IT(llc_est_.last_est_cnt_ = llc_est_.est_cnt_)) { + } else if (OB_ISNULL(tenant_sql_mem_manager)) { + uint64_t tenant_id = MTL_ID(); + if (OB_MAX_RESERVED_TENANT_ID < tenant_id) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpect null ptr", K(ret)); + } else if (ndv_ratio_is_small_enough) { + bypass_ctrl_.bypass_rebackto_insert(ndv); + llc_est_.enabled_ = false; + } + } else { + global_bound_size = tenant_sql_mem_manager->get_global_bound_size(); + has_enough_mem_for_deduplication = (global_bound_size * LlcEstimate::GLOBAL_BOUND_RATIO_) > (llc_est_.avg_group_mem_ * ndv); + LOG_TRACE("check llc ndv", K(ndv_ratio_is_small_enough), K(ndv), K(llc_est_.est_cnt_), K(has_enough_mem_for_deduplication), K(llc_est_.avg_group_mem_), K(global_bound_size), K(get_actual_mem_used_size())); + if (!has_enough_mem_for_deduplication) { + //continue bypass and stop estimating llc ndv + llc_est_.enabled_ = false; + LOG_TRACE("stop check llc ndv and continue bypass", K(ndv_ratio_is_small_enough), K(ndv), K(llc_est_.est_cnt_), K(has_enough_mem_for_deduplication), K(llc_est_.avg_group_mem_), K(global_bound_size), K(get_actual_mem_used_size())); + } else if (ndv_ratio_is_small_enough) { + // go to llc_insert_state and stop bypass and stop estimating llc ndv + bypass_ctrl_.bypass_rebackto_insert(ndv); + llc_est_.enabled_ = false; + LOG_TRACE("reback into deduplication state and stop bypass and stop estimating llc ndv", K(ndv_ratio_is_small_enough), K(ndv), K(llc_est_.est_cnt_), K(has_enough_mem_for_deduplication), K(llc_est_.avg_group_mem_), K(global_bound_size), K(get_actual_mem_used_size())); + } else { + //do nothing, continue bypass and estimate llc ndv + } + } + return ret; +} + +int ObHashGroupByOp::bypass_add_llc_map(uint64_t hash_val, bool ready_to_check_ndv) { + int ret = OB_SUCCESS; + llc_add_value(hash_val); + if ((llc_est_.est_cnt_ - llc_est_.last_est_cnt_) > LlcEstimate::ESTIMATE_MOD_NUM_ && ready_to_check_ndv) { + if (OB_FAIL(check_llc_ndv())) { + LOG_WARN("failed to check llc ndv", K(ret)); + } else if (0 < bypass_ctrl_.scaled_llc_est_ndv_) { // means state of bypass_ctrl_ go to INSERT from BYPASS + if (OB_ISNULL(last_child_row_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected null ptr", K(ret), K(llc_est_.est_cnt_), K(bypass_ctrl_.scaled_llc_est_ndv_)); + } + } + } + return ret; +} +int ObHashGroupByOp::bypass_add_llc_map_batch(bool ready_to_check_ndv) { + int ret = OB_SUCCESS; + for (int64_t i = 0; OB_SUCC(ret) && llc_est_.enabled_ && i < brs_.size_; ++i) { + if (brs_.skip_->exist(i)) { continue; } + llc_add_value(hash_vals_[i]); + } + if ((llc_est_.est_cnt_ - llc_est_.last_est_cnt_) > LlcEstimate::ESTIMATE_MOD_NUM_ && ready_to_check_ndv) { + if (OB_FAIL(check_llc_ndv())) { + LOG_WARN("failed to check llc ndv", K(ret)); + } + } + return ret; +} + } // end namespace sql } // end namespace oceanbase diff --git a/src/sql/engine/aggregate/ob_hash_groupby_op.h b/src/sql/engine/aggregate/ob_hash_groupby_op.h index 9808657de8..d75e505dc6 100644 --- a/src/sql/engine/aggregate/ob_hash_groupby_op.h +++ b/src/sql/engine/aggregate/ob_hash_groupby_op.h @@ -22,6 +22,7 @@ #include "sql/engine/basic/ob_hash_partitioning_infrastructure_op.h" #include "sql/engine/aggregate/ob_aggregate_processor.h" #include "sql/engine/aggregate/ob_adaptive_bypass_ctrl.h" +#include "sql/engine/aggregate/ob_hash_groupby_vec_op.h" namespace oceanbase { @@ -111,7 +112,6 @@ public: uint16_t group_row_offset_in_selector_; }; - class ObGroupRowHashTable : public ObExtendHashTable { public: @@ -125,6 +125,7 @@ public: ObEvalCtx *eval_ctx, const common::ObIArray *cmp_funcs, int64_t initial_size = INITIAL_SIZE); + int add_hashval_to_llc_map(LlcEstimate &llc_est); private: int likely_equal(const ObGroupRowItem &left, const ObGroupRowItem &right, bool &result) const; private: @@ -270,7 +271,8 @@ public: by_pass_nth_group_(0), last_child_row_(nullptr), by_pass_child_brs_(nullptr), - force_by_pass_(false) + force_by_pass_(false), + llc_est_() { } void reset(); @@ -285,7 +287,15 @@ public: // for batch virtual int inner_get_next_batch(const int64_t max_row_cnt) override; - + void calc_avg_group_mem(); + OB_INLINE void llc_add_value(int64_t hash_value) + { + ObAggregateProcessor::llc_add_value(hash_value, llc_est_.llc_map_); + ++llc_est_.est_cnt_; + } + int bypass_add_llc_map(uint64_t hash_val, bool ready_to_check_ndv); + int bypass_add_llc_map_batch(bool ready_to_check_ndv); + int check_llc_ndv(); int check_same_group(int64_t &diff_pos); int restore_groupby_datum(const int64_t diff_pos); int rollup_and_calc_results(const int64_t group_id); @@ -606,6 +616,7 @@ private: const ObBatchRows *by_pass_child_brs_; ObBatchResultHolder by_pass_brs_holder_; bool force_by_pass_; + LlcEstimate llc_est_; }; } // end namespace sql diff --git a/src/sql/engine/aggregate/ob_hash_groupby_vec_op.cpp b/src/sql/engine/aggregate/ob_hash_groupby_vec_op.cpp index 4a98a94cfe..b20eceb49d 100644 --- a/src/sql/engine/aggregate/ob_hash_groupby_vec_op.cpp +++ b/src/sql/engine/aggregate/ob_hash_groupby_vec_op.cpp @@ -97,8 +97,8 @@ int ObHashGroupByVecOp::inner_open() LOG_WARN("init memory entity failed", K(ret)); } else if (!local_group_rows_.is_inited()) { - int64_t max_row_size = ObCompactRow::calc_max_row_size(MY_SPEC.group_exprs_, - ObExtendHashTableVec::calc_extra_size(aggr_processor_.get_aggregate_row_size())); + int64_t max_row_size = ObCompactRow::calc_max_row_size(MY_SPEC.group_exprs_, + ObExtendHashTableVec::calc_extra_size(aggr_processor_.get_aggregate_row_size())); //create bucket int64_t est_group_cnt = MY_SPEC.est_group_cnt_; int64_t est_hash_mem_size = 0; @@ -180,7 +180,13 @@ int ObHashGroupByVecOp::inner_open() LOG_WARN("failed to init group store", K(ret)); } else if (MY_SPEC.by_pass_enabled_ && OB_FAIL(init_by_pass_op())) { LOG_WARN("failed to init by pass op", K(ret)); + } else if (bypass_ctrl_.by_pass_ctrl_enabled_ && + MY_SPEC.llc_ndv_est_enabled_ && + OB_FAIL(llc_est_.init_llc_map(mem_context_->get_arena_allocator()))) { + LOG_WARN("failed to init llc map", K(ret)); } else { + llc_est_.enabled_ = MY_SPEC.by_pass_enabled_ && MY_SPEC.llc_ndv_est_enabled_ && !force_by_pass_; + LOG_TRACE("gby switch", K(MY_SPEC.id_), K(llc_est_.enabled_), K(MY_SPEC.by_pass_enabled_), K(MY_SPEC.llc_ndv_est_enabled_), K(bypass_ctrl_.by_pass_ctrl_enabled_), K(ret)); //THIRD_STAGE have to process dup data but aggr_code is not in gby_expr, we can not judge same group by aggr ptr reorder_aggr_rows_ = eval_ctx_.max_batch_size_ >= MIN_BATCH_SIZE_REORDER_AGGR_ROWS && MY_SPEC.aggr_stage_ != ObThreeStageAggrStage::THIRD_STAGE; @@ -375,6 +381,7 @@ int ObHashGroupByVecOp::inner_rescan() LOG_WARN("failed to rescan", K(ret)); } else { iter_end_ = false; + llc_est_.enabled_ = MY_SPEC.by_pass_enabled_ && MY_SPEC.llc_ndv_est_enabled_ && !force_by_pass_; // keep lc_est_.enabled_ same as inner_open() } return ret; @@ -531,7 +538,8 @@ int ObHashGroupByVecOp::init_distinct_info(bool is_part) int64_t est_bucket_num = distinct_data_set_.est_bucket_count( est_rows, MY_SPEC.width_, MIN_GROUP_HT_INIT_SIZE, MAX_GROUP_HT_INIT_SIZE); - if (OB_FAIL(distinct_data_set_.set_funcs(&sort_collations_, &eval_ctx_))) { + if (OB_FAIL(ret)) { + } else if (OB_FAIL(distinct_data_set_.set_funcs(&sort_collations_, &eval_ctx_))) { LOG_WARN("failed to set funcs", K(ret)); } else if (OB_FAIL(distinct_data_set_.start_round())) { LOG_WARN("failed to start round", K(ret)); @@ -657,6 +665,19 @@ void ObHashGroupByVecOp::calc_data_mem_ratio(const int64_t part_cnt, double &dat K(profile_.get_expect_size()), K(profile_.get_cache_size())); } +void ObHashGroupByVecOp::calc_avg_group_mem() +{ + if (0 == llc_est_.avg_group_mem_ && llc_est_.enabled_) + { + int64_t row_cnt = local_group_rows_.size(); + int64_t part_cnt = detect_part_cnt(row_cnt); + int64_t data_size = get_actual_mem_used_size(); + int64_t est_extra_size = data_size + part_cnt * FIX_SIZE_PER_PART; + double data_ratio = (0 == est_extra_size) ? 0 : (data_size * 1.0 / est_extra_size); + llc_est_.avg_group_mem_ = (0 == row_cnt || 0 == data_ratio) ? 128 : (data_size * data_ratio / row_cnt); + } +} + void ObHashGroupByVecOp::adjust_part_cnt(int64_t &part_cnt) { int64_t mem_used = get_mem_used_size(); @@ -677,6 +698,7 @@ void ObHashGroupByVecOp::adjust_part_cnt(int64_t &part_cnt) bool ObHashGroupByVecOp::need_start_dump(const int64_t input_rows, int64_t &est_part_cnt, const bool check_dump) { + bool actual_need_dump = false; bool need_dump = false; const int64_t mem_used = get_mem_used_size(); const int64_t mem_bound = get_mem_bound_size(); @@ -716,11 +738,26 @@ bool ObHashGroupByVecOp::need_start_dump(const int64_t input_rows, int64_t &est_ K(agged_group_cnt_)); } } - if ((need_dump || force_dump_) && MY_SPEC.by_pass_enabled_) { - bypass_ctrl_.start_process_ht(); - bypass_ctrl_.set_max_rebuild_times(); + if ((need_dump || force_dump_)) { + actual_need_dump = true; + if (bypass_ctrl_.scaled_llc_est_ndv_) { + if (bypass_ctrl_.is_max_mem_insert_state()) { + bypass_ctrl_.set_analyze_state(); + } else { + // do nothing + } + actual_need_dump = false; + int ret = OB_SUCCESS; // no use + LOG_TRACE("max insert is about to dump, stop it", K(ret), K(get_actual_mem_used_size()), K(get_mem_bound_size()), K(sql_mem_processor_.get_data_ratio())); + } else if (MY_SPEC.by_pass_enabled_) { + bypass_ctrl_.start_process_ht(); + bypass_ctrl_.set_max_rebuild_times(); + actual_need_dump = false; + } else { + // do nothing + } } - return bypass_ctrl_.processing_ht() ? false : (need_dump || force_dump_); + return actual_need_dump; } int ObHashGroupByVecOp::setup_dump_env(const int64_t part_id, const int64_t input_rows, @@ -939,6 +976,7 @@ int ObHashGroupByVecOp::inner_get_next_batch(const int64_t max_row_cnt) bypass_ctrl_.reset_rebuild_times(); bypass_ctrl_.reset_state(); by_pass_vec_holder_.restore(); + calc_avg_group_mem(); } if (!bypass_ctrl_.by_passing()) { if (OB_FAIL(by_pass_restart_round())) { @@ -1188,6 +1226,19 @@ int ObHashGroupByVecOp::load_data_batch(int64_t max_row_cnt) } // while end row_store_iter.reset(); + if (OB_SUCC(ret) && llc_est_.enabled_) { + if (local_group_rows_.is_sstr_aggr_valid()) { + llc_est_.enabled_ = false;// do not need llc, ndv must less then 65535 + } else { + AddLlcCallback cb_func(&llc_est_); + if (OB_FAIL(local_group_rows_.foreach_bucket_hash(cb_func))) { + LOG_WARN("add hash val from local_group_rows_ to llc_est_ failed", K(ret)); + } else { + llc_est_.est_cnt_ += agged_row_cnt_; + LOG_TRACE("llc map succ to add hash val from insert state", K(ret), K(llc_est_.est_cnt_), K(agged_row_cnt_), K(agged_group_cnt_)); + } + } + } if (OB_FAIL(ret)) { } else if (NULL == cur_part && !use_distinct_data_ && OB_FAIL(finish_insert_distinct_data())) { LOG_WARN("failed to finish insert distinct data", K(ret)); @@ -1903,6 +1954,18 @@ int ObHashGroupByVecOp::by_pass_prepare_one_batch(const int64_t batch_size) by_pass_nth_group_, last_group, by_pass_child_brs_, brs_, batch_size, insert_group_ht))) { LOG_WARN("failed to get next permutation row", K(ret)); } + if (OB_SUCC(ret) && llc_est_.enabled_) { + const ObCompactRow **store_rows = NULL; + const RowMeta *meta = NULL; + if (OB_FAIL(eval_groupby_exprs_batch(store_rows, meta, brs_))) { + LOG_WARN("fail to calc groupby exprs hash batch", K(ret)); + } else if (OB_FAIL(calc_groupby_exprs_hash_batch(dup_groupby_exprs_, brs_))) { + LOG_WARN("failed to calc groupby expr has", K(ret), K(dup_groupby_exprs_)); + } else if (OB_FAIL(bypass_add_llc_map_batch(ObThreeStageAggrStage::FIRST_STAGE == MY_SPEC.aggr_stage_ ? + by_pass_nth_group_ == MY_SPEC.dist_col_group_idxs_.count() : true))) { + LOG_WARN("failed to add llc map batch", K(ret)); + } + } if (OB_FAIL(ret) || no_non_distinct_aggr_) { } else if (OB_UNLIKELY(by_pass_batch_size_ <= 0)) { ret = OB_ERR_UNEXPECTED; @@ -2108,5 +2171,88 @@ void ObHashGroupByVecOp::check_groupby_exprs(const ObIArray &groupby_e } } +int ObHashGroupByVecOp::check_llc_ndv() +{ + int ret = OB_SUCCESS; + int64_t ndv = -1; + int64_t global_bound_size = 0; + bool ndv_ratio_is_small_enough = false; + bool has_enough_mem_for_deduplication = false; + ObTenantSqlMemoryManager * tenant_sql_mem_manager = NULL; + tenant_sql_mem_manager = MTL(ObTenantSqlMemoryManager*); + ObExprEstimateNdv::llc_estimate_ndv(ndv, llc_est_.llc_map_); + if (0 == llc_est_.est_cnt_) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpect zero cnt", K(llc_est_.est_cnt_), K(ret)); + } else if (FALSE_IT(ndv_ratio_is_small_enough = (ndv * 1.0 / llc_est_.est_cnt_) < LlcEstimate::LLC_NDV_RATIO_)) { + } else if (FALSE_IT(llc_est_.last_est_cnt_ = llc_est_.est_cnt_)) { + } else if (OB_ISNULL(tenant_sql_mem_manager)) { + uint64_t tenant_id = MTL_ID(); + if (OB_MAX_RESERVED_TENANT_ID < tenant_id) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpect null ptr", K(ret)); + } else if (ndv_ratio_is_small_enough) { + bypass_ctrl_.bypass_rebackto_insert(ndv); + llc_est_.enabled_ = false; + } + } else { + global_bound_size = tenant_sql_mem_manager->get_global_bound_size(); + has_enough_mem_for_deduplication = (global_bound_size * LlcEstimate::GLOBAL_BOUND_RATIO_) > (llc_est_.avg_group_mem_ * ndv); + LOG_TRACE("check llc ndv", K(ndv_ratio_is_small_enough), K(ndv), K(llc_est_.est_cnt_), K(has_enough_mem_for_deduplication), K(llc_est_.avg_group_mem_), K(global_bound_size), K(get_actual_mem_used_size())); + if (!has_enough_mem_for_deduplication) { + //continue bypass and stop estimating llc ndv + llc_est_.enabled_ = false; + LOG_TRACE("stop check llc ndv and continue bypass", K(ndv_ratio_is_small_enough), K(ndv), K(llc_est_.est_cnt_), K(has_enough_mem_for_deduplication), K(llc_est_.avg_group_mem_), K(global_bound_size), K(get_actual_mem_used_size())); + } else if (ndv_ratio_is_small_enough) { + // go to llc_insert_state and stop bypass and stop estimating llc ndv + bypass_ctrl_.bypass_rebackto_insert(ndv); + llc_est_.enabled_ = false; + LOG_TRACE("reback into deduplication state and stop bypass and stop estimating llc ndv", K(ndv_ratio_is_small_enough), K(ndv), K(llc_est_.est_cnt_), K(has_enough_mem_for_deduplication), K(llc_est_.avg_group_mem_), K(global_bound_size), K(get_actual_mem_used_size())); + } else { + //do nothing, continue bypass and estimate llc ndv + } + } + return ret; +} + +int ObHashGroupByVecOp::bypass_add_llc_map_batch(bool ready_to_check_ndv) { + int ret = OB_SUCCESS; + for (int64_t i = 0; OB_SUCC(ret) && llc_est_.enabled_ && i < brs_.size_; ++i) { + if (brs_.skip_->exist(i)) { continue; } + llc_add_value(hash_vals_[i]); + } + if ((llc_est_.est_cnt_ - llc_est_.last_est_cnt_) > LlcEstimate::ESTIMATE_MOD_NUM_ && + ready_to_check_ndv && OB_FAIL(check_llc_ndv())) { + LOG_WARN("failed to check llc ndv", K(ret)); + } + return ret; +} + +int LlcEstimate::init_llc_map(common::ObArenaAllocator &allocator) +{ + int ret = OB_SUCCESS; + char *llc_map; + int64_t llc_map_size; + if (OB_FAIL(ObAggregateProcessor::llc_init_empty(llc_map, llc_map_size, allocator))) { + LOG_WARN("failed to init llc map", K(ret)); + } else { + llc_map_.assign_ptr(llc_map, llc_map_size); + } + return ret; +} + +int LlcEstimate::reset() +{ + int ret = OB_SUCCESS; + if (!llc_map_.empty()) { + MEMSET(llc_map_.ptr(), 0, llc_map_.length()); + } + avg_group_mem_ = 0; + est_cnt_ = 0; + last_est_cnt_ = 0; + enabled_ = false; + return ret; +} + } // end namespace sql } // end namespace oceanbase diff --git a/src/sql/engine/aggregate/ob_hash_groupby_vec_op.h b/src/sql/engine/aggregate/ob_hash_groupby_vec_op.h index 632d64ec93..e6ec734b6f 100644 --- a/src/sql/engine/aggregate/ob_hash_groupby_vec_op.h +++ b/src/sql/engine/aggregate/ob_hash_groupby_vec_op.h @@ -22,12 +22,46 @@ #include "sql/engine/basic/ob_vector_result_holder.h" #include "sql/engine/aggregate/ob_groupby_vec_op.h" #include "sql/engine/basic/ob_hp_infras_vec_op.h" +#include "src/sql/engine/expr/ob_expr_estimate_ndv.h" namespace oceanbase { namespace sql { +struct LlcEstimate +{ +public: + LlcEstimate() + : avg_group_mem_(0), llc_map_(), est_cnt_(0), last_est_cnt_(0), enabled_(false) + {} + int init_llc_map(common::ObArenaAllocator &allocator); + int reset(); + double avg_group_mem_; + ObString llc_map_; + uint64_t est_cnt_; + uint64_t last_est_cnt_; + bool enabled_; + static constexpr const int64_t ESTIMATE_MOD_NUM_ = 4096; + static constexpr const double LLC_NDV_RATIO_ = 0.3; + static constexpr const double GLOBAL_BOUND_RATIO_ = 0.8; +}; + +class AddLlcCallback +{ +public: + explicit AddLlcCallback(LlcEstimate *llc_est_ptr) { llc_est_ptr_ = llc_est_ptr; } + AddLlcCallback() = delete; + virtual ~AddLlcCallback() = default; + int operator()(uint64_t hash_val) { + // for performance, do not check if llc_est_ptr_ is NULL ptr or not + ObAggregateProcessor::llc_add_value(hash_val, llc_est_ptr_->llc_map_); + return OB_SUCCESS; + } +private: + LlcEstimate *llc_est_ptr_; +}; + struct ObGroupByDupColumnPairVec { OB_UNIS_VERSION_V(1); @@ -156,7 +190,8 @@ public: aggr_vectors_(nullptr), reorder_aggr_rows_(false), old_row_selector_(nullptr), - batch_aggr_rows_table_() + batch_aggr_rows_table_(), + llc_est_() { } void reset(bool for_rescan); @@ -169,7 +204,14 @@ public: // for batch virtual int inner_get_next_batch(const int64_t max_row_cnt) override; - + void calc_avg_group_mem(); + OB_INLINE void llc_add_value(int64_t hash_value) + { + ObAggregateProcessor::llc_add_value(hash_value, llc_est_.llc_map_); + ++llc_est_.est_cnt_; + } + int bypass_add_llc_map_batch(bool ready_to_check_ndv); + int check_llc_ndv(); OB_INLINE int64_t get_hash_groupby_row_count() const { return local_group_rows_.size(); @@ -389,6 +431,7 @@ private: bool reorder_aggr_rows_; uint16_t *old_row_selector_; BatchAggrRowsTable batch_aggr_rows_table_; + LlcEstimate llc_est_; }; } // end namespace sql diff --git a/src/sql/engine/basic/ob_chunk_datum_store.cpp b/src/sql/engine/basic/ob_chunk_datum_store.cpp index 33bb9edf9b..306f551af2 100644 --- a/src/sql/engine/basic/ob_chunk_datum_store.cpp +++ b/src/sql/engine/basic/ob_chunk_datum_store.cpp @@ -1800,6 +1800,8 @@ int ObChunkDatumStore::get_store_row(RowIterator &it, const StoredRow *&sr) return ret; } + + //////////////////////////////////////////////////////////////// ObChunkDatumStore::RowIterator::RowIterator() : store_(NULL), diff --git a/src/sql/engine/basic/ob_chunk_datum_store.h b/src/sql/engine/basic/ob_chunk_datum_store.h index f8e9296466..d3388f68dc 100644 --- a/src/sql/engine/basic/ob_chunk_datum_store.h +++ b/src/sql/engine/basic/ob_chunk_datum_store.h @@ -1094,6 +1094,12 @@ public: return io_event_observer_; } inline int64_t get_max_blk_size() const { return max_blk_size_; } + + // 这里暂时以ObExpr的数组形式写入数据到DatumStore,主要是为了上层Operator在写入数据时,可以无脑调用ObExpr的插入 + // 可以看下面参数为common::ObDatum **datums的函数进行对比 + static inline int row_copy_size(const common::ObIArray &exprs, ObEvalCtx &ctx, + int64_t &size); + private: OB_INLINE int add_row(const common::ObIArray &exprs, ObEvalCtx *ctx, const int64_t row_size, StoredRow **stored_row); @@ -1147,38 +1153,10 @@ private: int init_batch_ctx(const int64_t col_cnt, const int64_t max_batch_size); - // 这里暂时以ObExpr的数组形式写入数据到DatumStore,主要是为了上层Operator在写入数据时,可以无脑调用ObExpr的插入 - // 可以看下面参数为common::ObDatum **datums的函数进行对比 - static inline int row_copy_size( - const common::ObIArray &exprs, ObEvalCtx &ctx, int64_t &size) - { - int ret = OB_SUCCESS; - ObExpr *expr = nullptr; - common::ObDatum *datum = nullptr; - size = DATUM_SIZE * exprs.count(); - for (int64_t i = 0; i < exprs.count() && OB_SUCC(ret); ++i) { - expr = exprs.at(i); - if (OB_ISNULL(expr)) { - } else if (OB_FAIL(expr->eval(ctx, datum))) { - SQL_ENG_LOG(WARN, "failed to eval expr datum", KPC(expr), K(ret)); - } else { - size += datum->len_; - } - } - return ret; - } - // 提供给从chunk datum store获取后 // 由于整体是compact模式,所以采用指针形式指向第一个datum,后续以++或下标方式可以获取所有datum // 暂时没有使用 - static inline int64_t row_copy_size(const common::ObDatum *datums, const int64_t cnt) - { - int64_t size = DATUM_SIZE * cnt; - for (int64_t i = 0; i < cnt; ++i) { - size += datums[i].len_; - } - return size; - } + static inline int64_t row_copy_size(const common::ObDatum *datums, const int64_t cnt); private: bool inited_; uint64_t tenant_id_; @@ -1303,6 +1281,32 @@ int ObChunkDatumStore::StoredRow::to_expr( return ret; } +inline int ObChunkDatumStore::row_copy_size(const common::ObIArray &exprs, ObEvalCtx &ctx, + int64_t &size) +{ + int ret = OB_SUCCESS; + ObExpr *expr = nullptr; + common::ObDatum *datum = nullptr; + size = DATUM_SIZE * exprs.count(); + for (int64_t i = 0; i < exprs.count() && OB_SUCC(ret); ++i) { + expr = exprs.at(i); + if (OB_ISNULL(expr)) { + } else if (OB_FAIL(expr->eval(ctx, datum))) { + SQL_ENG_LOG(WARN, "failed to eval expr datum", KPC(expr), K(ret)); + } else { + size += datum->len_; + } + } + return ret; +} + +inline int64_t ObChunkDatumStore::row_copy_size(const common::ObDatum *datums, const int64_t cnt) +{ + int64_t size = DATUM_SIZE * cnt; + for (int64_t i = 0; i < cnt; ++i) { size += datums[i].len_; } + return size; +} + template int ObChunkDatumStore::Iterator::get_next_row( ObEvalCtx &ctx, const common::ObIArray &exprs) diff --git a/src/sql/engine/basic/ob_compact_row.h b/src/sql/engine/basic/ob_compact_row.h index 8673dac96e..92dfe36521 100644 --- a/src/sql/engine/basic/ob_compact_row.h +++ b/src/sql/engine/basic/ob_compact_row.h @@ -198,7 +198,6 @@ struct ObCompactRow inline void set_null(const RowMeta &meta, const int64_t col_idx) { nulls()->set(col_idx); - header_.has_null_ = true; if (meta.fixed_expr_reordered()) { const int32_t idx = meta.project_idx(col_idx); if (idx < meta.fixed_cnt_) { diff --git a/src/sql/engine/px/ob_px_row_store.cpp b/src/sql/engine/px/ob_px_row_store.cpp index 4eee989feb..074f9eace5 100644 --- a/src/sql/engine/px/ob_px_row_store.cpp +++ b/src/sql/engine/px/ob_px_row_store.cpp @@ -600,7 +600,7 @@ int ObReceiveRowReader::attach_vectors(const common::ObIArray &exprs, } } } else { - bool has_null = true; // TODO : opt + bool has_null = (0 != data_buffer.get_nulls(col_idx)->accumulate_bit_cnt(data_buffer.get_row_cnt())); if (e->is_fixed_length_data_) { const dtl::VectorInfo &col_info = data_buffer.get_info(col_idx); if (OB_UNLIKELY(col_info.format_ != e->get_vector_header(eval_ctx).format_)) { diff --git a/src/sql/engine/recursive_cte/ob_fake_cte_table_op.cpp b/src/sql/engine/recursive_cte/ob_fake_cte_table_op.cpp index 0482d5a58c..536c770cd7 100644 --- a/src/sql/engine/recursive_cte/ob_fake_cte_table_op.cpp +++ b/src/sql/engine/recursive_cte/ob_fake_cte_table_op.cpp @@ -12,6 +12,7 @@ #define USING_LOG_PREFIX SQL_ENG #include "sql/engine/recursive_cte/ob_fake_cte_table_op.h" +#include "lib/rc/context.h" namespace oceanbase { @@ -20,22 +21,34 @@ namespace sql { OB_SERIALIZE_MEMBER((ObFakeCTETableSpec, ObOpSpec), column_involved_offset_, - column_involved_exprs_); + column_involved_exprs_, + is_bulk_search_, + identify_seq_expr_); int ObFakeCTETableOp::inner_get_next_row() { int ret = OB_SUCCESS; clear_evaluated_flag(); if (OB_FAIL(try_check_status())) { - LOG_WARN("Failed to check physical plan status", K(ret)); - } else if (!has_valid_data()) { + LOG_WARN("Fail to check physical plan status", K(ret)); + } else if (empty_) { ret = OB_ITER_END; - } else if (OB_ISNULL(pump_row_) - && OB_UNLIKELY(MY_SPEC.column_involved_exprs_.count() != 0)) { + } else if (!MY_SPEC.is_bulk_search_ && OB_FAIL(get_next_single_row())) { + LOG_WARN("Fail to get next pump row", K(ret)); + } else if (MY_SPEC.is_bulk_search_ && OB_FAIL(get_next_bulk_row())) { + LOG_WARN("Fail to get next bulk row", K(ret)); + } + return ret; +} + +int ObFakeCTETableOp::get_next_single_row() +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(pump_row_) && OB_UNLIKELY(MY_SPEC.column_involved_exprs_.count() != 0)) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("pump row is null", K(ret)); - } else if (OB_LIKELY(NULL != pump_row_) - && OB_FAIL(pump_row_->to_expr(MY_SPEC.column_involved_exprs_, eval_ctx_))) { + LOG_WARN("Pump row is null", K(ret)); + } else if (OB_NOT_NULL(pump_row_) && + OB_FAIL(pump_row_->to_expr(MY_SPEC.column_involved_exprs_, eval_ctx_))) { LOG_WARN("Stored row to expr failed", K(ret)); } else { empty_ = true; @@ -43,17 +56,62 @@ int ObFakeCTETableOp::inner_get_next_row() return ret; } +int ObFakeCTETableOp::get_next_bulk_row() +{ + int ret = OB_SUCCESS; + int64_t expr_cnt = MY_SPEC.column_involved_exprs_.count(); + if (OB_UNLIKELY(bulk_rows_.empty() && expr_cnt != 0)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Bulk rows is empty", K(ret)); + } else if (OB_UNLIKELY(bulk_rows_.empty())) { + empty_ = true; + } else if (OB_UNLIKELY(read_bluk_cnt_ >= bulk_rows_.count() + || OB_ISNULL(bulk_rows_.at(read_bluk_cnt_)))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Current bulk row is null or out of range", K(read_bluk_cnt_), K(ret)); + } else if (OB_FAIL(to_expr(MY_SPEC.column_involved_exprs_, MY_SPEC.column_involved_offset_, + bulk_rows_.at(read_bluk_cnt_), eval_ctx_))) { + LOG_WARN("Stored row to expr not in recursive bulk failed", K(ret)); + } else if (is_oracle_mode()) { + MY_SPEC.identify_seq_expr_->locate_datum_for_write(eval_ctx_).set_uint(read_bluk_cnt_); + } + if (OB_SUCC(ret)) { + read_bluk_cnt_++; + if (OB_UNLIKELY(read_bluk_cnt_ == bulk_rows_.count())) { + empty_ = true; + bulk_rows_.reset(); + } + } + return ret; +} + int ObFakeCTETableOp::inner_get_next_batch(const int64_t max_row_cnt) { - UNUSED(max_row_cnt); int ret = OB_SUCCESS; - if (OB_FAIL(inner_get_next_row())) { + clear_evaluated_flag(); + if (OB_FAIL(try_check_status())) { + LOG_WARN("Fail to check physical plan status", K(ret)); + } else if (empty_) { + brs_.end_ = true; + brs_.size_ = 0; + } else if (!MY_SPEC.is_bulk_search_ && OB_FAIL(get_next_single_batch(max_row_cnt))) { + LOG_WARN("Fail to get next single batch", K(ret)); + } else if (MY_SPEC.is_bulk_search_ && OB_FAIL(get_next_bulk_batch(max_row_cnt))) { + LOG_WARN("Fail to get next bulk batch", K(ret)); + } + return ret; +} + +int ObFakeCTETableOp::get_next_single_batch(const int64_t max_row_cnt) +{ + int ret = OB_SUCCESS; + if (OB_FAIL(get_next_single_row())) { if (ret == OB_ITER_END) { brs_.end_ = true; brs_.size_ = 0; ret = OB_SUCCESS; } else { - LOG_INFO("Failed to get result from cte table", K(ret)); + LOG_INFO("Fail to get result from cte table", K(ret)); } } else { brs_.size_ = 1; @@ -61,14 +119,66 @@ int ObFakeCTETableOp::inner_get_next_batch(const int64_t max_row_cnt) return ret; } +int ObFakeCTETableOp::get_next_bulk_batch(const int64_t max_row_cnt) +{ + int ret = OB_SUCCESS; + int64_t read_rows = 0; + int64_t batch_size = std::min(max_row_cnt, MY_SPEC.max_batch_size_); + int64_t expr_cnt = MY_SPEC.column_involved_exprs_.count(); + if (OB_UNLIKELY(bulk_rows_.empty() && expr_cnt != 0)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Bulk rows is empty", K(ret)); + } else if (OB_UNLIKELY(bulk_rows_.empty())) { + empty_ = true; + } else if (OB_UNLIKELY(read_bluk_cnt_ >= bulk_rows_.count()) + || OB_ISNULL(bulk_rows_.at(read_bluk_cnt_))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Current bulk row is null or out of range", K(read_bluk_cnt_), K(ret)); + } else if (FALSE_IT(read_rows = std::min(batch_size, bulk_rows_.count() - read_bluk_cnt_))) { + } else if (OB_FAIL(attach_rows(MY_SPEC.column_involved_exprs_, MY_SPEC.column_involved_offset_, + bulk_rows_, read_bluk_cnt_, eval_ctx_, read_rows))) { + LOG_WARN("Failed to attach rows", K(ret)); + } else if (is_oracle_mode()) { + ObDatum *datums = MY_SPEC.identify_seq_expr_->locate_datums_for_update(eval_ctx_, read_rows); + for (int64_t i = 0; i < read_rows; ++i) { + datums[i].set_uint(read_bluk_cnt_ + i); + } + } + if (OB_SUCC(ret)) { + brs_.size_ = read_rows; + brs_.end_ = (0 == read_rows); + read_bluk_cnt_ += read_rows; + if (OB_UNLIKELY(read_bluk_cnt_ == bulk_rows_.count())) { + empty_ = true; + bulk_rows_.reset(); + } + } + return ret; +} void ObFakeCTETableOp::reuse() { - pump_row_ = nullptr; + int ret = OB_SUCCESS; empty_ = true; + read_bluk_cnt_ = 0; + cur_identify_seq_ = 0; + bulk_rows_.reset(); + if (OB_NOT_NULL(pump_row_)) { + allocator_->free(const_cast(pump_row_)); + pump_row_ = nullptr; + } } -int ObFakeCTETableOp::add_row(ObChunkDatumStore::StoredRow *row) +void ObFakeCTETableOp::destroy() +{ + if (OB_NOT_NULL(mem_context_)) { + DESTROY_CONTEXT(mem_context_); + mem_context_ = nullptr; + } + ObOperator::destroy(); +} + +int ObFakeCTETableOp::add_single_row(ObChunkDatumStore::StoredRow *row) { int ret = OB_SUCCESS; /** @@ -81,16 +191,17 @@ int ObFakeCTETableOp::add_row(ObChunkDatumStore::StoredRow *row) empty_ = false; } else if (OB_ISNULL(row)) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("fake cte table add row count != output_ count", KPC(row)); + LOG_WARN("Fake cte table add nullptr row", KPC(row)); } else if (OB_FAIL(deep_copy_row(row, new_row, MY_SPEC.column_involved_offset_, - ObSearchMethodOp::ROW_EXTRA_SIZE, allocator_))) { - LOG_WARN("fail to deep copy stored row", K(ret)); + ObSearchMethodOp::ROW_EXTRA_SIZE, *allocator_))) { + LOG_WARN("Fail to deep copy stored row", K(ret)); } else { old_row = const_cast(pump_row_); pump_row_ = new_row; empty_ = false; if (nullptr != old_row) { - allocator_.free(old_row); + allocator_->free(old_row); + old_row = nullptr; } } return ret; @@ -99,7 +210,9 @@ int ObFakeCTETableOp::add_row(ObChunkDatumStore::StoredRow *row) int ObFakeCTETableOp::inner_rescan() { int ret = ObOperator::inner_rescan(); - if (pump_row_ != nullptr) { + if (!MY_SPEC.is_bulk_search_ && pump_row_ != nullptr) { + empty_ = false; + } else if (MY_SPEC.is_bulk_search_ && !bulk_rows_.empty()) { empty_ = false; } return ret; @@ -111,6 +224,28 @@ int ObFakeCTETableOp::inner_open() if (MY_SPEC.column_involved_exprs_.count() != MY_SPEC.column_involved_offset_.count()) { ret = OB_ERR_UNEXPECTED; LOG_WARN("invalid fake cte table spec", K(ret)); + } else if (OB_ISNULL(MY_SPEC.identify_seq_expr_)) { + if (is_oracle_mode() && MY_SPEC.is_bulk_search_) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected null identify seq expr", K(ret)); + } + } else if (OB_NOT_NULL(MY_SPEC.identify_seq_expr_)) { + if (!is_oracle_mode() || !MY_SPEC.is_bulk_search_) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected not null identify seq expr", K(ret)); + } + } + if (OB_SUCC(ret)) { + lib::ContextParam param; + param.set_mem_attr(MTL_ID(), "FakeCteTable", ObCtxIds::WORK_AREA); + if (OB_FAIL(CURRENT_CONTEXT->CREATE_CONTEXT(mem_context_, param))) { + LOG_WARN("create entity failed", K(ret)); + } else if (OB_ISNULL(mem_context_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("null memory entity returned", K(ret)); + } else { + allocator_ = &mem_context_->get_malloc_allocator(); + } } return ret; } @@ -193,7 +328,7 @@ int ObFakeCTETableOp::deep_copy_row(const ObChunkDatumStore::StoredRow *src_row, } else if (OB_FAIL(copy_datums(new_row, const_cast(src_row->cells()), src_row->cnt_, chosen_index, buf + pos, buffer_len - head_size, row_size, extra_size))) { - LOG_WARN("failed to deep copy row", K(ret), K(buffer_len), K(row_size)); + LOG_WARN("failed to deep copy row", K(ret), K(buffer_len), K(row_size)); } else { dst_row = new_row; } @@ -202,5 +337,109 @@ int ObFakeCTETableOp::deep_copy_row(const ObChunkDatumStore::StoredRow *src_row, return ret; } +int ObFakeCTETableOp::to_expr( + const common::ObIArray &exprs, + const common::ObIArray &chosen_index, + ObChunkDatumStore::StoredRow *row, ObEvalCtx &ctx) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(row)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected nullptr row", K(ret), K(row)); + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < exprs.count(); i++) { + ObExpr *expr = exprs.at(i); + if (expr->is_const_expr()) { + continue; + } else if (chosen_index.at(i) >= row->cnt_) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("idx out of range", K(ret), K(chosen_index), K(row->cnt_), K(chosen_index.at(i))); + } else { + const ObDatum &src = row->cells()[chosen_index.at(i)]; + if (OB_LIKELY(expr->is_variable_res_buf())) { + ObDatum &dst = expr->locate_expr_datum(ctx); + dst = src; + } else { + ObDatum &dst = expr->locate_datum_for_write(ctx); + dst.pack_ = src.pack_; + MEMCPY(const_cast(dst.ptr_), src.ptr_, src.len_); + } + expr->set_evaluated_projected(ctx); + } + } + } + return ret; +} + +int ObFakeCTETableOp::attach_rows( + const common::ObIArray &exprs, + const common::ObIArray &chosen_index, + const common::ObArray &srows, + const int64_t rows_offset, ObEvalCtx &ctx, const int64_t read_rows) +{ + int ret = OB_SUCCESS; + for (int64_t col_idx = 0; OB_SUCC(ret) && col_idx < exprs.count(); col_idx++) { + ObExpr *e = exprs.at(col_idx); + int64_t idx = chosen_index.at(col_idx); + if (e->is_const_expr()) { + continue; + } else if (OB_LIKELY(e->is_variable_res_buf())) { + ObDatum *datums = e->locate_batch_datums(ctx); + if (!e->is_batch_result()) { + if (OB_UNLIKELY(idx >= srows.at(0)->cnt_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("idx out of range", K(ret), K(idx), K(chosen_index), K(srows.at(0)->cnt_)); + } else { + datums[0] = srows.at(0)->cells()[idx]; + } + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < read_rows; i++) { + if (OB_UNLIKELY(idx >= srows.at(rows_offset+i)->cnt_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("idx out of range", K(ret), K(idx), K(read_rows), + K(i), K(chosen_index), K(srows.at(rows_offset+i)->cnt_)); + } else { + datums[i] = srows.at(rows_offset+i)->cells()[idx]; + } + } + } + } else { + if (!e->is_batch_result()) { + ObDatum *datums = e->locate_datums_for_update(ctx, 1); + if (OB_UNLIKELY(idx >= srows.at(0)->cnt_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("idx out of range", K(ret), K(idx), K(chosen_index), K(srows.at(0)->cnt_)); + } else { + const ObDatum &src = srows.at(0)->cells()[idx]; + ObDatum &dst = datums[0]; + dst.pack_ = src.pack_; + MEMCPY(const_cast(dst.ptr_), src.ptr_, src.len_); + } + } else { + ObDatum *datums = e->locate_datums_for_update(ctx, read_rows); + for (int64_t i = 0; OB_SUCC(ret) && i < read_rows; i++) { + if (OB_UNLIKELY(idx >= srows.at(rows_offset+i)->cnt_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("idx out of range", K(ret), K(idx), K(read_rows), + K(i), K(chosen_index), K(srows.at(rows_offset+i)->cnt_)); + } else { + const ObDatum &src = srows.at(rows_offset+i)->cells()[idx]; + ObDatum &dst = datums[i]; + dst.pack_ = src.pack_; + MEMCPY(const_cast(dst.ptr_), src.ptr_, src.len_); + } + } + } + } + if (OB_SUCC(ret)) { + e->set_evaluated_projected(ctx); + ObEvalInfo &info = e->get_eval_info(ctx); + info.notnull_ = false; + info.point_to_frame_ = false; + } + } + return ret; +} + } // end namespace sql } // end namespace oceanbase diff --git a/src/sql/engine/recursive_cte/ob_fake_cte_table_op.h b/src/sql/engine/recursive_cte/ob_fake_cte_table_op.h index 757cd51e61..6b1eaf47ec 100644 --- a/src/sql/engine/recursive_cte/ob_fake_cte_table_op.h +++ b/src/sql/engine/recursive_cte/ob_fake_cte_table_op.h @@ -32,14 +32,23 @@ class ObFakeCTETableSpec : public ObOpSpec OB_UNIS_VERSION_V(1); public: explicit ObFakeCTETableSpec(common::ObIAllocator &alloc, const ObPhyOperatorType type) - : ObOpSpec(alloc, type), column_involved_offset_(alloc), column_involved_exprs_(alloc) + : ObOpSpec(alloc, type), column_involved_offset_(alloc), column_involved_exprs_(alloc), + is_bulk_search_(false), identify_seq_expr_(nullptr) { } + + INHERIT_TO_STRING_KV("op_spec", ObOpSpec, + K_(column_involved_offset), K_(column_involved_exprs), + K_(is_bulk_search), K_(identify_seq_expr)); + virtual ~ObFakeCTETableSpec() {} //数组下标指的是output_里面的下标,数组内容是在cte表中原始列的偏移位置 common::ObFixedArray column_involved_offset_; common::ObFixedArray column_involved_exprs_; + //for breadth search first + bool is_bulk_search_; + ObExpr *identify_seq_expr_; }; class ObFakeCTETableOp : public ObOperator @@ -49,22 +58,28 @@ public: : ObOperator(exec_ctx, spec, input), empty_(false), pump_row_(nullptr), - allocator_(exec_ctx.get_allocator()) + allocator_(nullptr), + read_bluk_cnt_(0), + cur_identify_seq_(0), + bulk_rows_(), + mem_context_(nullptr) { } - inline virtual void destroy() - { - ObOperator::destroy(); - } - inline bool has_valid_data() { return !empty_; } + common::ObArray &get_bulk_rows() { return bulk_rows_; }; void reuse(); + virtual void destroy(); virtual int inner_rescan() override; virtual int inner_open() override; virtual int inner_close() override; virtual int inner_get_next_row() override; virtual int inner_get_next_batch(const int64_t max_row_cnt) override; inline void set_empty() { empty_ = true; } - int add_row(ObChunkDatumStore::StoredRow *row); + inline void update_status(); + int get_next_single_row(); + int get_next_bulk_row(); + int get_next_single_batch(const int64_t max_row_cnt); + int get_next_bulk_batch(const int64_t max_row_cnt); + int add_single_row(ObChunkDatumStore::StoredRow *row); int copy_datums(ObChunkDatumStore::StoredRow *row, common::ObDatum *datums, int64_t cnt, const common::ObIArray &chosen_datums, char *buf, const int64_t size, const int64_t row_size, @@ -75,14 +90,36 @@ public: const common::ObIArray &chosen_index, int64_t extra_size, common::ObIAllocator &allocator); + int to_expr(const common::ObIArray &exprs, + const common::ObIArray &chosen_datums, + ObChunkDatumStore::StoredRow *row, ObEvalCtx &ctx); + int attach_rows(const common::ObIArray &exprs, + const common::ObIArray &chosen_index, + const common::ObArray &srows, + const int64_t rows_offset, ObEvalCtx &ctxm, const int64_t read_rows); const static int64_t ROW_EXTRA_SIZE = 0; private: bool empty_; const ObChunkDatumStore::StoredRow* pump_row_; - ObIAllocator &allocator_; + ObIAllocator *allocator_; + // for batch search recursive cte + int64_t read_bluk_cnt_; + int64_t cur_identify_seq_; + common::ObArray bulk_rows_; + lib::MemoryContext mem_context_; }; +void ObFakeCTETableOp::update_status() +{ + read_bluk_cnt_ = 0; + if (MY_SPEC.column_involved_offset_.empty()) { + empty_ = false; + } else if (!bulk_rows_.empty()) { + empty_ = false; + } +} + } // end namespace sql } // end namespace oceanbase diff --git a/src/sql/engine/recursive_cte/ob_recursive_inner_data_op.cpp b/src/sql/engine/recursive_cte/ob_recursive_inner_data_op.cpp index 8800ed37d3..df2b69bc3a 100644 --- a/src/sql/engine/recursive_cte/ob_recursive_inner_data_op.cpp +++ b/src/sql/engine/recursive_cte/ob_recursive_inner_data_op.cpp @@ -57,7 +57,11 @@ int ObRecursiveInnerDataOp::get_all_data_from_left_child() } } else { ++left_rows_count; - if (SearchStrategyType::BREADTH_FRIST == search_type_) { + if (SearchStrategyType::BREADTH_FIRST_BULK == search_type_) { + if (OB_FAIL(bfs_bulk_pump_.add_row(left_op_->get_spec().output_, eval_ctx_))) { + LOG_WARN("Failed to add row", K(ret)); + } + } else if (SearchStrategyType::BREADTH_FRIST == search_type_) { if (OB_FAIL(bfs_pump_.add_row(left_op_->get_spec().output_, eval_ctx_))) { LOG_WARN("Failed to add row", K(ret)); } @@ -131,6 +135,10 @@ int ObRecursiveInnerDataOp::get_all_data_from_right_child() } else { while (OB_SUCC(ret) && OB_SUCC(right_op_->get_next_row())) { if (OB_ITER_END == ret) { + } else if (OB_SUCC(ret) && SearchStrategyType::BREADTH_FIRST_BULK == search_type_) { + if (OB_FAIL(bfs_bulk_pump_.add_row(right_op_->get_spec().output_, eval_ctx_))) { //add stored row + LOG_WARN("Failed to add row", K(ret)); + } } else if (OB_SUCC(ret) && SearchStrategyType::BREADTH_FRIST == search_type_) { if (OB_FAIL(bfs_pump_.add_row(right_op_->get_spec().output_, eval_ctx_))) { //add stored row LOG_WARN("Failed to add row", K(ret)); @@ -183,7 +191,7 @@ int ObRecursiveInnerDataOp::get_all_data_from_right_batch() return ret; } -int ObRecursiveInnerDataOp::try_format_output_row() +int ObRecursiveInnerDataOp::try_format_output_row(int64_t &read_rows) { int ret = OB_SUCCESS; ObTreeNode result_node; @@ -204,12 +212,72 @@ int ObRecursiveInnerDataOp::try_format_output_row() LOG_WARN("Failed to assign input row to cur row", K(ret)); } else if (OB_FAIL(add_pseudo_column(result_node.is_cycle_))) { LOG_WARN("Add pseudo column failed", K(ret)); + } else { + read_rows = 1; } } LOG_DEBUG("try_format_output_row: output info", K(result_node), K(ret)); return ret; } +int ObRecursiveInnerDataOp::try_format_output_batch(int64_t batch_size, int64_t &read_rows) +{ + int ret = OB_SUCCESS; + ObTreeNode result_node; + ObEvalCtx::BatchInfoScopeGuard guard(eval_ctx_); + guard.set_batch_size(batch_size); + for (int64_t i = 0; OB_SUCC(ret) && i < batch_size; ++i) { + // try to get row again + if (!result_output_.empty()) { + if (OB_FAIL(result_output_.pop_front(result_node))) { + LOG_WARN("Get result output failed", K(ret)); + } else if (OB_ISNULL(result_node.stored_row_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Get a null result output", K(ret)); + } + } else { + ret = OB_ITER_END; + } + // try format row + if (OB_SUCC(ret)) { + guard.set_batch_idx(i); + if (OB_FAIL(assign_to_cur_row(result_node.stored_row_))) { + LOG_WARN("Failed to assign input row to cur row", K(ret)); + } else if (OB_FAIL(add_pseudo_column(result_node.is_cycle_))) { + LOG_WARN("Add pseudo column failed", K(ret)); + } else { + read_rows++; + } + } + LOG_DEBUG("try_format_output_batch: output info", K(result_node), K(ret)); + } + if (OB_ITER_END == ret && read_rows > 0) { + ret = OB_SUCCESS; + } + if (OB_SUCC(ret)) { + if (OB_NOT_NULL(search_expr_)) { + search_expr_->set_evaluated_projected(eval_ctx_); + ObEvalInfo &info = search_expr_->get_eval_info(eval_ctx_); + info.notnull_ = false; + info.point_to_frame_ = false; + } + if (OB_NOT_NULL(cycle_expr_)) { + cycle_expr_->set_evaluated_projected(eval_ctx_); + ObEvalInfo &info = cycle_expr_->get_eval_info(eval_ctx_); + info.notnull_ = false; + info.point_to_frame_ = false; + } + for (int64_t i = 0; i < output_union_exprs_.count(); ++i) { + ObExpr *expr = output_union_exprs_.at(i); + expr->set_evaluated_projected(eval_ctx_); + ObEvalInfo &info = expr->get_eval_info(eval_ctx_); + info.notnull_ = false; + info.point_to_frame_ = false; + } + } + return ret; +} + int ObRecursiveInnerDataOp::depth_first_union(const bool sort /*=true*/) { int ret = OB_SUCCESS; @@ -218,7 +286,7 @@ int ObRecursiveInnerDataOp::depth_first_union(const bool sort /*=true*/) LOG_WARN("Failed to add row", K(ret)); } else if (OB_FAIL(set_fake_cte_table_empty())) { LOG_WARN("Set fake cte table to empty failed", K(ret)); - } else if (OB_FAIL(dfs_pump_.get_next_non_cycle_node(result_output_, node))) { + } else if (OB_FAIL(dfs_pump_.get_next_nocycle_node(result_output_, node))) { if (OB_ITER_END == ret) { ret = OB_SUCCESS; } else { @@ -236,7 +304,7 @@ int ObRecursiveInnerDataOp::fake_cte_table_add_row(ObTreeNode &node) if (OB_ISNULL(pump_operator_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("Fake cte table op can not be nullptr", K(ret)); - } else if (OB_FAIL(pump_operator_->add_row(node.stored_row_))) { + } else if (OB_FAIL(pump_operator_->add_single_row(node.stored_row_))) { LOG_WARN("Fake cte table add row failed", K(ret)); } else if (SearchStrategyType::BREADTH_FRIST == search_type_ && OB_FAIL(bfs_pump_.update_parent_node(node))) { @@ -256,7 +324,7 @@ int ObRecursiveInnerDataOp::breadth_first_union(bool left_branch, bool &continue LOG_WARN("Set fake cte table to empty failed", K(ret)); } else if (OB_FAIL(bfs_pump_.add_result_rows())) { LOG_WARN("Failed to finish add row", K(ret)); - } else if (OB_FAIL(bfs_pump_.get_next_non_cycle_node(result_output_, node))) { + } else if (OB_FAIL(bfs_pump_.get_next_nocycle_node(result_output_, node))) { if (OB_ITER_END == ret) { ret = OB_SUCCESS; continue_search = false; @@ -289,7 +357,7 @@ int ObRecursiveInnerDataOp::start_new_level(bool left_branch) ObTreeNode node; if (OB_FAIL(bfs_pump_.finish_add_row(!left_branch))) { LOG_WARN("Failed to finish add row", K(ret)); - } else if (OB_FAIL(bfs_pump_.get_next_non_cycle_node(result_output_, node))) { + } else if (OB_FAIL(bfs_pump_.get_next_nocycle_node(result_output_, node))) { if (OB_ITER_END == ret) { ret = OB_SUCCESS; state_ = RecursiveUnionState::R_UNION_END; @@ -302,7 +370,47 @@ int ObRecursiveInnerDataOp::start_new_level(bool left_branch) return ret; } -int ObRecursiveInnerDataOp::try_get_left_rows(bool batch_mode /* = false */) +// for breadth bulk search first +int ObRecursiveInnerDataOp::fake_cte_table_add_bulk_rows(bool left_branch) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(pump_operator_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Fake cte table op can not be nullptr", K(ret)); + } else if (FALSE_IT(pump_operator_->update_status())) { + } else if (OB_FAIL(bfs_bulk_pump_.update_search_depth(max_recursion_depth_))) { + LOG_WARN("Failed to update last bst node stask", K(ret)); + } + return ret; +} + +int ObRecursiveInnerDataOp::breadth_first_bulk_union(bool left_branch) +{ + int ret = OB_SUCCESS; + bool need_sort = !sort_collations_.empty(); + if (OB_ISNULL(pump_operator_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("The fake cte table is null", K(ret)); + } else if (OB_FAIL(set_fake_cte_table_empty())) { + LOG_WARN("Set fake cte table to empty failed", K(ret)); + } else if (OB_FAIL(bfs_bulk_pump_.add_result_rows(left_branch, identify_seq_offset_))) { + LOG_WARN("Failed to finish add row", K(ret)); + } else if (OB_FAIL(bfs_bulk_pump_.get_next_nocycle_bulk( + result_output_, pump_operator_->get_bulk_rows(), need_sort))) { + if (OB_ITER_END == ret) { + ret = OB_SUCCESS; + state_ = RecursiveUnionState::R_UNION_END; + } else { + LOG_WARN("Failed to get next non cycle node", K(ret)); + } + } else if (OB_FAIL(fake_cte_table_add_bulk_rows(left_branch))) { + LOG_WARN("Fake cte table add row failed", K(ret)); + } else { /* do nothing */ } + return ret; +} + +int ObRecursiveInnerDataOp::try_get_left_rows( + bool batch_mode, int64_t batch_size, int64_t &read_rows) { int ret = OB_SUCCESS; ObTreeNode result_node; @@ -320,7 +428,11 @@ int ObRecursiveInnerDataOp::try_get_left_rows(bool batch_mode /* = false */) LOG_WARN("Get row from left child failed", K(ret)); } } else { - if (SearchStrategyType::BREADTH_FRIST == search_type_) { + if (SearchStrategyType::BREADTH_FIRST_BULK == search_type_) { + if (OB_FAIL(breadth_first_bulk_union(true))) { + LOG_WARN("Breadth first union failed", K(ret)); + } + } else if (SearchStrategyType::BREADTH_FRIST == search_type_) { bool continue_search = false; if (OB_FAIL(breadth_first_union(true, continue_search))) { LOG_WARN("Breadth first union failed", K(ret)); @@ -333,8 +445,14 @@ int ObRecursiveInnerDataOp::try_get_left_rows(bool batch_mode /* = false */) // never get there } if (OB_SUCC(ret)) { - if (OB_FAIL(try_format_output_row())) {//why check does NOT check iter_end - LOG_WARN("Failed to get next row", K(ret)); + if (batch_mode && is_bulk_search()) { + if (OB_FAIL(try_format_output_batch(batch_size, read_rows))) { + LOG_WARN("failed to get next batch", K(ret)); + } + } else { + if (OB_FAIL(try_format_output_row(read_rows))) { + LOG_WARN("Failed to get next row", K(ret)); + } } } } @@ -342,7 +460,8 @@ int ObRecursiveInnerDataOp::try_get_left_rows(bool batch_mode /* = false */) return ret; } -int ObRecursiveInnerDataOp::try_get_right_rows(bool batch_mode /* = false */) +int ObRecursiveInnerDataOp::try_get_right_rows( + bool batch_mode, int64_t batch_size, int64_t &read_rows) { int ret = OB_SUCCESS; ObTreeNode result_node; @@ -373,12 +492,32 @@ int ObRecursiveInnerDataOp::try_get_right_rows(bool batch_mode /* = false */) LOG_WARN("Breadth first union failed", K(ret)); } } + } else if (SearchStrategyType::BREADTH_FIRST_BULK == search_type_) { + if (batch_mode && OB_FAIL(get_all_data_from_right_batch())) { + LOG_WARN("Get row from right child in batch mode failed", K(ret)); + } else if (!batch_mode && OB_FAIL(get_all_data_from_right_child())) { + LOG_WARN("Get row from right child failed", K(ret)); + } else if (OB_FAIL(right_op_->rescan())) { + LOG_WARN("Recursive union right children rescan failed", K(ret)); + } else if (bfs_bulk_pump_.empty()) { + // do nothing + } else if (OB_FAIL(breadth_first_bulk_union(false))) { + LOG_WARN("Breadth first union failed", K(ret)); + } } // try to get row again if (OB_SUCC(ret)) { - if (OB_FAIL(try_format_output_row())) { - if (ret != OB_ITER_END) { - LOG_WARN("Failed to get next row", K(ret)); + if (batch_mode && is_bulk_search()) { + if (OB_FAIL(try_format_output_batch(batch_size, read_rows))) { + if (ret != OB_ITER_END) { + LOG_WARN("failed to get next batch", K(ret)); + } + } + } else { + if (OB_FAIL(try_format_output_row(read_rows))) { + if (ret != OB_ITER_END) { + LOG_WARN("Failed to get next row", K(ret)); + } } } } @@ -393,14 +532,15 @@ int ObRecursiveInnerDataOp::try_get_right_rows(bool batch_mode /* = false */) int ObRecursiveInnerDataOp::get_next_row() { int ret = OB_SUCCESS; + int64_t read_rows = 0; if (!result_output_.empty()) { - if (OB_FAIL(try_format_output_row())) { + if (OB_FAIL(try_format_output_row(read_rows))) { LOG_WARN("Format output row failed", K(ret)); } else { } } else if (RecursiveUnionState::R_UNION_READ_LEFT == state_) { if (is_mysql_mode() && OB_FAIL(check_recursive_depth())) { LOG_WARN("Recursive query abort", K(ret)); - } else if (OB_FAIL(try_get_left_rows())) { + } else if (OB_FAIL(try_get_left_rows(false, 1, read_rows))) { if (ret != OB_ITER_END) { LOG_WARN("Get left rows failed", K(ret)); } else { @@ -412,7 +552,7 @@ int ObRecursiveInnerDataOp::get_next_row() } else if (RecursiveUnionState::R_UNION_READ_RIGHT == state_) { if (is_mysql_mode() && OB_FAIL(check_recursive_depth())) { LOG_WARN("Recursive query abort", K(ret)); - } else if (OB_FAIL(try_get_right_rows())) { + } else if (OB_FAIL(try_get_right_rows(false, 1, read_rows))) { if (ret != OB_ITER_END) { LOG_WARN("Get right rows failed", K(ret)); } else { @@ -435,20 +575,26 @@ int ObRecursiveInnerDataOp::get_next_row() // during batch iterating make it MUCH MUCH more complicated. And its benefits // outweight the overhead of maintaining the parent-child relation. // Thus, make recursive union all return output with batch size to 1 so far. -int ObRecursiveInnerDataOp::get_next_batch(const int64_t max_row_cnt, +int ObRecursiveInnerDataOp::get_next_batch(const int64_t batch_size, ObBatchRows &brs) { int ret = OB_SUCCESS; - UNUSED(max_row_cnt); + int64_t read_rows = 0; LOG_DEBUG("Entrance of get_next_batch", K(result_output_.empty()), K(state_)); if (!result_output_.empty()) { - if (OB_FAIL(try_format_output_row())) { - LOG_WARN("Format output row failed", K(ret)); - }// else { } do nothing + if (is_bulk_search()) { + if (OB_FAIL(try_format_output_batch(batch_size, read_rows))) { + LOG_WARN("Format output bacth failed", K(ret)); + } + } else { + if (OB_FAIL(try_format_output_row(read_rows))) { + LOG_WARN("Format output row failed", K(ret)); + } + } } else if (RecursiveUnionState::R_UNION_READ_LEFT == state_) { if (is_mysql_mode() && OB_FAIL(check_recursive_depth())) { LOG_WARN("Recursive query abort", K(ret)); - } else if (OB_FAIL(try_get_left_rows(true))) { + } else if (OB_FAIL(try_get_left_rows(true, batch_size, read_rows))) { if (ret != OB_ITER_END) { LOG_WARN("Get left rows failed", K(ret)); } else { @@ -460,7 +606,7 @@ int ObRecursiveInnerDataOp::get_next_batch(const int64_t max_row_cnt, } else if (RecursiveUnionState::R_UNION_READ_RIGHT == state_) { if (is_mysql_mode() && OB_FAIL(check_recursive_depth())) { LOG_WARN("Recursive query abort", K(ret)); - } else if (OB_FAIL(try_get_right_rows(true))) { + } else if (OB_FAIL(try_get_right_rows(true, batch_size, read_rows))) { if (ret != OB_ITER_END) { LOG_WARN("Get right rows failed", K(ret)); } else { @@ -481,7 +627,7 @@ int ObRecursiveInnerDataOp::get_next_batch(const int64_t max_row_cnt, // do nothing already set in previouse block } else { brs.end_ = false; - brs.size_ = 1; + brs.size_ = read_rows; } } else if (ret == OB_ITER_END) { brs.end_ = true; @@ -512,9 +658,9 @@ int ObRecursiveInnerDataOp::add_pseudo_column(bool cycle /*default false*/) } else { // 无search列或search 列不在output中 } - if (nullptr != cycle_expr_) { + if (OB_SUCC(ret) && nullptr != cycle_expr_) { if (OB_FAIL(cycle_expr_->deep_copy_datum(eval_ctx_, cycle ? cycle_value_ : non_cycle_value_))) { - LOG_WARN("expr datum deep copy failed", K(ret)); + LOG_WARN("expr datum deep copy failed", K(ret)); } else { cycle_expr_->set_evaluated_projected(eval_ctx_); } @@ -530,6 +676,10 @@ int ObRecursiveInnerDataOp::rescan() ordering_column_ = 1; dfs_pump_.reuse(); bfs_pump_.reuse(); + bfs_bulk_pump_.reuse(); + //rescan RCTE should clear cte intermediate data + //while rescan cte don't need to clear itself because they have different meaning + pump_operator_->reuse(); // 由于容器本身使用stored_row_buf_,故不能reset它。 return ret; } @@ -548,7 +698,16 @@ int ObRecursiveInnerDataOp::set_fake_cte_table_empty() void ObRecursiveInnerDataOp::destroy() { + result_output_.reset(); + left_op_ = nullptr; + right_op_ = nullptr; dfs_pump_.destroy(); + bfs_pump_.destroy(); + bfs_bulk_pump_.destroy(); + if (OB_NOT_NULL(pump_operator_)) { + pump_operator_->destroy(); + pump_operator_ = nullptr; + } stored_row_buf_.reset(); } @@ -558,12 +717,9 @@ int ObRecursiveInnerDataOp::assign_to_cur_row(ObChunkDatumStore::StoredRow *stor if (OB_ISNULL(stored_row)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("stored row is null", K(stored_row)); - } else { - if (OB_SUCC(ret)) { - if (OB_FAIL(stored_row->to_expr(output_union_exprs_, eval_ctx_))) { - LOG_WARN("stored row to exprs failed", K(ret)); - } - } + } else if (OB_FAIL(stored_row->to_expr( + output_union_exprs_, eval_ctx_, output_union_exprs_.count()))) { + LOG_WARN("stored row to exprs failed", K(ret)); } return ret; } @@ -574,6 +730,8 @@ int ObRecursiveInnerDataOp::check_recursive_depth() { if (OB_ISNULL(pump = get_search_method_bump())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected null", K(ret)); + } else if (SearchStrategyType::BREADTH_FIRST_BULK == search_type_) { + // do nothing } else { uint64_t level = pump->get_last_node_level(); if (level != UINT64_MAX && level > max_recursion_depth_) { diff --git a/src/sql/engine/recursive_cte/ob_recursive_inner_data_op.h b/src/sql/engine/recursive_cte/ob_recursive_inner_data_op.h index a218992612..67dee32613 100644 --- a/src/sql/engine/recursive_cte/ob_recursive_inner_data_op.h +++ b/src/sql/engine/recursive_cte/ob_recursive_inner_data_op.h @@ -40,7 +40,7 @@ public: }; enum SearchStrategyType { - DEPTH_FRIST, BREADTH_FRIST + DEPTH_FRIST, BREADTH_FRIST, BREADTH_FIRST_BULK }; public: explicit ObRecursiveInnerDataOp(ObEvalCtx &eval_ctx, @@ -48,7 +48,8 @@ public: const ExprFixedArray &left_output, const common::ObIArray &sort_collations, const common::ObIArray &cycle_by_col_lists, - const common::ObIArray &output_union_exprs) : + const common::ObIArray &output_union_exprs, + const int64_t identify_seq_offset) : state_(RecursiveUnionState::R_UNION_READ_LEFT), stored_row_buf_(ObModIds::OB_SQL_CTE_ROW), pump_operator_(nullptr), @@ -65,10 +66,12 @@ public: ordering_column_(1), dfs_pump_(stored_row_buf_, left_output, sort_collations, cycle_by_col_lists), bfs_pump_(stored_row_buf_, left_output, sort_collations, cycle_by_col_lists), + bfs_bulk_pump_(stored_row_buf_, left_output, sort_collations, cycle_by_col_lists), eval_ctx_(eval_ctx), ctx_(exec_ctx), output_union_exprs_(output_union_exprs), - max_recursion_depth_(0) + max_recursion_depth_(0), + identify_seq_offset_(identify_seq_offset) { } ~ObRecursiveInnerDataOp() = default; @@ -84,7 +87,7 @@ public: int add_cycle_column(uint64_t index); int add_cmp_func(ObCmpFunc cmp_func); int get_next_row(); - int get_next_batch(const int64_t max_row_cnt, ObBatchRows &brs); + int get_next_batch(const int64_t batch_size, ObBatchRows &brs); int rescan(); int set_fake_cte_table_empty(); int init(const ObExpr *search_expr, const ObExpr *cycle_expr); @@ -94,9 +97,10 @@ public: private: void destroy(); int add_pseudo_column(bool cycle = false); - int try_get_left_rows(bool batch_mode = false); - int try_get_right_rows(bool batch_mode = false); - int try_format_output_row(); + int try_get_left_rows(bool batch_mode, int64_t batch_size, int64_t &read_rows); + int try_get_right_rows(bool batch_mode, int64_t batch_size, int64_t &read_rows); + int try_format_output_row(int64_t &read_rows); + int try_format_output_batch(int64_t batch_size, int64_t &read_rows); /** * recursive union的左儿子被称为plan a,右儿子被称为plan b * plan a会产出初始数据,recursive union本身控制递归的进度, @@ -110,19 +114,26 @@ private: int depth_first_union(const bool sort = true); // 广度优先递归中,进行行的UNION ALL操作 int breadth_first_union(bool left_branch, bool &continue_search); + // 广度优先批量搜索递归中,进行行的UNION ALL操作 + int breadth_first_bulk_union(bool left_branch); int start_new_level(bool left_branch); // 将一行数据吐给fake cte table算子,它将作为下一次plan b的输入 int fake_cte_table_add_row(ObTreeNode &node); + // 将一批数据吐给fake cte table算子,它将作为下一次plan b的输入 + int fake_cte_table_add_bulk_rows(bool left_branch); // 设置cte table column expr的值 int assign_to_cur_row(ObChunkDatumStore::StoredRow *stored_row); ObSearchMethodOp * get_search_method_bump() { - if (SearchStrategyType::BREADTH_FRIST == search_type_) { + if (SearchStrategyType::BREADTH_FIRST_BULK == search_type_) { + return &bfs_bulk_pump_; + } else if (SearchStrategyType::BREADTH_FRIST == search_type_) { return &bfs_pump_; - } else { // SearchStrategyType::DEPTH_FRIST + } else { return &dfs_pump_; } - } + }; int check_recursive_depth(); + bool is_bulk_search() { return SearchStrategyType::BREADTH_FIRST_BULK == search_type_; }; // disallow copy DISALLOW_COPY_AND_ASSIGN(ObRecursiveInnerDataOp); private: @@ -157,14 +168,17 @@ private: */ int64_t ordering_column_; // 深度优先 - ObDepthFisrtSearchOp dfs_pump_; + ObDepthFirstSearchOp dfs_pump_; // 广度优先 - ObBreadthFisrtSearchOp bfs_pump_; + ObBreadthFirstSearchOp bfs_pump_; + // 广度优先批量搜索 + ObBreadthFirstSearchBulkOp bfs_bulk_pump_; ObEvalCtx &eval_ctx_; ObExecContext &ctx_; const common::ObIArray &output_union_exprs_; int64_t batch_size_ = 1; uint64_t max_recursion_depth_; + int64_t identify_seq_offset_; }; } // end namespace sql } // end namespace oceanbase diff --git a/src/sql/engine/recursive_cte/ob_recursive_union_all_op.cpp b/src/sql/engine/recursive_cte/ob_recursive_union_all_op.cpp index 4f036ab13a..37151423f9 100644 --- a/src/sql/engine/recursive_cte/ob_recursive_union_all_op.cpp +++ b/src/sql/engine/recursive_cte/ob_recursive_union_all_op.cpp @@ -25,10 +25,7 @@ const int64_t ObRecursiveUnionAllSpec::UNUSED_POS = -2; int ObRecursiveUnionAllOp::inner_close() { int ret = OB_SUCCESS; - inner_data_.result_output_.reset(); - inner_data_.pump_operator_ = nullptr; - inner_data_.left_op_ = nullptr; - inner_data_.right_op_ = nullptr; + inner_data_.destroy(); return ret; } @@ -42,7 +39,8 @@ ObRecursiveUnionAllSpec::ObRecursiveUnionAllSpec(ObIAllocator &alloc, const ObPh cycle_expr_(nullptr), strategy_(ObRecursiveInnerDataOp::SearchStrategyType::BREADTH_FRIST), cycle_value_(nullptr), - cycle_default_value_(nullptr) + cycle_default_value_(nullptr), + identify_seq_offset_(-1) { } @@ -59,7 +57,8 @@ OB_SERIALIZE_MEMBER((ObRecursiveUnionAllSpec, ObOpSpec), cycle_expr_, strategy_, cycle_value_, - cycle_default_value_); + cycle_default_value_, + identify_seq_offset_); int ObRecursiveUnionAllOp::inner_rescan() { @@ -134,9 +133,10 @@ int ObRecursiveUnionAllOp::inner_get_next_batch(const int64_t max_row_cnt) { int ret = OB_SUCCESS; clear_evaluated_flag(); + int64_t batch_size = std::min(max_row_cnt, MY_SPEC.max_batch_size_); if (OB_FAIL(try_check_status())) { LOG_WARN("Failed to check physical plan status", K(ret)); - } else if (OB_FAIL(inner_data_.get_next_batch(max_row_cnt, brs_))) { + } else if (OB_FAIL(inner_data_.get_next_batch(batch_size, brs_))) { LOG_WARN("Failed to get next sort row from recursive inner data", K(ret)); } return ret; diff --git a/src/sql/engine/recursive_cte/ob_recursive_union_all_op.h b/src/sql/engine/recursive_cte/ob_recursive_union_all_op.h index c0426895a3..6f1302fc95 100644 --- a/src/sql/engine/recursive_cte/ob_recursive_union_all_op.h +++ b/src/sql/engine/recursive_cte/ob_recursive_union_all_op.h @@ -33,6 +33,7 @@ public: friend class ObRecursiveUnionAllOp; void set_search_pseudo_column(ObExpr *expr) { search_expr_ = expr; } void set_cycle_pseudo_column(ObExpr *expr) { cycle_expr_ = expr; } + void set_identify_seq_offset(int64_t offset) { identify_seq_offset_ = offset; } inline void set_search_strategy(ObRecursiveInnerDataOp::SearchStrategyType strategy) { strategy_ = strategy; @@ -68,6 +69,7 @@ protected: ObRecursiveInnerDataOp::SearchStrategyType strategy_; ObExpr *cycle_value_; ObExpr *cycle_default_value_; + int64_t identify_seq_offset_; }; class ObRecursiveUnionAllOp : public ObOperator @@ -79,7 +81,8 @@ public: MY_SPEC.get_left()->output_, MY_SPEC.sort_collations_, MY_SPEC.cycle_by_col_lists_, - MY_SPEC.output_union_exprs_) + MY_SPEC.output_union_exprs_, + MY_SPEC.identify_seq_offset_) { } ~ObRecursiveUnionAllOp() diff --git a/src/sql/engine/recursive_cte/ob_search_method_op.cpp b/src/sql/engine/recursive_cte/ob_search_method_op.cpp index 093fe596ba..7fa56c1d2d 100644 --- a/src/sql/engine/recursive_cte/ob_search_method_op.cpp +++ b/src/sql/engine/recursive_cte/ob_search_method_op.cpp @@ -129,9 +129,8 @@ int ObSearchMethodOp::is_same_row(ObChunkDatumStore::StoredRow &row_1st, const ObDatum *cells_1st = row_1st.cells(); const ObDatum *cells_2nd = row_2nd.cells(); int cmp_ret = 0; - if (OB_UNLIKELY(row_1st.cnt_ != row_2nd.cnt_ || 0 == row_1st.cnt_) - || OB_ISNULL(cells_1st) - || OB_ISNULL(cells_2nd)) { + if (OB_UNLIKELY(0 == row_1st.cnt_ || 0 == row_2nd.cnt_) + || OB_ISNULL(cells_1st) || OB_ISNULL(cells_2nd)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("Inconformity row schema", K(ret), K(row_1st), K(row_2nd)); } else if (cycle_by_columns_.empty()) { @@ -168,7 +167,7 @@ int ObSearchMethodOp::is_same_row(ObChunkDatumStore::StoredRow &row_1st, return ret; } -int ObDepthFisrtSearchOp::init() +int ObDepthFirstSearchOp::init() { int ret = OB_SUCCESS; if (OB_FAIL(hash_filter_rows_.create(CTE_SET_NUM))) { @@ -187,12 +186,12 @@ int ObDepthFisrtSearchOp::init() return ret; } -void ObDepthFisrtSearchOp::destroy() +void ObDepthFirstSearchOp::destroy() { search_stack_.reset(); } -int ObDepthFisrtSearchOp::reuse() +int ObDepthFirstSearchOp::reuse() { ObSearchMethodOp::reuse(); last_node_level_ = UINT64_MAX; @@ -200,7 +199,7 @@ int ObDepthFisrtSearchOp::reuse() return OB_SUCCESS; } -int ObDepthFisrtSearchOp::finish_add_row(bool sort) +int ObDepthFirstSearchOp::finish_add_row(bool sort) { int ret = OB_SUCCESS; if (sort && OB_FAIL(sort_input_rows())) { @@ -243,7 +242,7 @@ int ObDepthFisrtSearchOp::finish_add_row(bool sort) return ret; } -int ObDepthFisrtSearchOp::is_depth_cycle_node(ObTreeNode &node) +int ObDepthFirstSearchOp::is_depth_cycle_node(ObTreeNode &node) { int ret = OB_SUCCESS; ObCycleHash cycle_hash(node.stored_row_, &hash_col_idx_, &left_output_); @@ -266,7 +265,7 @@ int ObDepthFisrtSearchOp::is_depth_cycle_node(ObTreeNode &node) return ret; } -int ObDepthFisrtSearchOp::adjust_stack(ObTreeNode &node) +int ObDepthFirstSearchOp::adjust_stack(ObTreeNode &node) { int ret = OB_SUCCESS; last_node_level_ = node.tree_level_; @@ -314,25 +313,25 @@ int ObDepthFisrtSearchOp::adjust_stack(ObTreeNode &node) return ret; } -int ObDepthFisrtSearchOp::get_next_non_cycle_node(ObList &result_output, - ObTreeNode &node) +int ObDepthFirstSearchOp::get_next_nocycle_node(ObList &result_output, + ObTreeNode &nocycle_node) { int ret = OB_SUCCESS; - ObTreeNode non_cycle_node; + ObTreeNode node; bool got_row = false; while (OB_SUCC(ret) && !search_stack_.empty()) { - if (OB_FAIL(search_stack_.pop_front(non_cycle_node))) { + if (OB_FAIL(search_stack_.pop_front(node))) { LOG_WARN("Search stack pop back failed", K(ret)); - } else if (OB_FAIL(result_output.push_back(non_cycle_node))) { + } else if (OB_FAIL(result_output.push_back(node))) { LOG_WARN("Push back data to result output failed", K(ret)); - } else if (non_cycle_node.is_cycle_) { - if (OB_FAIL(recycle_rows_.push_back(non_cycle_node.stored_row_))) { + } else if (node.is_cycle_) { + if (OB_FAIL(recycle_rows_.push_back(node.stored_row_))) { LOG_WARN("Failed to push back rows", K(ret)); } } else { got_row = true; - node = non_cycle_node; + nocycle_node = node; break; } }// end while @@ -342,7 +341,12 @@ int ObDepthFisrtSearchOp::get_next_non_cycle_node(ObList &result_output, - ObTreeNode &node) + ObTreeNode &nocycle_node) { int ret = OB_SUCCESS; - ObTreeNode non_cycle_node; + ObTreeNode node; bool got_row = false; while(OB_SUCC(ret) && !search_queue_.empty()) { - if (OB_FAIL(search_queue_.pop_front(non_cycle_node))) { + if (OB_FAIL(search_queue_.pop_front(node))) { LOG_WARN("Get row from hold queue failed", K(ret)); - } else if (OB_FAIL(result_output.push_back(non_cycle_node))) { + } else if (OB_FAIL(result_output.push_back(node))) { LOG_WARN("Failed to push row to output ", K(ret)); - } else if (non_cycle_node.is_cycle_) { - if (OB_FAIL(recycle_rows_.push_back(non_cycle_node.stored_row_))) { + } else if (node.is_cycle_) { + if (OB_FAIL(recycle_rows_.push_back(node.stored_row_))) { LOG_WARN("Failed to push back rows", K(ret)); } } else { got_row = true; - node = non_cycle_node; + nocycle_node = node; break; } }// end while @@ -444,7 +448,7 @@ int ObBreadthFisrtSearchOp::get_next_non_cycle_node(ObListstored_row_)) { + ObChunkDatumStore::StoredRow* row_1st = row; + ObChunkDatumStore::StoredRow* row_2nd = node->stored_row_; + if (OB_FAIL(is_same_row(*row_1st, *row_2nd, is_cycle))) { + LOG_WARN("Failed to compare the two row", K(ret), KPC(row_1st), KPC(row_2nd)); + } else if (is_cycle) { + break; + } else { + node = node->parent_; + } + } + } + return ret; +} + +int ObBreadthFirstSearchBulkOp::get_next_nocycle_bulk( + ObList &result_output, + ObArray &fake_table_bulk_rows, + bool need_sort) +{ + int ret = OB_SUCCESS; + int rows_cnt = search_results_.count(); + + if (OB_SUCC(ret) && need_sort) { + if (rows_cnt > max_buffer_cnt_) { + if (OB_NOT_NULL(result_output_buffer_)) { + allocator_.free(result_output_buffer_); + result_output_buffer_ = NULL; + max_buffer_cnt_ = 0; + } + result_output_buffer_ = (ObTreeNode **)allocator_.alloc(sizeof(ObTreeNode *) * rows_cnt); + if (OB_ISNULL(result_output_buffer_)) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("Fail to alloc memory", K(ret)); + } else { + max_buffer_cnt_ = rows_cnt; + MEMSET(result_output_buffer_, 0, sizeof(ObTreeNode *) * rows_cnt); + } + } else { + MEMSET(result_output_buffer_, 0, sizeof(ObTreeNode *) * rows_cnt); + } + } + + ObTreeNode node; + ARRAY_FOREACH(search_results_, i) { + if (FALSE_IT(node = search_results_.at(i))) { + LOG_WARN("Get row from hold queue failed", K(ret)); + } else if (need_sort && FALSE_IT(result_output_buffer_[i] = &(search_results_.at(i)))) { + LOG_WARN("Failed to push row to output ", K(ret)); + } else if (!need_sort && OB_FAIL(result_output.push_back(node))) { + LOG_WARN("Failed to push row to output ", K(ret)); + } else if (node.is_cycle_) { + if (OB_FAIL(recycle_rows_.push_back(node.stored_row_))) { + LOG_WARN("Failed to push back rows", K(ret)); + } + } else if (OB_FAIL(fake_table_bulk_rows.push_back(node.stored_row_))) { + LOG_WARN("Failed to push back rows", K(ret)); + } + } + + if (OB_SUCC(ret) && need_sort) { + if (OB_FAIL(sort_result_output_nodes(rows_cnt))) { + LOG_WARN("Failed to sort row nodes", K(ret)); + } else { + for (int i = 0; OB_SUCC(ret) && i < rows_cnt; ++i) { + if (OB_ISNULL(result_output_buffer_[i])) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Unexpected buffer node", K(ret)); + } else if (OB_FAIL(result_output.push_back(*result_output_buffer_[i]))) { + LOG_WARN("Failed to push row to output ", K(ret)); + } + } + } + } + + search_results_.reuse(); + if (OB_SUCC(ret) && fake_table_bulk_rows.empty()) { + ret = OB_ITER_END; + } + return ret; +} + +int ObBreadthFirstSearchBulkOp::update_search_depth(uint64_t max_recursive_depth) +{ + int ret = OB_SUCCESS; + cur_recursion_depth_++; + if (!is_oracle_mode() && cur_recursion_depth_ > max_recursive_depth) { + ret = OB_ERR_CTE_MAX_RECURSION_DEPTH; + LOG_USER_ERROR(OB_ERR_CTE_MAX_RECURSION_DEPTH, cur_recursion_depth_); + LOG_WARN("Recursive query aborted after too many iterations", K(ret), K(cur_recursion_depth_)); + } + // warning for infinite recursion or large memory + if (OB_SUCC(ret) && cur_recursion_depth_ > 1000) { + if (0 == (cur_recursion_depth_ & (cur_recursion_depth_ - 1))) { + LOG_WARN("Attention !! Recursion depth too large", K(cur_recursion_depth_)); + } + } + return ret; +} + +int ObBreadthFirstSearchBulkOp::add_result_rows(bool left_branch, int64_t identify_seq_offset) +{ + int ret = OB_SUCCESS; + if (!is_oracle_mode()) { + free_last_iter_mem(); + ARRAY_FOREACH(input_rows_, i) { + ObTreeNode tree_node; + if (OB_ISNULL(input_rows_.at(i))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Unexpected input row", K(ret)); + } else if (FALSE_IT(tree_node.stored_row_ = input_rows_.at(i))) { + } else if (OB_FAIL(search_results_.push_back(tree_node))) { + LOG_WARN("Failed to push back result rows", K(ret)); + } else if (OB_FAIL(last_iter_input_rows_.push_back(input_rows_.at(i)))) { + LOG_WARN("Failed to push back last iter input rows"); + } else { + LOG_DEBUG("Result node", K(tree_node)); + } + } + } else if (is_oracle_mode() && left_branch) { + ARRAY_FOREACH(input_rows_, i) { + void* ptr = nullptr; + ObTreeNode tree_node; + ObBFSTreeNode* cur_node = nullptr; + ObChunkDatumStore::StoredRow *row = nullptr; + if (OB_ISNULL(row = input_rows_.at(i))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Unexpected input row", K(ret)); + } else if (FALSE_IT(tree_node.stored_row_ = row)) { + } else if (OB_ISNULL(ptr = allocator_.alloc(sizeof(ObBFSTreeNode)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("Alloc memory for row failed", "size", sizeof(ObBFSTreeNode), K(ret)); + } else { + cur_node = new(ptr) ObBFSTreeNode(); + cur_node->stored_row_ = row; + cur_node->parent_ = &bst_root_; + tree_node.is_cycle_ = false; + tree_node.in_bstree_node_ = cur_node; + } + if (OB_FAIL(ret)) { + } else if (OB_FAIL(search_results_.push_back(tree_node))) { + LOG_WARN("Failed to push back result rows", K(ret)); + } else if (OB_FAIL(last_iter_groups_.push_back(cur_node))) { + } else { + LOG_DEBUG("Result node", K(tree_node)); + } + } + } else if (is_oracle_mode() && !left_branch) { + ARRAY_FOREACH(input_rows_, i) { + uint64_t identify_seq = 0; + bool is_cycle = false; + void* ptr = nullptr; + ObTreeNode tree_node; + ObBFSTreeNode* cur_node = nullptr; + ObBFSTreeNode* parent_node = nullptr; + ObChunkDatumStore::StoredRow *row = nullptr; + if (OB_ISNULL(row = input_rows_.at(i))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Unexpected input row", K(ret)); + } else if (identify_seq_offset < 0 || identify_seq_offset >= row->cnt_) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Unexpected identify seq offset", K(ret), K(identify_seq_offset)); + } else { + const ObDatum *cells = row->cells(); + identify_seq = cells[identify_seq_offset].get_uint(); + tree_node.stored_row_ = input_rows_.at(i); + } + + if (OB_FAIL(ret)) { + } else if (identify_seq >= last_iter_groups_.count()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Unexpected identify sequence of input row", + K(identify_seq), K(last_iter_groups_.count()), K(ret)); + } else if (FALSE_IT(parent_node = last_iter_groups_[identify_seq])) { + } else if (OB_FAIL(is_breadth_cycle_node(parent_node, row, is_cycle))) { + LOG_WARN("Find cycle failed", K(ret)); + } else if (OB_ISNULL(ptr = allocator_.alloc(sizeof(ObBFSTreeNode)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("Alloc memory for row failed", "size", sizeof(ObBFSTreeNode), K(ret)); + } else { + cur_node = new(ptr) ObBFSTreeNode(); + cur_node->stored_row_ = row; + cur_node->parent_ = parent_node; + tree_node.is_cycle_ = is_cycle; + tree_node.in_bstree_node_ = cur_node; + } + + if (OB_FAIL(ret)) { + } else if (!is_cycle && OB_FAIL(cur_iter_groups_.push_back(cur_node))) { + LOG_WARN("Failed to push back cur iter groups", K(ret)); + } else if (OB_FAIL(search_results_.push_back(tree_node))) { + LOG_WARN("Failed to push back result rows", K(ret)); + } else { + LOG_DEBUG("Result node", K(tree_node)); + } + } + if (OB_SUCC(ret)) { + std::swap(cur_iter_groups_, last_iter_groups_); + cur_iter_groups_.reuse(); + } + } + + input_rows_.reuse(); + return ret; +} + +int ObBreadthFirstSearchBulkOp::sort_result_output_nodes(int64_t rows_cnt) +{ + int ret = OB_SUCCESS; + if (OB_LIKELY(rows_cnt > 0)) { + ObTreeNode *first_row = result_output_buffer_[0]; + ObNodeComparer comparer(sort_collations_, left_output_, &ret); + std::sort(first_row, first_row + rows_cnt, comparer); + if (OB_SUCCESS != ret) { + LOG_WARN("Failed to do sort", K(ret)); + } + } + return ret; +} + +// if mysql mode, free last iter memory +int ObBreadthFirstSearchBulkOp::add_row(const ObIArray &exprs, ObEvalCtx &eval_ctx) +{ + int ret = OB_SUCCESS; + if (!is_oracle_mode() && OB_ISNULL(malloc_allocator_)) { + if (OB_FAIL(init_mem_context())) { + LOG_WARN("Failed to init mem context", K(ret)); + } else if (OB_ISNULL(malloc_allocator_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Malloc allocator not init in mysql mode", K(ret)); + } + } + if (OB_SUCC(ret)) { + ObIAllocator *allocator = nullptr; + allocator = is_oracle_mode() ? &allocator_ : malloc_allocator_; + + ObChunkDatumStore::StoredRow *store_row = NULL; + if (input_rows_.empty() && 0 == input_rows_.get_capacity() + && OB_FAIL(input_rows_.reserve(INIT_ROW_COUNT))) { + LOG_WARN("Failed to pre allocate array", K(ret)); + } else if (OB_UNLIKELY(exprs.empty())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("exprs empty", K(ret)); + } else if (OB_FAIL(save_to_store_row(*allocator, exprs, eval_ctx, store_row))) { + LOG_WARN("save store row failed", K(ret)); + } else if (OB_ISNULL(store_row)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("stored_row is null", K(ret)); + } else if (OB_FAIL(input_rows_.push_back(store_row))) { + LOG_WARN("Push new row to result input error", K(ret)); + } + } + return ret; +} + +int ObBreadthFirstSearchBulkOp::init_mem_context() +{ + int ret = OB_SUCCESS; + lib::ContextParam param; + param.set_mem_attr(MTL_ID(), "CTESearchBulk", ObCtxIds::WORK_AREA); + if (OB_FAIL(CURRENT_CONTEXT->CREATE_CONTEXT(mem_context_, param))) { + LOG_WARN("create entity failed", K(ret)); + } else if (OB_ISNULL(mem_context_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("null memory entity returned", K(ret)); + } else { + malloc_allocator_ = &mem_context_->get_malloc_allocator(); + } + return ret; +} + +void ObBreadthFirstSearchBulkOp::free_last_iter_mem() +{ + if (OB_ISNULL(malloc_allocator_)) { + // do nothing + } else { + for (int64_t i = 0; i < last_iter_input_rows_.size(); ++i) { + if (OB_NOT_NULL(last_iter_input_rows_.at(i))) { + malloc_allocator_->free(last_iter_input_rows_.at(i)); + } + } + last_iter_input_rows_.reset(); + } +} + +int ObBreadthFirstSearchBulkOp::save_to_store_row(ObIAllocator &allocator, + const ObIArray &exprs, + ObEvalCtx &eval_ctx, + ObChunkDatumStore::StoredRow *&store_row) +{ + int ret = OB_SUCCESS; + int64_t row_size; + if (OB_FAIL(ObChunkDatumStore::row_copy_size(exprs, eval_ctx, row_size))) { + LOG_WARN("failed to calc copy size", K(ret)); + } else { + int64_t head_size = sizeof(ObChunkDatumStore::StoredRow); + int64_t buffer_len = row_size + head_size + ROW_EXTRA_SIZE; + char *buf; + if (OB_ISNULL(buf = reinterpret_cast(allocator.alloc(buffer_len)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("alloc buf failed", K(ret)); + } else if (OB_FAIL(ObChunkDatumStore::StoredRow::build(store_row, exprs, eval_ctx, buf, + buffer_len, + static_cast(ROW_EXTRA_SIZE)))) { + LOG_WARN("failed to build stored row", K(ret), K(buffer_len), K(row_size)); + } + } + return ret; +} diff --git a/src/sql/engine/recursive_cte/ob_search_method_op.h b/src/sql/engine/recursive_cte/ob_search_method_op.h index 4615a05c94..0f002cafeb 100644 --- a/src/sql/engine/recursive_cte/ob_search_method_op.h +++ b/src/sql/engine/recursive_cte/ob_search_method_op.h @@ -19,6 +19,7 @@ #include "share/datum/ob_datum_funcs.h" #include "sql/engine/basic/ob_chunk_datum_store.h" #include "sql/engine/sort/ob_sort_basic_info.h" +#include "lib/rc/context.h" namespace oceanbase { @@ -186,13 +187,10 @@ public: left_output_(left_output), last_node_level_(UINT64_MAX) {}; virtual ~ObSearchMethodOp() = default; - virtual int finish_add_row(bool sort) = 0; - virtual int get_next_non_cycle_node(common::ObList &result_output, ObTreeNode &node) = 0; virtual int empty() = 0; virtual int reuse(); - int add_row(const ObIArray &exprs, ObEvalCtx &eval_ctx); + virtual int add_row(const ObIArray &exprs, ObEvalCtx &eval_ctx); int sort_input_rows(); int sort_rownodes(common::ObArray &sort_array); @@ -215,33 +213,31 @@ protected: uint64_t last_node_level_; }; -class ObDepthFisrtSearchOp : public ObSearchMethodOp +class ObDepthFirstSearchOp : public ObSearchMethodOp { typedef common::hash::ObHashSet RowMap; public: - ObDepthFisrtSearchOp(common::ObIAllocator &allocator, const ExprFixedArray &left_output, + ObDepthFirstSearchOp(common::ObIAllocator &allocator, const ExprFixedArray &left_output, const common::ObIArray &sort_collations, const common::ObIArray &cycle_by_columns) : ObSearchMethodOp(allocator, left_output, sort_collations, cycle_by_columns), hash_filter_rows_(), hash_col_idx_(), current_search_path_(), search_stack_(allocator_) { } - virtual ~ObDepthFisrtSearchOp() { + virtual ~ObDepthFirstSearchOp() { if (hash_filter_rows_.created()) { hash_filter_rows_.destroy(); } } - - - virtual int finish_add_row(bool sort) override; virtual void destroy(); virtual int reuse() override; virtual int empty() override { return search_stack_.empty() && input_rows_.empty(); } int init(); + int finish_add_row(bool sort); int adjust_stack(ObTreeNode &node); - int get_next_non_cycle_node(common::ObList &result_output, - ObTreeNode &node) override; + int get_next_nocycle_node(common::ObList &result_output, + ObTreeNode &nocycle_node); private: // 检测一个node是不是环节点 @@ -268,26 +264,27 @@ private: * 由于需要判断环的存在,广度优先整个树都会被保存在内存中; * 能用深度优先的时候尽量不要使用广度优先。 */ -class ObBreadthFisrtSearchOp : public ObSearchMethodOp +class ObBreadthFirstSearchOp : public ObSearchMethodOp { public: - ObBreadthFisrtSearchOp(common::ObIAllocator &allocator, const ExprFixedArray &left_output, + ObBreadthFirstSearchOp(common::ObIAllocator &allocator, const ExprFixedArray &left_output, const common::ObIArray &sort_collations, const common::ObIArray &cycle_by_columns) : ObSearchMethodOp(allocator, left_output, sort_collations, cycle_by_columns), bst_root_(), current_parent_node_(&bst_root_), search_queue_(allocator), search_results_() { last_node_level_ = 0; } - virtual ~ObBreadthFisrtSearchOp() = default; + virtual ~ObBreadthFirstSearchOp() = default; - virtual int finish_add_row(bool sort) override; virtual int reuse() override; + virtual void destroy(); virtual int empty() override { return input_rows_.empty() && search_queue_.empty() && search_results_.empty(); } int add_result_rows(); - int get_next_non_cycle_node(common::ObList &result_output, - ObTreeNode &node) override; + int finish_add_row(bool sort); + int get_next_nocycle_node(common::ObList &result_output, + ObTreeNode &nocycle_node); int update_parent_node(ObTreeNode &node); private: @@ -311,6 +308,53 @@ private: common::ObArray search_results_; }; +class ObBreadthFirstSearchBulkOp : public ObSearchMethodOp +{ +public: + ObBreadthFirstSearchBulkOp(common::ObIAllocator &allocator, + const ExprFixedArray &left_output, + const common::ObIArray &sort_collations, + const common::ObIArray &cycle_by_columns) : + ObSearchMethodOp(allocator, left_output, sort_collations, cycle_by_columns), bst_root_(), + search_results_(), cur_recursion_depth_(0), cur_iter_groups_(), last_iter_groups_(), + max_buffer_cnt_(0), result_output_buffer_(nullptr), mem_context_(nullptr), + malloc_allocator_(nullptr) {} + virtual ~ObBreadthFirstSearchBulkOp() = default; + + virtual int reuse() override; + virtual void destroy(); + virtual int empty() override { return input_rows_.empty() && search_results_.empty(); } + + int add_result_rows(bool left_branch, int64_t identify_seq_offset); + int get_next_nocycle_bulk(ObList &result_output, + ObArray &fake_table_bulk_rows, + bool need_sort); + int update_search_depth(uint64_t max_recursive_depth); + int sort_result_output_nodes(int64_t rows_cnt); + int add_row(const ObIArray &exprs, ObEvalCtx &eval_ctx); + int init_mem_context(); + void free_last_iter_mem(); + +private: + int is_breadth_cycle_node(ObBFSTreeNode* node, ObChunkDatumStore::StoredRow *row, bool &is_cycle); + int save_to_store_row(ObIAllocator &allocator, const ObIArray &exprs, + ObEvalCtx &eval_ctx, ObChunkDatumStore::StoredRow *&store_row); + +private: + // breadth first search的root节点 + ObBFSTreeNode bst_root_; + common::ObArray search_results_; + uint64_t cur_recursion_depth_; + common::ObArray cur_iter_groups_; + common::ObArray last_iter_groups_; + int64_t max_buffer_cnt_; + ObTreeNode ** result_output_buffer_; + lib::MemoryContext mem_context_; + ObIAllocator *malloc_allocator_; + // for mysql mode, free last iter memory because not need check cycle + common::ObArray last_iter_input_rows_; +}; + } } diff --git a/src/sql/engine/table/ob_table_scan_op.cpp b/src/sql/engine/table/ob_table_scan_op.cpp index 135d8067bb..9c30b56077 100644 --- a/src/sql/engine/table/ob_table_scan_op.cpp +++ b/src/sql/engine/table/ob_table_scan_op.cpp @@ -964,6 +964,9 @@ OB_INLINE int ObTableScanOp::init_das_scan_rtdef(const ObDASScanCtDef &das_ctdef if (OB_SUCC(ret)) { if (OB_FAIL(tsc_ctdef.flashback_item_.set_flashback_query_info(eval_ctx_, das_rtdef))) { LOG_WARN("failed to set flashback query snapshot version", K(ret)); + } else if (share::is_oracle_mapping_real_virtual_table(MY_SPEC.ref_table_id_) + && das_ctdef.ref_table_id_ < OB_MIN_SYS_TABLE_INDEX_ID) { + //not index scan, keep need_scn_ } else if (MY_SPEC.ref_table_id_ != das_ctdef.ref_table_id_) { //only data table scan need to set row scn flag das_rtdef.need_scn_ = false; diff --git a/src/sql/executor/ob_remote_executor_processor.cpp b/src/sql/executor/ob_remote_executor_processor.cpp index d0391c50e5..1c831ee382 100644 --- a/src/sql/executor/ob_remote_executor_processor.cpp +++ b/src/sql/executor/ob_remote_executor_processor.cpp @@ -169,7 +169,7 @@ int ObRemoteBaseExecuteP::base_before_process(int64_t tenant_schema_version, exec_ctx_.set_mem_attr(ObMemAttr(tenant_id, ObModIds::OB_SQL_EXEC_CONTEXT, ObCtxIds::EXECUTE_CTX_ID)); ObPhysicalPlanCtx *plan_ctx = GET_PHY_PLAN_CTX(exec_ctx_); plan_ctx->set_rich_format(session_info->use_rich_format()); - + exec_ctx_.hide_session(); // don't show remote session in show processlist vt_ctx.session_ = session_info; vt_ctx.vt_iter_factory_ = &vt_iter_factory_; vt_ctx.schema_guard_ = &schema_guard_; @@ -273,6 +273,7 @@ int ObRemoteBaseExecuteP::sync_send_result(ObExecContext &exec_ctx, if (OB_ISNULL(spec = plan.get_root_op_spec()) || OB_ISNULL(kit = exec_ctx.get_kit_store().get_operator_kit(spec->id_)) || OB_ISNULL(se_op = kit->op_)) { + ret = OB_INVALID_ARGUMENT; LOG_WARN("root op spec is null", K(ret)); } } diff --git a/src/sql/executor/ob_task.cpp b/src/sql/executor/ob_task.cpp index 56e9567bf3..534d1b88cb 100644 --- a/src/sql/executor/ob_task.cpp +++ b/src/sql/executor/ob_task.cpp @@ -416,6 +416,15 @@ OB_DEF_DESERIALIZE(ObRemoteTask) ObSQLSessionInfo::LockGuard query_guard(session_info_->get_query_lock()); ObSQLSessionInfo::LockGuard data_guard(session_info_->get_thread_data_lock()); OB_UNIS_DECODE(*session_info_); + if (OB_FAIL(ret)) { + } else if (OB_FAIL(session_info_->set_session_state(QUERY_ACTIVE))) { + LOG_WARN("set session state failed", K(ret)); + } else if (OB_FAIL(session_info_->store_query_string( + ObString::make_string("REMOTE PLAN SCHEDULING")))) { + LOG_WARN("store query string failed", K(ret)); + } else { + session_info_->set_mysql_cmd(obmysql::COM_QUERY); + } OB_UNIS_DECODE(remote_sql_info_->is_batched_stmt_); } dependency_tables_.set_allocator(&(exec_ctx_->get_allocator())); diff --git a/src/sql/ob_sql_utils.cpp b/src/sql/ob_sql_utils.cpp index 54009f21b2..04845f88db 100644 --- a/src/sql/ob_sql_utils.cpp +++ b/src/sql/ob_sql_utils.cpp @@ -3939,6 +3939,9 @@ int ObVirtualTableResultConverter::get_all_columns_schema() } for (int64_t i = 0; OB_SUCC(ret) && i < output_column_ids_->count(); ++i) { const uint64_t column_id = output_column_ids_->at(i); + if (OB_HIDDEN_TRANS_VERSION_COLUMN_ID == column_id) { + continue; + } const ObColumnSchemaV2 *col_schema = table_schema_->get_column_schema(column_id); if (OB_ISNULL(col_schema)) { ret = OB_ERR_UNEXPECTED; diff --git a/src/sql/optimizer/ob_log_set.cpp b/src/sql/optimizer/ob_log_set.cpp index b5ec84af47..a83967a156 100644 --- a/src/sql/optimizer/ob_log_set.cpp +++ b/src/sql/optimizer/ob_log_set.cpp @@ -565,8 +565,21 @@ int ObLogSet::get_op_exprs(ObIArray &all_exprs) LOG_WARN("failed to get exprs", K(ret)); } else if (is_recursive_union_ && get_stmt()->is_select_stmt()) { const ObSelectStmt *select_stmt = static_cast(get_stmt()); + uint64_t min_cluster_version = GET_MIN_CLUSTER_VERSION(); // 伪列的产生,search/cycle的伪列都要求在recursive union算子产生 - if (OB_FAIL(append(all_exprs, select_stmt->get_cte_exprs()))) { + if (lib::is_oracle_mode() && is_breadth_search_ + && ((min_cluster_version >= CLUSTER_VERSION_4_2_2_0 + && min_cluster_version < CLUSTER_VERSION_4_3_0_0) + || (min_cluster_version >= CLUSTER_VERSION_4_3_1_0))) { + if (OB_ISNULL(identify_seq_expr_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("identify seq exor is null", K(ret)); + } else if (OB_FAIL(all_exprs.push_back(identify_seq_expr_))) { + LOG_WARN("failed to push back expr", K(ret)); + } + } + if (OB_FAIL(ret)) { + } else if (OB_FAIL(append(all_exprs, select_stmt->get_cte_exprs()))) { LOG_WARN("fail to add cte exprs", K(ret)); } else { /*do nothing*/ } } else { /*do nothing*/ } diff --git a/src/sql/optimizer/ob_log_set.h b/src/sql/optimizer/ob_log_set.h index 4ecfdfb5d4..e119ab08dd 100644 --- a/src/sql/optimizer/ob_log_set.h +++ b/src/sql/optimizer/ob_log_set.h @@ -32,7 +32,8 @@ public: set_algo_(INVALID_SET_ALGO), set_dist_algo_(DIST_INVALID_METHOD), set_op_(ObSelectStmt::NONE), - set_directions_() + set_directions_(), + identify_seq_expr_(nullptr) { } @@ -85,6 +86,8 @@ public: virtual uint64_t hash(uint64_t seed) const override; const common::ObIArray &get_search_ordering() { return search_ordering_; } const common::ObIArray &get_cycle_items() { return cycle_items_; } + ObRawExpr *get_identify_seq_expr() { return identify_seq_expr_; } + inline void set_identify_seq_expr(ObRawExpr *expr) { identify_seq_expr_ = expr; } virtual int compute_const_exprs() override; virtual int compute_equal_set() override; virtual int compute_fd_item_set() override; @@ -135,6 +138,8 @@ private: common::ObSEArray search_ordering_; common::ObSEArray cycle_items_; common::ObSEArray child_ndv_; + //for batch search recursive cte + ObRawExpr *identify_seq_expr_; }; } // end of namespace sql diff --git a/src/sql/optimizer/ob_log_table_scan.cpp b/src/sql/optimizer/ob_log_table_scan.cpp index 2c350794e4..61933a5fca 100644 --- a/src/sql/optimizer/ob_log_table_scan.cpp +++ b/src/sql/optimizer/ob_log_table_scan.cpp @@ -342,6 +342,25 @@ int ObLogTableScan::copy_filter_before_index_back() return ret; } + +int ObLogTableScan::find_nearest_rcte_op(ObLogSet *&log_set) +{ + int ret = OB_SUCCESS; + log_set = nullptr; + ObLogicalOperator *op = this->get_parent(); + while (OB_NOT_NULL(op)) { + if (log_op_def::LOG_SET == op->get_type()) { + ObLogSet *set_op = static_cast(op); + if (set_op->is_recursive_union()) { + log_set = set_op; + break; + } + } + op = op->get_parent(); + } + return ret; +} + int ObLogTableScan::generate_access_exprs() { int ret = OB_SUCCESS; @@ -394,6 +413,26 @@ int ObLogTableScan::generate_access_exprs() LOG_WARN("failed to append exprs", K(ret)); } else { /*do nothing*/ } + uint64_t min_cluster_version = GET_MIN_CLUSTER_VERSION(); + if (OB_SUCC(ret) && lib::is_oracle_mode() && get_contains_fake_cte() + && ((min_cluster_version >= CLUSTER_VERSION_4_2_2_0 + && min_cluster_version < CLUSTER_VERSION_4_3_0_0) + || (min_cluster_version >= CLUSTER_VERSION_4_3_1_0))) { + ObLogSet *rcte_op = nullptr; + if (OB_FAIL(find_nearest_rcte_op(rcte_op))) { + LOG_WARN("fail to find recursive cte op", K(ret)); + } else if (OB_ISNULL(rcte_op_ = rcte_op)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("recursive cte op is NULL", K(ret)); + } else if (!rcte_op_->is_breadth_search()) { + //search depth do nothing + } else if (OB_ISNULL(identify_seq_expr_ = rcte_op->get_identify_seq_expr())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("identify seq expr is NULL", K(ret)); + } else if (OB_FAIL(access_exprs_.push_back(identify_seq_expr_))) { + LOG_WARN("fail to add identify seq expr", K(ret)); + } + } for (int64_t i = 0; OB_SUCC(ret) && i < stmt->get_pseudo_column_like_exprs().count(); i++) { ObRawExpr *expr = stmt->get_pseudo_column_like_exprs().at(i); @@ -655,9 +694,7 @@ int ObLogTableScan::extract_virtual_gen_access_exprs( ret = OB_ERR_UNEXPECTED; LOG_WARN("expr is null", K(ret), K(expr)); } else if (T_ORA_ROWSCN == expr->get_expr_type()) { - ret = OB_NOT_SUPPORTED; - LOG_WARN("rowscan not supported", K(ret)); - LOG_USER_ERROR(OB_NOT_SUPPORTED, "rowscan not supported"); + // keep orign expr } else if (OB_ISNULL(mapping_expr = get_real_expr(expr))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("mapping expr is null", K(ret), KPC(expr)); @@ -864,8 +901,9 @@ int ObLogTableScan::add_mapping_columns_for_vt(ObIArray &access_expr LOG_DEBUG("debug mapping columns for virtual table", K(first_col_expr->get_table_id()), K(ref_table_id_)); if (share::is_oracle_mapping_real_virtual_table(ref_table_id_)) { for (int64_t i = 0; OB_SUCC(ret) && i < access_exprs.count(); ++i) { - ObRawExpr *real_expr = NULL; - if (OB_FAIL(add_mapping_column_for_vt(static_cast(access_exprs.at(i)), + ObRawExpr *real_expr = access_exprs.at(i); + if (T_ORA_ROWSCN != access_exprs.at(i)->get_expr_type() + && OB_FAIL(add_mapping_column_for_vt(static_cast(access_exprs.at(i)), real_expr))) { LOG_WARN("failed to add mapping column for vt", K(ret)); } else if (OB_FAIL(real_expr_map_.push_back( @@ -882,6 +920,7 @@ int ObLogTableScan::add_mapping_column_for_vt(ObColumnRefRawExpr *col_expr, ObRawExpr *&real_expr) { int ret = OB_SUCCESS; + real_expr = nullptr; int64_t mapping_table_id = share::schema::ObSchemaUtils::get_real_table_mappings_tid(ref_table_id_); if (OB_INVALID_ID == mapping_table_id) { ret = OB_ERR_UNEXPECTED; diff --git a/src/sql/optimizer/ob_log_table_scan.h b/src/sql/optimizer/ob_log_table_scan.h index 0b0b6909db..62d0394298 100644 --- a/src/sql/optimizer/ob_log_table_scan.h +++ b/src/sql/optimizer/ob_log_table_scan.h @@ -18,6 +18,7 @@ #include "sql/optimizer/ob_opt_est_cost.h" #include "sql/resolver/dml/ob_sql_hint.h" #include "sql/engine/px/p2p_datahub/ob_runtime_filter_query_range.h" +#include "sql/optimizer/ob_log_set.h" namespace oceanbase { @@ -75,6 +76,8 @@ public: tablet_id_type_(0), calc_part_id_expr_(NULL), trans_info_expr_(NULL), + rcte_op_(nullptr), + identify_seq_expr_(nullptr), global_index_back_table_partition_info_(NULL), has_index_scan_filter_(false), has_index_lookup_filter_(false), @@ -480,6 +483,9 @@ public: static int replace_gen_column(ObLogPlan *plan, ObRawExpr *part_expr, ObRawExpr *&new_part_expr); int extract_file_column_exprs_recursively(ObRawExpr *expr); virtual int get_card_without_filter(double &card) override; + inline ObLogSet *get_rcte_op() { return rcte_op_; } + inline ObRawExpr *get_identify_seq_expr() { return identify_seq_expr_; } + private: // member functions //called when index_back_ set int pick_out_query_range_exprs(); @@ -495,6 +501,7 @@ private: // member functions int add_mapping_columns_for_vt(ObIArray &access_exprs); int get_mbr_column_exprs(const uint64_t table_id, ObIArray &mbr_exprs); int allocate_lookup_trans_info_expr(); + int find_nearest_rcte_op(ObLogSet *&rcte_op); protected: // memeber variables // basic info uint64_t table_id_; //table id or alias table id @@ -592,6 +599,10 @@ protected: // memeber variables ObRawExpr *calc_part_id_expr_; ObRawExpr *trans_info_expr_; + //for batch search recursive cte + ObLogSet *rcte_op_; + ObRawExpr *identify_seq_expr_; + // begin for global index lookup ObTablePartitionInfo *global_index_back_table_partition_info_; bool has_index_scan_filter_; diff --git a/src/sql/optimizer/ob_logical_operator.cpp b/src/sql/optimizer/ob_logical_operator.cpp index 7815382c88..0d6517fc23 100644 --- a/src/sql/optimizer/ob_logical_operator.cpp +++ b/src/sql/optimizer/ob_logical_operator.cpp @@ -3693,8 +3693,26 @@ int ObLogicalOperator::set_plan_root_output_exprs() } else if (stmt->is_select_stmt()) { const ObSelectStmt *sel_stmt = static_cast(get_stmt()); bool is_unpivot = (LOG_UNPIVOT == type_ && sel_stmt->is_unpivot_select()); + uint64_t min_cluster_version = GET_MIN_CLUSTER_VERSION(); if (OB_FAIL(sel_stmt->get_select_exprs(output_exprs_, is_unpivot))) { LOG_WARN("failed to get select exprs", K(ret)); + } else if (((min_cluster_version >= CLUSTER_VERSION_4_2_2_0 + && min_cluster_version < CLUSTER_VERSION_4_3_0_0) + || (min_cluster_version >= CLUSTER_VERSION_4_3_1_0)) + && is_oracle_mode() && OB_NOT_NULL(this->parent_) + && LOG_SET == this->parent_->type_) { + ObLogSet *set_op = static_cast(this->parent_); + if (this == this->parent_->child_[1] && + set_op->is_recursive_union() && set_op->is_breadth_search()) { + ObRawExpr *identify_seq_expr = nullptr; + if (OB_FAIL(ObOptimizerUtil::allocate_identify_seq_expr(get_plan(), identify_seq_expr))) { + LOG_WARN("allocate identify seq expr failed", K(ret)); + } else if (OB_FAIL(output_exprs_.push_back(identify_seq_expr))) { + LOG_WARN("failed to push identify seq expr into output", K(ret)); + } else { + set_op->set_identify_seq_expr(identify_seq_expr); + } + } } else { /*do nothing*/ } } else if (stmt->is_returning()) { const ObDelUpdStmt *del_upd_stmt = static_cast(stmt); diff --git a/src/sql/optimizer/ob_optimizer_util.cpp b/src/sql/optimizer/ob_optimizer_util.cpp index 97b7205b7e..4b98096804 100644 --- a/src/sql/optimizer/ob_optimizer_util.cpp +++ b/src/sql/optimizer/ob_optimizer_util.cpp @@ -8436,6 +8436,37 @@ int ObOptimizerUtil::allocate_group_id_expr(ObLogPlan *log_plan, ObRawExpr *&gro return ret; } +int ObOptimizerUtil::allocate_identify_seq_expr(ObLogPlan *log_plan, ObRawExpr *&identify_seq_expr) +{ + int ret = OB_SUCCESS; + ObOptimizerContext *opt_ctx = NULL; + ObOpPseudoColumnRawExpr *tmp_identify_seq_expr = NULL; + identify_seq_expr = NULL; + if (OB_ISNULL(log_plan) || OB_ISNULL(opt_ctx = &log_plan->get_optimizer_context()) + || OB_ISNULL(opt_ctx->get_session_info())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Get unexpected null", K(ret), K(log_plan), K(opt_ctx)); + } else { + ObExprResType res_type; + res_type.set_type(ObUInt64Type); + res_type.set_accuracy(ObAccuracy::MAX_ACCURACY[ObUInt64Type]); + if (OB_FAIL(ObRawExprUtils::build_op_pseudo_column_expr(opt_ctx->get_expr_factory(), + T_PSEUDO_IDENTIFY_SEQ, + "IDENTIFY_SEQ", + res_type, + tmp_identify_seq_expr))) { + } else if (OB_ISNULL(tmp_identify_seq_expr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("identify seq expr is null", K(ret)); + } else if (OB_FAIL(tmp_identify_seq_expr->formalize(opt_ctx->get_session_info()))) { + LOG_WARN("identify seq expr formalize failed", K(ret)); + } else { + identify_seq_expr = tmp_identify_seq_expr; + } + } + return ret; +} + int ObOptimizerUtil::check_contribute_query_range(ObLogicalOperator *root, const ObIArray ¶ms, bool &is_valid) diff --git a/src/sql/optimizer/ob_optimizer_util.h b/src/sql/optimizer/ob_optimizer_util.h index 59036ee9cb..c76fb056b3 100644 --- a/src/sql/optimizer/ob_optimizer_util.h +++ b/src/sql/optimizer/ob_optimizer_util.h @@ -1395,6 +1395,8 @@ public: static int allocate_group_id_expr(ObLogPlan *log_plan, ObRawExpr *&group_id_expr); + static int allocate_identify_seq_expr(ObLogPlan *log_plan, ObRawExpr *&identify_seq_expr); + static int check_contribute_query_range(ObLogicalOperator *tsc, const ObIArray ¶ms, bool &is_valid); diff --git a/src/sql/resolver/cmd/ob_alter_system_resolver.cpp b/src/sql/resolver/cmd/ob_alter_system_resolver.cpp index 28de2c740a..a93a4ce757 100644 --- a/src/sql/resolver/cmd/ob_alter_system_resolver.cpp +++ b/src/sql/resolver/cmd/ob_alter_system_resolver.cpp @@ -717,6 +717,7 @@ int ObFreezeResolver::resolve_server_list_(ObFreezeStmt *freeze_stmt, ParseNode for (int64_t i = 0; OB_SUCC(ret) && i < opt_server_list->num_child_; ++i) { ParseNode *node = opt_server_list->children_[i]; if (OB_ISNULL(node)) { + ret = OB_INVALID_ARGUMENT; LOG_WARN("children of server_list should not be null"); } else { addr_str.assign_ptr(node->str_value_, static_cast(node->str_len_)); @@ -2503,11 +2504,24 @@ int ObSetTPResolver::resolve(const ParseNode &parse_tree) switch (action_node->type_) { case T_TP_NO: { // event no - stmt->get_rpc_arg().event_no_ = value->value_; - } break; - case T_TP_NAME: { - stmt->get_rpc_arg().event_name_.assign_ptr( + if (stmt->get_rpc_arg().event_name_ != "") { + ret = OB_NOT_SUPPORTED; + SQL_RESV_LOG(WARN, "Setting tp_no and tp_name simultaneously is not supported."); + LOG_USER_ERROR(OB_NOT_SUPPORTED, "Setting tp_no and tp_name simultaneously is"); + } else { + stmt->get_rpc_arg().event_no_ = value->value_; + } + break; + } + case T_TP_NAME: { // event name + if (stmt->get_rpc_arg().event_no_ != 0) { + ret = OB_NOT_SUPPORTED; + SQL_RESV_LOG(WARN, "Setting tp_no and tp_name simultaneously is not supported."); + LOG_USER_ERROR(OB_NOT_SUPPORTED, "Setting tp_no and tp_name simultaneously is"); + } else { + stmt->get_rpc_arg().event_name_.assign_ptr( value->str_value_, static_cast(value->str_len_)); + } break; } case T_OCCUR: { // occurrence @@ -3711,6 +3725,7 @@ int ObClearBalanceTaskResolver::resolve(const ParseNode &parse_tree) for (int64_t i = 0; OB_SUCC(ret) && i < tenants_node->num_child_; ++i) { ParseNode *node = tenants_node->children_[i]; if (OB_ISNULL(node)) { + ret = OB_INVALID_ARGUMENT; LOG_WARN("children of server_list should not be null"); } else { tenant_name.assign_ptr(node->str_value_, @@ -3741,6 +3756,7 @@ int ObClearBalanceTaskResolver::resolve(const ParseNode &parse_tree) for (int64_t i = 0; OB_SUCC(ret) && i < zone_node->num_child_; ++i) { ParseNode *node = zone_node->children_[i]; if (OB_ISNULL(node)) { + ret = OB_INVALID_ARGUMENT; LOG_WARN("children of server_list should not be null"); } else { parse_zone_name.assign_ptr(node->str_value_, diff --git a/src/sql/resolver/cmd/ob_show_resolver.cpp b/src/sql/resolver/cmd/ob_show_resolver.cpp index 38a005ff2d..d6281df8e5 100644 --- a/src/sql/resolver/cmd/ob_show_resolver.cpp +++ b/src/sql/resolver/cmd/ob_show_resolver.cpp @@ -2929,23 +2929,23 @@ DEFINE_SHOW_CLAUSE_SET(SHOW_GRANTS_USING_ROLES, NULL); DEFINE_SHOW_CLAUSE_SET(SHOW_PROCESSLIST, NULL, - "SELECT id AS `Id`, user AS `User`, host AS `Host`, db AS `db`, command AS `Command`, time AS `Time`, state AS `State`, info AS `Info` FROM %s.%s WHERE is_serving_tenant(svr_ip, svr_port, %ld)=1", - R"(SELECT "ID" AS "ID", "USER" AS "USER", "HOST" AS "HOST", "DB" AS "DB", "COMMAND" AS "COMMAND", "TIME" AS "TIME", "STATE" AS "STATE", "INFO" AS "INFO" FROM %s.%s WHERE IS_SERVING_TENANT(SVR_IP, SVR_PORT, %ld)=1)", + "SELECT id AS `Id`, user AS `User`, host AS `Host`, db AS `db`, command AS `Command`, cast(time as SIGNED) AS `Time`, state AS `State`, info AS `Info` FROM %s.%s WHERE is_serving_tenant(svr_ip, svr_port, %ld)=1", + R"(SELECT "ID" AS "ID", "USER" AS "USER", "HOST" AS "HOST", "DB" AS "DB", "COMMAND" AS "COMMAND", CAST("TIME" AS INT) AS "TIME", "STATE" AS "STATE", "INFO" AS "INFO" FROM %s.%s WHERE IS_SERVING_TENANT(SVR_IP, SVR_PORT, %ld)=1)", NULL); DEFINE_SHOW_CLAUSE_SET(SHOW_FULL_PROCESSLIST, NULL, - "SELECT id AS `Id`, user as `User`, tenant as `Tenant`, host AS `Host`, db AS `db`, command AS `Command`, time AS `Time`, state AS `State`, info AS `Info` , svr_ip AS `Ip`, sql_port AS `Port` FROM %s.%s WHERE is_serving_tenant(svr_ip, svr_port, %ld)=1", - R"(SELECT "ID" AS "ID", "USER" AS "USER", "TENANT" AS "TENANT", "HOST" AS "HOST", "DB" AS "DB", "COMMAND" AS "COMMAND", "TIME" AS "TIME", "STATE" AS "STATE", "INFO" AS "INFO" , "SVR_IP" AS "IP", "SQL_PORT" AS "PORT" FROM %s.%s WHERE IS_SERVING_TENANT(SVR_IP, SVR_PORT, %ld)=1)", + "SELECT id AS `Id`, user as `User`, tenant as `Tenant`, host AS `Host`, db AS `db`, command AS `Command`, cast(time as SIGNED) AS `Time`, state AS `State`, info AS `Info` , svr_ip AS `Ip`, sql_port AS `Port` FROM %s.%s WHERE is_serving_tenant(svr_ip, svr_port, %ld)=1", + R"(SELECT "ID" AS "ID", "USER" AS "USER", "TENANT" AS "TENANT", "HOST" AS "HOST", "DB" AS "DB", "COMMAND" AS "COMMAND", CAST("TIME" AS INT) AS "TIME", "STATE" AS "STATE", "INFO" AS "INFO" , "SVR_IP" AS "IP", "SQL_PORT" AS "PORT" FROM %s.%s WHERE IS_SERVING_TENANT(SVR_IP, SVR_PORT, %ld)=1)", NULL); DEFINE_SHOW_CLAUSE_SET(SHOW_SYS_PROCESSLIST, NULL, - "SELECT id AS `Id`, user AS `User`, host AS `Host`, db AS `db`, command AS `Command`, time AS `Time`, state AS `State`, info AS `Info` FROM %s.%s", - R"(SELECT "ID" AS "ID", "USER" AS "USER", "HOST" AS "HOST", "DB" AS "DB", "COMMAND" AS "COMMAND", "TIME" AS "TIME", "STATE" AS "STATE", "INFO" AS "INFO" FROM %s.%s)", + "SELECT id AS `Id`, user AS `User`, host AS `Host`, db AS `db`, command AS `Command`, cast(time as SIGNED) AS `Time`, state AS `State`, info AS `Info` FROM %s.%s", + R"(SELECT "ID" AS "ID", "USER" AS "USER", "HOST" AS "HOST", "DB" AS "DB", "COMMAND" AS "COMMAND", CAST("TIME" AS INT) AS "TIME", "STATE" AS "STATE", "INFO" AS "INFO" FROM %s.%s)", NULL); DEFINE_SHOW_CLAUSE_SET(SHOW_SYS_FULL_PROCESSLIST, NULL, - "SELECT id AS `Id`, user as `User`, tenant as `Tenant`, host AS `Host`, db AS `db`, command AS `Command`, time AS `Time`, state AS `State`, info AS `Info` , svr_ip AS `Ip`, sql_port AS `Port`, proxy_sessid AS `Proxy_sessid` FROM %s.%s", - R"(SELECT "ID" AS "ID", "USER" AS "USER", "TENANT" AS "TENANT", "HOST" AS "HOST", "DB" AS "DB", "COMMAND" AS "COMMAND", "TIME" AS "TIME", "STATE" AS "STATE", "INFO" AS "INFO" , "SVR_IP" AS "IP", "SQL_PORT" AS "PORT", "PROXY_SESSID" AS "PROXY_SESSID" FROM %s.%s)", + "SELECT id AS `Id`, user as `User`, tenant as `Tenant`, host AS `Host`, db AS `db`, command AS `Command`, cast(time as SIGNED) AS `Time`, state AS `State`, info AS `Info` , svr_ip AS `Ip`, sql_port AS `Port`, proxy_sessid AS `Proxy_sessid` FROM %s.%s", + R"(SELECT "ID" AS "ID", "USER" AS "USER", "TENANT" AS "TENANT", "HOST" AS "HOST", "DB" AS "DB", "COMMAND" AS "COMMAND", CAST("TIME" AS INT) AS "TIME", "STATE" AS "STATE", "INFO" AS "INFO" , "SVR_IP" AS "IP", "SQL_PORT" AS "PORT", "PROXY_SESSID" AS "PROXY_SESSID" FROM %s.%s)", NULL); DEFINE_SHOW_CLAUSE_SET(SHOW_TABLE_STATUS, NULL, diff --git a/src/sql/resolver/expr/ob_raw_expr.cpp b/src/sql/resolver/expr/ob_raw_expr.cpp index b07e4b5a43..919db53ea3 100644 --- a/src/sql/resolver/expr/ob_raw_expr.cpp +++ b/src/sql/resolver/expr/ob_raw_expr.cpp @@ -5988,6 +5988,7 @@ int ObPseudoColumnRawExpr::get_name_internal(char *buf, const int64_t buf_len, i case T_PSEUDO_GROUP_ID: case T_PSEUDO_STMT_ID: case T_PSEUDO_GROUP_PARAM: + case T_PSEUDO_IDENTIFY_SEQ: if (OB_FAIL(databuff_print_obj(buf, buf_len, pos, expr_name_))) { LOG_WARN("failed to print expr name", K(ret)); } diff --git a/src/sql/session/ob_basic_session_info.cpp b/src/sql/session/ob_basic_session_info.cpp index 23fd881838..80100cdcc5 100644 --- a/src/sql/session/ob_basic_session_info.cpp +++ b/src/sql/session/ob_basic_session_info.cpp @@ -477,7 +477,8 @@ int ObBasicSessionInfo::reset_timezone() } ObObj tmp_obj2; - if (OB_FAIL(get_sys_variable(SYS_VAR_ERROR_ON_OVERLAP_TIME, tmp_obj2))) { + if (OB_FAIL(ret)) { + } else if (OB_FAIL(get_sys_variable(SYS_VAR_ERROR_ON_OVERLAP_TIME, tmp_obj2))) { LOG_WARN("get sys var failed", K(ret)); } else if (OB_FAIL(process_session_overlap_time_value(tmp_obj2))) { LOG_WARN("process session overlap time value failed", K(ret), K(tmp_obj2)); @@ -5893,8 +5894,13 @@ int ObBasicSessionInfo::set_session_state_(ObSQLSessionState state) LOG_WARN("session state is unknown", K(ret), K(sessid_), K(proxy_sessid_), K(state)); } } else { + bool is_state_change = is_active_state_change(thread_data_.state_, state); thread_data_.state_ = state; - thread_data_.cur_state_start_time_ = ::oceanbase::common::ObClockGenerator::getClock(); + int64_t current_time = ::oceanbase::common::ObTimeUtility::current_time(); + if (is_state_change) { + thread_data_.retry_active_time_ += (current_time - thread_data_.cur_state_start_time_); + } + thread_data_.cur_state_start_time_ = current_time; } return ret; } @@ -5941,6 +5947,7 @@ int ObBasicSessionInfo::set_session_active(const ObString &sql, thread_data_.cur_query_start_time_ = query_receive_ts; thread_data_.mysql_cmd_ = cmd; thread_data_.last_active_time_ = last_active_time_ts; + thread_data_.is_request_end_ = false; ObActiveSessionGuard::setup_ash(ash_stat_); } return ret; @@ -5957,6 +5964,7 @@ int ObBasicSessionInfo::set_session_active(const ObString &label, LOG_WARN("fail to set session state", K(ret)); } else { thread_data_.mysql_cmd_ = cmd; + thread_data_.is_request_end_ = false; ObActiveSessionGuard::setup_ash(ash_stat_); } return ret; diff --git a/src/sql/session/ob_basic_session_info.h b/src/sql/session/ob_basic_session_info.h index ec74707e60..54296cc9a8 100644 --- a/src/sql/session/ob_basic_session_info.h +++ b/src/sql/session/ob_basic_session_info.h @@ -855,6 +855,18 @@ public: bool get_is_in_retry_for_dup_tbl() { return SESS_IN_RETRY_FOR_DUP_TBL == thread_data_.is_in_retry_; } + void set_retry_active_time(int64_t time) + { + LockGuard lock_guard(thread_data_mutex_); + thread_data_.retry_active_time_ = time; + } + int64_t get_retry_active_time() const { return thread_data_.retry_active_time_; } + void set_is_request_end(bool is_request_end) + { + LockGuard lock_guard(thread_data_mutex_); + thread_data_.is_request_end_ = is_request_end; + } + bool get_is_request_end() const { return thread_data_.is_request_end_; } obmysql::ObMySQLCmd get_mysql_cmd() const { return thread_data_.mysql_cmd_; } char const *get_mysql_cmd_str() const { return obmysql::get_mysql_cmd_str(thread_data_.mysql_cmd_); } int store_query_string(const common::ObString &stmt); @@ -1304,6 +1316,14 @@ public: int get_sync_sys_vars_size(common::ObIArray &sys_var_delta_ids, int64_t &len) const; bool is_sync_sys_var(share::ObSysVarClassType sys_var_id) const; bool is_exist_error_sync_var(share::ObSysVarClassType sys_var_id) const; + // record session state from active to anothe state. for record total_cpu_time. + bool is_active_state_change(ObSQLSessionState last_state, ObSQLSessionState curr_state) { + if (last_state == QUERY_ACTIVE && curr_state != QUERY_ACTIVE) { + return true; + } else { + return false; + } + } // nested session and sql execute for foreign key. bool is_nested_session() const { return nested_count_ > 0; } @@ -1495,7 +1515,9 @@ protected: client_addr_port_(0), is_mark_killed_(false), proxy_user_name_(), - proxy_host_name_() + proxy_host_name_(), + retry_active_time_(0), + is_request_end_(true) { CHAR_CARRAY_INIT(database_name_); } @@ -1536,6 +1558,8 @@ protected: is_mark_killed_ = false; proxy_user_name_.reset(); proxy_host_name_.reset(); + retry_active_time_ = 0; + is_request_end_ = true; } ~MultiThreadData () { @@ -1573,6 +1597,13 @@ protected: bool is_mark_killed_; // Mark the current session as delayed kill common::ObString proxy_user_name_; common::ObString proxy_host_name_; + // In the retry scenario, record the cumulative active time except the current state, + // and use it to count the CPU time. For example, 1. The current request status is Sleep, + // waiting for retry, it will record the cumulative time of Active during previous execution. + // 2. The current request status is Active, and it is retrying. It will ignore the active time + // of the current status and record the cumulative time of Active during previous execution. + int64_t retry_active_time_; + bool is_request_end_; // This flag is used to distinguish whether the current request is over. }; public: diff --git a/tools/deploy/mysql_test/r/mysql/information_schema.result b/tools/deploy/mysql_test/r/mysql/information_schema.result index 80c1fed58b..3e4e20849e 100644 --- a/tools/deploy/mysql_test/r/mysql/information_schema.result +++ b/tools/deploy/mysql_test/r/mysql/information_schema.result @@ -390,6 +390,7 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | GV$OB_RPC_INCOMING | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | GV$OB_RPC_OUTGOING | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | GV$OB_SERVER_SCHEMA_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | oceanbase | GV$OB_SESSION | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | GV$OB_SQL_AUDIT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | GV$OB_SQL_PLAN | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | GV$OB_SQL_WORKAREA_MEMORY_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | @@ -399,6 +400,7 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | GV$OB_TABLET_STATS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | GV$OB_TENANT_MEMORY | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | GV$OB_THREAD | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | oceanbase | GV$OB_TRACEPOINT_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | GV$OB_TRANSACTION_PARTICIPANTS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | GV$OB_TRANSACTION_SCHEDULERS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | GV$OB_UNITS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | @@ -456,6 +458,7 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | V$OB_RPC_INCOMING | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | V$OB_RPC_OUTGOING | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | V$OB_SERVER_SCHEMA_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | oceanbase | V$OB_SESSION | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | V$OB_SQL_AUDIT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | V$OB_SQL_PLAN | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | V$OB_SQL_WORKAREA_MEMORY_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | @@ -466,6 +469,7 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | V$OB_TENANT_MEMORY | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | V$OB_THREAD | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | V$OB_TIMESTAMP_SERVICE | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | oceanbase | V$OB_TRACEPOINT_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | V$OB_TRANSACTION_PARTICIPANTS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | V$OB_TRANSACTION_SCHEDULERS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | V$OB_UNITS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | @@ -795,6 +799,7 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | __all_virtual_server_compaction_progress | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_virtual_server_schema_info | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_virtual_session_event | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | oceanbase | __all_virtual_session_info | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_virtual_session_wait | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_virtual_session_wait_history | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_virtual_sesstat | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | @@ -837,6 +842,7 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | __all_virtual_thread | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_virtual_timestamp_service | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_virtual_trace_span_info | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | oceanbase | __all_virtual_tracepoint_info | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_virtual_trans_lock_stat | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_virtual_trans_scheduler | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_virtual_trans_stat | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | @@ -1803,6 +1809,7 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | GV$OB_RPC_INCOMING | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | GV$OB_RPC_OUTGOING | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | GV$OB_SERVER_SCHEMA_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | oceanbase | GV$OB_SESSION | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | GV$OB_SQL_AUDIT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | GV$OB_SQL_PLAN | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | GV$OB_SQL_WORKAREA_MEMORY_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | @@ -1812,6 +1819,7 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | GV$OB_TABLET_STATS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | GV$OB_TENANT_MEMORY | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | GV$OB_THREAD | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | oceanbase | GV$OB_TRACEPOINT_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | GV$OB_TRANSACTION_PARTICIPANTS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | GV$OB_TRANSACTION_SCHEDULERS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | GV$OB_UNITS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | @@ -1869,6 +1877,7 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | V$OB_RPC_INCOMING | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | V$OB_RPC_OUTGOING | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | V$OB_SERVER_SCHEMA_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | oceanbase | V$OB_SESSION | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | V$OB_SQL_AUDIT | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | V$OB_SQL_PLAN | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | V$OB_SQL_WORKAREA_MEMORY_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | @@ -1879,6 +1888,7 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | V$OB_TENANT_MEMORY | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | V$OB_THREAD | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | V$OB_TIMESTAMP_SERVICE | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | oceanbase | V$OB_TRACEPOINT_INFO | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | V$OB_TRANSACTION_PARTICIPANTS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | V$OB_TRANSACTION_SCHEDULERS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | V$OB_UNITS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | @@ -2208,6 +2218,7 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | __all_virtual_server_compaction_progress | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_virtual_server_schema_info | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_virtual_session_event | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | oceanbase | __all_virtual_session_info | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_virtual_session_wait | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_virtual_session_wait_history | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_virtual_sesstat | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | @@ -2249,6 +2260,7 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | __all_virtual_tenant_user_failed_login_stat | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_virtual_thread | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_virtual_timestamp_service | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | oceanbase | __all_virtual_tracepoint_info | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_virtual_trace_span_info | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_virtual_transaction_checkpoint | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_virtual_transaction_freeze_checkpoint | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | diff --git a/tools/deploy/mysql_test/test_suite/information_schema/r/mysql/information_schema_desc.result b/tools/deploy/mysql_test/test_suite/information_schema/r/mysql/information_schema_desc.result index cb921c5e62..2ad3680ac5 100644 --- a/tools/deploy/mysql_test/test_suite/information_schema/r/mysql/information_schema_desc.result +++ b/tools/deploy/mysql_test/test_suite/information_schema/r/mysql/information_schema_desc.result @@ -97,7 +97,7 @@ USER varchar(32) NO HOST varchar(67) YES NULL DB varchar(128) YES NULL COMMAND varchar(4096) NO -TIME bigint(20) NO +TIME bigint(21) NO NULL STATE varchar(128) YES NULL INFO varchar(262143) YES NULL desc schema_privileges; @@ -251,7 +251,7 @@ View Create View character_set_client collation_connection PARTITIONS CREATE VIEW `PARTITIONS` AS SELECT CAST('def' as CHAR(4096)) AS TABLE_CATALOG, DB.DATABASE_NAME collate utf8mb4_name_case AS TABLE_SCHEMA, T.TABLE_NAME collate utf8mb4_name_case AS TABLE_NAME, P.PART_NAME AS PARTITION_NAME, SP.SUB_PART_NAME AS SUBPARTITION_NAME, CAST(PART_POSITION AS UNSIGNED) AS PARTITION_ORDINAL_POSITION, CAST(SUB_PART_POSITION AS UNSIGNED) AS SUBPARTITION_ORDINAL_POSITION, CAST(CASE WHEN T.PART_LEVEL = 0 THEN NULL ELSE (CASE T.PART_FUNC_TYPE WHEN 0 THEN 'HASH' WHEN 1 THEN 'KEY' WHEN 2 THEN 'KEY' WHEN 3 THEN 'RANGE' WHEN 4 THEN 'RANGE COLUMNS' WHEN 5 THEN 'LIST' WHEN 6 THEN 'LIST COLUMNS' WHEN 7 THEN 'RANGE' END) END AS CHAR(13)) PARTITION_METHOD, CAST(CASE WHEN (T.PART_LEVEL = 0 OR T.PART_LEVEL = 1) THEN NULL ELSE (CASE T.SUB_PART_FUNC_TYPE WHEN 0 THEN 'HASH' WHEN 1 THEN 'KEY' WHEN 2 THEN 'KEY' WHEN 3 THEN 'RANGE' WHEN 4 THEN 'RANGE COLUMNS' WHEN 5 THEN 'LIST' WHEN 6 THEN 'LIST COLUMNS' WHEN 7 THEN 'RANGE' END) END AS CHAR(13)) SUBPARTITION_METHOD, CAST(CASE WHEN (T.PART_LEVEL = 0) THEN NULL ELSE T.PART_FUNC_EXPR END AS CHAR(2048)) PARTITION_EXPRESSION, CAST(CASE WHEN (T.PART_LEVEL = 0 OR T.PART_LEVEL = 1) THEN NULL ELSE T.SUB_PART_FUNC_EXPR END AS CHAR(2048)) SUBPARTITION_EXPRESSION, CAST(CASE WHEN (T.PART_LEVEL = 0) THEN NULL ELSE (CASE WHEN LENGTH(P.HIGH_BOUND_VAL) > 0 THEN P.HIGH_BOUND_VAL ELSE P.LIST_VAL END) END AS CHAR(4096)) AS PARTITION_DESCRIPTION, CAST(CASE WHEN (T.PART_LEVEL = 0 OR T.PART_LEVEL = 1) THEN NULL ELSE (CASE WHEN LENGTH(SP.HIGH_BOUND_VAL) > 0 THEN SP.HIGH_BOUND_VAL ELSE SP.LIST_VAL END) END AS CHAR(4096)) AS SUBPARTITION_DESCRIPTION, CAST(TS.ROW_CNT AS UNSIGNED) AS TABLE_ROWS, CAST(TS.AVG_ROW_LEN AS UNSIGNED) AS AVG_ROW_LENGTH, CAST(NULL AS UNSIGNED) AS DATA_LENGTH, CAST(NULL AS UNSIGNED) AS MAX_DATA_LENGTH, CAST(NULL AS UNSIGNED) AS INDEX_LENGTH, CAST(NULL AS UNSIGNED) AS DATA_FREE, CASE T.PART_LEVEL WHEN 0 THEN T.GMT_CREATE WHEN 1 THEN P.GMT_CREATE WHEN 2 THEN SP.GMT_CREATE END AS CREATE_TIME, CAST(NULL AS DATETIME) AS UPDATE_TIME, CAST(NULL AS DATETIME) AS CHECK_TIME, CAST(NULL AS SIGNED) AS CHECKSUM, CAST(CASE T.PART_LEVEL WHEN 0 THEN NULL WHEN 1 THEN P.COMMENT WHEN 2 THEN SP.COMMENT END AS CHAR(1024)) AS PARTITION_COMMENT, CAST('default' AS CHAR(256)) NODEGROUP, CAST(TP.TABLESPACE_NAME AS CHAR(268)) AS TABLESPACE_NAME FROM OCEANBASE.__ALL_TABLE T JOIN OCEANBASE.__ALL_DATABASE DB ON T.DATABASE_ID = DB.DATABASE_ID AND T.TENANT_ID = DB.TENANT_ID AND T.TABLE_MODE >> 12 & 15 in (0,1) LEFT JOIN ( SELECT TENANT_ID, TABLE_ID, PART_ID, PART_NAME, HIGH_BOUND_VAL, LIST_VAL, TABLESPACE_ID, GMT_CREATE, COMMENT, ROW_NUMBER() OVER(PARTITION BY TENANT_ID,TABLE_ID ORDER BY PART_IDX) AS PART_POSITION FROM OCEANBASE.__ALL_PART ) P ON T.TABLE_ID = P.TABLE_ID AND T.TENANT_ID = P.TENANT_ID LEFT JOIN ( SELECT TENANT_ID, TABLE_ID, PART_ID, SUB_PART_ID, SUB_PART_NAME, HIGH_BOUND_VAL, LIST_VAL, TABLESPACE_ID, GMT_CREATE, COMMENT, ROW_NUMBER() OVER(PARTITION BY TENANT_ID,TABLE_ID,PART_ID ORDER BY SUB_PART_IDX) AS SUB_PART_POSITION FROM OCEANBASE.__ALL_SUB_PART ) SP ON T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID AND T.TENANT_ID = SP.TENANT_ID LEFT JOIN OCEANBASE.__ALL_TENANT_TABLESPACE TP ON TP.TABLESPACE_ID = IFNULL(SP.TABLESPACE_ID, P.TABLESPACE_ID) AND TP.TENANT_ID = T.TENANT_ID LEFT JOIN OCEANBASE.__ALL_TABLE_STAT TS ON T.TENANT_ID = TS.TENANT_ID AND TS.TABLE_ID = T.TABLE_ID AND TS.PARTITION_ID = CASE T.PART_LEVEL WHEN 0 THEN T.TABLE_ID WHEN 1 THEN P.PART_ID WHEN 2 THEN SP.SUB_PART_ID END WHERE T.TABLE_TYPE IN (3,6,8,9,14,15) utf8mb4 utf8mb4_general_ci show create table processlist; View Create View character_set_client collation_connection -PROCESSLIST CREATE VIEW `PROCESSLIST` AS SELECT id AS ID, user AS USER, concat(user_client_ip, ':', user_client_port) AS HOST, db AS DB, command AS COMMAND, time AS TIME, state AS STATE, info AS INFO FROM oceanbase.__all_virtual_processlist WHERE is_serving_tenant(svr_ip, svr_port, effective_tenant_id()) utf8mb4 utf8mb4_general_ci +PROCESSLIST CREATE VIEW `PROCESSLIST` AS SELECT id AS ID, user AS USER, concat(user_client_ip, ':', user_client_port) AS HOST, db AS DB, command AS COMMAND, cast(time as SIGNED) AS TIME, state AS STATE, info AS INFO FROM oceanbase.__all_virtual_processlist WHERE is_serving_tenant(svr_ip, svr_port, effective_tenant_id()) utf8mb4 utf8mb4_general_ci show create table schema_privileges; View Create View character_set_client collation_connection SCHEMA_PRIVILEGES CREATE VIEW `SCHEMA_PRIVILEGES` AS SELECT CAST(CONCAT('''', V.USER_NAME, '''', '@', '''', V.HOST, '''') AS CHAR(81)) AS GRANTEE , CAST('def' AS CHAR(512)) AS TABLE_CATALOG , CAST(V.DATABASE_NAME AS CHAR(128)) collate utf8mb4_name_case AS TABLE_SCHEMA , CAST(V.PRIVILEGE_TYPE AS CHAR(64)) AS PRIVILEGE_TYPE , CAST(V.IS_GRANTABLE AS CHAR(3)) AS IS_GRANTABLE FROM (SELECT DP.DATABASE_NAME DATABASE_NAME, U.USER_NAME AS USER_NAME, U.HOST AS HOST, CASE WHEN V1.C1 = 1 AND DP.PRIV_ALTER = 1 THEN 'ALTER' WHEN V1.C1 = 2 AND DP.PRIV_CREATE = 1 THEN 'CREATE' WHEN V1.C1 = 4 AND DP.PRIV_DELETE = 1 THEN 'DELETE' WHEN V1.C1 = 5 AND DP.PRIV_DROP = 1 THEN 'DROP' WHEN V1.C1 = 7 AND DP.PRIV_INSERT = 1 THEN 'INSERT' WHEN V1.C1 = 8 AND DP.PRIV_UPDATE = 1 THEN 'UPDATE' WHEN V1.C1 = 9 AND DP.PRIV_SELECT = 1 THEN 'SELECT' WHEN V1.C1 = 10 AND DP.PRIV_INDEX = 1 THEN 'INDEX' WHEN V1.C1 = 11 AND DP.PRIV_CREATE_VIEW = 1 THEN 'CREATE VIEW' WHEN V1.C1 = 12 AND DP.PRIV_SHOW_VIEW = 1 THEN 'SHOW VIEW' WHEN V1.C1 = 13 AND (U.PRIV_OTHERS & (1 << 0)) != 0 THEN 'EXECUTE' WHEN V1.C1 = 14 AND (U.PRIV_OTHERS & (1 << 1)) != 0 THEN 'ALTER ROUTINE' WHEN V1.C1 = 15 AND (U.PRIV_OTHERS & (1 << 2)) != 0 THEN 'CREATE ROUTINE' ELSE NULL END PRIVILEGE_TYPE , CASE WHEN DP.PRIV_GRANT_OPTION = 1 THEN 'YES' WHEN DP.PRIV_GRANT_OPTION = 0 THEN 'NO' END IS_GRANTABLE FROM oceanbase.__all_database_privilege DP, oceanbase.__all_user U, (SELECT 1 AS C1 UNION ALL SELECT 2 AS C1 UNION ALL SELECT 4 AS C1 UNION ALL SELECT 5 AS C1 UNION ALL SELECT 7 AS C1 UNION ALL SELECT 8 AS C1 UNION ALL SELECT 9 AS C1 UNION ALL SELECT 10 AS C1 UNION ALL SELECT 11 AS C1 UNION ALL SELECT 12 AS C1 UNION ALL SELECT 13 AS C1 UNION ALL SELECT 14 AS C1 UNION ALL SELECT 15 AS C1) V1, (SELECT USER_ID FROM oceanbase.__all_user WHERE TENANT_ID= 0 AND CONCAT(USER_NAME, '@', HOST) = CURRENT_USER()) CURR LEFT JOIN (SELECT USER_ID FROM oceanbase.__all_database_privilege WHERE TENANT_ID = 0 AND DATABASE_NAME = 'mysql' AND PRIV_SELECT = 1) DB ON CURR.USER_ID = DB.USER_ID WHERE DP.TENANT_ID = 0 AND DP.TENANT_ID = U.TENANT_ID AND DP.USER_ID = U.USER_ID AND DP.DATABASE_NAME != '__recyclebin' AND DP.DATABASE_NAME != '__public' AND DP.DATABASE_NAME != 'SYS' AND DP.DATABASE_NAME != 'LBACSYS' AND DP.DATABASE_NAME != 'ORAAUDITOR' AND (DB.USER_ID IS NOT NULL OR 512 & CURRENT_USER_PRIV() = 512 OR DP.USER_ID = CURR.USER_ID)) V WHERE V.PRIVILEGE_TYPE IS NOT NULL utf8mb4 utf8mb4_general_ci diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/all_virtual_sys_parameter_stat.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/all_virtual_sys_parameter_stat.result index 81dddac587..fed39f5008 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/all_virtual_sys_parameter_stat.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/all_virtual_sys_parameter_stat.result @@ -297,6 +297,7 @@ _enable_defensive_check _enable_easy_keepalive _enable_hash_join_hasher _enable_hash_join_processor +_enable_hgby_llc_ndv_adaptive _enable_in_range_optimization _enable_log_cache _enable_memleak_light_backtrace diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_mysql.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_mysql.result index 20dabcbc07..6e81a4404a 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_mysql.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_mysql.result @@ -202,7 +202,7 @@ USER varchar(32) NO HOST varchar(67) YES NULL DB varchar(128) YES NULL COMMAND varchar(4096) NO -TIME bigint(20) NO +TIME bigint(21) NO NULL STATE varchar(128) YES NULL INFO varchar(262143) YES NULL select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from information_schema.PROCESSLIST limit 1); @@ -2571,8 +2571,8 @@ HOST varchar(128) NO DB varchar(128) YES NULL TENANT varchar(128) NO NULL COMMAND varchar(4096) NO -TIME bigint(20) NO -TOTAL_TIME bigint(20) NO +TIME double NO NULL +TOTAL_TIME double NO NULL STATE varchar(128) YES NULL INFO varchar(262143) YES NULL PROXY_SESSID bigint(20) unsigned YES NULL @@ -2599,6 +2599,7 @@ LB_VPORT bigint(20) YES NULL IN_BYTES bigint(20) NO NULL OUT_BYTES bigint(20) NO NULL USER_CLIENT_PORT bigint(20) NO +TOTAL_CPU_TIME bigint(21) NO NULL select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$OB_PROCESSLIST limit 1); cnt 1 @@ -2613,8 +2614,8 @@ HOST varchar(128) NO DB varchar(128) NO TENANT varchar(128) NO COMMAND varchar(4096) NO -TIME bigint(20) NO -TOTAL_TIME bigint(20) NO +TIME double NO +TOTAL_TIME double NO STATE varchar(128) NO INFO varchar(262143) NO PROXY_SESSID bigint(20) unsigned NO @@ -2641,6 +2642,7 @@ LB_VPORT bigint(20) NO IN_BYTES bigint(20) NO OUT_BYTES bigint(20) NO USER_CLIENT_PORT bigint(20) NO +TOTAL_CPU_TIME bigint(21) NO select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_PROCESSLIST limit 1); cnt 1 @@ -5458,6 +5460,64 @@ RECORD_POLICY varchar(32) NO NULL select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$OB_FLT_TRACE_CONFIG limit 1); cnt 1 +desc oceanbase.GV$OB_SESSION; +Field Type Null Key Default Extra +ID bigint(20) unsigned NO +USER varchar(32) NO +TENANT varchar(128) NO NULL +HOST varchar(128) NO +DB varchar(128) YES NULL +COMMAND varchar(4096) NO +SQL_ID varchar(32) NO +TIME bigint(21) NO NULL +STATE varchar(128) YES NULL +INFO varchar(262143) YES NULL +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL +SQL_PORT bigint(20) NO NULL +PROXY_SESSID bigint(20) unsigned YES NULL +USER_CLIENT_IP varchar(46) YES NULL +USER_HOST varchar(128) YES NULL +TRANS_ID bigint(20) unsigned NO NULL +THREAD_ID bigint(20) unsigned NO NULL +TRACE_ID varchar(64) YES +REF_COUNT bigint(20) NO NULL +BACKTRACE varchar(16384) YES +TRANS_STATE varchar(32) YES NULL +USER_CLIENT_PORT bigint(20) NO +TOTAL_CPU_TIME bigint(21) NO NULL +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$OB_SESSION limit 1); +cnt +1 +desc oceanbase.V$OB_SESSION; +Field Type Null Key Default Extra +ID bigint(20) unsigned NO +USER varchar(32) NO +TENANT varchar(128) NO +HOST varchar(128) NO +DB varchar(128) NO +COMMAND varchar(4096) NO +SQL_ID varchar(32) NO +TIME bigint(21) NO +STATE varchar(128) NO +INFO varchar(262143) NO +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +SQL_PORT bigint(20) NO +PROXY_SESSID bigint(20) unsigned NO +USER_CLIENT_IP varchar(46) NO +USER_HOST varchar(128) NO +TRANS_ID bigint(20) unsigned NO +THREAD_ID bigint(20) unsigned NO +TRACE_ID varchar(64) NO +REF_COUNT bigint(20) NO +BACKTRACE varchar(16384) NO +TRANS_STATE varchar(32) NO +USER_CLIENT_PORT bigint(20) NO +TOTAL_CPU_TIME bigint(21) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_SESSION limit 1); +cnt +1 desc oceanbase.GV$OB_PL_CACHE_OBJECT; Field Type Null Key Default Extra TENANT_ID bigint(20) NO NULL @@ -6031,6 +6091,34 @@ EXECUTION_PLAN longtext YES NULL select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.DBA_MVREF_STMT_STATS limit 1); cnt 1 +desc oceanbase.GV$OB_TRACEPOINT_INFO; +Field Type Null Key Default Extra +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL +TP_NO bigint(20) NO NULL +TP_NAME varchar(128) NO NULL +TP_DESCRIBE varchar(4096) NO NULL +TP_FREQUENCY bigint(20) NO NULL +TP_ERROR_CODE bigint(20) NO NULL +TP_OCCUR bigint(20) NO NULL +TP_MATCH bigint(20) NO NULL +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$OB_TRACEPOINT_INFO limit 1); +cnt +1 +desc oceanbase.V$OB_TRACEPOINT_INFO; +Field Type Null Key Default Extra +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +TP_NO bigint(20) NO +TP_NAME varchar(128) NO +TP_DESCRIBE varchar(4096) NO +TP_FREQUENCY bigint(20) NO +TP_ERROR_CODE bigint(20) NO +TP_OCCUR bigint(20) NO +TP_MATCH bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_TRACEPOINT_INFO limit 1); +cnt +1 desc oceanbase.GV$OB_NIC_INFO; Field Type Null Key Default Extra SVR_IP varchar(46) NO NULL diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_sys.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_sys.result index f32168d51a..4d45f643ed 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_sys.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_sys.result @@ -203,7 +203,7 @@ USER varchar(32) NO HOST varchar(67) YES NULL DB varchar(128) YES NULL COMMAND varchar(4096) NO -TIME bigint(20) NO +TIME bigint(21) NO NULL STATE varchar(128) YES NULL INFO varchar(262143) YES NULL select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from information_schema.PROCESSLIST limit 1); @@ -3841,8 +3841,8 @@ HOST varchar(128) NO DB varchar(128) YES NULL TENANT varchar(128) NO NULL COMMAND varchar(4096) NO -TIME bigint(20) NO -TOTAL_TIME bigint(20) NO +TIME double NO NULL +TOTAL_TIME double NO NULL STATE varchar(128) YES NULL INFO varchar(262143) YES NULL PROXY_SESSID bigint(20) unsigned YES NULL @@ -3869,6 +3869,7 @@ LB_VPORT bigint(20) YES NULL IN_BYTES bigint(20) NO NULL OUT_BYTES bigint(20) NO NULL USER_CLIENT_PORT bigint(20) NO +TOTAL_CPU_TIME bigint(21) NO NULL select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$OB_PROCESSLIST limit 1); cnt 1 @@ -3883,8 +3884,8 @@ HOST varchar(128) NO DB varchar(128) NO TENANT varchar(128) NO COMMAND varchar(4096) NO -TIME bigint(20) NO -TOTAL_TIME bigint(20) NO +TIME double NO +TOTAL_TIME double NO STATE varchar(128) NO INFO varchar(262143) NO PROXY_SESSID bigint(20) unsigned NO @@ -3911,6 +3912,7 @@ LB_VPORT bigint(20) NO IN_BYTES bigint(20) NO OUT_BYTES bigint(20) NO USER_CLIENT_PORT bigint(20) NO +TOTAL_CPU_TIME bigint(21) NO select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_PROCESSLIST limit 1); cnt 1 @@ -7657,6 +7659,64 @@ RECORD_POLICY varchar(32) NO NULL select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$OB_FLT_TRACE_CONFIG limit 1); cnt 1 +desc oceanbase.GV$OB_SESSION; +Field Type Null Key Default Extra +ID bigint(20) unsigned NO +USER varchar(32) NO +TENANT varchar(128) NO NULL +HOST varchar(128) NO +DB varchar(128) YES NULL +COMMAND varchar(4096) NO +SQL_ID varchar(32) NO +TIME bigint(21) NO NULL +STATE varchar(128) YES NULL +INFO varchar(262143) YES NULL +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL +SQL_PORT bigint(20) NO NULL +PROXY_SESSID bigint(20) unsigned YES NULL +USER_CLIENT_IP varchar(46) YES NULL +USER_HOST varchar(128) YES NULL +TRANS_ID bigint(20) unsigned NO NULL +THREAD_ID bigint(20) unsigned NO NULL +TRACE_ID varchar(64) YES +REF_COUNT bigint(20) NO NULL +BACKTRACE varchar(16384) YES +TRANS_STATE varchar(32) YES NULL +USER_CLIENT_PORT bigint(20) NO +TOTAL_CPU_TIME bigint(21) NO NULL +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$OB_SESSION limit 1); +cnt +1 +desc oceanbase.V$OB_SESSION; +Field Type Null Key Default Extra +ID bigint(20) unsigned NO +USER varchar(32) NO +TENANT varchar(128) NO +HOST varchar(128) NO +DB varchar(128) NO +COMMAND varchar(4096) NO +SQL_ID varchar(32) NO +TIME bigint(21) NO +STATE varchar(128) NO +INFO varchar(262143) NO +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +SQL_PORT bigint(20) NO +PROXY_SESSID bigint(20) unsigned NO +USER_CLIENT_IP varchar(46) NO +USER_HOST varchar(128) NO +TRANS_ID bigint(20) unsigned NO +THREAD_ID bigint(20) unsigned NO +TRACE_ID varchar(64) NO +REF_COUNT bigint(20) NO +BACKTRACE varchar(16384) NO +TRANS_STATE varchar(32) NO +USER_CLIENT_PORT bigint(20) NO +TOTAL_CPU_TIME bigint(21) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_SESSION limit 1); +cnt +1 desc oceanbase.GV$OB_PL_CACHE_OBJECT; Field Type Null Key Default Extra TENANT_ID bigint(20) NO NULL @@ -8776,6 +8836,34 @@ EXECUTION_PLAN longtext YES NULL select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.DBA_MVREF_STMT_STATS limit 1); cnt 1 +desc oceanbase.GV$OB_TRACEPOINT_INFO; +Field Type Null Key Default Extra +SVR_IP varchar(46) NO NULL +SVR_PORT bigint(20) NO NULL +TP_NO bigint(20) NO NULL +TP_NAME varchar(128) NO NULL +TP_DESCRIBE varchar(4096) NO NULL +TP_FREQUENCY bigint(20) NO NULL +TP_ERROR_CODE bigint(20) NO NULL +TP_OCCUR bigint(20) NO NULL +TP_MATCH bigint(20) NO NULL +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.GV$OB_TRACEPOINT_INFO limit 1); +cnt +1 +desc oceanbase.V$OB_TRACEPOINT_INFO; +Field Type Null Key Default Extra +SVR_IP varchar(46) NO +SVR_PORT bigint(20) NO +TP_NO bigint(20) NO +TP_NAME varchar(128) NO +TP_DESCRIBE varchar(4096) NO +TP_FREQUENCY bigint(20) NO +TP_ERROR_CODE bigint(20) NO +TP_OCCUR bigint(20) NO +TP_MATCH bigint(20) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_TRACEPOINT_INFO limit 1); +cnt +1 desc oceanbase.GV$OB_NIC_INFO; Field Type Null Key Default Extra SVR_IP varchar(46) NO NULL diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_mysql.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_mysql.result index 0caca5c22a..e10178e325 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_mysql.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_mysql.result @@ -93,7 +93,7 @@ host varchar(128) NO db varchar(128) YES NULL command varchar(4096) NO sql_id varchar(32) NO -time bigint(20) NO 0 +time double NO NULL state varchar(128) YES NULL info varchar(262143) YES NULL svr_ip varchar(46) NO NULL @@ -108,7 +108,7 @@ thread_id bigint(20) unsigned NO NULL ssl_cipher varchar(4096) YES NULL trace_id varchar(64) YES trans_state varchar(32) YES NULL -total_time bigint(20) NO 0 +total_time double NO NULL retry_cnt bigint(20) NO 0 retry_info bigint(20) NO 0 action varchar(4096) YES @@ -1365,6 +1365,40 @@ IF(count(*) >= 0, 1, 0) "oceanbase.__all_virtual_compaction_suggestion runs in single server" IF(count(*) >= 0, 1, 0) 1 +desc oceanbase.__all_virtual_session_info; +Field Type Null Key Default Extra +id bigint(20) unsigned NO 0 +user varchar(32) NO +tenant varchar(128) NO NULL +host varchar(128) NO +db varchar(128) YES NULL +command varchar(4096) NO +sql_id varchar(32) NO +time double NO NULL +state varchar(128) YES NULL +info varchar(262143) YES NULL +svr_ip varchar(46) NO NULL +svr_port bigint(20) NO NULL +sql_port bigint(20) NO NULL +proxy_sessid bigint(20) unsigned YES NULL +master_sessid bigint(20) unsigned YES NULL +user_client_ip varchar(46) YES NULL +user_host varchar(128) YES NULL +trans_id bigint(20) unsigned NO NULL +thread_id bigint(20) unsigned NO NULL +ssl_cipher varchar(4096) YES NULL +trace_id varchar(64) YES +ref_count bigint(20) NO NULL +backtrace varchar(16384) YES +trans_state varchar(32) YES NULL +user_client_port bigint(20) NO 0 +total_cpu_time double NO NULL +select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_session_info; +IF(count(*) >= 0, 1, 0) +1 +"oceanbase.__all_virtual_session_info runs in single server" +IF(count(*) >= 0, 1, 0) +1 desc oceanbase.__all_virtual_tablet_compaction_history; Field Type Null Key Default Extra svr_ip varchar(46) NO NULL @@ -4787,6 +4821,23 @@ IS_MANDATORY varchar(1024) NO select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from information_schema.ENABLED_ROLES; IF(count(*) >= 0, 1, 0) 1 +desc oceanbase.__all_virtual_tracepoint_info; +Field Type Null Key Default Extra +svr_ip varchar(46) NO NULL +svr_port bigint(20) NO NULL +tp_no bigint(20) NO NULL +tp_name varchar(128) NO NULL +tp_describe varchar(4096) NO NULL +tp_frequency bigint(20) NO NULL +tp_error_code bigint(20) NO NULL +tp_occur bigint(20) NO NULL +tp_match bigint(20) NO NULL +select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_tracepoint_info; +IF(count(*) >= 0, 1, 0) +1 +"oceanbase.__all_virtual_tracepoint_info runs in single server" +IF(count(*) >= 0, 1, 0) +1 desc oceanbase.__all_virtual_nic_info; Field Type Null Key Default Extra svr_ip varchar(46) NO NULL diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_sys.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_sys.result index 8a6deea5ae..4f59168e88 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_sys.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_sys.result @@ -94,7 +94,7 @@ host varchar(128) NO db varchar(128) YES NULL command varchar(4096) NO sql_id varchar(32) NO -time bigint(20) NO 0 +time double NO NULL state varchar(128) YES NULL info varchar(262143) YES NULL svr_ip varchar(46) NO NULL @@ -109,7 +109,7 @@ thread_id bigint(20) unsigned NO NULL ssl_cipher varchar(4096) YES NULL trace_id varchar(64) YES trans_state varchar(32) YES NULL -total_time bigint(20) NO 0 +total_time double NO NULL retry_cnt bigint(20) NO 0 retry_info bigint(20) NO 0 action varchar(4096) YES @@ -1798,7 +1798,7 @@ host varchar(128) NO db varchar(128) YES NULL command varchar(4096) NO sql_id varchar(32) NO -time bigint(20) NO 0 +time double NO NULL state varchar(128) YES NULL info varchar(262143) YES NULL svr_ip varchar(46) NO NULL @@ -9364,6 +9364,23 @@ IS_MANDATORY varchar(1024) NO select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from information_schema.ENABLED_ROLES; IF(count(*) >= 0, 1, 0) 1 +desc oceanbase.__all_virtual_tracepoint_info; +Field Type Null Key Default Extra +svr_ip varchar(46) NO NULL +svr_port bigint(20) NO NULL +tp_no bigint(20) NO NULL +tp_name varchar(128) NO NULL +tp_describe varchar(4096) NO NULL +tp_frequency bigint(20) NO NULL +tp_error_code bigint(20) NO NULL +tp_occur bigint(20) NO NULL +tp_match bigint(20) NO NULL +select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_tracepoint_info; +IF(count(*) >= 0, 1, 0) +1 +"oceanbase.__all_virtual_tracepoint_info runs in single server" +IF(count(*) >= 0, 1, 0) +1 desc oceanbase.__all_virtual_nic_info; Field Type Null Key Default Extra svr_ip varchar(46) NO NULL diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/inner_table_overall.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/inner_table_overall.result index 538361d1b1..3621f8aaa9 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/inner_table_overall.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/inner_table_overall.result @@ -730,6 +730,7 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 12463 __all_virtual_column_privilege_history 2 201001 1 12464 __all_virtual_tenant_snapshot_ls_replica_history 2 201001 1 12466 ENABLED_ROLES 2 201002 1 +12469 __all_virtual_tracepoint_info 2 201001 1 12487 __all_virtual_nic_info 2 201001 1 20001 GV$OB_PLAN_CACHE_STAT 1 201001 1 20002 GV$OB_PLAN_CACHE_PLAN_STAT 1 201001 1 @@ -1084,6 +1085,8 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 21447 DBA_OB_TENANT_EVENT_HISTORY 1 201001 1 21448 CDB_OB_TENANT_EVENT_HISTORY 1 201001 1 21449 GV$OB_FLT_TRACE_CONFIG 1 201001 1 +21459 GV$OB_SESSION 1 201001 1 +21460 V$OB_SESSION 1 201001 1 21461 GV$OB_PL_CACHE_OBJECT 1 201001 1 21462 V$OB_PL_CACHE_OBJECT 1 201001 1 21463 CDB_OB_RECOVER_TABLE_JOBS 1 201001 1 @@ -1136,6 +1139,8 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 21538 DBA_MVREF_CHANGE_STATS 1 201001 1 21539 CDB_MVREF_STMT_STATS 1 201001 1 21540 DBA_MVREF_STMT_STATS 1 201001 1 +21543 GV$OB_TRACEPOINT_INFO 1 201001 1 +21544 V$OB_TRACEPOINT_INFO 1 201001 1 21580 GV$OB_NIC_INFO 1 201001 1 21581 V$OB_NIC_INFO 1 201001 1 check sys table count and table_id range success