From 09ed904b580ba3ea6b9fac4329091e51099d3eb7 Mon Sep 17 00:00:00 2001 From: wjhh2008 Date: Sat, 29 Apr 2023 15:11:49 +0000 Subject: [PATCH] [FEAT MERGE] Support external table Co-authored-by: jingtaoye35 <1255153887@qq.com> --- .../src/lib/charset/ob_template_helper.h | 6 + deps/oblib/src/lib/ob_define.h | 4 + deps/oblib/src/lib/ob_name_def.h | 2 + deps/oblib/src/lib/rowid/ob_urowid.cpp | 36 +- deps/oblib/src/lib/rowid/ob_urowid.h | 2 + deps/oblib/src/lib/wait_event/ob_wait_event.h | 2 +- deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h | 4 +- src/objit/include/objit/common/ob_item_type.h | 5 +- src/observer/ob_server.cpp | 7 + src/observer/ob_server.h | 6 + src/observer/ob_server_struct.h | 3 + src/observer/ob_srv_xlator_primary.cpp | 4 + .../ob_all_virtual_proxy_schema.cpp | 3 +- .../virtual_table/ob_tenant_all_tables.cpp | 1 + .../virtual_table/ob_tenant_show_tables.cpp | 1 + src/pl/sys_package/ob_dbms_stats.cpp | 26 +- src/pl/sys_package/ob_dbms_stats.h | 2 + src/rootserver/ob_ddl_operator.cpp | 16 +- src/rootserver/ob_ddl_service.cpp | 24 +- src/share/CMakeLists.txt | 7 + src/share/backup/ob_backup_io_adapter.cpp | 30 + src/share/backup/ob_backup_io_adapter.h | 14 + .../ob_external_table_file_mgr.cpp | 512 ++++++++++++ .../ob_external_table_file_mgr.h | 161 ++++ .../ob_external_table_file_rpc_processor.cpp | 153 ++++ .../ob_external_table_file_rpc_processor.h | 173 ++++ .../ob_external_table_file_rpc_proxy.h | 36 + .../ob_external_table_file_task.cpp | 70 ++ .../ob_external_table_file_task.h | 79 ++ .../ob_external_table_utils.cpp | 369 +++++++++ .../external_table/ob_external_table_utils.h | 98 +++ .../ob_inner_table_schema.101_150.cpp | 60 ++ .../ob_inner_table_schema.11001_11050.cpp | 60 ++ .../ob_inner_table_schema.12051_12100.cpp | 120 +++ .../ob_inner_table_schema.12351_12400.cpp | 164 ++++ .../ob_inner_table_schema.15101_15150.cpp | 60 ++ .../ob_inner_table_schema.15201_15250.cpp | 60 ++ .../ob_inner_table_schema.15251_15300.cpp | 149 ++++ .../ob_inner_table_schema.1_50.cpp | 60 ++ .../ob_inner_table_schema.20001_20050.cpp | 2 +- .../ob_inner_table_schema.21151_21200.cpp | 6 +- .../ob_inner_table_schema.21201_21250.cpp | 2 +- .../ob_inner_table_schema.21251_21300.cpp | 16 +- .../ob_inner_table_schema.21351_21400.cpp | 2 +- .../ob_inner_table_schema.21401_21450.cpp | 150 ++++ .../ob_inner_table_schema.25001_25050.cpp | 24 +- .../ob_inner_table_schema.25051_25100.cpp | 4 +- .../ob_inner_table_schema.25201_25250.cpp | 100 +++ .../ob_inner_table_schema.28051_28100.cpp | 42 +- .../ob_inner_table_schema.28101_28150.cpp | 6 +- .../ob_inner_table_schema.451_500.cpp | 151 ++++ .../ob_inner_table_schema.50451_50500.cpp | 135 ++++ .../ob_inner_table_schema.60451_60500.cpp | 90 +++ src/share/inner_table/ob_inner_table_schema.h | 52 +- .../inner_table/ob_inner_table_schema.lob.cpp | 2 +- .../inner_table/ob_inner_table_schema.vt.cpp | 7 + .../ob_inner_table_schema_constants.h | 20 + .../inner_table/ob_inner_table_schema_def.py | 308 +++++-- .../ob_inner_table_schema_misc.ipp | 40 +- .../location_cache/ob_location_service.cpp | 12 + .../location_cache/ob_location_service.h | 4 + src/share/ob_i_tablet_scan.cpp | 4 +- src/share/ob_i_tablet_scan.h | 15 +- src/share/schema/ob_schema_printer.cpp | 120 ++- src/share/schema/ob_schema_printer.h | 5 + src/share/schema/ob_schema_retrieve_utils.ipp | 13 + src/share/schema/ob_schema_service.cpp | 10 +- src/share/schema/ob_schema_struct.cpp | 6 +- src/share/schema/ob_schema_struct.h | 1 + src/share/schema/ob_table_schema.cpp | 59 +- src/share/schema/ob_table_schema.h | 15 + src/share/schema/ob_table_sql_service.cpp | 16 + src/share/stat/ob_basic_stats_estimator.cpp | 2 +- src/share/stat/ob_dbms_stats_executor.cpp | 4 +- src/share/stat/ob_dbms_stats_utils.cpp | 2 +- src/share/stat/ob_stat_define.cpp | 1 + src/share/stat/ob_stat_define.h | 7 +- src/sql/CMakeLists.txt | 1 + src/sql/code_generator/ob_dml_cg_service.cpp | 3 + .../code_generator/ob_static_engine_cg.cpp | 6 + src/sql/code_generator/ob_tsc_cg_service.cpp | 46 ++ src/sql/das/ob_das_context.cpp | 58 ++ src/sql/das/ob_das_context.h | 13 + src/sql/das/ob_das_define.h | 8 +- src/sql/das/ob_das_location_router.cpp | 24 + src/sql/das/ob_das_location_router.h | 1 + src/sql/das/ob_das_scan_op.cpp | 29 +- src/sql/das/ob_das_scan_op.h | 18 +- src/sql/engine/basic/ob_pushdown_filter.cpp | 16 +- src/sql/engine/basic/ob_pushdown_filter.h | 5 + src/sql/engine/cmd/ob_load_data_parser.cpp | 378 ++++++++- src/sql/engine/cmd/ob_load_data_parser.h | 207 +++-- src/sql/engine/cmd/ob_table_executor.cpp | 342 +++++++- src/sql/engine/cmd/ob_table_executor.h | 32 +- src/sql/engine/px/ob_dfo.cpp | 16 +- src/sql/engine/px/ob_dfo.h | 16 +- src/sql/engine/px/ob_granule_pump.cpp | 72 +- src/sql/engine/px/ob_granule_pump.h | 8 + src/sql/engine/px/ob_granule_util.cpp | 70 +- src/sql/engine/px/ob_granule_util.h | 15 + src/sql/engine/px/ob_px_sub_coord.cpp | 3 +- src/sql/engine/px/ob_px_util.cpp | 184 ++++- src/sql/engine/px/ob_px_util.h | 13 + .../ob_external_table_access_service.cpp | 765 ++++++++++++++++++ .../table/ob_external_table_access_service.h | 170 ++++ src/sql/engine/table/ob_table_scan_op.cpp | 18 + src/sql/engine/table/ob_table_scan_op.h | 5 +- src/sql/ob_sql_utils.cpp | 73 ++ src/sql/ob_sql_utils.h | 8 + .../optimizer/ob_access_path_estimation.cpp | 35 +- src/sql/optimizer/ob_access_path_estimation.h | 1 + src/sql/optimizer/ob_join_order.cpp | 42 +- src/sql/optimizer/ob_log_granule_iterator.cpp | 3 + src/sql/optimizer/ob_log_granule_iterator.h | 7 +- src/sql/optimizer/ob_log_plan.cpp | 45 +- src/sql/optimizer/ob_log_plan.h | 1 + src/sql/optimizer/ob_log_table_scan.cpp | 55 +- src/sql/optimizer/ob_log_table_scan.h | 16 +- src/sql/optimizer/ob_logical_operator.cpp | 10 + src/sql/optimizer/ob_opt_est_cost_model.cpp | 9 +- src/sql/optimizer/ob_opt_est_cost_model.h | 6 +- src/sql/optimizer/ob_select_log_plan.cpp | 35 +- src/sql/optimizer/ob_select_log_plan.h | 2 + src/sql/optimizer/ob_table_location.cpp | 23 +- src/sql/optimizer/ob_table_location.h | 3 + .../parser/non_reserved_keywords_mysql_mode.c | 11 + .../non_reserved_keywords_oracle_mode.c | 10 + src/sql/parser/sql_parser_mysql_mode.y | 167 +++- .../resolver/ddl/ob_alter_table_resolver.cpp | 9 + .../resolver/ddl/ob_alter_table_resolver.h | 3 +- src/sql/resolver/ddl/ob_alter_table_stmt.cpp | 6 +- src/sql/resolver/ddl/ob_alter_table_stmt.h | 4 + src/sql/resolver/ddl/ob_analyze_stmt.cpp | 4 +- src/sql/resolver/ddl/ob_analyze_stmt.h | 9 +- .../resolver/ddl/ob_analyze_stmt_resolver.cpp | 3 +- .../resolver/ddl/ob_create_index_resolver.cpp | 3 + .../resolver/ddl/ob_create_table_resolver.cpp | 145 +++- .../resolver/ddl/ob_create_table_resolver.h | 2 + src/sql/resolver/ddl/ob_ddl_resolver.cpp | 522 ++++++++++-- src/sql/resolver/ddl/ob_ddl_resolver.h | 12 +- src/sql/resolver/dml/ob_dml_resolver.cpp | 27 + src/sql/resolver/dml/ob_dml_resolver.h | 1 + src/sql/resolver/dml/ob_dml_stmt.cpp | 48 ++ src/sql/resolver/dml/ob_dml_stmt.h | 6 +- src/sql/resolver/dml/ob_select_stmt.cpp | 13 +- src/sql/resolver/dml/ob_select_stmt.h | 1 + .../expr/ob_expr_relation_analyzer.cpp | 1 + src/sql/resolver/expr/ob_raw_expr.cpp | 8 + src/sql/resolver/expr/ob_raw_expr.h | 6 +- src/sql/resolver/expr/ob_raw_expr_printer.cpp | 8 + src/sql/resolver/expr/ob_raw_expr_util.cpp | 131 ++- src/sql/resolver/expr/ob_raw_expr_util.h | 6 + src/sql/resolver/ob_resolver.cpp | 4 + src/sql/resolver/ob_resolver_utils.cpp | 301 ++++++- src/sql/resolver/ob_resolver_utils.h | 21 + src/sql/rewrite/ob_transform_utils.cpp | 4 + src/storage/access/ob_dml_param.cpp | 4 +- src/storage/lob/ob_lob_manager.cpp | 257 +++--- src/storage/tablelock/ob_table_lock_common.h | 1 + .../tablelock/ob_table_lock_rpc_struct.cpp | 3 +- .../tablelock/ob_table_lock_service.cpp | 2 +- .../r/mysql/information_schema_desc.result | 4 +- .../r/mysql/inner_table_overall.result | 5 + unittest/sql/parser/test_parser.result | 9 +- 164 files changed, 8074 insertions(+), 667 deletions(-) create mode 100644 src/share/external_table/ob_external_table_file_mgr.cpp create mode 100644 src/share/external_table/ob_external_table_file_mgr.h create mode 100644 src/share/external_table/ob_external_table_file_rpc_processor.cpp create mode 100644 src/share/external_table/ob_external_table_file_rpc_processor.h create mode 100644 src/share/external_table/ob_external_table_file_rpc_proxy.h create mode 100644 src/share/external_table/ob_external_table_file_task.cpp create mode 100644 src/share/external_table/ob_external_table_file_task.h create mode 100644 src/share/external_table/ob_external_table_utils.cpp create mode 100644 src/share/external_table/ob_external_table_utils.h create mode 100644 src/sql/engine/table/ob_external_table_access_service.cpp create mode 100644 src/sql/engine/table/ob_external_table_access_service.h diff --git a/deps/oblib/src/lib/charset/ob_template_helper.h b/deps/oblib/src/lib/charset/ob_template_helper.h index 910043b12..3aeeab64d 100644 --- a/deps/oblib/src/lib/charset/ob_template_helper.h +++ b/deps/oblib/src/lib/charset/ob_template_helper.h @@ -16,6 +16,12 @@ #include +template< size_t N > +constexpr size_t str_length( char const (&)[N] ) +{ + return N-1; +} + template constexpr size_t array_elements(T (&)[N]) noexcept { return N; diff --git a/deps/oblib/src/lib/ob_define.h b/deps/oblib/src/lib/ob_define.h index 6bdda5dba..d83a408bd 100644 --- a/deps/oblib/src/lib/ob_define.h +++ b/deps/oblib/src/lib/ob_define.h @@ -562,6 +562,8 @@ const uint64_t OB_HIDDEN_SESSION_ID_COLUMN_ID = 9; const uint64_t OB_HIDDEN_SESS_CREATE_TIME_COLUMN_ID = 10; const uint64_t OB_HIDDEN_LOGICAL_ROWID_COLUMN_ID = 11; const uint64_t OB_HIDDEN_GROUP_IDX_COLUMN_ID = 13; // used for batch nlj +const uint64_t OB_HIDDEN_FILE_ID_COLUMN_ID = 14; // used for external table +const uint64_t OB_HIDDEN_LINE_NUMBER_COLUMN_ID = 15; // used for external table const int64_t OB_END_RESERVED_COLUMN_ID_NUM = 16; const uint64_t OB_APP_MIN_COLUMN_ID = 16; const uint64_t OB_ACTION_FLAG_COLUMN_ID = OB_ALL_MAX_COLUMN_ID @@ -582,6 +584,8 @@ const char *const OB_HIDDEN_PK_INCREMENT_COLUMN_NAME = "__pk_increment"; //hidde const char *const OB_MOCK_LINK_TABLE_PK_COLUMN_NAME = "__link_table_pkey"; //hidden const char *const OB_HIDDEN_SESSION_ID_COLUMN_NAME = "SYS_SESSION_ID"; //oracle temporary table const char *const OB_HIDDEN_SESS_CREATE_TIME_COLUMN_NAME = "SYS_SESS_CREATE_TIME"; //oracle temporary table +const char *const OB_HIDDEN_FILE_ID_COLUMN_NAME = "__file_id"; // used for external table +const char *const OB_HIDDEN_LINE_NUMBER_COLUMN_NAME = "__line_number"; // used for external table // hidden rowid name const char *const OB_HIDDEN_ROWID_COLUMN_NAME = "__ob_rowid"; diff --git a/deps/oblib/src/lib/ob_name_def.h b/deps/oblib/src/lib/ob_name_def.h index 02d8c866d..2179a7f77 100644 --- a/deps/oblib/src/lib/ob_name_def.h +++ b/deps/oblib/src/lib/ob_name_def.h @@ -1045,6 +1045,8 @@ #define N_ST_CONTAINS "st_contains" #define N_ST_WITHIN "st_within" #define N_SQL_MODE_CONVERT "sql_mode_convert" +#define N_EXTERNAL_FILE_COLUMN_PREFIX "metadata$filecol" + #define N_PREFIX_PATTERN "prefix_pattern" #define N_PRIV_XML_BINARY "_make_xml_binary" #define N_SYS_MAKEXML "sys_makexml" diff --git a/deps/oblib/src/lib/rowid/ob_urowid.cpp b/deps/oblib/src/lib/rowid/ob_urowid.cpp index 9475553ae..017a1a42c 100644 --- a/deps/oblib/src/lib/rowid/ob_urowid.cpp +++ b/deps/oblib/src/lib/rowid/ob_urowid.cpp @@ -336,11 +336,12 @@ inline int ObURowIDData::get_pk_value(ObObjType obj_type, int64_t &pos, ObObj &p const uint8_t version = get_version(); if (OB_UNLIKELY(PK_ROWID_VERSION != version && NO_PK_ROWID_VERSION != version - && LOB_NO_PK_ROWID_VERSION != version)) { + && LOB_NO_PK_ROWID_VERSION != version + && EXTERNAL_TABLE_ROWID_VERSION != version)) { ret = OB_INVALID_ROWID; COMMON_LOG(WARN, "invalid rowid version", K(ret), K(version)); } else if (OB_UNLIKELY(obj_type >= ObMaxType) - || OB_UNLIKELY(NULL == inner_get_funcs_[obj_type])) { + || OB_UNLIKELY(NULL == inner_get_funcs_[obj_type])) { ret = OB_INVALID_ROWID; COMMON_LOG(WARN, "invalid type or get null for get pk function", K(ret), K(obj_type)); } else { @@ -493,7 +494,8 @@ bool ObURowIDData::is_valid_urowid() const is_valid = rowid_len_ == EXT_HEAP_ORGANIZED_TABLE_ROWID_CONTENT_BUF_SIZE; } else if (NO_PK_ROWID_VERSION == version || PK_ROWID_VERSION == version - || LOB_NO_PK_ROWID_VERSION == version) { + || LOB_NO_PK_ROWID_VERSION == version + || EXTERNAL_TABLE_ROWID_VERSION == version) { int64_t pos = get_pk_content_offset(); ObObj obj; for (; is_valid && pos < rowid_len_; ) { @@ -519,6 +521,7 @@ bool ObURowIDData::is_valid_version(int64_t v) bret = false; } else if (PK_ROWID_VERSION != v && NO_PK_ROWID_VERSION != v + && EXTERNAL_TABLE_ROWID_VERSION != v && HEAP_TABLE_ROWID_VERSION != v && EXT_HEAP_TABLE_ROWID_VERSION != v && LOB_NO_PK_ROWID_VERSION != v) { @@ -549,7 +552,8 @@ uint8_t ObURowIDData::get_version() const raw_version = rowid_content_[offset]; if (PK_ROWID_VERSION == raw_version || NO_PK_ROWID_VERSION == raw_version - || LOB_NO_PK_ROWID_VERSION == raw_version) { + || LOB_NO_PK_ROWID_VERSION == raw_version + || EXTERNAL_TABLE_ROWID_VERSION == raw_version) { version = raw_version; } else if (is_valid_part_gen_col_version(raw_version)) { version = PK_ROWID_VERSION; @@ -1022,6 +1026,30 @@ int ObURowIDData::get_pk_vals(ObIArray &pk_vals) const if (OB_FAIL(get_rowkey_for_heap_organized_table(pk_vals))) { COMMON_LOG(WARN, "failed to get rowkey for heap organized_table", K(ret)); } else {/*do nothing*/} + } else if (EXTERNAL_TABLE_ROWID_VERSION == get_version()) { + // external table rowid = partition id + file id + line number + pos = get_pk_content_offset(); + int i = 0; + while (OB_SUCC(ret) && pos < get_buf_len() && i < 3) { + if (OB_LIKELY(pos + 1 <= get_buf_len())) { + ObObjType type = get_pk_type(pos); + ObObj tmp_obj; + if (OB_LIKELY(is_valid_obj_type(type))) { + if (OB_FAIL(get_pk_value(type, pos, tmp_obj))) { + COMMON_LOG(WARN, "failed to get pk value", K(ret)); + } else if (i > 0) { // skip partition id here + if (OB_FAIL(pk_vals.push_back(tmp_obj))) { + COMMON_LOG(WARN, "failed to push back element", K(ret)); + } + } + i++; + } else { + ret = OB_INVALID_ROWID; + } + } else { + ret = OB_INVALID_ROWID; + } + } } else { pos = get_pk_content_offset(); while (OB_SUCC(ret) && pos < get_buf_len()) { diff --git a/deps/oblib/src/lib/rowid/ob_urowid.h b/deps/oblib/src/lib/rowid/ob_urowid.h index 19f8a26bf..1cd0ae38b 100644 --- a/deps/oblib/src/lib/rowid/ob_urowid.h +++ b/deps/oblib/src/lib/rowid/ob_urowid.h @@ -48,6 +48,8 @@ public: NO_PK_ROWID_VERSION = 2, LOB_NO_PK_ROWID_VERSION = 3, + EXTERNAL_TABLE_ROWID_VERSION = 4, + HEAP_TABLE_ROWID_VERSION = 128, // 0x80 EXT_HEAP_TABLE_ROWID_VERSION = 160, // 0xA0 }; diff --git a/deps/oblib/src/lib/wait_event/ob_wait_event.h b/deps/oblib/src/lib/wait_event/ob_wait_event.h index d78e084aa..244048ebf 100644 --- a/deps/oblib/src/lib/wait_event/ob_wait_event.h +++ b/deps/oblib/src/lib/wait_event/ob_wait_event.h @@ -37,7 +37,7 @@ WAIT_EVENT_DEF(OMT_IDLE, 12002, "sched idle", "wait start timestamp", "", "", ID WAIT_EVENT_DEF(SYNC_RPC, 13000, "sync rpc", "pcode", "size", "", NETWORK, "sync rpc", true) WAIT_EVENT_DEF(MYSQL_RESPONSE_WAIT_CLIENT, 13001, "mysql response wait client", "", "", "", NETWORK, "mysql response wait client", true) WAIT_EVENT_DEF(DAS_ASYNC_RPC_LOCK_WAIT, 13002, "das wait remote response", "", "", "", NETWORK, "das wait remote response", true) -//WAIT_EVENT_DEF(ASYNC_EXTERNAL_TABLE_LOCK_WAIT, 13003, "external table wait remote response", "", "", "", NETWORK, "external table wait remote response", true) +WAIT_EVENT_DEF(ASYNC_EXTERNAL_TABLE_LOCK_WAIT, 13003, "external table wait remote response", "", "", "", NETWORK, "external table wait remote response", true) //application WAIT_EVENT_DEF(MT_READ_LOCK_WAIT,14001,"memstore read lock wait","lock","waiter","owner",APPLICATION,"memstore read lock wait", false) diff --git a/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h b/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h index c08805316..0dd13ed8f 100644 --- a/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h +++ b/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h @@ -959,7 +959,9 @@ PCODE_DEF(OB_TABLET_MAJOR_FREEZE, 0x1558) // 1561-1570 for lob access PCODE_DEF(OB_LOB_QUERY, 0x1561) -//PCODE_DEF(OB_FLUSH_EXTERNAL_TABLE_FILE_CACHE, 0X1571) + +PCODE_DEF(OB_FLUSH_EXTERNAL_TABLE_FILE_CACHE, 0X1570) +PCODE_DEF(OB_LOAD_EXTERNAL_FILE_LIST, 0x1571) // 1572-1580 for object storage service // PCODE_DEF(OB_ADD_STORAGE, 0x1572) diff --git a/src/objit/include/objit/common/ob_item_type.h b/src/objit/include/objit/common/ob_item_type.h index f7e121cba..afe2335b8 100755 --- a/src/objit/include/objit/common/ob_item_type.h +++ b/src/objit/include/objit/common/ob_item_type.h @@ -834,6 +834,7 @@ typedef enum ObItemType T_PSEUDO_RANDOM = 3010, T_INNER_WF_AGGR_STAUTS = 3011, T_PSEUDO_GROUP_PARAM = 3040, + T_PSEUDO_EXTERNAL_FILE_COL = 3041, ///< @note values of the following symbols are insiginificant T_DEFAULT, @@ -2219,17 +2220,19 @@ typedef enum ObItemType T_TRACE_FORMAT, T_TG_ALTER_OPTIONS, + //for external table T_EXTERNAL_FILE_LOCATION, T_EXTERNAL_FILE_FORMAT, T_EXTERNAL_FILE_FORMAT_TYPE, T_EXTERNAL, T_ALTER_REFRESH_EXTERNAL_TABLE, - T_SKIP_HEADER, T_SKIP_BLANK_LINE, T_TRIM_SPACE, T_NULL_IF_EXETERNAL, T_EMPTY_FIELD_AS_NULL, + T_EXTERNAL_FILE_PATTERN, + T_ADMIN_STORAGE,// used to support oss storage for clog/sstable T_DYNAMIC_SAMPLING, T_TABLE_DYNAMIC_SAMPLING, diff --git a/src/observer/ob_server.cpp b/src/observer/ob_server.cpp index 4b0bb40ff..f845a0a7c 100644 --- a/src/observer/ob_server.cpp +++ b/src/observer/ob_server.cpp @@ -64,6 +64,7 @@ #include "share/sequence/ob_sequence_cache.h" #include "share/stat/ob_opt_stat_monitor_manager.h" #include "share/stat/ob_opt_stat_manager.h" +#include "share/external_table/ob_external_table_file_mgr.h" #include "sql/dtl/ob_dtl.h" #include "sql/engine/cmd/ob_load_data_utils.h" #include "sql/engine/px/ob_px_worker.h" @@ -350,6 +351,8 @@ int ObServer::init(const ObServerOptions &opts, const ObPLogWriterCfg &log_cfg) LOG_ERROR("init device manager failed", KR(ret)); } else if (OB_FAIL(ObTenantMutilAllocatorMgr::get_instance().init())) { LOG_ERROR("init ObTenantMutilAllocatorMgr failed", KR(ret)); + } else if (OB_FAIL(ObExternalTableFileManager::get_instance().init())) { + LOG_ERROR("init external table file manager failed", KR(ret)); } else if (OB_FAIL(SLOGGERMGR.init(storage_env_.log_spec_.log_dir_, storage_env_.log_spec_.max_log_file_size_, storage_env_.slog_file_spec_, true/*need_reserved*/))) { @@ -1906,6 +1909,8 @@ int ObServer::init_network() LOG_ERROR("get rpc proxy fail"); } else if (OB_FAIL(net_frame_.get_proxy(load_data_proxy_))) { LOG_ERROR("get rpc proxy fail", KR(ret)); + } else if (OB_FAIL(net_frame_.get_proxy(external_table_proxy_))) { + LOG_ERROR("get rpc proxy fail", KR(ret)); } else if (OB_FAIL(net_frame_.get_proxy(interrupt_proxy_))) { LOG_ERROR("get rpc proxy fail"); } else if (OB_FAIL(net_frame_.get_proxy(dbms_job_rpc_proxy_))) { @@ -2149,6 +2154,7 @@ int ObServer::init_global_context() gctx_.dbms_sched_job_rpc_proxy_ = &dbms_sched_job_rpc_proxy_; gctx_.rs_rpc_proxy_ = &rs_rpc_proxy_; gctx_.load_data_proxy_ = &load_data_proxy_; + gctx_.external_table_proxy_ = &external_table_proxy_; gctx_.sql_proxy_ = &sql_proxy_; gctx_.ddl_sql_proxy_ = &ddl_sql_proxy_; gctx_.ddl_oracle_sql_proxy_ = &ddl_oracle_sql_proxy_; @@ -2159,6 +2165,7 @@ int ObServer::init_global_context() gctx_.rs_mgr_ = &rs_mgr_; gctx_.bandwidth_throttle_ = &bandwidth_throttle_; gctx_.vt_par_ser_ = &vt_data_service_; + gctx_.et_access_service_ = &et_access_service_; gctx_.session_mgr_ = &session_mgr_; gctx_.sql_engine_ = &sql_engine_; gctx_.pl_engine_ = &pl_engine_; diff --git a/src/observer/ob_server.h b/src/observer/ob_server.h index 6c2e5c28c..54699a5f9 100644 --- a/src/observer/ob_server.h +++ b/src/observer/ob_server.h @@ -70,6 +70,9 @@ #include "share/table/ob_table_rpc_proxy.h" +#include "sql/engine/table/ob_external_table_access_service.h" +#include "share/external_table/ob_external_table_file_rpc_proxy.h" + namespace oceanbase { namespace omt @@ -351,6 +354,7 @@ private: obrpc::ObInterruptRpcProxy interrupt_proxy_; // global interrupt obrpc::ObLoadDataRpcProxy load_data_proxy_; obrpc::ObTableRpcProxy table_rpc_proxy_; + obrpc::ObExtenralTableRpcProxy external_table_proxy_; // The OceanBase configuration relating to. common::ObServerConfig &config_; @@ -404,6 +408,8 @@ private: // virtual table related ObVirtualDataAccessService vt_data_service_; + // external table + ObExternalTableAccessService et_access_service_; // Weakly Consistent Read Service transaction::ObWeakReadService weak_read_service_; diff --git a/src/observer/ob_server_struct.h b/src/observer/ob_server_struct.h index 92b80065b..835127746 100644 --- a/src/observer/ob_server_struct.h +++ b/src/observer/ob_server_struct.h @@ -40,6 +40,7 @@ class ObDBMSJobRpcProxy; class ObBatchRpc; class ObInnerSQLRpcProxy; class ObDBMSSchedJobRpcProxy; +class ObExtenralTableRpcProxy; } // end of namespace rpc namespace share @@ -240,6 +241,7 @@ struct ObGlobalContext share::ObRsMgr *rs_mgr_; common::ObInOutBandwidthThrottle *bandwidth_throttle_; common::ObITabletScan *vt_par_ser_; + common::ObITabletScan *et_access_service_; sql::ObSQLSessionMgr *session_mgr_; sql::ObSql *sql_engine_; pl::ObPL *pl_engine_; @@ -271,6 +273,7 @@ struct ObGlobalContext int64_t ssl_key_expired_time_; sql::ObConnectResourceMgr* conn_res_mgr_; storage::ObLocalityManager *locality_manager_; + obrpc::ObExtenralTableRpcProxy *external_table_proxy_; ObGlobalContext() { MEMSET(this, 0, sizeof(*this)); init(); } ObGlobalContext &operator = (const ObGlobalContext &other); diff --git a/src/observer/ob_srv_xlator_primary.cpp b/src/observer/ob_srv_xlator_primary.cpp index 0134d56e4..8c2f69c9b 100644 --- a/src/observer/ob_srv_xlator_primary.cpp +++ b/src/observer/ob_srv_xlator_primary.cpp @@ -49,6 +49,8 @@ #include "storage/tx_storage/ob_tenant_freezer_rpc.h" #include "observer/dbms_scheduler/ob_dbms_sched_job_rpc_processor.h" +#include "share/external_table/ob_external_table_file_rpc_processor.h" + using namespace oceanbase; using namespace oceanbase::observer; using namespace oceanbase::lib; @@ -225,4 +227,6 @@ void oceanbase::observer::init_srv_xlator_for_executor(ObSrvRpcXlator *xlator) { RPC_PROCESSOR(ObDASAsyncEraseP); RPC_PROCESSOR(ObRpcEraseIntermResultP, gctx_); RPC_PROCESSOR(ObDASAsyncAccessP, gctx_); + RPC_PROCESSOR(ObFlushExternalTableKVCacheP); + RPC_PROCESSOR(ObAsyncLoadExternalTableFileListP); } diff --git a/src/observer/virtual_table/ob_all_virtual_proxy_schema.cpp b/src/observer/virtual_table/ob_all_virtual_proxy_schema.cpp index de9e5dc49..3a1bc7f9d 100644 --- a/src/observer/virtual_table/ob_all_virtual_proxy_schema.cpp +++ b/src/observer/virtual_table/ob_all_virtual_proxy_schema.cpp @@ -1313,7 +1313,8 @@ int ObAllVirtualProxySchema::get_table_tablet_location_( // impossible } else if ((table_schema->is_vir_table()) || (table_schema->is_tmp_table()) - || (table_schema->is_view_table())) { + || (table_schema->is_view_table()) + || (table_schema->is_external_table())) { // virtual table use virtual tablet if (OB_FAIL(location_.init_fake_location())) { LOG_WARN("fail to init fake location", KR(ret), KPC(table_schema)); diff --git a/src/observer/virtual_table/ob_tenant_all_tables.cpp b/src/observer/virtual_table/ob_tenant_all_tables.cpp index bd5c75c50..74db8b50e 100644 --- a/src/observer/virtual_table/ob_tenant_all_tables.cpp +++ b/src/observer/virtual_table/ob_tenant_all_tables.cpp @@ -485,6 +485,7 @@ int ObTenantAllTables::inner_get_next_row() if (!table_schema->is_user_table() && !table_schema->is_sys_table() && !table_schema->is_view_table() + && !table_schema->is_external_table() && !is_information_schema_database_id(table_schema->get_database_id()) && !is_mysql_database_id(table_schema->get_database_id())) { is_allow = false; diff --git a/src/observer/virtual_table/ob_tenant_show_tables.cpp b/src/observer/virtual_table/ob_tenant_show_tables.cpp index 553cdb985..f93f8dfce 100644 --- a/src/observer/virtual_table/ob_tenant_show_tables.cpp +++ b/src/observer/virtual_table/ob_tenant_show_tables.cpp @@ -184,6 +184,7 @@ int ObTenantShowTables::inner_get_next_row() if ((!table_schema->is_user_table() && !table_schema->is_sys_table() && !table_schema->is_view_table() + && !table_schema->is_external_table() && !is_information_schema_database_id(table_schema->get_database_id()) && !is_mysql_database_id(table_schema->get_database_id())) || table_schema->is_user_hidden_table()) { diff --git a/src/pl/sys_package/ob_dbms_stats.cpp b/src/pl/sys_package/ob_dbms_stats.cpp index ef34b80d7..a8edae27e 100644 --- a/src/pl/sys_package/ob_dbms_stats.cpp +++ b/src/pl/sys_package/ob_dbms_stats.cpp @@ -117,8 +117,8 @@ int ObDbmsStats::gather_table_stats(ObExecContext &ctx, ParamStore ¶ms, ObOb stat_param, &running_monitor))) { LOG_WARN("failed to update stat cache", K(ret)); - } else if (is_virtual_table(stat_param.table_id_)) {//not gather virtual table index. - //do nothing + } else if (!need_gather_index_stats(stat_param)) { + //not gather virtual table/external table index. } else if (stat_param.cascade_ && OB_FAIL(fast_gather_index_stats(ctx, stat_param, is_all_fast_gather, no_gather_index_ids))) { @@ -224,6 +224,8 @@ int ObDbmsStats::gather_schema_stats(ObExecContext &ctx, ParamStore ¶ms, ObO } else { LOG_WARN("failed check stat locked", K(ret)); } + } else if (share::schema::ObTableType::EXTERNAL_TABLE == stat_param.ref_table_type_) { + // not allow gather external table in schema scope } else if (OB_FAIL(ObDbmsStatsExecutor::gather_table_stats(ctx, stat_param))) { LOG_WARN("failed to gather table stats", K(ret)); } else if (OB_FAIL(update_stat_cache(ctx.get_my_session()->get_rpc_tenant_id(), @@ -3068,6 +3070,7 @@ int ObDbmsStats::parse_table_part_info(ObExecContext &ctx, LOG_WARN("failed to parse partition name", K(ret)); } else { param.table_id_ = table_schema->get_table_id(); + param.ref_table_type_ = table_schema->get_table_type(); param.part_level_ = table_schema->get_part_level(); param.total_part_cnt_ = table_schema->get_all_part_num(); // we can't get part/subpart type anyway, because default value of part_func_type is @@ -3120,6 +3123,7 @@ int ObDbmsStats::parse_table_part_info(ObExecContext &ctx, LOG_WARN("failed to init column stat params", K(ret)); } else { param.table_id_ = table_schema->get_table_id(); + param.ref_table_type_ = table_schema->get_table_type(); param.part_level_ = table_schema->get_part_level(); param.total_part_cnt_ = table_schema->get_all_part_num(); } @@ -3184,6 +3188,7 @@ int ObDbmsStats::parse_index_part_info(ObExecContext &ctx, } if (OB_SUCC(ret)) { param.table_id_ = index_schema->get_table_id(); + param.ref_table_type_ = index_schema->get_table_type(); param.part_level_ = index_schema->get_part_level(); param.total_part_cnt_ = index_schema->get_all_part_num(); param.is_global_index_ = index_schema->is_global_index_table(); @@ -3370,6 +3375,7 @@ int ObDbmsStats::parse_set_table_info(ObExecContext &ctx, LOG_WARN("failed to init column stat params", K(ret)); } else { param.table_id_ = table_schema->get_table_id(); + param.ref_table_type_ = table_schema->get_table_type(); param.part_level_ = table_schema->get_part_level(); decide_modified_part(param, false /* cascade_part */); } @@ -3451,6 +3457,7 @@ int ObDbmsStats::parse_set_column_stats(ObExecContext &ctx, LOG_WARN("failed to parser part info", K(ret)); } else { param.table_id_ = table_schema->get_table_id(); + param.ref_table_type_ = table_schema->get_table_type(); param.part_level_ = table_schema->get_part_level(); decide_modified_part(param, false /* cascade_part */); } @@ -3614,6 +3621,7 @@ int ObDbmsStats::parse_table_info(ObExecContext &ctx, } if (OB_SUCC(ret) && table_schema != NULL && !table_schema->is_view_table()) { param.table_id_ = table_schema->get_table_id(); + param.ref_table_type_ = table_schema->get_table_type(); param.part_level_ = table_schema->get_part_level(); if (OB_FAIL(set_param_global_part_id(ctx, param))) { LOG_WARN("failed to set param globa part id", K(ret)); @@ -3663,6 +3671,7 @@ int ObDbmsStats::parse_table_info(ObExecContext &ctx, } if (OB_SUCC(ret) && table_schema != NULL && !table_schema->is_view_table()) { param.table_id_ = table_schema->get_table_id(); + param.ref_table_type_ = table_schema->get_table_type(); param.part_level_ = table_schema->get_part_level(); if (OB_FAIL(set_param_global_part_id(ctx, param))) { LOG_WARN("failed to set param globa part id", K(ret)); @@ -3719,6 +3728,7 @@ int ObDbmsStats::parse_index_table_info(ObExecContext &ctx, param.tenant_id_ = data_table_param.tenant_id_; param.db_id_ = data_table_param.db_id_; param.table_id_ = index_schema->get_table_id(); + param.ref_table_type_ = index_schema->get_table_type(); param.part_level_ = index_schema->get_part_level(); if (OB_FAIL(set_param_global_part_id(ctx, param))) { LOG_WARN("failed to set param globa part id", K(ret)); @@ -5210,7 +5220,7 @@ int ObDbmsStats::get_need_statistics_tables(sql::ObExecContext &ctx, ObGatherTab table_schema->get_table_id(), is_valid))) { LOG_WARN("failed to check sy table validity", K(ret)); - } else if (!is_valid) { + } else if (!is_valid || table_schema->is_external_table()) { // only gather statistics for following tables: // 1. user table // 2. valid sys table @@ -5594,8 +5604,8 @@ int ObDbmsStats::gather_table_stats_with_default_param(ObExecContext &ctx, duration_time, stat_param.duration_time_))) { LOG_WARN("failed to get valid duration time", K(ret)); - } else if (is_virtual_table(stat_param.table_id_)) {//not gather virtual table index. - //do nothing + } else if (!need_gather_index_stats(stat_param)) { + LOG_TRACE("Succeed to gather table stats", K(stat_param)); } else if (stat_param.cascade_ && OB_FAIL(fast_gather_index_stats(ctx, stat_param, is_all_fast_gather, no_gather_index_ids))) { @@ -6010,6 +6020,12 @@ bool ObDbmsStats::is_func_index(const ObTableStatParam &index_param) return is_true; } +bool ObDbmsStats::need_gather_index_stats(const ObTableStatParam ¶m) +{ + return !(is_virtual_table(param.table_id_) || + share::schema::ObTableType::EXTERNAL_TABLE == param.ref_table_type_); +} + /** * @brief ObDbmsStats::parse_granularity * @param ctx diff --git a/src/pl/sys_package/ob_dbms_stats.h b/src/pl/sys_package/ob_dbms_stats.h index b86e95898..42e4947bb 100644 --- a/src/pl/sys_package/ob_dbms_stats.h +++ b/src/pl/sys_package/ob_dbms_stats.h @@ -549,6 +549,8 @@ private: static bool is_func_index(const ObTableStatParam &index_param); + static bool need_gather_index_stats(const ObTableStatParam &table_param); + static int resovle_granularity(ObGranularityType granu_type, ObTableStatParam ¶m); static void decide_modified_part(ObTableStatParam ¶m, const bool cascade_parts); diff --git a/src/rootserver/ob_ddl_operator.cpp b/src/rootserver/ob_ddl_operator.cpp index 82440d86d..332639f1e 100644 --- a/src/rootserver/ob_ddl_operator.cpp +++ b/src/rootserver/ob_ddl_operator.cpp @@ -75,6 +75,7 @@ #include "storage/tx/ob_i_ts_source.h" #include "share/stat/ob_dbms_stats_maintenance_window.h" #include "share/scn.h" +#include "share/external_table/ob_external_table_file_mgr.h" namespace oceanbase { @@ -1492,7 +1493,7 @@ int ObDDLOperator::create_table(ObTableSchema &table_schema, } // add audit in table if necessary - if (OB_SUCC(ret) && !is_truncate_table && table_schema.is_user_table()) { + if (OB_SUCC(ret) && !is_truncate_table && (table_schema.is_user_table() || table_schema.is_external_table())) { const uint64_t tenant_id = table_schema.get_tenant_id(); ObArray audits; @@ -4214,8 +4215,15 @@ int ObDDLOperator::drop_table( } if (OB_FAIL(ret)) { - } else if (OB_FAIL(drop_tablet_of_table(table_schema, trans))) { - LOG_WARN("fail to drop tablet", K(table_schema), KR(ret)); + } else if (table_schema.is_external_table()) { + if (OB_FAIL(ObExternalTableFileManager::get_instance().clear_inner_table_files( + table_schema.get_tenant_id(), table_schema.get_table_id(), trans))) { + LOG_WARN("delete external table file list failed", K(ret)); + } + } else { + if (OB_FAIL(drop_tablet_of_table(table_schema, trans))) { + LOG_WARN("fail to drop tablet", K(table_schema), KR(ret)); + } } return ret; @@ -4274,7 +4282,7 @@ int ObDDLOperator::drop_table_for_not_dropped_schema( } // delete audit in table - if (OB_SUCC(ret) && table_schema.is_user_table()) { + if (OB_SUCC(ret) && (table_schema.is_user_table() || table_schema.is_external_table())) { ObArray audits; if (OB_FAIL(schema_guard.get_audit_schema_in_owner(tenant_id, AUDIT_TABLE, diff --git a/src/rootserver/ob_ddl_service.cpp b/src/rootserver/ob_ddl_service.cpp index 8a334d926..258459a97 100644 --- a/src/rootserver/ob_ddl_service.cpp +++ b/src/rootserver/ob_ddl_service.cpp @@ -801,7 +801,7 @@ int ObDDLService::generate_tablet_id(ObTableSchema &table_schema) LOG_WARN("part level is unexpected", K(table_schema), K(ret)); } else if (is_sys_table(table_schema.get_table_id())) { table_schema.set_tablet_id(table_schema.get_table_id()); - } else if (table_schema.is_vir_table() || table_schema.is_view_table()) { + } else if (table_schema.is_vir_table() || table_schema.is_view_table() || table_schema.is_external_table()) { } else if ((tablet_num = table_schema.get_all_part_num()) <= 0) { ret = OB_ERR_UNEXPECTED; LOG_WARN("fail to get tablet num", K(table_schema), K(ret), K(tablet_num)); @@ -11108,7 +11108,7 @@ int ObDDLService::do_offline_ddl_in_trans(obrpc::ObAlterTableArg &alter_table_ar alter_table_arg.consumer_group_id_, &alter_table_arg.allocator_, &alter_table_arg); - if (orig_table_schema->is_tmp_table()) { + if (orig_table_schema->is_tmp_table() || orig_table_schema->is_external_table()) { ret = OB_OP_NOT_ALLOW; char err_msg[OB_MAX_ERROR_MSG_LEN] = {0}; (void)snprintf(err_msg, sizeof(err_msg), "%s on temporary table is", ddl_type_str(ddl_type)); @@ -11343,7 +11343,9 @@ int ObDDLService::get_and_check_table_schema( LOG_WARN("can not alter table in recyclebin", K(ret), K(alter_table_arg), K(is_db_in_recyclebin)); } else if (!orig_table_schema->is_user_table() - && !orig_table_schema->is_sys_table() && !orig_table_schema->is_tmp_table()) { + && !orig_table_schema->is_sys_table() + && !orig_table_schema->is_tmp_table() + && !orig_table_schema->is_external_table()) { ret = OB_ERR_WRONG_OBJECT; LOG_USER_ERROR(OB_ERR_WRONG_OBJECT, to_cstring(origin_database_name), to_cstring(origin_table_name), "BASE TABLE"); @@ -16712,7 +16714,7 @@ int ObDDLService::check_table_schema_is_legal(const ObDatabaseSchema & database_ } else if (0 != table_schema.get_autoinc_column_id()) { ret = OB_ERR_PARALLEL_DDL_CONFLICT; LOG_WARN("table with autoinc column should not get in new_truncate_table", KR(ret), K(table_id), K(table_name), K(database_name)); - } else if (table_schema.is_sys_table()) { + } else if (table_schema.is_sys_table() || table_schema.is_external_table()) { ret = OB_NOT_SUPPORTED; LOG_WARN("truncate table is not supported on system table", KR(ret), K(table_id), K(table_name)); } else if (table_schema.is_index_table() || table_schema.is_aux_vp_table() || table_schema.is_aux_lob_table()) { @@ -16869,7 +16871,7 @@ int ObDDLService::truncate_table(const ObTruncateTableArg &arg, ret = OB_NOT_SUPPORTED; LOG_WARN("truncate table is not supported on index or aux vp table", K(ret)); } else if (!orig_table_schema->is_user_table() && !orig_table_schema->is_tmp_table()) { - if (orig_table_schema->is_sys_table()) { + if (orig_table_schema->is_sys_table() || orig_table_schema->is_external_table()) { ret = OB_NOT_SUPPORTED; LOG_WARN("truncate table is not supported on system table", K(ret)); } else { @@ -17359,6 +17361,8 @@ int ObDDLService::rebuild_table_schema_with_new_id(const ObTableSchema &orig_tab new_table_schema.set_table_type(USER_TABLE); } else if (orig_table_schema.is_sys_view()) { new_table_schema.set_table_type(USER_VIEW); + } else if (orig_table_schema.is_external_table()) { + new_table_schema.set_table_type(EXTERNAL_TABLE); } if (new_table_schema.is_user_table() && (TMP_TABLE == table_type_ || TMP_TABLE_ORA_SESS == table_type_)) { @@ -19043,7 +19047,7 @@ int ObDDLService::check_table_exists(const uint64_t tenant_id, LOG_WARN("Table type not equal!", K(expected_table_type), K(table_item), K(*tmp_table_schema), K(ret)); } } else if (USER_TABLE == expected_table_type) { - if (!tmp_table_schema->is_table() && !tmp_table_schema->is_tmp_table()) { + if (!tmp_table_schema->is_table() && !tmp_table_schema->is_tmp_table() && !tmp_table_schema->is_external_table()) { ret = OB_TABLE_NOT_EXIST; LOG_WARN("Table type not equal!", K(expected_table_type), K(table_item), K(ret)); } else { /*maybe SYS_TABLE or VIRTUAL TABLE */ } @@ -19567,7 +19571,7 @@ int ObDDLService::drop_table(const ObDropTableArg &drop_table_arg, const obrpc:: } else { bool to_recyclebin = drop_table_arg.to_recyclebin_; bool has_conflict_ddl = false; - if (table_schema->get_table_type() == MATERIALIZED_VIEW || table_schema->is_tmp_table()) { + if (table_schema->get_table_type() == MATERIALIZED_VIEW || table_schema->is_tmp_table() || table_schema->is_external_table()) { to_recyclebin = false; } if (drop_table_arg.table_type_ == USER_TABLE && OB_FAIL(ObDDLTaskRecordOperator::check_has_conflict_ddl( @@ -32207,7 +32211,7 @@ int ObDDLService::handle_rls_policy_ddl(const obrpc::ObRlsPolicyDDLArg &arg) } else if (is_db_in_recyclebin) { ret = OB_ERR_OPERATION_ON_RECYCLE_OBJECT; LOG_WARN("database of rls table is in recyclebin", KR(ret), KPC(table_schema)); - } else if (!table_schema->is_user_table() && !table_schema->is_view_table()) { + } else if (!table_schema->is_user_table() && !table_schema->is_view_table() && !table_schema->is_external_table()) { ret = OB_NOT_SUPPORTED; LOG_WARN("only support rls on user table or user view", KR(ret), KPC(table_schema)); LOG_USER_ERROR(OB_NOT_SUPPORTED, "policy on non-user table"); @@ -32334,7 +32338,7 @@ int ObDDLService::handle_rls_group_ddl(const obrpc::ObRlsGroupDDLArg &arg) } else if (is_db_in_recyclebin) { ret = OB_ERR_OPERATION_ON_RECYCLE_OBJECT; LOG_WARN("database of rls table is in recyclebin", KR(ret), KPC(table_schema)); - } else if (!table_schema->is_user_table() && !table_schema->is_view_table()) { + } else if (!table_schema->is_user_table() && !table_schema->is_view_table() && !table_schema->is_external_table()) { ret = OB_NOT_SUPPORTED; LOG_WARN("only support rls on user table or user view", KR(ret), KPC(table_schema)); LOG_USER_ERROR(OB_NOT_SUPPORTED, "policy on non-user table"); @@ -32441,7 +32445,7 @@ int ObDDLService::handle_rls_context_ddl(const obrpc::ObRlsContextDDLArg &arg) } else if (is_db_in_recyclebin) { ret = OB_ERR_OPERATION_ON_RECYCLE_OBJECT; LOG_WARN("database of rls table is in recyclebin", KR(ret), KPC(table_schema)); - } else if (!table_schema->is_user_table() && !table_schema->is_view_table()) { + } else if (!table_schema->is_user_table() && !table_schema->is_view_table() && !table_schema->is_external_table()) { ret = OB_NOT_SUPPORTED; LOG_WARN("only support rls on user table or user view", KR(ret), KPC(table_schema)); LOG_USER_ERROR(OB_NOT_SUPPORTED, "policy on non-user table"); diff --git a/src/share/CMakeLists.txt b/src/share/CMakeLists.txt index 52412ce4b..8363c798f 100644 --- a/src/share/CMakeLists.txt +++ b/src/share/CMakeLists.txt @@ -449,6 +449,13 @@ ob_set_subtarget(ob_share stat stat/ob_opt_ds_stat_cache.cpp ) +ob_set_subtarget(ob_share external_table + external_table/ob_external_table_file_mgr.cpp + external_table/ob_external_table_file_rpc_processor.cpp + external_table/ob_external_table_file_task.cpp + external_table/ob_external_table_utils.cpp +) + ob_set_subtarget(ob_share io io/ob_io_define.cpp io/io_schedule/ob_io_mclock.cpp diff --git a/src/share/backup/ob_backup_io_adapter.cpp b/src/share/backup/ob_backup_io_adapter.cpp index 3f70cceea..845b52d24 100644 --- a/src/share/backup/ob_backup_io_adapter.cpp +++ b/src/share/backup/ob_backup_io_adapter.cpp @@ -703,6 +703,36 @@ int ObFileListArrayOp::func(const dirent *entry) return ret; } + +int ObFullPathArrayOp::func(const dirent *entry) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(entry)) { + ret = OB_INVALID_ARGUMENT; + OB_LOG(WARN, "invalid list entry, entry is null"); + } else if (OB_ISNULL(entry->d_name)) { + ret = OB_INVALID_ARGUMENT; + OB_LOG(WARN, "invalid list entry, d_name is null"); + } else { + ObSqlString full_path; + const ObString file_name(entry->d_name); + ObString tmp_file; + if (OB_FAIL(full_path.assign(path_))) { + OB_LOG(WARN, "assign string failed", K(ret)); + } else if (full_path.length() > 0 && *(full_path.ptr() + full_path.length() - 1) != '/' && + OB_FAIL(full_path.append("/"))) { + OB_LOG(WARN, "append failed", K(ret)) ; + } else if (OB_FAIL(full_path.append(file_name))) { + OB_LOG(WARN, "append file name failed", K(ret)); + } else if (OB_FAIL(ob_write_string(allocator_, full_path.string(), tmp_file))) { + OB_LOG(WARN, "fail to save file name", K(ret), K(file_name)); + } else if (OB_FAIL(name_array_.push_back(tmp_file))) { + OB_LOG(WARN, "fail to push filename to array", K(ret), K(tmp_file)); + } + } + return ret; +} + //*************ObDirPrefixEntryNameFilter************* int ObDirPrefixEntryNameFilter::func(const dirent *entry) { diff --git a/src/share/backup/ob_backup_io_adapter.h b/src/share/backup/ob_backup_io_adapter.h index 26085b9ad..7ce431c6f 100644 --- a/src/share/backup/ob_backup_io_adapter.h +++ b/src/share/backup/ob_backup_io_adapter.h @@ -113,6 +113,20 @@ private: common::ObIAllocator& allocator_; }; +class ObFullPathArrayOp : public ObBaseDirEntryOperator +{ +public: + ObFullPathArrayOp(common::ObIArray &name_array, common::ObString &path, + common::ObIAllocator &array_allocator) + : name_array_(name_array), path_(path), allocator_(array_allocator) {} + ~ObFullPathArrayOp() {} + int func(const dirent *entry) ; +private: + common::ObIArray &name_array_; + common::ObString &path_; + common::ObIAllocator &allocator_; +}; + class ObDirPrefixEntryNameFilter : public ObBaseDirEntryOperator { public: diff --git a/src/share/external_table/ob_external_table_file_mgr.cpp b/src/share/external_table/ob_external_table_file_mgr.cpp new file mode 100644 index 000000000..4d590278f --- /dev/null +++ b/src/share/external_table/ob_external_table_file_mgr.cpp @@ -0,0 +1,512 @@ +/** + * 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. + */ + +#define USING_LOG_PREFIX SHARE +#include "lib/oblog/ob_log.h" +#include "lib/oblog/ob_log_module.h" +#include "lib/string/ob_sql_string.h" +#include "lib/mysqlclient/ob_mysql_proxy.h" +#include "lib/mysqlclient/ob_mysql_transaction.h" +#include "lib/mysqlclient/ob_mysql_result.h" +#include "lib/mysqlclient/ob_mysql_connection.h" +#include "lib/mysqlclient/ob_mysql_statement.h" +#include "lib/mysqlclient/ob_mysql_connection_pool.h" +#include "lib/utility/ob_print_utils.h" +#include "lib/compress/ob_compressor_pool.h" +#include "share/ob_dml_sql_splicer.h" +#include "share/config/ob_server_config.h" +#include "share/schema/ob_schema_utils.h" +#include "share/schema/ob_schema_service.h" +#include "share/inner_table/ob_inner_table_schema_constants.h" +#include "observer/ob_sql_client_decorator.h" +#include "observer/ob_server_struct.h" +#include "lib/charset/ob_charset.h" +#include "share/schema/ob_schema_service_sql_impl.h" +#include "ob_external_table_file_mgr.h" +#include "storage/tablelock/ob_table_lock_service.h" +#include "observer/ob_inner_sql_connection.h" +#include "sql/engine/table/ob_external_table_access_service.h" +#include "share/external_table/ob_external_table_utils.h" +namespace oceanbase +{ +using namespace observer; +using namespace common; +using namespace transaction::tablelock; +namespace share +{ + +int ObExternalTableFilesKey::deep_copy(char *buf, const int64_t buf_len, ObIKVCacheKey *&key) const +{ + int ret = OB_SUCCESS; + ObExternalTableFilesKey *new_value = NULL; + ObDataBuffer allocator(buf, buf_len); + if (OB_ISNULL(new_value = OB_NEWx(ObExternalTableFilesKey, &allocator))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("fail to allocate memory", K(ret)); + } else { + new_value->tenant_id_ = this->tenant_id_; + new_value->table_id_ = this->table_id_; + new_value->partition_id_ = this->partition_id_; + key = new_value; + } + return ret; + } + +int64_t ObExternalTableFiles::size() const +{ + int64_t size = sizeof(*this) + sizeof(ObString) * file_urls_.count() + sizeof(int64_t) * file_ids_.count(); + for (int i = 0; i < file_urls_.count(); ++i) { + size += file_urls_.at(i).length(); + } + return size; + } + +int ObExternalTableFiles::deep_copy(char *buf, const int64_t buf_len, ObIKVCacheValue *&value) const +{ + int ret = OB_SUCCESS; + ObDataBuffer allocator(buf, buf_len); + ObExternalTableFiles *new_value = NULL; + if (OB_ISNULL(new_value = OB_NEWx(ObExternalTableFiles, &allocator))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("fail to allocate memory", K(ret)); + } + + if (OB_SUCC(ret) && this->file_urls_.count() > 0) { + if (OB_FAIL(new_value->file_urls_.allocate_array(allocator, this->file_urls_.count()))) { + LOG_WARN("fail to allocate array", K(ret)); + } else { + for (int i = 0; OB_SUCC(ret) && i < this->file_urls_.count(); i++) { + OZ (ob_write_string(allocator, this->file_urls_.at(i), new_value->file_urls_.at(i))); + } + } + } + + if (OB_SUCC(ret) && this->file_ids_.count() > 0) { + if (OB_FAIL(new_value->file_ids_.allocate_array(allocator, this->file_ids_.count()))) { + LOG_WARN("fail to allocate array", K(ret)); + } else { + MEMCPY(new_value->file_ids_.get_data(), this->file_ids_.get_data(), + sizeof(int64_t) * this->file_ids_.count()); + } + } + if (OB_SUCC(ret)) { + new_value->create_ts_ = this->create_ts_; + } + value = new_value; + return ret; +} + +int ObExternalTableFileManager::flush_cache(const uint64_t tenant_id, const uint64_t table_id) +{ + int ret = OB_SUCCESS; + ObExternalTableFilesKey key; + key.tenant_id_ = tenant_id; + key.table_id_ = table_id; + key.partition_id_ = 0; + if (OB_FAIL(kv_cache_.erase(key))) { + if (OB_ENTRY_NOT_EXIST != ret) { + LOG_WARN("fail to erase value", K(ret), K(key)); + } else { + ret = OB_SUCCESS; + } + } + return ret; +} + +int ObExternalTableFileManager::clear_inner_table_files( + const uint64_t tenant_id, + const uint64_t table_id, + ObMySQLTransaction &trans) +{ + int ret = OB_SUCCESS; + ObSqlString delete_sql; + int64_t affected_rows = 0; + OZ (delete_sql.assign_fmt("DELETE FROM %s WHERE TABLE_ID = %lu AND PART_ID = %lu", + OB_ALL_EXTERNAL_TABLE_FILE_TNAME, table_id, 0L)); + OZ (trans.write(tenant_id, delete_sql.ptr(), affected_rows)); + LOG_DEBUG("check clear rows", K(affected_rows)); + return ret; +} + +int ObExternalTableFileManager::init() +{ + int ret = OB_SUCCESS; + OZ (kv_cache_.init("external_table_file_cache")); + return ret; +} + +ObExternalTableFileManager &ObExternalTableFileManager::get_instance() +{ + static ObExternalTableFileManager instance_; + return instance_; +} + +int ObExternalTableFileManager::get_external_files( + const uint64_t tenant_id, + const uint64_t table_id, + const bool is_local_file_on_disk, + ObIAllocator &allocator, + ObIArray &external_files, + ObIArray *range_filter /*default = NULL*/) +{ + return get_external_files_by_part_id(tenant_id, table_id, 0UL, is_local_file_on_disk, allocator, external_files, range_filter); +} + +int ObExternalTableFileManager::get_external_files_by_part_id( + const uint64_t tenant_id, + const uint64_t table_id, + const uint64_t partition_id, + const bool is_local_file_on_disk, + ObIAllocator &allocator, + ObIArray &external_files, + ObIArray *range_filter /*default = NULL*/) +{ + int ret = OB_SUCCESS; + ObKVCacheHandle handle; + const ObExternalTableFiles *ext_files = NULL; + ObExternalTableFilesKey key; + key.tenant_id_ = tenant_id; + key.table_id_ = table_id; + key.partition_id_ = partition_id; + if (OB_FAIL(kv_cache_.get(key, ext_files, handle))) { + if (OB_ENTRY_NOT_EXIST != ret) { + LOG_WARN("fail to get from KVCache", K(ret), K(key)); + } + } + + if ((OB_SUCC(ret) && is_cache_value_timeout(*ext_files)) + || OB_ENTRY_NOT_EXIST == ret) { + if (OB_FAIL(fill_cache_from_inner_table(key, ext_files, handle))) { + LOG_WARN("fail to fill cache from inner table", K(ret)); + } + } + + for (int i = 0; OB_SUCC(ret) && i < ext_files->file_urls_.count(); ++i) { + bool in_ranges = false; + if (range_filter != NULL && OB_FAIL(ObExternalTableUtils::is_file_id_in_ranges(*range_filter, + ext_files->file_ids_.at(i), + in_ranges))) { + LOG_WARN("failed to judge file id in ranges", K(ret)); + } else if (range_filter == NULL || in_ranges) { + ObExternalFileInfo file_info; + ObString file_url = ext_files->file_urls_.at(i); + file_info.file_id_ = ext_files->file_ids_.at(i); + if (is_local_file_on_disk) { + ObString ip_port = file_url.split_on('%'); + OZ (file_info.file_addr_.parse_from_string(ip_port)); + } + OZ (ob_write_string(allocator, file_url, file_info.file_url_)); + OZ (external_files.push_back(file_info)); + } + } + LOG_DEBUG("get external file list result", K(table_id), K(external_files)); + return ret; +} + +int ObExternalTableFileManager::update_inner_table_file_list( + const uint64_t tenant_id, + const uint64_t table_id, + ObIArray &file_urls, + ObIArray &file_sizes) +{ + int ret = OB_SUCCESS; + ObMySQLTransaction trans; + OZ (trans.start(GCTX.sql_proxy_, tenant_id)); + OZ (lock_for_refresh(trans, tenant_id, table_id)); + OZ (update_inner_table_files_list_one_part(tenant_id, table_id, 0, trans, file_urls, file_sizes)); + OZ (trans.end(true)); + + if (trans.is_started()) { + trans.end(false); + } + return ret; +} + +int ObExternalTableFileManager::get_external_file_list_on_device(const ObString &location, + ObIArray &file_urls, + ObIArray &file_sizes, + const ObString &access_info, + ObIAllocator &allocator) +{ + int ret = OB_SUCCESS; + sql::ObExternalDataAccessDriver driver; + if (OB_FAIL(driver.init(location, access_info))) { + LOG_WARN("init external data access driver failed", K(ret)); + } else if (OB_FAIL(driver.get_file_list(location, file_urls, allocator))) { + LOG_WARN("get file urls failed", K(ret)); + } else if (OB_FAIL(driver.get_file_sizes(location, file_urls, file_sizes))) { + LOG_WARN("get file sizes failed", K(ret)); + } + if (driver.is_opened()) { + driver.close(); + } + + LOG_DEBUG("show external table files", K(file_urls), K(access_info)); + return ret; +} + +int ObExternalTableFileManager::update_inner_table_files_list_one_part( + const uint64_t tenant_id, + const uint64_t table_id, + const uint64_t partition_id, + ObMySQLTransaction &trans, + ObIArray &file_urls, + ObIArray &file_sizes) +{ + int ret = OB_SUCCESS; + int64_t cur_time = ObTimeUtil::current_time(); + ObSEArray old_file_urls; + ObSEArray old_file_ids; + ObSEArray insert_file_urls; + ObSEArray insert_file_ids; + ObSEArray insert_file_sizes; + ObSEArray update_file_urls; + ObSEArray update_file_sizes; + ObSEArray update_file_ids; + ObSEArray delete_file_urls; + ObSEArray delete_file_ids; + ObArenaAllocator allocator; + ObSqlString update_sql; + ObSqlString insert_sql; + ObSqlString delete_sql; + int64_t update_rows = 0; + int64_t insert_rows = 0; + int64_t max_file_id = 0;// ObCSVTableRowIterator::MIN_EXTERNAL_TABLE_FILE_ID - 1 + common::hash::ObHashMap hash_map; + OZ(hash_map.create(std::max(file_urls.count(), old_file_urls.count()) + 1, "ExternalFile")); + OZ(get_all_records_from_inner_table(allocator, tenant_id, table_id, partition_id, old_file_urls, old_file_ids)); + for (int64_t i = 0; OB_SUCC(ret) && i < old_file_urls.count(); i++) { + OZ(hash_map.set_refactored(old_file_urls.at(i), old_file_ids.at(i))); + max_file_id = old_file_ids.at(i) > max_file_id ? old_file_ids.at(i) : max_file_id; + } + + for (int64_t i = 0; OB_SUCC(ret) && i < file_urls.count(); i++) { + int64_t file_id = 0; + OZ(hash_map.get_refactored(file_urls.at(i), file_id)); + if (ret == OB_HASH_NOT_EXIST) { + ret = OB_SUCCESS; + OZ(insert_file_urls.push_back(file_urls.at(i))); + OZ(insert_file_sizes.push_back(file_sizes.at(i))); + OZ(insert_file_ids.push_back(++max_file_id)); + } else if (ret == OB_SUCCESS) { + OZ(update_file_urls.push_back(file_urls.at(i))); + OZ(update_file_sizes.push_back(file_sizes.at(i))); + OZ(update_file_ids.push_back(file_id)); + } + } + OZ(hash_map.reuse()); + for (int64_t i = 0; OB_SUCC(ret) && i < file_urls.count(); i++) { + OZ(hash_map.set_refactored(file_urls.at(i), 1)); + } + for (int64_t i = 0; OB_SUCC(ret) && i < old_file_urls.count(); i++) { + int64_t existed = 0; + OZ(hash_map.get_refactored(old_file_urls.at(i), existed)); + if (ret == OB_HASH_NOT_EXIST) { + ret = OB_SUCCESS; + OZ(delete_file_urls.push_back(old_file_urls.at(i))); + OZ(delete_file_ids.push_back(old_file_ids.at(i))); + } + } + if (OB_SUCC(ret) && delete_file_urls.count() > 0) { + OZ(delete_sql.assign_fmt("UPDATE %s SET DELETE_VERSION = %ld WHERE (TABLE_ID, PART_ID, FILE_ID) IN (", + OB_ALL_EXTERNAL_TABLE_FILE_TNAME, cur_time)); + for (int64_t i = 0; OB_SUCC(ret) && i < delete_file_urls.count(); i++) { + OZ(delete_sql.append_fmt("%c(%ld, %ld, %ld)", (0 == i) ? ' ' : ',', table_id, partition_id, + delete_file_ids.at(i))); + } + OZ(delete_sql.append(")")); + OZ(trans.write(tenant_id, delete_sql.ptr(), update_rows)); + } + if (OB_SUCC(ret) && update_file_urls.count() > 0) { + for (int64_t i = 0; OB_SUCC(ret) && i < update_file_urls.count(); i++) { + OZ(update_sql.assign_fmt("UPDATE %s SET" + " CREATE_VERSION = CASE WHEN DELETE_VERSION != %ld THEN %ld ELSE CREATE_VERSION end," + " DELETE_VERSION = %ld, FILE_SIZE = %ld WHERE TABLE_ID = %lu AND PART_ID = %lu AND FILE_ID=%ld", + OB_ALL_EXTERNAL_TABLE_FILE_TNAME, + MAX_VERSION, cur_time, + MAX_VERSION, update_file_sizes.at(i), table_id, partition_id, + update_file_ids.at(i))); + OZ (trans.write(tenant_id, update_sql.ptr(), update_rows)); + } + } + if (OB_SUCC(ret) && insert_file_urls.count() > 0) { + OZ(insert_sql.assign_fmt("INSERT INTO %s(TABLE_ID,PART_ID,FILE_ID,FILE_URL,CREATE_VERSION,DELETE_VERSION,FILE_SIZE) VALUES", + OB_ALL_EXTERNAL_TABLE_FILE_TNAME)); + for (int64_t i = 0; OB_SUCC(ret) && i < insert_file_urls.count(); i++) { + OZ(insert_sql.append_fmt("%c(%lu,%lu,%ld,'%.*s',%ld,%ld,%ld)", + (0 == i) ? ' ' : ',', table_id, partition_id, + insert_file_ids.at(i), + insert_file_urls.at(i).length(), insert_file_urls.at(i).ptr(), + cur_time, MAX_VERSION, insert_file_sizes.at(i))); + } + OZ(trans.write(tenant_id, insert_sql.ptr(), insert_rows)); + } + + return ret; +} + +int ObExternalTableFileManager::get_all_records_from_inner_table(ObIAllocator &allocator, + int64_t tenant_id, + int64_t table_id, + int64_t partition_id, + ObIArray &file_urls, + ObIArray &file_ids) +{ + int ret = OB_SUCCESS; + SMART_VAR(ObMySQLProxy::MySQLResult, res) { + sqlclient::ObMySQLResult *result = NULL; + ObSqlString sql; + OZ (sql.append_fmt("SELECT file_url, file_id FROM %s" + " WHERE table_id = %lu AND part_id = %lu", + OB_ALL_EXTERNAL_TABLE_FILE_TNAME, table_id, partition_id)); + OZ (GCTX.sql_proxy_->read(res, tenant_id, sql.ptr())); + if (OB_SUCC(ret)) { + if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("result is null", K(ret)); + } else { + while (OB_SUCC(result->next())) { + ObString file_url; + int64_t file_id; + EXTRACT_VARCHAR_FIELD_MYSQL(*result, "file_url", file_url); + EXTRACT_INT_FIELD_MYSQL(*result, "file_id", file_id, int64_t); + ObString tmp_url; + OZ (ob_write_string(allocator, file_url, tmp_url)); + OZ (file_urls.push_back(tmp_url)); + OZ (file_ids.push_back(file_id)); + } + if (OB_FAIL(ret) && OB_ITER_END != ret) { + LOG_WARN("get next result failed", K(ret)); + } else { + ret = OB_SUCCESS; + } + } + } + } + return ret; +} +int ObExternalTableFileManager::fill_cache_from_inner_table( + const ObExternalTableFilesKey &key, + const ObExternalTableFiles *&ext_files, + ObKVCacheHandle &handle) +{ + int ret = OB_SUCCESS; + + //only one worker need do the job + int64_t bucket_id = key.hash() % LOAD_CACHE_LOCK_CNT; + int64_t total_wait_secs = 0; + + while (OB_FAIL(fill_cache_locks_[bucket_id].lock(LOCK_TIMEOUT)) + && OB_TIMEOUT == ret && !THIS_WORKER.is_timeout()) { + total_wait_secs += LOAD_CACHE_LOCK_CNT; + LOG_WARN("fill external table cache wait", K(total_wait_secs)); + } + if (OB_SUCC(ret)) { + //try fetch again + if (OB_FAIL(kv_cache_.get(key, ext_files, handle))) { + if (OB_ENTRY_NOT_EXIST != ret) { + LOG_WARN("fail to get from KVCache", K(ret), K(key)); + } + } + + if ((OB_SUCC(ret) && is_cache_value_timeout(*ext_files)) + || OB_ENTRY_NOT_EXIST == ret) { + ret = OB_SUCCESS; + SMART_VAR(ObMySQLProxy::MySQLResult, res) { + sqlclient::ObMySQLResult *result = NULL; + ObSqlString sql; + int64_t cur_time = ObTimeUtil::current_time(); + + if (OB_ISNULL(GCTX.sql_proxy_)) { + ret = OB_ERR_UNEXPECTED; + } + + OZ (sql.append_fmt("SELECT file_url, file_id FROM %s" + " WHERE table_id = %lu AND part_id = %lu" + " AND create_version <=%ld AND %ld < delete_version", + OB_ALL_EXTERNAL_TABLE_FILE_TNAME, key.table_id_, key.partition_id_, + cur_time, cur_time)); + OZ (GCTX.sql_proxy_->read(res, key.tenant_id_, sql.ptr())); + + if (OB_SUCC(ret)) { + if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("result is null", K(ret)); + } else { + ObSEArray temp_file_urls; + ObSEArray temp_file_ids; + ObArenaAllocator allocator; + while (OB_SUCC(result->next())) { + ObString file_url; + ObString tmp_url; + int64_t file_id = INT64_MAX; + EXTRACT_VARCHAR_FIELD_MYSQL(*result, "file_url", tmp_url); + EXTRACT_INT_FIELD_MYSQL(*result, "file_id", file_id, int64_t); + OZ (ob_write_string(allocator, tmp_url, file_url)); + OZ (temp_file_urls.push_back(file_url)); + OZ (temp_file_ids.push_back(file_id)); + } + if (OB_FAIL(ret) && OB_ITER_END != ret) { + LOG_WARN("get next result failed", K(ret)); + } else { + ret = OB_SUCCESS; + } + if (OB_SUCC(ret)) { + ObExternalTableFiles temp_ext_files; + temp_ext_files.create_ts_ = cur_time; + temp_ext_files.file_urls_ = ObArrayWrap(temp_file_urls.get_data(), temp_file_urls.count()); + temp_ext_files.file_ids_ = ObArrayWrap(temp_file_ids.get_data(), temp_file_ids.count()); + OZ (kv_cache_.put_and_fetch(key, temp_ext_files, ext_files, handle, true)); + } + } + } + } + LOG_TRACE("external table fill cache", K(ext_files), K(key)); + } + } + if (fill_cache_locks_[bucket_id].self_locked()) { + fill_cache_locks_[bucket_id].unlock(); + } + return ret; +} + +int ObExternalTableFileManager::lock_for_refresh( + ObMySQLTransaction &trans, + const uint64_t tenant_id, + const uint64_t object_id) +{ + int ret = OB_SUCCESS; + ObInnerSQLConnection *conn = NULL; + if (OB_ISNULL(conn = dynamic_cast(trans.get_connection()))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("conn_ is NULL", KR(ret)); + } else { + ObLockObjRequest lock_arg; + lock_arg.obj_type_ = ObLockOBJType::OBJ_TYPE_EXTERNAL_TABLE_REFRESH; + lock_arg.obj_id_ = object_id; + lock_arg.owner_id_ = ObTableLockOwnerID(get_tid_cache()); + lock_arg.lock_mode_ = EXCLUSIVE; + lock_arg.op_type_ = ObTableLockOpType::IN_TRANS_COMMON_LOCK; + lock_arg.timeout_us_ = 1000L * 1000L * 2; //2s + while (OB_FAIL(conn->lock_obj(tenant_id, lock_arg)) && !THIS_WORKER.is_timeout()) { + LOG_WARN("lock failed try again", K(ret)); + } + } + + + return ret; +} + +OB_SERIALIZE_MEMBER(ObExternalFileInfo, file_url_, file_id_, file_addr_); + +} +} diff --git a/src/share/external_table/ob_external_table_file_mgr.h b/src/share/external_table/ob_external_table_file_mgr.h new file mode 100644 index 000000000..2e8922e6a --- /dev/null +++ b/src/share/external_table/ob_external_table_file_mgr.h @@ -0,0 +1,161 @@ +/** + * 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 _OB_EXTERNAL_TABLE_FILE_MANAGER_H_ +#define _OB_EXTERNAL_TABLE_FILE_MANAGER_H_ + +#include "share/ob_rpc_struct.h" +#include "observer/ob_server_struct.h" + +namespace oceanbase { + +namespace share { + +struct ObExternalFileInfo { + ObExternalFileInfo() : file_id_(INT64_MAX) {} + common::ObString file_url_; + int64_t file_id_; + common::ObAddr file_addr_; + TO_STRING_KV(K_(file_url), K_(file_id), K_(file_addr)); + OB_UNIS_VERSION(1); +}; + +class ObExternalTableFilesKey : public ObIKVCacheKey +{ +public: + ObExternalTableFilesKey() : tenant_id_(OB_INVALID_ID), + table_id_(OB_INVALID_ID), + partition_id_(OB_INVALID_ID) + {} + virtual ~ObExternalTableFilesKey() {} + bool operator ==(const ObIKVCacheKey &other) const override { + const ObExternalTableFilesKey &other_key = reinterpret_cast(other); + return this->tenant_id_ == other_key.tenant_id_ + && this->table_id_ == other_key.table_id_ + && this->partition_id_ == other_key.partition_id_; + } + uint64_t hash() const override { + return common::murmurhash(this, sizeof(ObExternalTableFilesKey), 0); + } + uint64_t get_tenant_id() const override { return tenant_id_; } + int64_t size() const override { return sizeof(*this); } + int deep_copy(char *buf, const int64_t buf_len, ObIKVCacheKey *&key) const override; + TO_STRING_KV(K(tenant_id_), K(table_id_), K(partition_id_)); +public: + uint64_t tenant_id_; + uint64_t table_id_; + uint64_t partition_id_; +}; + +class ObExternalTableFiles : public ObIKVCacheValue +{ +public: + ObExternalTableFiles() : create_ts_(0) {} + virtual ~ObExternalTableFiles() {} + int64_t size() const override; + int deep_copy(char *buf, const int64_t buf_len, ObIKVCacheValue *&value) const override; + TO_STRING_KV(K(file_urls_), K(file_ids_), K(create_ts_)); +public: + ObArrayWrap file_urls_; + ObArrayWrap file_ids_; + int64_t create_ts_; +}; + +class ObExternalTableFileManager +{ +public: + static const int64_t CACHE_EXPIRE_TIME = 20 * 1000000L; //20s + static const int64_t MAX_VERSION = INT64_MAX; + static const int64_t LOAD_CACHE_LOCK_CNT = 16; + static const int64_t LOCK_TIMEOUT = 2 * 1000000L; + + ObExternalTableFileManager() {} + + int init(); + + static ObExternalTableFileManager &get_instance(); + + int get_external_files( + const uint64_t tenant_id, + const uint64_t table_id, + const bool is_local_file_on_disk, + common::ObIAllocator &allocator, + common::ObIArray &external_files, + common::ObIArray *range_filter = NULL); + + int get_external_files_by_part_id( + const uint64_t tenant_id, + const uint64_t table_id, + const uint64_t partition_id, + const bool is_local_file_on_disk, + common::ObIAllocator &allocator, + common::ObIArray &external_files, + common::ObIArray *range_filter = NULL); + + int flush_cache( + const uint64_t tenant_id, + const uint64_t table_id); + + int update_inner_table_file_list( + const uint64_t tenant_id, + const uint64_t table_id, + common::ObIArray &file_urls, + common::ObIArray &file_sizes); + + int get_all_records_from_inner_table(ObIAllocator &allocator, + int64_t tenant_id, + int64_t table_id, + int64_t partition_id, + ObIArray &file_urls, + ObIArray &file_ids); + int clear_inner_table_files( + const uint64_t tenant_id, + const uint64_t table_id, + ObMySQLTransaction &trans); + + int get_external_file_list_on_device(const ObString &location, + ObIArray &file_urls, + ObIArray &file_sizes, + const ObString &access_info, + ObIAllocator &allocator); + +private: + + int update_inner_table_files_list_one_part( + const uint64_t tenant_id, + const uint64_t table_id, + const uint64_t partition_id, + ObMySQLTransaction &trans, + common::ObIArray &file_urls, + common::ObIArray &file_sizes); + + bool is_cache_value_timeout(const ObExternalTableFiles &ext_files) { + return ObTimeUtil::current_time() - ext_files.create_ts_ > CACHE_EXPIRE_TIME; + } + int fill_cache_from_inner_table( + const ObExternalTableFilesKey &key, + const ObExternalTableFiles *&ext_files, + ObKVCacheHandle &handle); + int lock_for_refresh( + ObMySQLTransaction &trans, + const uint64_t tenant_id, + const uint64_t object_id); +private: + common::ObSpinLock fill_cache_locks_[LOAD_CACHE_LOCK_CNT]; + common::ObKVCache kv_cache_; +}; + + +} +} + +#endif /* _OB_EXTERNAL_TABLE_FILE_MANAGER_H_ */ diff --git a/src/share/external_table/ob_external_table_file_rpc_processor.cpp b/src/share/external_table/ob_external_table_file_rpc_processor.cpp new file mode 100644 index 000000000..14a9d268c --- /dev/null +++ b/src/share/external_table/ob_external_table_file_rpc_processor.cpp @@ -0,0 +1,153 @@ +/** + * 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. + */ + +#define USING_LOG_PREFIX SQL +#include "sql/engine/ob_exec_context.h" +#include "observer/ob_server_struct.h" +#include "storage/tx/ob_trans_service.h" +#include "share/external_table/ob_external_table_file_mgr.h" +#include "share/external_table/ob_external_table_file_rpc_processor.h" +#include "share/external_table/ob_external_table_file_task.h" +namespace oceanbase +{ +namespace share +{ + +int ObFlushExternalTableKVCacheP::process() +{ + int ret = OB_SUCCESS; + ObFlushExternalTableFileCacheReq &req = arg_; + ObFlushExternalTableFileCacheRes &res = result_; + if (OB_FAIL(ObExternalTableFileManager::get_instance().flush_cache(req.tenant_id_, req.table_id_))) { + LOG_WARN("erase kvcache result failed", K(ret)); + } + res.rcode_.rcode_ = ret; + return OB_SUCCESS; +} + +int ObAsyncLoadExternalTableFileListP::process() +{ + int ret = OB_SUCCESS; + ObLoadExternalFileListReq &req = arg_; + ObLoadExternalFileListRes &res = result_; + ObString &location = req.location_; + ObSEArray file_urls; + ObString access_info; + ObArenaAllocator allocator; + if (OB_FAIL(ObExternalTableFileManager::get_instance().get_external_file_list_on_device(location, + file_urls, + res.file_sizes_, + access_info, + allocator))) { + LOG_WARN("get external table file on device failed", K(ret)); + } + for (int64_t i =0 ; OB_SUCC(ret) && i < file_urls.count(); i++) { + ObString tmp; + OZ(ob_write_string(res.get_alloc(), file_urls.at(i), tmp)); + OZ(res.file_urls_.push_back(tmp)); + } + res.rcode_.rcode_ = ret; + LOG_DEBUG("get external table file", K(ret), K(location), K(file_urls), K(res.file_urls_)); + return ret; +} + +void ObRpcAsyncLoadExternalTableFileCallBack::on_timeout() +{ + int ret = OB_TIMEOUT; + int64_t current_ts = ObTimeUtility::current_time(); + int64_t timeout_ts = get_send_ts() + timeout_; + if (current_ts < timeout_ts) { + LOG_DEBUG("rpc return OB_TIMEOUT before actual timeout, change error code to OB_RPC_CONNECT_ERROR", KR(ret), + K(timeout_ts), K(current_ts)); + ret = OB_RPC_CONNECT_ERROR; + } + LOG_WARN("async task timeout", KR(ret)); + result_.rcode_.rcode_ = ret; + context_->inc_concurrency_limit_with_signal(); +} + +void ObRpcAsyncLoadExternalTableFileCallBack::on_invalid() +{ + int ret = OB_SUCCESS; + // a valid packet on protocol level, but can't decode it. + result_.rcode_.rcode_ = OB_INVALID_ERROR; + LOG_WARN("async task invalid", K(result_.rcode_.rcode_)); + context_->inc_concurrency_limit_with_signal(); +} + +int ObRpcAsyncLoadExternalTableFileCallBack::process() +{ + int ret = OB_SUCCESS; + LOG_DEBUG("async access callback process", K_(result)); + if (OB_FAIL(get_rcode())) { + result_.rcode_.rcode_ = get_rcode(); + LOG_WARN("async rpc execution failed", K(get_rcode()), K_(result)); + } + context_->inc_concurrency_limit_with_signal(); + return ret; +} + +oceanbase::rpc::frame::ObReqTransport::AsyncCB *ObRpcAsyncLoadExternalTableFileCallBack::clone( + const oceanbase::rpc::frame::SPAlloc &alloc) const { + UNUSED(alloc); + return const_cast( + static_cast(this)); +} + +void ObRpcAsyncFlushExternalTableKVCacheCallBack::on_timeout() +{ + int ret = OB_TIMEOUT; + int64_t current_ts = ObTimeUtility::current_time(); + int64_t timeout_ts = get_send_ts() + timeout_; + if (current_ts < timeout_ts) { + LOG_DEBUG("rpc return OB_TIMEOUT before actual timeout, change error code to OB_RPC_CONNECT_ERROR", KR(ret), + K(timeout_ts), K(current_ts)); + ret = OB_RPC_CONNECT_ERROR; + } + LOG_WARN("async task timeout", KR(ret)); + result_.rcode_.rcode_ = ret; + context_->inc_concurrency_limit_with_signal(); +} + + +void ObRpcAsyncFlushExternalTableKVCacheCallBack::on_invalid() +{ + int ret = OB_SUCCESS; + // a valid packet on protocol level, but can't decode it. + result_.rcode_.rcode_ = OB_INVALID_ERROR; + LOG_WARN("async task invalid", K(result_.rcode_.rcode_)); + context_->inc_concurrency_limit_with_signal(); +} + +int ObRpcAsyncFlushExternalTableKVCacheCallBack::process() +{ + int ret = OB_SUCCESS; + LOG_DEBUG("async access callback process", K_(result)); + if (OB_FAIL(get_rcode())) { + result_.rcode_.rcode_ = get_rcode(); + // we need to clear op results because they are not decoded from das async rpc due to rpc error. + LOG_WARN("async rpc execution failed", K(get_rcode()), K_(result)); + } + context_->inc_concurrency_limit_with_signal(); + return ret; +} + +oceanbase::rpc::frame::ObReqTransport::AsyncCB *ObRpcAsyncFlushExternalTableKVCacheCallBack::clone( + const oceanbase::rpc::frame::SPAlloc &alloc) const { + UNUSED(alloc); + return const_cast( + static_cast(this)); +} + + +} // namespace share +} // namespace oceanbase diff --git a/src/share/external_table/ob_external_table_file_rpc_processor.h b/src/share/external_table/ob_external_table_file_rpc_processor.h new file mode 100644 index 000000000..1aa86c201 --- /dev/null +++ b/src/share/external_table/ob_external_table_file_rpc_processor.h @@ -0,0 +1,173 @@ +/** + * 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 OB_EXTERNAL_TABLE_FILE_RPC_PROCESSOR_H_ +#define OB_EXTERNAL_TABLE_FILE_RPC_PROCESSOR_H_ +#include "rpc/obrpc/ob_rpc_processor.h" +#include "share/external_table/ob_external_table_file_rpc_proxy.h" +#include "share/external_table/ob_external_table_file_task.h" +#include "deps/oblib/src/lib/lock/ob_thread_cond.h" +#include "deps/oblib/src/lib/atomic/ob_atomic.h" +#include "deps/oblib/src/lib/list/ob_obj_store.h" +namespace observer +{ +struct ObGlobalContext; +} +namespace oceanbase +{ +namespace share +{ + +template +class ObAsyncRpcTaskWaitContext +{ +public: + ObAsyncRpcTaskWaitContext() + : cond_(), finished_cnt_(0), task_cnt_(0), async_cb_list_() { + } + ~ObAsyncRpcTaskWaitContext() = default; + int init() { return cond_.init(ObWaitEventIds::ASYNC_EXTERNAL_TABLE_LOCK_WAIT); } + void inc_concurrency_limit_with_signal() + { + common::ObThreadCondGuard guard(cond_); + if (__sync_add_and_fetch(&finished_cnt_, 1) >= task_cnt_) { + cond_.signal(); + } + } + + int32_t get_current_concurrency() const + { + return ATOMIC_LOAD(&finished_cnt_); + }; + + void inc_concurrency_limit() + { + ATOMIC_INC(&finished_cnt_); + } + + int dec_concurrency_limit() + { + int ret = OB_SUCCESS; + int32_t cur = get_current_concurrency(); + int32_t next = cur - 1; + if (OB_UNLIKELY(0 == cur)) { + ret = OB_SIZE_OVERFLOW; + } else { + while (ATOMIC_CAS(&finished_cnt_, cur, next) != cur) { + cur = get_current_concurrency(); + next = cur - 1; + if (OB_UNLIKELY(0 == cur)) { + ret = OB_SIZE_OVERFLOW; + break; + } + } + } + return ret; + } + + void set_task_count(int32_t task_count) { + task_cnt_ = task_count; + } + typedef common::ObSEArray AsyncCbList; + + AsyncCbList &get_cb_list() { return async_cb_list_; } + + int wait_executing_tasks() { + int ret = OB_SUCCESS; + common::ObThreadCondGuard guard(cond_); + while (OB_SUCC(ret) && get_current_concurrency() < task_cnt_) { + ret = cond_.wait(); + } + return ret; + } + + TO_STRING_KV(K_(finished_cnt), K_(task_cnt)); +private: + common::ObThreadCond cond_; + int32_t finished_cnt_; + int32_t task_cnt_; + + AsyncCbList async_cb_list_; +}; + +class ObRpcAsyncFlushExternalTableKVCacheCallBack + : public obrpc::ObExtenralTableRpcProxy::AsyncCB +{ +public: + ObRpcAsyncFlushExternalTableKVCacheCallBack( + ObAsyncRpcTaskWaitContext *context) + : context_(context) + { + } + ~ObRpcAsyncFlushExternalTableKVCacheCallBack() = default; + void on_timeout() override; + void on_invalid() override; + void set_args(const Request &arg) { UNUSED(arg); } + oceanbase::rpc::frame::ObReqTransport::AsyncCB *clone( + const oceanbase::rpc::frame::SPAlloc &alloc) const; + virtual int process(); + const ObFlushExternalTableFileCacheRes &get_task_resp() const { return result_; } + ObAsyncRpcTaskWaitContext *get_async_cb_context() + { return context_; } + + TO_STRING_KV(K_(context)); +private: + ObAsyncRpcTaskWaitContext *context_; +}; + +class ObFlushExternalTableKVCacheP : public + obrpc::ObRpcProcessor > +{ +public: + ObFlushExternalTableKVCacheP() {} + ~ObFlushExternalTableKVCacheP() {} + int process(); +private: + DISALLOW_COPY_AND_ASSIGN(ObFlushExternalTableKVCacheP); +}; + +class ObAsyncLoadExternalTableFileListP : public + obrpc::ObRpcProcessor > +{ +public: + ObAsyncLoadExternalTableFileListP() {} + ~ObAsyncLoadExternalTableFileListP() {} + int process(); +private: + DISALLOW_COPY_AND_ASSIGN(ObAsyncLoadExternalTableFileListP); +}; + +class ObRpcAsyncLoadExternalTableFileCallBack + : public obrpc::ObExtenralTableRpcProxy::AsyncCB +{ +public: + ObRpcAsyncLoadExternalTableFileCallBack( + ObAsyncRpcTaskWaitContext *context) + : context_(context) + { + } + ~ObRpcAsyncLoadExternalTableFileCallBack() = default; + void on_timeout() override; + void on_invalid() override; + void set_args(const Request &arg) { UNUSED(arg); } + oceanbase::rpc::frame::ObReqTransport::AsyncCB *clone( + const oceanbase::rpc::frame::SPAlloc &alloc) const; + virtual int process(); + const ObLoadExternalFileListRes &get_task_resp() const { return result_; } + ObAsyncRpcTaskWaitContext *get_async_cb_context() { return context_; } + + TO_STRING_KV(K_(context)); +private: + ObAsyncRpcTaskWaitContext *context_; +}; +} // namespace share +} // namespace oceanbase +#endif /* OB_EXTERNAL_TABLE_FILE_RPC_PROCESSOR_H_ */ diff --git a/src/share/external_table/ob_external_table_file_rpc_proxy.h b/src/share/external_table/ob_external_table_file_rpc_proxy.h new file mode 100644 index 000000000..9bd00d9e7 --- /dev/null +++ b/src/share/external_table/ob_external_table_file_rpc_proxy.h @@ -0,0 +1,36 @@ +/** + * 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 OBDEV_SRC_EXTERNAL_TABLE_FILE_RPC_PROXY_H_ +#define OBDEV_SRC_EXTERNAL_TABLE_FILE_RPC_PROXY_H_ +#include "share/ob_define.h" +#include "rpc/obrpc/ob_rpc_proxy.h" +#include "share/external_table/ob_external_table_file_task.h" +#include "observer/ob_server_struct.h" +namespace oceanbase +{ +namespace obrpc +{ +class ObExtenralTableRpcProxy : public obrpc::ObRpcProxy +{ +public: + DEFINE_TO(ObExtenralTableRpcProxy); + virtual ~ObExtenralTableRpcProxy() {} + // sync rpc for das task result + RPC_AP(PR5 flush_file_kvcahce, obrpc::OB_FLUSH_EXTERNAL_TABLE_FILE_CACHE, (share::ObFlushExternalTableFileCacheReq), share::ObFlushExternalTableFileCacheRes); + RPC_AP(PR5 load_external_file_list, obrpc::OB_LOAD_EXTERNAL_FILE_LIST, (share::ObLoadExternalFileListReq), share::ObLoadExternalFileListRes); +}; +} // namespace obrpc + + +} // namespace oceanbase +#endif /* OBDEV_SRC_EXTERNAL_TABLE_FILE_RPC_PROXY_H_ */ diff --git a/src/share/external_table/ob_external_table_file_task.cpp b/src/share/external_table/ob_external_table_file_task.cpp new file mode 100644 index 000000000..002d771a2 --- /dev/null +++ b/src/share/external_table/ob_external_table_file_task.cpp @@ -0,0 +1,70 @@ +/** + * 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. + */ +#define USING_LOG_PREFIX SQL +#include "share/external_table/ob_external_table_file_task.h" +#include "share/external_table/ob_external_table_file_rpc_processor.h" + +namespace oceanbase +{ +namespace share +{ + + +OB_SERIALIZE_MEMBER(ObFlushExternalTableFileCacheReq, tenant_id_, table_id_, partition_id_); + +OB_SERIALIZE_MEMBER(ObFlushExternalTableFileCacheRes, rcode_); + +OB_SERIALIZE_MEMBER(ObLoadExternalFileListReq, location_); + +OB_DEF_SERIALIZE(ObLoadExternalFileListRes) +{ + int ret = OB_SUCCESS; + LST_DO_CODE(OB_UNIS_ENCODE, rcode_, file_urls_, file_sizes_); + return ret; +} + +OB_DEF_SERIALIZE_SIZE(ObLoadExternalFileListRes) +{ + int64_t len = 0; + LST_DO_CODE(OB_UNIS_ADD_LEN, rcode_, file_urls_, file_sizes_); + return len; +} + +OB_DEF_DESERIALIZE(ObLoadExternalFileListRes) +{ + int ret = OB_SUCCESS; + LST_DO_CODE(OB_UNIS_DECODE, rcode_, file_urls_, file_sizes_); + for (int64_t i = 0; OB_SUCC(ret) && i < file_urls_.count(); i++) { + ObString file_url; + OZ (ob_write_string(allocator_, file_urls_.at(i), file_url)); + file_urls_.at(i).assign_ptr(file_url.ptr(), file_url.length()); + + } + return ret; +} + +int ObLoadExternalFileListRes::assign(const ObLoadExternalFileListRes &other) +{ + int ret = OB_SUCCESS; + rcode_ = other.rcode_; + file_sizes_.assign(other.file_sizes_); + for (int64_t i = 0; OB_SUCC(ret) && i < other.file_urls_.count(); i++) { + ObString tmp; + OZ (ob_write_string(allocator_, other.file_urls_.at(i), tmp)); + OZ (file_urls_.push_back(tmp)); + } + return ret; +} + + +} // namespace share +} // namespace oceanbase diff --git a/src/share/external_table/ob_external_table_file_task.h b/src/share/external_table/ob_external_table_file_task.h new file mode 100644 index 000000000..e24c280e2 --- /dev/null +++ b/src/share/external_table/ob_external_table_file_task.h @@ -0,0 +1,79 @@ +/** + * 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 OBDEV_SRC_EXTERNAL_TABLE_FILE_TASK_H_ +#define OBDEV_SRC_EXTERNAL_TABLE_FILE_TASK_H_ +#include "rpc/obrpc/ob_rpc_result_code.h" +#include "deps/oblib/src/lib/lock/ob_thread_cond.h" +namespace oceanbase +{ +namespace share +{ + +class ObFlushExternalTableFileCacheReq +{ + OB_UNIS_VERSION(1); +public: + ObFlushExternalTableFileCacheReq() : + tenant_id_(common::OB_INVALID_ID), table_id_(common::OB_INVALID_ID), partition_id_(common::OB_INVALID_ID) {} +public: + uint64_t tenant_id_; + int64_t table_id_; + int64_t partition_id_; + TO_STRING_KV(K_(tenant_id), K_(table_id), K_(partition_id)); +}; + +class ObFlushExternalTableFileCacheRes +{ + OB_UNIS_VERSION(1); +public: + ObFlushExternalTableFileCacheRes() : rcode_() {} + TO_STRING_KV(K_(rcode)); +public: + obrpc::ObRpcResultCode rcode_; +}; + +class ObLoadExternalFileListReq +{ + OB_UNIS_VERSION(1); +public: + ObLoadExternalFileListReq() : + location_() {} +public: + ObString location_; + TO_STRING_KV(K_(location)); +}; + +class ObLoadExternalFileListRes +{ + OB_UNIS_VERSION(1); +public: + ObLoadExternalFileListRes() : rcode_(), file_urls_(), file_sizes_(), allocator_() {} + + ObIAllocator &get_alloc() { return allocator_; } + int assign(const ObLoadExternalFileListRes &other); + TO_STRING_KV(K_(rcode)); +public: + obrpc::ObRpcResultCode rcode_; //返回的错误信息 + ObSEArray file_urls_; + ObSEArray file_sizes_; + +private: + ObArenaAllocator allocator_; +}; + + + + +} // namespace share +} // namespace oceanbase +#endif /* OBDEV_SRC_EXTERNAL_TABLE_FILE_TASK_H_ */ diff --git a/src/share/external_table/ob_external_table_utils.cpp b/src/share/external_table/ob_external_table_utils.cpp new file mode 100644 index 000000000..3c9479845 --- /dev/null +++ b/src/share/external_table/ob_external_table_utils.cpp @@ -0,0 +1,369 @@ + /** + * 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. + */ +#define USING_LOG_PREFIX SQL +#include "share/external_table/ob_external_table_utils.h" + +#include "common/ob_range.h" +#include "common/object/ob_object.h" +#include "share/external_table/ob_external_table_file_mgr.h" +#include "sql/engine/expr/ob_expr_regexp_context.h" +#include "sql/engine/expr/ob_expr_util.h" +#include "sql/engine/ob_exec_context.h" +#include "sql/engine/table/ob_external_table_access_service.h" +#include "sql/ob_sql_utils.h" +#include "sql/rewrite/ob_query_range.h" + +namespace oceanbase +{ +using namespace common; +using namespace sql; + +namespace share +{ +bool ObExternalTableUtils::is_left_edge(const ObObj &value) +{ + bool ret = false; + bool is_oracle = lib::is_oracle_mode(); + if ((is_oracle && value.is_min_value()) || + (!is_oracle && (value.is_min_value() || value.is_null()))) { + ret = true; + } + return ret; +} + +bool ObExternalTableUtils::is_right_edge(const ObObj &value) +{ + bool ret = false; + bool is_oracle = lib::is_oracle_mode(); + if ((is_oracle && (value.is_max_value() || value.is_null())) || + (!is_oracle && value.is_max_value())) { + ret = true; + } + return ret; +} + +int ObExternalTableUtils::is_file_id_in_ranges(const ObIArray &range_filter, + const int64_t &file_id, + bool &in_ranges) +{ + int ret = OB_SUCCESS; + in_ranges = false; + for (int64_t i = 0; OB_SUCC(ret) && !in_ranges && i < range_filter.count(); ++i) { + int64_t start_file_id = ObCSVTableRowIterator::MIN_EXTERNAL_TABLE_FILE_ID; + int64_t end_file_id = INT64_MAX; + if (OB_ISNULL(range_filter.at(i))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get Null ptr", K(ret)); + } else if (OB_FAIL(resolve_file_id_range(*range_filter.at(i), 0, start_file_id, end_file_id))) { + LOG_WARN("failed to resolve range in external table", K(ret)); + } else if (file_id >= start_file_id && file_id <= end_file_id) { + in_ranges = true; + } + } + return ret; +} + +int64_t ObExternalTableUtils::get_edge_value(const ObObj &edge) { + int64_t value = 1; + if (is_left_edge(edge)) { + // file_id and line_number are begin at 1 + value = 1; + } else if (is_right_edge(edge)) { + value = INT64_MAX; + } else { + value = edge.get_int(); + } + return value; +} + + +int ObExternalTableUtils::resolve_file_id_range(const ObNewRange &range, + const int64_t &column_idx, + int64_t &start_file, + int64_t &end_file) +{ + int ret = OB_SUCCESS; + start_file = ObCSVTableRowIterator::MIN_EXTERNAL_TABLE_FILE_ID; + end_file = INT64_MAX; + if (column_idx >= range.get_start_key().get_obj_cnt() || + column_idx >= range.get_end_key().get_obj_cnt() ) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed. input column idx invalid", K(ret), K(range), K(column_idx)); + } else { + const ObObj &start_obj = range.get_start_key().get_obj_ptr()[column_idx]; + const ObObj &end_obj = range.get_end_key().get_obj_ptr()[column_idx]; + start_file = get_edge_value(start_obj); + end_file = get_edge_value(end_obj); + } + return ret; +} + +int ObExternalTableUtils::resolve_line_number_range(const ObNewRange &range, + const int64_t &column_idx, + int64_t &start_lineno, + int64_t &end_lineno) +{ + int ret = OB_SUCCESS; + start_lineno = ObCSVTableRowIterator::MIN_EXTERNAL_TABLE_LINE_NUMBER; + end_lineno = INT64_MAX; + if (column_idx >= range.get_start_key().get_obj_cnt() || + column_idx >= range.get_end_key().get_obj_cnt() ) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed. input column idx invalid", K(ret), K(range), K(column_idx)); + } else { + const ObObj &start_obj = range.get_start_key().get_obj_ptr()[column_idx]; + const ObObj &end_obj = range.get_end_key().get_obj_ptr()[column_idx]; + start_lineno = get_edge_value(start_obj); + end_lineno = get_edge_value(end_obj); + if (!is_left_edge(start_obj) && !is_right_edge(start_obj) && !range.border_flag_.inclusive_start()) { + start_lineno++; + } + if (!is_left_edge(end_obj) && !is_right_edge(end_obj) && !range.border_flag_.inclusive_end()) { + end_lineno--; + } + } + return ret; +} + +int ObExternalTableUtils::convert_external_table_new_range(const ObString &file_url, + const int64_t file_id, + const uint64_t ref_table_id, + const ObNewRange &range, + ObIAllocator &allocator, + ObNewRange &new_range, + bool &is_valid) +{ + int ret = OB_SUCCESS; + int64_t start_file_id = ObCSVTableRowIterator::MIN_EXTERNAL_TABLE_FILE_ID; + int64_t end_file_id = INT64_MAX; + int64_t start_lineno = ObCSVTableRowIterator::MIN_EXTERNAL_TABLE_LINE_NUMBER; + int64_t end_lineno = INT64_MAX; + ObObj start_obj; + ObObj end_obj; + is_valid = false; + if (OB_UNLIKELY(range.get_start_key().get_obj_cnt() != 2 || + range.get_end_key().get_obj_cnt() != 2)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed. get unexpected params", K(ret), K(range)); + } else if (OB_FAIL(resolve_file_id_range(range, 0, start_file_id, end_file_id))) { + LOG_WARN("failed to resolve range in external table", K(ret)); + } else if (file_id >= start_file_id && file_id <= end_file_id) { + if (file_id == start_file_id) { + start_obj = ObObj(range.get_start_key().get_obj_ptr()[1]); + } else { + start_obj.set_min_value(); + } + if (file_id == end_file_id) { + end_obj = ObObj(range.get_end_key().get_obj_ptr()[1]); + } else { + end_obj.set_max_value(); + } + /* 1. line number is invalid as min:min or max:max. + * 2. start_lineno > end_lineno. eg, (min:1)--> [1, 1) --> [1, 0] + */ + bool start_min = is_left_edge(start_obj); + bool start_max = is_right_edge(start_obj); + bool end_min = is_left_edge(end_obj); + bool end_max = is_right_edge(end_obj); + if (!(start_min && end_min) && !(start_max && end_max)) { + start_lineno = get_edge_value(start_obj); + end_lineno = get_edge_value(end_obj); + if (!start_min && !start_max && !range.border_flag_.inclusive_start()) { + start_lineno++; + } + if (!end_min && !end_max && !range.border_flag_.inclusive_end()) { + end_lineno--; + } + if (end_lineno >= start_lineno) { + is_valid = true; + } + } + } + if (OB_SUCC(ret) && is_valid) { + if (OB_FAIL(make_external_table_scan_range(file_url, + file_id, + ref_table_id, + start_lineno, + end_lineno, + allocator, + new_range))) { + LOG_WARN("failed to make external table scan range", K(ret)); + } + } + return ret; +} + +int ObExternalTableUtils::convert_external_table_empty_range(const ObString &file_url, + const int64_t file_id, + const uint64_t ref_table_id, + ObIAllocator &allocator, + ObNewRange &new_range) +{ + int ret = OB_SUCCESS; + if (OB_FAIL(make_external_table_scan_range(file_url, + file_id, + ref_table_id, + ObCSVTableRowIterator::MIN_EXTERNAL_TABLE_LINE_NUMBER, + INT64_MAX, + allocator, + new_range))) { + LOG_WARN("failed to make external table scan range", K(ret)); + } + return ret; +} + +int ObExternalTableUtils::make_external_table_scan_range(const common::ObString &file_url, + const int64_t file_id, + const uint64_t ref_table_id, + const int64_t first_lineno, + const int64_t last_lineno, + common::ObIAllocator &allocator, + common::ObNewRange &new_range) +{ + int ret = OB_SUCCESS; + ObObj *obj_start = NULL; + ObObj *obj_end = NULL; + if (OB_UNLIKELY(first_lineno > last_lineno)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed. get invalid params", K(ret), K(first_lineno), K(last_lineno)); + } else if (OB_ISNULL(obj_start = static_cast(allocator.alloc(sizeof(ObObj) * + MAX_EXTERNAL_FILE_SCANKEY)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("fail to alloc memory", K(ret)); + } else if (OB_ISNULL(obj_end = static_cast(allocator.alloc(sizeof(ObObj) * + MAX_EXTERNAL_FILE_SCANKEY)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("fail to alloc memory", K(ret)); + } else { + obj_start[PARTITION_ID] = ObObj(); + obj_start[PARTITION_ID].set_uint64(ref_table_id); + obj_end[PARTITION_ID] = ObObj(); + obj_end[PARTITION_ID].set_uint64(ref_table_id); + obj_start[FILE_URL] = ObObj(); + obj_start[FILE_URL].set_varchar(file_url); + obj_start[FILE_URL].set_collation_type(ObCharset::get_system_collation()); + obj_end[FILE_URL] = ObObj(); + obj_end[FILE_URL].set_varchar(file_url); + obj_end[FILE_URL].set_collation_type(ObCharset::get_system_collation()); + obj_start[FILE_ID] = ObObj(); + obj_start[FILE_ID].set_int(file_id); + obj_end[FILE_ID] = ObObj(); + obj_end[FILE_ID].set_int(file_id); + obj_start[LINE_NUMBER] = ObObj(); + obj_start[LINE_NUMBER].set_int(first_lineno); + obj_end[LINE_NUMBER] = ObObj(); + obj_end[LINE_NUMBER].set_int(last_lineno); + new_range.border_flag_.set_inclusive_start(); + new_range.border_flag_.set_inclusive_end(); + new_range.start_key_.assign(obj_start, MAX_EXTERNAL_FILE_SCANKEY); + new_range.end_key_.assign(obj_end, MAX_EXTERNAL_FILE_SCANKEY); + } + return ret; +} + +int ObExternalTableUtils::prepare_single_scan_range(const uint64_t tenant_id, + const uint64_t table_id, + ObIArray &ranges, + ObIAllocator &range_allocator, + ObIArray &new_range, + bool is_file_on_disk) { + int ret = OB_SUCCESS; + ObSEArray file_urls; + ObSEArray tmp_ranges; + if (OB_FAIL(tmp_ranges.assign(ranges))) { + LOG_WARN("failed to assign array", K(ret)); + } else if (OB_FAIL(ObExternalTableFileManager::get_instance().get_external_files(tenant_id, + table_id, is_file_on_disk, range_allocator, file_urls, + tmp_ranges.empty() ? NULL : &tmp_ranges))) { + LOG_WARN("get external table file error", K(ret)); + } else { + new_range.reset(); + } + for (int64_t i = 0; OB_SUCC(ret) && i < tmp_ranges.count(); ++i) { + if (OB_ISNULL(tmp_ranges.at(i))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get unexpected NULL ptr", K(ret)); + } else { + for (int64_t j = 0; OB_SUCC(ret) && j < file_urls.count(); ++j) { + ObNewRange *range = NULL; + bool is_valid = false; + if (OB_ISNULL(range = OB_NEWx(ObNewRange, (&range_allocator)))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed to new a ptr", K(ret)); + } else if (OB_FAIL(ObExternalTableUtils::convert_external_table_new_range( + file_urls.at(j).file_url_, + file_urls.at(j).file_id_, + table_id, + *tmp_ranges.at(i), + range_allocator, + *range, + is_valid))) { + LOG_WARN("failed to convert external table new range", K(ret), K(file_urls.at(j)), + K(ranges.at(i))); + } else if (is_valid) { + OZ (new_range.push_back(range)); + } + } + } + } + return ret; +} + +int ObExternalTableUtils::filter_external_table_files(const ObString &pattern, + ObExecContext &exec_ctx, + ObIArray &file_urls) +{ + int ret = OB_SUCCESS; + if (!pattern.empty()) { + const common::ObCollationType cs_type_pattern = CS_TYPE_UTF8MB4_BIN; + const common::ObCollationType cs_type_file = CS_TYPE_UTF8MB4_BIN; + const common::ObCollationType cs_type_match = CS_TYPE_UTF16_BIN; + ObExprRegexContext regex_ctx; + ObArenaAllocator allocator; + uint32_t flags = 0; + ObString match_string; + ObSEArray tmp_file_urls; + if (OB_FAIL(ObExprRegexContext::get_regexp_flags(match_string, true, flags))) { + LOG_WARN("failed to get regexp flags", K(ret)); + } else if (OB_FAIL(regex_ctx.init(exec_ctx.get_allocator(), + exec_ctx.get_my_session(), + pattern, + flags, + true, + cs_type_pattern))) { + LOG_WARN("init regex context failed", K(ret), K(pattern)); + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < file_urls.count(); ++i) { + bool match = false; + ObString out_text; + if (OB_FAIL(ObExprUtil::convert_string_collation(file_urls.at(i), + cs_type_file, + out_text, + cs_type_match, + allocator))) { + LOG_WARN("convert charset failed", K(ret)); + } else if (OB_FAIL(regex_ctx.match(allocator, out_text, 0, match))) { + LOG_WARN("regex match failed", K(ret)); + } else if (match && OB_FAIL(tmp_file_urls.push_back(file_urls.at(i)))) { + LOG_WARN("failed to push back into tmp_file_urls", K(ret)); + } + } + if (OB_SUCC(ret) && OB_FAIL(file_urls.assign(tmp_file_urls))) { + LOG_WARN("failed to assign file_urls", K(ret)); + } + } + } + return ret; +} + +} // namespace share +} // namespace oceanbase diff --git a/src/share/external_table/ob_external_table_utils.h b/src/share/external_table/ob_external_table_utils.h new file mode 100644 index 000000000..43ae44bfe --- /dev/null +++ b/src/share/external_table/ob_external_table_utils.h @@ -0,0 +1,98 @@ +/** + * 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 _OB_EXTERNAL_TABLE_UTILS_H_ +#define _OB_EXTERNAL_TABLE_UTILS_H_ + +#include "lib/container/ob_iarray.h" + +namespace oceanbase +{ + +namespace common +{ +class ObObj; +class ObNewRange; +} + +namespace sql +{ +class ObDASTabletLoc; +class ObExecContext; +class ObExternalTableAccessService; +class ObQueryRange; +} + +namespace share +{ +class ObExternalTableUtils { + public: + enum ExternalTableRangeColumn { + PARTITION_ID = 0, + FILE_URL, + FILE_ID, + LINE_NUMBER, + MAX_EXTERNAL_FILE_SCANKEY + }; + + public: + // range_filter is from query_range + static int is_file_id_in_ranges(const common::ObIArray &range_filter, + const int64_t &file_id, + bool &in_ranges); + static int resolve_file_id_range(const common::ObNewRange &range, + const int64_t &column_idx, + int64_t &start_file, + int64_t &end_file); + // file_id is same in start and end + static int resolve_line_number_range(const common::ObNewRange &range, + const int64_t &column_idx, + int64_t &start_lineno, + int64_t &end_lineno); + static int convert_external_table_new_range(const common::ObString &file_url, + const int64_t file_id, + const uint64_t ref_table_id, + const common::ObNewRange &range, + common::ObIAllocator &allocator, + common::ObNewRange &new_range, + bool &is_valid); + static int convert_external_table_empty_range(const common::ObString &file_url, + const int64_t file_id, + const uint64_t ref_table_id, + common::ObIAllocator &allocator, + common::ObNewRange &new_range); + + static int prepare_single_scan_range(const uint64_t tenant_id, + const uint64_t table_id, + common::ObIArray &ranges, + common::ObIAllocator &range_allocator, + common::ObIArray &new_range, + bool is_file_on_disk); + + static int filter_external_table_files(const common::ObString &pattern, + sql::ObExecContext &exec_ctx, + common::ObIArray &file_urls); + private: + static bool is_left_edge(const common::ObObj &value); + static bool is_right_edge(const common::ObObj &value); + static int64_t get_edge_value(const common::ObObj &edge); + static int make_external_table_scan_range(const common::ObString &file_url, + const int64_t file_id, + const uint64_t ref_table_id, + const int64_t first_lineno, + const int64_t last_lineno, + common::ObIAllocator &allocator, + common::ObNewRange &new_range); +}; +} +} +#endif /* OBDEV_SRC_EXTERNAL_TABLE_UTILS_H_ */ diff --git a/src/share/inner_table/ob_inner_table_schema.101_150.cpp b/src/share/inner_table/ob_inner_table_schema.101_150.cpp index 2b3a602f0..359e4a54e 100644 --- a/src/share/inner_table/ob_inner_table_schema.101_150.cpp +++ b/src/share/inner_table/ob_inner_table_schema.101_150.cpp @@ -6367,6 +6367,66 @@ int ObInnerTableSchema::all_table_history_schema(ObTableSchema &table_schema) truncate_version_default, truncate_version_default); //default_value } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("external_file_location", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("external_file_location_access_info", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("external_file_format", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("external_file_pattern", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } 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); diff --git a/src/share/inner_table/ob_inner_table_schema.11001_11050.cpp b/src/share/inner_table/ob_inner_table_schema.11001_11050.cpp index 2d36e4058..e35a90b1d 100644 --- a/src/share/inner_table/ob_inner_table_schema.11001_11050.cpp +++ b/src/share/inner_table/ob_inner_table_schema.11001_11050.cpp @@ -13839,6 +13839,66 @@ int ObInnerTableSchema::all_virtual_core_all_table_schema(ObTableSchema &table_s truncate_version_default, truncate_version_default); //default_value } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("external_file_location", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("external_file_location_access_info", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("external_file_format", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("external_file_pattern", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } 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); diff --git a/src/share/inner_table/ob_inner_table_schema.12051_12100.cpp b/src/share/inner_table/ob_inner_table_schema.12051_12100.cpp index de5e62e00..16b61cad5 100644 --- a/src/share/inner_table/ob_inner_table_schema.12051_12100.cpp +++ b/src/share/inner_table/ob_inner_table_schema.12051_12100.cpp @@ -6323,6 +6323,66 @@ int ObInnerTableSchema::all_virtual_table_schema(ObTableSchema &table_schema) truncate_version_default, truncate_version_default); //default_value } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("external_file_location", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("external_file_location_access_info", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("external_file_format", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("external_file_pattern", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } 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); @@ -7611,6 +7671,66 @@ int ObInnerTableSchema::all_virtual_table_history_schema(ObTableSchema &table_sc truncate_version_default, truncate_version_default); //default_value } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("external_file_location", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("external_file_location_access_info", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("external_file_format", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("external_file_pattern", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } 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); diff --git a/src/share/inner_table/ob_inner_table_schema.12351_12400.cpp b/src/share/inner_table/ob_inner_table_schema.12351_12400.cpp index 344168b18..f7681efe2 100644 --- a/src/share/inner_table/ob_inner_table_schema.12351_12400.cpp +++ b/src/share/inner_table/ob_inner_table_schema.12351_12400.cpp @@ -3514,6 +3514,170 @@ int ObInnerTableSchema::all_virtual_io_scheduler_schema(ObTableSchema &table_sch return ret; } +int ObInnerTableSchema::all_virtual_external_table_file_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_EXTERNAL_TABLE_FILE_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(4); + 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_EXTERNAL_TABLE_FILE_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("tenant_id", //column_name + ++column_id, //column_id + 1, //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("table_id", //column_name + ++column_id, //column_id + 2, //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("part_id", //column_name + ++column_id, //column_id + 3, //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("file_id", //column_name + ++column_id, //column_id + 4, //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("file_url", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 16384, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("create_version", //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("delete_version", //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("file_size", //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 + } + 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::all_virtual_task_opt_stat_gather_history_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.15101_15150.cpp b/src/share/inner_table/ob_inner_table_schema.15101_15150.cpp index 9c6b3e739..194215ba9 100644 --- a/src/share/inner_table/ob_inner_table_schema.15101_15150.cpp +++ b/src/share/inner_table/ob_inner_table_schema.15101_15150.cpp @@ -6218,6 +6218,66 @@ int ObInnerTableSchema::all_virtual_table_real_agent_ora_schema(ObTableSchema &t false); //is_autoincrement } + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("EXTERNAL_FILE_LOCATION", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("EXTERNAL_FILE_LOCATION_ACCESS_INFO", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("EXTERNAL_FILE_FORMAT", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("EXTERNAL_FILE_PATTERN", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + if (OB_SUCC(ret)) { ADD_COLUMN_SCHEMA("GMT_CREATE", //column_name ++column_id, //column_id diff --git a/src/share/inner_table/ob_inner_table_schema.15201_15250.cpp b/src/share/inner_table/ob_inner_table_schema.15201_15250.cpp index 66ed72e2a..07a09d742 100644 --- a/src/share/inner_table/ob_inner_table_schema.15201_15250.cpp +++ b/src/share/inner_table/ob_inner_table_schema.15201_15250.cpp @@ -5956,6 +5956,66 @@ int ObInnerTableSchema::all_virtual_core_all_table_ora_schema(ObTableSchema &tab false, //is_nullable false); //is_autoincrement } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("EXTERNAL_FILE_LOCATION", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("EXTERNAL_FILE_LOCATION_ACCESS_INFO", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("EXTERNAL_FILE_FORMAT", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("EXTERNAL_FILE_PATTERN", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } 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); diff --git a/src/share/inner_table/ob_inner_table_schema.15251_15300.cpp b/src/share/inner_table/ob_inner_table_schema.15251_15300.cpp index 6ec48fb47..401f65b41 100644 --- a/src/share/inner_table/ob_inner_table_schema.15251_15300.cpp +++ b/src/share/inner_table/ob_inner_table_schema.15251_15300.cpp @@ -9246,6 +9246,155 @@ int ObInnerTableSchema::all_virtual_archive_dest_status_ora_schema(ObTableSchema return ret; } +int ObInnerTableSchema::all_virtual_external_table_file_real_agent_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_EXTERNAL_TABLE_FILE_REAL_AGENT_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(3); + 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_EXTERNAL_TABLE_FILE_REAL_AGENT_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("TABLE_ID", //column_name + ++column_id, //column_id + 1, //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("PART_ID", //column_name + ++column_id, //column_id + 2, //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("FILE_ID", //column_name + ++column_id, //column_id + 3, //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("FILE_URL", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 16384, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("CREATE_VERSION", //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("DELETE_VERSION", //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("FILE_SIZE", //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 + } + 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::all_virtual_task_opt_stat_gather_history_ora_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.1_50.cpp b/src/share/inner_table/ob_inner_table_schema.1_50.cpp index ddb884e0b..b7aa2121d 100644 --- a/src/share/inner_table/ob_inner_table_schema.1_50.cpp +++ b/src/share/inner_table/ob_inner_table_schema.1_50.cpp @@ -1451,6 +1451,66 @@ int ObInnerTableSchema::all_table_schema(ObTableSchema &table_schema) truncate_version_default, truncate_version_default); //default_value } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("external_file_location", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("external_file_location_access_info", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("external_file_format", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("external_file_pattern", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_VARCHAR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } 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); 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 b81cb6fc1..480e4e737 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 @@ -410,7 +410,7 @@ int ObInnerTableSchema::tables_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 /*+ leading(a) no_use_nl(ts)*/ cast('def' as char(512)) as TABLE_CATALOG, cast(b.database_name as char(64)) as TABLE_SCHEMA, cast(a.table_name as char(64)) as TABLE_NAME, cast(case when (a.database_id = 201002 or a.table_type = 1) then 'SYSTEM VIEW' when a.table_type in (0, 2) then 'SYSTEM TABLE' when a.table_type = 4 then 'VIEW' else 'BASE TABLE' end as char(64)) as TABLE_TYPE, cast(NULL as char(64)) as ENGINE, cast(NULL as unsigned) as VERSION, cast(NULL as char(10)) as ROW_FORMAT, cast( coalesce(ts.row_cnt,0) as unsigned) as TABLE_ROWS, cast( coalesce(ts.avg_row_len,0) as unsigned) as AVG_ROW_LENGTH, cast( coalesce(ts.data_size,0) 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, cast(NULL as unsigned) as AUTO_INCREMENT, cast(a.gmt_create as datetime) as CREATE_TIME, cast(a.gmt_modified as datetime) as UPDATE_TIME, cast(NULL as datetime) as CHECK_TIME, cast(d.collation as char(32)) as TABLE_COLLATION, cast(NULL as unsigned) as CHECKSUM, cast(NULL as char(255)) as CREATE_OPTIONS, cast(case when a.table_type = 4 then 'VIEW' else a.comment end as char(2048)) as TABLE_COMMENT from ( select cast(0 as signed) as tenant_id, c.database_id, c.table_id, c.table_name, c.collation_type, c.table_type, usec_to_time(d.schema_version) as gmt_create, usec_to_time(c.schema_version) as gmt_modified, c.comment from oceanbase.__all_virtual_core_all_table c join oceanbase.__all_virtual_core_all_table d on c.tenant_id = d.tenant_id and d.table_name = '__all_core_table' where c.tenant_id = effective_tenant_id() union all select tenant_id, database_id, table_id, table_name, collation_type, table_type, gmt_create, gmt_modified, comment from oceanbase.__all_table) a join oceanbase.__all_database b on a.database_id = b.database_id and a.tenant_id = b.tenant_id join oceanbase.__tenant_virtual_collation d on a.collation_type = d.collation_type left join ( select tenant_id, table_id, sum(row_cnt) as row_cnt, sum(row_cnt * avg_row_len) / sum(row_cnt) as avg_row_len, sum(row_cnt * avg_row_len) as data_size from oceanbase.__all_table_stat group by tenant_id, table_id) ts on a.table_id = ts.table_id and a.tenant_id = ts.tenant_id where a.tenant_id = 0 and a.table_type in (0, 1, 2, 3, 4) and b.database_name != '__recyclebin' and b.in_recyclebin = 0 and 0 = sys_privilege_check('table_acc', effective_tenant_id(), b.database_name, a.table_name) )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( select /*+ leading(a) no_use_nl(ts)*/ cast('def' as char(512)) as TABLE_CATALOG, cast(b.database_name as char(64)) as TABLE_SCHEMA, cast(a.table_name as char(64)) as TABLE_NAME, cast(case when (a.database_id = 201002 or a.table_type = 1) then 'SYSTEM VIEW' when a.table_type in (0, 2) then 'SYSTEM TABLE' when a.table_type = 4 then 'VIEW' else 'BASE TABLE' end as char(64)) as TABLE_TYPE, cast(NULL as char(64)) as ENGINE, cast(NULL as unsigned) as VERSION, cast(NULL as char(10)) as ROW_FORMAT, cast( coalesce(ts.row_cnt,0) as unsigned) as TABLE_ROWS, cast( coalesce(ts.avg_row_len,0) as unsigned) as AVG_ROW_LENGTH, cast( coalesce(ts.data_size,0) 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, cast(NULL as unsigned) as AUTO_INCREMENT, cast(a.gmt_create as datetime) as CREATE_TIME, cast(a.gmt_modified as datetime) as UPDATE_TIME, cast(NULL as datetime) as CHECK_TIME, cast(d.collation as char(32)) as TABLE_COLLATION, cast(NULL as unsigned) as CHECKSUM, cast(NULL as char(255)) as CREATE_OPTIONS, cast(case when a.table_type = 4 then 'VIEW' else a.comment end as char(2048)) as TABLE_COMMENT from ( select cast(0 as signed) as tenant_id, c.database_id, c.table_id, c.table_name, c.collation_type, c.table_type, usec_to_time(d.schema_version) as gmt_create, usec_to_time(c.schema_version) as gmt_modified, c.comment from oceanbase.__all_virtual_core_all_table c join oceanbase.__all_virtual_core_all_table d on c.tenant_id = d.tenant_id and d.table_name = '__all_core_table' where c.tenant_id = effective_tenant_id() union all select tenant_id, database_id, table_id, table_name, collation_type, table_type, gmt_create, gmt_modified, comment from oceanbase.__all_table) a join oceanbase.__all_database b on a.database_id = b.database_id and a.tenant_id = b.tenant_id join oceanbase.__tenant_virtual_collation d on a.collation_type = d.collation_type left join ( select tenant_id, table_id, sum(row_cnt) as row_cnt, sum(row_cnt * avg_row_len) / sum(row_cnt) as avg_row_len, sum(row_cnt * avg_row_len) as data_size from oceanbase.__all_table_stat group by tenant_id, table_id) ts on a.table_id = ts.table_id and a.tenant_id = ts.tenant_id where a.tenant_id = 0 and a.table_type in (0, 1, 2, 3, 4, 14) and b.database_name != '__recyclebin' and b.in_recyclebin = 0 and 0 = sys_privilege_check('table_acc', effective_tenant_id(), b.database_name, a.table_name) )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.21151_21200.cpp b/src/share/inner_table/ob_inner_table_schema.21151_21200.cpp index 5c2d5bc93..c66204a76 100644 --- a/src/share/inner_table/ob_inner_table_schema.21151_21200.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21151_21200.cpp @@ -1910,7 +1910,7 @@ int ObInnerTableSchema::cdb_objects_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 CAST(A.TENANT_ID AS SIGNED) AS CON_ID, CAST(B.DATABASE_NAME AS CHAR(128)) AS OWNER, CAST(A.OBJECT_NAME AS CHAR(128)) AS OBJECT_NAME, CAST(A.SUBOBJECT_NAME AS CHAR(128)) AS SUBOBJECT_NAME, CAST(A.OBJECT_ID AS SIGNED) AS OBJECT_ID, CAST(A.DATA_OBJECT_ID AS SIGNED) AS DATA_OBJECT_ID, CAST(A.OBJECT_TYPE AS CHAR(23)) AS OBJECT_TYPE, CAST(A.GMT_CREATE AS DATETIME) AS CREATED, CAST(A.GMT_MODIFIED AS DATETIME) AS LAST_DDL_TIME, CAST(A.GMT_CREATE AS DATETIME) AS TIMESTAMP, CAST(A.STATUS AS CHAR(7)) AS STATUS, CAST(A.TEMPORARY AS CHAR(1)) AS TEMPORARY, CAST(A.`GENERATED` AS CHAR(1)) AS "GENERATED", CAST(A.SECONDARY AS CHAR(1)) AS SECONDARY, CAST(A.NAMESPACE AS SIGNED) AS NAMESPACE, CAST(A.EDITION_NAME AS CHAR(128)) AS EDITION_NAME, CAST(NULL AS CHAR(18)) AS SHARING, CAST(NULL AS CHAR(1)) AS EDITIONABLE, CAST(NULL AS CHAR(1)) AS ORACLE_MAINTAINED, CAST(NULL AS CHAR(1)) AS APPLICATION, CAST(NULL AS CHAR(1)) AS DEFAULT_COLLATION, CAST(NULL AS CHAR(1)) AS DUPLICATED, CAST(NULL AS CHAR(1)) AS SHARDED, CAST(NULL AS CHAR(1)) AS IMPORTED_OBJECT, CAST(NULL AS SIGNED) AS CREATED_APPID, CAST(NULL AS SIGNED) AS CREATED_VSNID, CAST(NULL AS SIGNED) AS MODIFIED_APPID, CAST(NULL AS SIGNED) AS MODIFIED_VSNID FROM ( SELECT A.TENANT_ID, USEC_TO_TIME(B.SCHEMA_VERSION) AS GMT_CREATE, USEC_TO_TIME(A.SCHEMA_VERSION) AS GMT_MODIFIED, A.DATABASE_ID, A.TABLE_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, CAST(A.TABLE_ID AS SIGNED) AS OBJECT_ID, A.TABLET_ID AS DATA_OBJECT_ID, 'TABLE' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_CORE_ALL_TABLE A JOIN OCEANBASE.__ALL_VIRTUAL_CORE_ALL_TABLE B ON A.TENANT_ID = B.TENANT_ID AND B.TABLE_NAME = '__all_core_table' UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,CAST((CASE WHEN DATABASE_ID = 201004 THEN TABLE_NAME WHEN TABLE_TYPE = 5 THEN SUBSTR(TABLE_NAME, 7 + POSITION('_' IN SUBSTR(TABLE_NAME, 7))) ELSE TABLE_NAME END) AS CHAR(128)) AS OBJECT_NAME ,NULL SUBOBJECT_NAME ,TABLE_ID OBJECT_ID ,(CASE WHEN TABLET_ID != 0 THEN TABLET_ID ELSE NULL END) DATA_OBJECT_ID ,CASE WHEN TABLE_TYPE IN (0,3,6,8,9) THEN 'TABLE' WHEN TABLE_TYPE IN (2) THEN 'VIRTUAL TABLE' WHEN TABLE_TYPE IN (1,4) THEN 'VIEW' WHEN TABLE_TYPE IN (5) THEN 'INDEX' WHEN TABLE_TYPE IN (7) THEN 'MATERIALIZED VIEW' ELSE NULL END AS OBJECT_TYPE ,CAST(CASE WHEN TABLE_TYPE IN (5) THEN CASE WHEN INDEX_STATUS = 2 THEN 'VALID' WHEN INDEX_STATUS = 3 THEN 'CHECKING' WHEN INDEX_STATUS = 4 THEN 'INELEGIBLE' WHEN INDEX_STATUS = 5 THEN 'ERROR' ELSE 'UNUSABLE' END ELSE CASE WHEN OBJECT_STATUS = 1 THEN 'VALID' ELSE 'INVALID' END END AS CHAR(10)) AS STATUS ,CASE WHEN TABLE_TYPE IN (6,8,9) THEN 'Y' ELSE 'N' END AS TEMPORARY ,CASE WHEN TABLE_TYPE IN (0,1) THEN 'Y' ELSE 'N' END AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_TABLE WHERE TABLE_TYPE != 12 AND TABLE_TYPE != 13 UNION ALL SELECT CST.TENANT_ID ,CST.GMT_CREATE ,CST.GMT_MODIFIED ,DB.DATABASE_ID ,CST.constraint_name AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,TBL.TABLE_ID AS OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'INDEX' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_CONSTRAINT CST, OCEANBASE.__ALL_VIRTUAL_TABLE TBL, OCEANBASE.__ALL_VIRTUAL_DATABASE DB WHERE CST.TENANT_ID = TBL.TENANT_ID AND TBL.TENANT_ID = DB.TENANT_ID AND DB.DATABASE_ID = TBL.DATABASE_ID AND TBL.TABLE_ID = CST.TABLE_ID and CST.CONSTRAINT_TYPE = 1 UNION ALL SELECT P.TENANT_ID ,P.GMT_CREATE ,P.GMT_MODIFIED ,T.DATABASE_ID ,CAST((CASE WHEN T.DATABASE_ID = 201004 THEN T.TABLE_NAME WHEN T.TABLE_TYPE = 5 THEN SUBSTR(T.TABLE_NAME, 7 + POSITION('_' IN SUBSTR(T.TABLE_NAME, 7))) ELSE T.TABLE_NAME END) AS CHAR(128)) AS OBJECT_NAME ,P.PART_NAME SUBOBJECT_NAME ,P.PART_ID OBJECT_ID ,CASE WHEN P.TABLET_ID != 0 THEN P.TABLET_ID ELSE NULL END AS DATA_OBJECT_ID ,(CASE WHEN T.TABLE_TYPE = 5 THEN 'INDEX PARTITION' ELSE 'TABLE PARTITION' END) AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY , NULL AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_TABLE T JOIN OCEANBASE.__ALL_VIRTUAL_PART P ON T.TABLE_ID = P.TABLE_ID WHERE T.TENANT_ID = P.TENANT_ID UNION ALL SELECT SUBP.TENANT_ID ,SUBP.GMT_CREATE ,SUBP.GMT_MODIFIED ,T.DATABASE_ID ,CAST((CASE WHEN T.DATABASE_ID = 201004 THEN T.TABLE_NAME WHEN T.TABLE_TYPE = 5 THEN SUBSTR(T.TABLE_NAME, 7 + POSITION('_' IN SUBSTR(T.TABLE_NAME, 7))) ELSE T.TABLE_NAME END) AS CHAR(128)) AS OBJECT_NAME ,SUBP.SUB_PART_NAME SUBOBJECT_NAME ,SUBP.SUB_PART_ID OBJECT_ID ,SUBP.TABLET_ID AS DATA_OBJECT_ID ,(CASE WHEN T.TABLE_TYPE = 5 THEN 'INDEX SUBPARTITION' ELSE 'TABLE SUBPARTITION' END) AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'Y' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_TABLE T, OCEANBASE.__ALL_VIRTUAL_PART P,OCEANBASE.__ALL_VIRTUAL_SUB_PART SUBP WHERE T.TABLE_ID =P.TABLE_ID AND P.TABLE_ID=SUBP.TABLE_ID AND P.PART_ID =SUBP.PART_ID AND T.TENANT_ID = P.TENANT_ID AND P.TENANT_ID = SUBP.TENANT_ID UNION ALL SELECT P.TENANT_ID ,P.GMT_CREATE ,P.GMT_MODIFIED ,P.DATABASE_ID ,P.PACKAGE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,P.PACKAGE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN TYPE = 1 THEN 'PACKAGE' WHEN TYPE = 2 THEN 'PACKAGE BODY' ELSE NULL END AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM OCEANBASE.__ALL_VIRTUAL_ERROR E WHERE P.TENANT_ID = E.TENANT_ID AND P.PACKAGE_ID = E.OBJ_ID AND (E.OBJ_TYPE = 3 OR E.OBJ_TYPE = 5)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_PACKAGE P UNION ALL SELECT R.TENANT_ID ,R.GMT_CREATE ,R.GMT_MODIFIED ,R.DATABASE_ID ,R.ROUTINE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,R.ROUTINE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN ROUTINE_TYPE = 1 THEN 'PROCEDURE' WHEN ROUTINE_TYPE = 2 THEN 'FUNCTION' ELSE NULL END AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM OCEANBASE.__ALL_VIRTUAL_ERROR E WHERE R.TENANT_ID = E.TENANT_ID AND R.ROUTINE_ID = E.OBJ_ID AND (E.OBJ_TYPE = 9 OR E.OBJ_TYPE = 12)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_ROUTINE R WHERE (ROUTINE_TYPE = 1 OR ROUTINE_TYPE = 2) UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,TYPE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,TYPE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_TYPE UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,OBJECT_TYPE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE BODY' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_OBJECT_TYPE WHERE TYPE = 2 UNION ALL SELECT T.TENANT_ID ,T.GMT_CREATE ,T.GMT_MODIFIED ,T.DATABASE_ID ,T.TRIGGER_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,T.TRIGGER_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TRIGGER' OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM OCEANBASE.__ALL_VIRTUAL_ERROR E WHERE T.TENANT_ID = E.TENANT_ID AND T.TRIGGER_ID = E.OBJ_ID AND (E.OBJ_TYPE = 7)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_TRIGGER T UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,SEQUENCE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,SEQUENCE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'SEQUENCE' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_SEQUENCE_OBJECT UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,SYNONYM_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,SYNONYM_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'SYNONYM' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_SYNONYM UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS SIGNED) AS DATABASE_ID ,NAMESPACE AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,CONTEXT_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'CONTEXT' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,21 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_TENANT_CONTEXT UNION ALL SELECT TENANT_ID, GMT_CREATE, GMT_MODIFIED, DATABASE_ID, DATABASE_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, DATABASE_ID AS OBJECT_ID, NULL AS DATA_OBJECT_ID, 'DATABASE' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_DATABASE UNION ALL SELECT TENANT_ID, GMT_CREATE, GMT_MODIFIED, CAST(201001 AS SIGNED) AS DATABASE_ID, TABLEGROUP_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, TABLEGROUP_ID AS OBJECT_ID, NULL AS DATA_OBJECT_ID, 'TABLEGROUP' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_TABLEGROUP UNION ALL SELECT P.TENANT_ID, P.GMT_CREATE, P.GMT_MODIFIED, CAST(201001 AS SIGNED) AS DATABASE_ID, TG.TABLEGROUP_NAME AS OBJECT_NAME, P.PART_NAME SUBOBJECT_NAME, P.PART_ID OBJECT_ID, NULL AS DATA_OBJECT_ID, 'TABLEGROUP PARTITION' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, NULL AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_TABLEGROUP TG JOIN OCEANBASE.__ALL_VIRTUAL_PART P ON TG.TABLEGROUP_ID = P.TABLE_ID WHERE TG.TENANT_ID = P.TENANT_ID UNION ALL SELECT SUBP.TENANT_ID, SUBP.GMT_CREATE, SUBP.GMT_MODIFIED, CAST(201001 AS SIGNED) AS DATABASE_ID, TG.TABLEGROUP_NAME AS OBJECT_NAME, SUBP.SUB_PART_NAME SUBOBJECT_NAME, SUBP.SUB_PART_ID OBJECT_ID, NULL DATA_OBJECT_ID, 'TABLEGROUP SUBPARTITION' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'Y' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_TABLEGROUP TG, OCEANBASE.__ALL_VIRTUAL_PART P,OCEANBASE.__ALL_VIRTUAL_SUB_PART SUBP WHERE TG.TABLEGROUP_ID = P.TABLE_ID AND P.TABLE_ID = SUBP.TABLE_ID AND P.PART_ID = SUBP.PART_ID AND TG.TENANT_ID = P.TENANT_ID AND P.TENANT_ID = SUBP.TENANT_ID ) A JOIN OCEANBASE.__ALL_VIRTUAL_DATABASE B ON A.TENANT_ID = B.TENANT_ID AND A.DATABASE_ID = B.DATABASE_ID )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(A.TENANT_ID AS SIGNED) AS CON_ID, CAST(B.DATABASE_NAME AS CHAR(128)) AS OWNER, CAST(A.OBJECT_NAME AS CHAR(128)) AS OBJECT_NAME, CAST(A.SUBOBJECT_NAME AS CHAR(128)) AS SUBOBJECT_NAME, CAST(A.OBJECT_ID AS SIGNED) AS OBJECT_ID, CAST(A.DATA_OBJECT_ID AS SIGNED) AS DATA_OBJECT_ID, CAST(A.OBJECT_TYPE AS CHAR(23)) AS OBJECT_TYPE, CAST(A.GMT_CREATE AS DATETIME) AS CREATED, CAST(A.GMT_MODIFIED AS DATETIME) AS LAST_DDL_TIME, CAST(A.GMT_CREATE AS DATETIME) AS TIMESTAMP, CAST(A.STATUS AS CHAR(7)) AS STATUS, CAST(A.TEMPORARY AS CHAR(1)) AS TEMPORARY, CAST(A.`GENERATED` AS CHAR(1)) AS "GENERATED", CAST(A.SECONDARY AS CHAR(1)) AS SECONDARY, CAST(A.NAMESPACE AS SIGNED) AS NAMESPACE, CAST(A.EDITION_NAME AS CHAR(128)) AS EDITION_NAME, CAST(NULL AS CHAR(18)) AS SHARING, CAST(NULL AS CHAR(1)) AS EDITIONABLE, CAST(NULL AS CHAR(1)) AS ORACLE_MAINTAINED, CAST(NULL AS CHAR(1)) AS APPLICATION, CAST(NULL AS CHAR(1)) AS DEFAULT_COLLATION, CAST(NULL AS CHAR(1)) AS DUPLICATED, CAST(NULL AS CHAR(1)) AS SHARDED, CAST(NULL AS CHAR(1)) AS IMPORTED_OBJECT, CAST(NULL AS SIGNED) AS CREATED_APPID, CAST(NULL AS SIGNED) AS CREATED_VSNID, CAST(NULL AS SIGNED) AS MODIFIED_APPID, CAST(NULL AS SIGNED) AS MODIFIED_VSNID FROM ( SELECT A.TENANT_ID, USEC_TO_TIME(B.SCHEMA_VERSION) AS GMT_CREATE, USEC_TO_TIME(A.SCHEMA_VERSION) AS GMT_MODIFIED, A.DATABASE_ID, A.TABLE_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, CAST(A.TABLE_ID AS SIGNED) AS OBJECT_ID, A.TABLET_ID AS DATA_OBJECT_ID, 'TABLE' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_CORE_ALL_TABLE A JOIN OCEANBASE.__ALL_VIRTUAL_CORE_ALL_TABLE B ON A.TENANT_ID = B.TENANT_ID AND B.TABLE_NAME = '__all_core_table' UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,CAST((CASE WHEN DATABASE_ID = 201004 THEN TABLE_NAME WHEN TABLE_TYPE = 5 THEN SUBSTR(TABLE_NAME, 7 + POSITION('_' IN SUBSTR(TABLE_NAME, 7))) ELSE TABLE_NAME END) AS CHAR(128)) AS OBJECT_NAME ,NULL SUBOBJECT_NAME ,TABLE_ID OBJECT_ID ,(CASE WHEN TABLET_ID != 0 THEN TABLET_ID ELSE NULL END) DATA_OBJECT_ID ,CASE WHEN TABLE_TYPE IN (0,3,6,8,9,14) THEN 'TABLE' WHEN TABLE_TYPE IN (2) THEN 'VIRTUAL TABLE' WHEN TABLE_TYPE IN (1,4) THEN 'VIEW' WHEN TABLE_TYPE IN (5) THEN 'INDEX' WHEN TABLE_TYPE IN (7) THEN 'MATERIALIZED VIEW' ELSE NULL END AS OBJECT_TYPE ,CAST(CASE WHEN TABLE_TYPE IN (5) THEN CASE WHEN INDEX_STATUS = 2 THEN 'VALID' WHEN INDEX_STATUS = 3 THEN 'CHECKING' WHEN INDEX_STATUS = 4 THEN 'INELEGIBLE' WHEN INDEX_STATUS = 5 THEN 'ERROR' ELSE 'UNUSABLE' END ELSE CASE WHEN OBJECT_STATUS = 1 THEN 'VALID' ELSE 'INVALID' END END AS CHAR(10)) AS STATUS ,CASE WHEN TABLE_TYPE IN (6,8,9) THEN 'Y' ELSE 'N' END AS TEMPORARY ,CASE WHEN TABLE_TYPE IN (0,1) THEN 'Y' ELSE 'N' END AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_TABLE WHERE TABLE_TYPE != 12 AND TABLE_TYPE != 13 UNION ALL SELECT CST.TENANT_ID ,CST.GMT_CREATE ,CST.GMT_MODIFIED ,DB.DATABASE_ID ,CST.constraint_name AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,TBL.TABLE_ID AS OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'INDEX' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_CONSTRAINT CST, OCEANBASE.__ALL_VIRTUAL_TABLE TBL, OCEANBASE.__ALL_VIRTUAL_DATABASE DB WHERE CST.TENANT_ID = TBL.TENANT_ID AND TBL.TENANT_ID = DB.TENANT_ID AND DB.DATABASE_ID = TBL.DATABASE_ID AND TBL.TABLE_ID = CST.TABLE_ID and CST.CONSTRAINT_TYPE = 1 UNION ALL SELECT P.TENANT_ID ,P.GMT_CREATE ,P.GMT_MODIFIED ,T.DATABASE_ID ,CAST((CASE WHEN T.DATABASE_ID = 201004 THEN T.TABLE_NAME WHEN T.TABLE_TYPE = 5 THEN SUBSTR(T.TABLE_NAME, 7 + POSITION('_' IN SUBSTR(T.TABLE_NAME, 7))) ELSE T.TABLE_NAME END) AS CHAR(128)) AS OBJECT_NAME ,P.PART_NAME SUBOBJECT_NAME ,P.PART_ID OBJECT_ID ,CASE WHEN P.TABLET_ID != 0 THEN P.TABLET_ID ELSE NULL END AS DATA_OBJECT_ID ,(CASE WHEN T.TABLE_TYPE = 5 THEN 'INDEX PARTITION' ELSE 'TABLE PARTITION' END) AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY , NULL AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_TABLE T JOIN OCEANBASE.__ALL_VIRTUAL_PART P ON T.TABLE_ID = P.TABLE_ID WHERE T.TENANT_ID = P.TENANT_ID UNION ALL SELECT SUBP.TENANT_ID ,SUBP.GMT_CREATE ,SUBP.GMT_MODIFIED ,T.DATABASE_ID ,CAST((CASE WHEN T.DATABASE_ID = 201004 THEN T.TABLE_NAME WHEN T.TABLE_TYPE = 5 THEN SUBSTR(T.TABLE_NAME, 7 + POSITION('_' IN SUBSTR(T.TABLE_NAME, 7))) ELSE T.TABLE_NAME END) AS CHAR(128)) AS OBJECT_NAME ,SUBP.SUB_PART_NAME SUBOBJECT_NAME ,SUBP.SUB_PART_ID OBJECT_ID ,SUBP.TABLET_ID AS DATA_OBJECT_ID ,(CASE WHEN T.TABLE_TYPE = 5 THEN 'INDEX SUBPARTITION' ELSE 'TABLE SUBPARTITION' END) AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'Y' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_TABLE T, OCEANBASE.__ALL_VIRTUAL_PART P,OCEANBASE.__ALL_VIRTUAL_SUB_PART SUBP WHERE T.TABLE_ID =P.TABLE_ID AND P.TABLE_ID=SUBP.TABLE_ID AND P.PART_ID =SUBP.PART_ID AND T.TENANT_ID = P.TENANT_ID AND P.TENANT_ID = SUBP.TENANT_ID UNION ALL SELECT P.TENANT_ID ,P.GMT_CREATE ,P.GMT_MODIFIED ,P.DATABASE_ID ,P.PACKAGE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,P.PACKAGE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN TYPE = 1 THEN 'PACKAGE' WHEN TYPE = 2 THEN 'PACKAGE BODY' ELSE NULL END AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM OCEANBASE.__ALL_VIRTUAL_ERROR E WHERE P.TENANT_ID = E.TENANT_ID AND P.PACKAGE_ID = E.OBJ_ID AND (E.OBJ_TYPE = 3 OR E.OBJ_TYPE = 5)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_PACKAGE P UNION ALL SELECT R.TENANT_ID ,R.GMT_CREATE ,R.GMT_MODIFIED ,R.DATABASE_ID ,R.ROUTINE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,R.ROUTINE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN ROUTINE_TYPE = 1 THEN 'PROCEDURE' WHEN ROUTINE_TYPE = 2 THEN 'FUNCTION' ELSE NULL END AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM OCEANBASE.__ALL_VIRTUAL_ERROR E WHERE R.TENANT_ID = E.TENANT_ID AND R.ROUTINE_ID = E.OBJ_ID AND (E.OBJ_TYPE = 9 OR E.OBJ_TYPE = 12)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_ROUTINE R WHERE (ROUTINE_TYPE = 1 OR ROUTINE_TYPE = 2) UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,TYPE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,TYPE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_TYPE UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,OBJECT_TYPE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE BODY' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_OBJECT_TYPE WHERE TYPE = 2 UNION ALL SELECT T.TENANT_ID ,T.GMT_CREATE ,T.GMT_MODIFIED ,T.DATABASE_ID ,T.TRIGGER_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,T.TRIGGER_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TRIGGER' OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM OCEANBASE.__ALL_VIRTUAL_ERROR E WHERE T.TENANT_ID = E.TENANT_ID AND T.TRIGGER_ID = E.OBJ_ID AND (E.OBJ_TYPE = 7)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_TRIGGER T UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,SEQUENCE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,SEQUENCE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'SEQUENCE' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_SEQUENCE_OBJECT UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,SYNONYM_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,SYNONYM_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'SYNONYM' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_SYNONYM UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS SIGNED) AS DATABASE_ID ,NAMESPACE AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,CONTEXT_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'CONTEXT' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,21 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_TENANT_CONTEXT UNION ALL SELECT TENANT_ID, GMT_CREATE, GMT_MODIFIED, DATABASE_ID, DATABASE_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, DATABASE_ID AS OBJECT_ID, NULL AS DATA_OBJECT_ID, 'DATABASE' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_DATABASE UNION ALL SELECT TENANT_ID, GMT_CREATE, GMT_MODIFIED, CAST(201001 AS SIGNED) AS DATABASE_ID, TABLEGROUP_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, TABLEGROUP_ID AS OBJECT_ID, NULL AS DATA_OBJECT_ID, 'TABLEGROUP' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_TABLEGROUP UNION ALL SELECT P.TENANT_ID, P.GMT_CREATE, P.GMT_MODIFIED, CAST(201001 AS SIGNED) AS DATABASE_ID, TG.TABLEGROUP_NAME AS OBJECT_NAME, P.PART_NAME SUBOBJECT_NAME, P.PART_ID OBJECT_ID, NULL AS DATA_OBJECT_ID, 'TABLEGROUP PARTITION' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, NULL AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_TABLEGROUP TG JOIN OCEANBASE.__ALL_VIRTUAL_PART P ON TG.TABLEGROUP_ID = P.TABLE_ID WHERE TG.TENANT_ID = P.TENANT_ID UNION ALL SELECT SUBP.TENANT_ID, SUBP.GMT_CREATE, SUBP.GMT_MODIFIED, CAST(201001 AS SIGNED) AS DATABASE_ID, TG.TABLEGROUP_NAME AS OBJECT_NAME, SUBP.SUB_PART_NAME SUBOBJECT_NAME, SUBP.SUB_PART_ID OBJECT_ID, NULL DATA_OBJECT_ID, 'TABLEGROUP SUBPARTITION' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'Y' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_TABLEGROUP TG, OCEANBASE.__ALL_VIRTUAL_PART P,OCEANBASE.__ALL_VIRTUAL_SUB_PART SUBP WHERE TG.TABLEGROUP_ID = P.TABLE_ID AND P.TABLE_ID = SUBP.TABLE_ID AND P.PART_ID = SUBP.PART_ID AND TG.TENANT_ID = P.TENANT_ID AND P.TENANT_ID = SUBP.TENANT_ID ) A JOIN OCEANBASE.__ALL_VIRTUAL_DATABASE B ON A.TENANT_ID = B.TENANT_ID AND A.DATABASE_ID = B.DATABASE_ID )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1960,7 +1960,7 @@ int ObInnerTableSchema::cdb_tables_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 CAST(DB.TENANT_ID AS SIGNED) AS CON_ID, CAST(DB.DATABASE_NAME AS CHAR(128)) AS OWNER, CAST(T.TABLE_NAME AS CHAR(128)) AS TABLE_NAME, CAST(TP.TABLESPACE_NAME AS CHAR(30)) AS TABLESPACE_NAME, CAST(NULL AS CHAR(128)) AS CLUSTER_NAME, CAST(NULL AS CHAR(128)) AS IOT_NAME, CAST('VALID' AS CHAR(8)) AS STATUS, CAST(T.PCTFREE AS SIGNED) AS PCT_FREE, CAST(NULL AS SIGNED) AS PCT_USED, CAST(NULL AS SIGNED) AS INI_TRANS, CAST(NULL AS SIGNED) AS MAX_TRANS, CAST(NULL AS SIGNED) AS INITIAL_EXTENT, CAST(NULL AS SIGNED) AS NEXT_EXTENT, CAST(NULL AS SIGNED) AS MIN_EXTENTS, CAST(NULL AS SIGNED) AS MAX_EXTENTS, CAST(NULL AS SIGNED) AS PCT_INCREASE, CAST(NULL AS SIGNED) AS FREELISTS, CAST(NULL AS SIGNED) AS FREELIST_GROUPS, CAST(NULL AS CHAR(3)) AS LOGGING, CAST(NULL AS CHAR(1)) AS BACKED_UP, CAST(INFO.ROW_COUNT AS SIGNED) AS NUM_ROWS, CAST(NULL AS SIGNED) AS BLOCKS, CAST(NULL AS SIGNED) AS EMPTY_BLOCKS, CAST(NULL AS SIGNED) AS AVG_SPACE, CAST(NULL AS SIGNED) AS CHAIN_CNT, CAST(NULL AS SIGNED) AS AVG_ROW_LEN, CAST(NULL AS SIGNED) AS AVG_SPACE_FREELIST_BLOCKS, CAST(NULL AS SIGNED) AS NUM_FREELIST_BLOCKS, CAST(NULL AS CHAR(10)) AS DEGREE, CAST(NULL AS CHAR(10)) AS INSTANCES, CAST(NULL AS CHAR(5)) AS CACHE, CAST(NULL AS CHAR(8)) AS TABLE_LOCK, CAST(NULL AS SIGNED) AS SAMPLE_SIZE, CAST(NULL AS DATE) AS LAST_ANALYZED, CAST( CASE WHEN T.PART_LEVEL = 0 THEN 'NO' ELSE 'YES' END AS CHAR(3)) AS PARTITIONED, CAST(NULL AS CHAR(12)) AS IOT_TYPE, CAST(CASE WHEN T.TABLE_TYPE IN (6, 8, 9) THEN 'Y' ELSE 'N' END AS CHAR(1)) AS TEMPORARY, CAST(NULL AS CHAR(1)) AS SECONDARY, CAST('NO' AS CHAR(3)) AS NESTED, CAST(NULL AS CHAR(7)) AS BUFFER_POOL, CAST(NULL AS CHAR(7)) AS FLASH_CACHE, CAST(NULL AS CHAR(7)) AS CELL_FLASH_CACHE, CAST(NULL AS CHAR(8)) AS ROW_MOVEMENT, CAST(NULL AS CHAR(3)) AS GLOBAL_STATS, CAST(NULL AS CHAR(3)) AS USER_STATS, CAST(CASE WHEN T.TABLE_TYPE IN (6, 8) THEN 'SYS$SESSION' WHEN T.TABLE_TYPE IN (9) THEN 'SYS$TRANSACTION' ELSE NULL END AS CHAR(15)) AS DURATION, CAST(NULL AS CHAR(8)) AS SKIP_CORRUPT, CAST(NULL AS CHAR(3)) AS MONITORING, CAST(NULL AS CHAR(128)) AS CLUSTER_OWNER, CAST(NULL AS CHAR(8)) AS DEPENDENCIES, CAST(NULL AS CHAR(8)) AS COMPRESSION, CAST(NULL AS CHAR(30)) AS COMPRESS_FOR, CAST(CASE WHEN DB.IN_RECYCLEBIN = 1 THEN 'YES' ELSE 'NO' END AS CHAR(3)) AS DROPPED, CAST(NULL AS CHAR(3)) AS READ_ONLY, CAST(NULL AS CHAR(3)) AS SEGMENT_CREATED, CAST(NULL AS CHAR(7)) AS RESULT_CACHE, CAST(NULL AS CHAR(3)) AS CLUSTERING, CAST(NULL AS CHAR(23)) AS ACTIVITY_TRACKING, CAST(NULL AS CHAR(25)) AS DML_TIMESTAMP, CAST(NULL AS CHAR(3)) AS HAS_IDENTITY, CAST(NULL AS CHAR(3)) AS CONTAINER_DATA, CAST(NULL AS CHAR(8)) AS INMEMORY, CAST(NULL AS CHAR(8)) AS INMEMORY_PRIORITY, CAST(NULL AS CHAR(15)) AS INMEMORY_DISTRIBUTE, CAST(NULL AS CHAR(17)) AS INMEMORY_COMPRESSION, CAST(NULL AS CHAR(13)) AS INMEMORY_DUPLICATE, CAST(NULL AS CHAR(100)) AS DEFAULT_COLLATION, CAST(NULL AS CHAR(1)) AS DUPLICATED, CAST(NULL AS CHAR(1)) AS SHARDED, CAST(NULL AS CHAR(1)) AS EXTERNALLY_SHARDED, CAST(NULL AS CHAR(1)) AS EXTERNALLY_DUPLICATED, CAST(NULL AS CHAR(3)) AS EXTERNAL, CAST(NULL AS CHAR(3)) AS HYBRID, CAST(NULL AS CHAR(24)) AS CELLMEMORY, CAST(NULL AS CHAR(3)) AS CONTAINERS_DEFAULT, CAST(NULL AS CHAR(3)) AS CONTAINER_MAP, CAST(NULL AS CHAR(3)) AS EXTENDED_DATA_LINK, CAST(NULL AS CHAR(3)) AS EXTENDED_DATA_LINK_MAP, CAST(NULL AS CHAR(12)) AS INMEMORY_SERVICE, CAST(NULL AS CHAR(1000)) AS INMEMORY_SERVICE_NAME, CAST(NULL AS CHAR(3)) AS CONTAINER_MAP_OBJECT, CAST(NULL AS CHAR(8)) AS MEMOPTIMIZE_READ, CAST(NULL AS CHAR(8)) AS MEMOPTIMIZE_WRITE, CAST(NULL AS CHAR(3)) AS HAS_SENSITIVE_COLUMN, CAST(NULL AS CHAR(3)) AS ADMIT_NULL, CAST(NULL AS CHAR(3)) AS DATA_LINK_DML_ENABLED, CAST(NULL AS CHAR(8)) AS LOGICAL_REPLICATION FROM (SELECT TENANT_ID, TABLE_ID, SUM(ROW_CNT) AS ROW_COUNT FROM OCEANBASE.__ALL_VIRTUAL_TABLE_STAT TS GROUP BY TENANT_ID, TABLE_ID ) INFO RIGHT JOIN (SELECT TENANT_ID, TABLE_ID, TABLE_NAME, DATABASE_ID, PCTFREE, PART_LEVEL, TABLE_TYPE, TABLESPACE_ID FROM OCEANBASE.__ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, TABLE_NAME, DATABASE_ID, PCTFREE, PART_LEVEL, TABLE_TYPE, TABLESPACE_ID FROM OCEANBASE.__ALL_VIRTUAL_TABLE) T ON T.TENANT_ID = INFO.TENANT_ID AND T.TABLE_ID = INFO.TABLE_ID JOIN OCEANBASE.__ALL_VIRTUAL_DATABASE DB ON DB.TENANT_ID = T.TENANT_ID AND DB.DATABASE_ID = T.DATABASE_ID AND T.TABLE_TYPE IN (0, 3, 6, 8, 9) AND DB.DATABASE_NAME != '__recyclebin' LEFT JOIN OCEANBASE.__ALL_VIRTUAL_TENANT_TABLESPACE TP ON TP.TABLESPACE_ID = T.TABLESPACE_ID AND T.TENANT_ID = TP.TENANT_ID )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(DB.TENANT_ID AS SIGNED) AS CON_ID, CAST(DB.DATABASE_NAME AS CHAR(128)) AS OWNER, CAST(T.TABLE_NAME AS CHAR(128)) AS TABLE_NAME, CAST(TP.TABLESPACE_NAME AS CHAR(30)) AS TABLESPACE_NAME, CAST(NULL AS CHAR(128)) AS CLUSTER_NAME, CAST(NULL AS CHAR(128)) AS IOT_NAME, CAST('VALID' AS CHAR(8)) AS STATUS, CAST(T.PCTFREE AS SIGNED) AS PCT_FREE, CAST(NULL AS SIGNED) AS PCT_USED, CAST(NULL AS SIGNED) AS INI_TRANS, CAST(NULL AS SIGNED) AS MAX_TRANS, CAST(NULL AS SIGNED) AS INITIAL_EXTENT, CAST(NULL AS SIGNED) AS NEXT_EXTENT, CAST(NULL AS SIGNED) AS MIN_EXTENTS, CAST(NULL AS SIGNED) AS MAX_EXTENTS, CAST(NULL AS SIGNED) AS PCT_INCREASE, CAST(NULL AS SIGNED) AS FREELISTS, CAST(NULL AS SIGNED) AS FREELIST_GROUPS, CAST(NULL AS CHAR(3)) AS LOGGING, CAST(NULL AS CHAR(1)) AS BACKED_UP, CAST(INFO.ROW_COUNT AS SIGNED) AS NUM_ROWS, CAST(NULL AS SIGNED) AS BLOCKS, CAST(NULL AS SIGNED) AS EMPTY_BLOCKS, CAST(NULL AS SIGNED) AS AVG_SPACE, CAST(NULL AS SIGNED) AS CHAIN_CNT, CAST(NULL AS SIGNED) AS AVG_ROW_LEN, CAST(NULL AS SIGNED) AS AVG_SPACE_FREELIST_BLOCKS, CAST(NULL AS SIGNED) AS NUM_FREELIST_BLOCKS, CAST(NULL AS CHAR(10)) AS DEGREE, CAST(NULL AS CHAR(10)) AS INSTANCES, CAST(NULL AS CHAR(5)) AS CACHE, CAST(NULL AS CHAR(8)) AS TABLE_LOCK, CAST(NULL AS SIGNED) AS SAMPLE_SIZE, CAST(NULL AS DATE) AS LAST_ANALYZED, CAST( CASE WHEN T.PART_LEVEL = 0 THEN 'NO' ELSE 'YES' END AS CHAR(3)) AS PARTITIONED, CAST(NULL AS CHAR(12)) AS IOT_TYPE, CAST(CASE WHEN T.TABLE_TYPE IN (6, 8, 9) THEN 'Y' ELSE 'N' END AS CHAR(1)) AS TEMPORARY, CAST(NULL AS CHAR(1)) AS SECONDARY, CAST('NO' AS CHAR(3)) AS NESTED, CAST(NULL AS CHAR(7)) AS BUFFER_POOL, CAST(NULL AS CHAR(7)) AS FLASH_CACHE, CAST(NULL AS CHAR(7)) AS CELL_FLASH_CACHE, CAST(NULL AS CHAR(8)) AS ROW_MOVEMENT, CAST(NULL AS CHAR(3)) AS GLOBAL_STATS, CAST(NULL AS CHAR(3)) AS USER_STATS, CAST(CASE WHEN T.TABLE_TYPE IN (6, 8) THEN 'SYS$SESSION' WHEN T.TABLE_TYPE IN (9) THEN 'SYS$TRANSACTION' ELSE NULL END AS CHAR(15)) AS DURATION, CAST(NULL AS CHAR(8)) AS SKIP_CORRUPT, CAST(NULL AS CHAR(3)) AS MONITORING, CAST(NULL AS CHAR(128)) AS CLUSTER_OWNER, CAST(NULL AS CHAR(8)) AS DEPENDENCIES, CAST(NULL AS CHAR(8)) AS COMPRESSION, CAST(NULL AS CHAR(30)) AS COMPRESS_FOR, CAST(CASE WHEN DB.IN_RECYCLEBIN = 1 THEN 'YES' ELSE 'NO' END AS CHAR(3)) AS DROPPED, CAST(NULL AS CHAR(3)) AS READ_ONLY, CAST(NULL AS CHAR(3)) AS SEGMENT_CREATED, CAST(NULL AS CHAR(7)) AS RESULT_CACHE, CAST(NULL AS CHAR(3)) AS CLUSTERING, CAST(NULL AS CHAR(23)) AS ACTIVITY_TRACKING, CAST(NULL AS CHAR(25)) AS DML_TIMESTAMP, CAST(NULL AS CHAR(3)) AS HAS_IDENTITY, CAST(NULL AS CHAR(3)) AS CONTAINER_DATA, CAST(NULL AS CHAR(8)) AS INMEMORY, CAST(NULL AS CHAR(8)) AS INMEMORY_PRIORITY, CAST(NULL AS CHAR(15)) AS INMEMORY_DISTRIBUTE, CAST(NULL AS CHAR(17)) AS INMEMORY_COMPRESSION, CAST(NULL AS CHAR(13)) AS INMEMORY_DUPLICATE, CAST(NULL AS CHAR(100)) AS DEFAULT_COLLATION, CAST(NULL AS CHAR(1)) AS DUPLICATED, CAST(NULL AS CHAR(1)) AS SHARDED, CAST(NULL AS CHAR(1)) AS EXTERNALLY_SHARDED, CAST(NULL AS CHAR(1)) AS EXTERNALLY_DUPLICATED, CAST(NULL AS CHAR(3)) AS EXTERNAL, CAST(NULL AS CHAR(3)) AS HYBRID, CAST(NULL AS CHAR(24)) AS CELLMEMORY, CAST(NULL AS CHAR(3)) AS CONTAINERS_DEFAULT, CAST(NULL AS CHAR(3)) AS CONTAINER_MAP, CAST(NULL AS CHAR(3)) AS EXTENDED_DATA_LINK, CAST(NULL AS CHAR(3)) AS EXTENDED_DATA_LINK_MAP, CAST(NULL AS CHAR(12)) AS INMEMORY_SERVICE, CAST(NULL AS CHAR(1000)) AS INMEMORY_SERVICE_NAME, CAST(NULL AS CHAR(3)) AS CONTAINER_MAP_OBJECT, CAST(NULL AS CHAR(8)) AS MEMOPTIMIZE_READ, CAST(NULL AS CHAR(8)) AS MEMOPTIMIZE_WRITE, CAST(NULL AS CHAR(3)) AS HAS_SENSITIVE_COLUMN, CAST(NULL AS CHAR(3)) AS ADMIT_NULL, CAST(NULL AS CHAR(3)) AS DATA_LINK_DML_ENABLED, CAST(NULL AS CHAR(8)) AS LOGICAL_REPLICATION FROM (SELECT TENANT_ID, TABLE_ID, SUM(ROW_CNT) AS ROW_COUNT FROM OCEANBASE.__ALL_VIRTUAL_TABLE_STAT TS GROUP BY TENANT_ID, TABLE_ID ) INFO RIGHT JOIN (SELECT TENANT_ID, TABLE_ID, TABLE_NAME, DATABASE_ID, PCTFREE, PART_LEVEL, TABLE_TYPE, TABLESPACE_ID FROM OCEANBASE.__ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, TABLE_NAME, DATABASE_ID, PCTFREE, PART_LEVEL, TABLE_TYPE, TABLESPACE_ID FROM OCEANBASE.__ALL_VIRTUAL_TABLE) T ON T.TENANT_ID = INFO.TENANT_ID AND T.TABLE_ID = INFO.TABLE_ID JOIN OCEANBASE.__ALL_VIRTUAL_DATABASE DB ON DB.TENANT_ID = T.TENANT_ID AND DB.DATABASE_ID = T.DATABASE_ID AND T.TABLE_TYPE IN (0, 3, 6, 8, 9, 14) AND DB.DATABASE_NAME != '__recyclebin' LEFT JOIN OCEANBASE.__ALL_VIRTUAL_TENANT_TABLESPACE TP ON TP.TABLESPACE_ID = T.TABLESPACE_ID AND T.TENANT_ID = TP.TENANT_ID )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -2010,7 +2010,7 @@ int ObInnerTableSchema::cdb_tab_cols_v_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/*+leading(DB,T,C,STAT)*/ CAST(DB.TENANT_ID AS SIGNED) AS CON_ID, CAST(DB.DATABASE_NAME AS CHAR(128)) AS OWNER, CAST(T.TABLE_NAME AS CHAR(128)) AS TABLE_NAME, CAST(C.COLUMN_NAME AS CHAR(128)) AS COLUMN_NAME, CAST(CASE C.DATA_TYPE WHEN 0 THEN 'VARCHAR2' WHEN 1 THEN 'NUMBER' WHEN 2 THEN 'NUMBER' WHEN 3 THEN 'NUMBER' WHEN 4 THEN 'NUMBER' WHEN 5 THEN 'NUMBER' WHEN 6 THEN 'NUMBER' WHEN 7 THEN 'NUMBER' WHEN 8 THEN 'NUMBER' WHEN 9 THEN 'NUMBER' WHEN 10 THEN 'NUMBER' WHEN 11 THEN 'BINARY_FLOAT' WHEN 12 THEN 'BINARY_DOUBLE' WHEN 13 THEN 'NUMBER' WHEN 14 THEN 'NUMBER' WHEN 15 THEN 'NUMBER' WHEN 16 THEN 'NUMBER' WHEN 17 THEN 'DATE' WHEN 18 THEN 'TIMESTAMP' WHEN 19 THEN 'DATE' WHEN 20 THEN 'TIME' WHEN 21 THEN 'YEAR' WHEN 22 THEN 'VARCHAR2' WHEN 23 THEN 'CHAR' WHEN 24 THEN 'HEX_STRING' WHEN 25 THEN 'UNDEFINED' WHEN 26 THEN 'UNKNOWN' WHEN 27 THEN 'TINYTEXT' WHEN 28 THEN 'TEXT' WHEN 29 THEN 'MEDIUMTEXT' WHEN 30 THEN (CASE C.COLLATION_TYPE WHEN 63 THEN 'BLOB' ELSE 'CLOB' END) WHEN 31 THEN 'BIT' WHEN 32 THEN 'ENUM' WHEN 33 THEN 'SET' WHEN 34 THEN 'ENUM_INNER' WHEN 35 THEN 'SET_INNER' WHEN 36 THEN CONCAT('TIMESTAMP(', CONCAT(C.DATA_SCALE, ') WITH TIME ZONE')) WHEN 37 THEN CONCAT('TIMESTAMP(', CONCAT(C.DATA_SCALE, ') WITH LOCAL TIME ZONE')) WHEN 38 THEN CONCAT('TIMESTAMP(', CONCAT(C.DATA_SCALE, ')')) WHEN 39 THEN 'RAW' WHEN 40 THEN CONCAT('INTERVAL YEAR(', CONCAT(C.DATA_SCALE, ') TO MONTH')) WHEN 41 THEN CONCAT('INTERVAL DAY(', CONCAT(FLOOR(C.DATA_SCALE/10), CONCAT(') TO SECOND(', CONCAT(MOD(C.DATA_SCALE, 10), ')')))) WHEN 42 THEN 'FLOAT' WHEN 43 THEN 'NVARCHAR2' WHEN 44 THEN 'NCHAR' WHEN 45 THEN 'UROWID' WHEN 46 THEN '' ELSE 'UNDEFINED' END AS CHAR(128)) AS DATA_TYPE, CAST(NULL AS CHAR(3)) AS DATA_TYPE_MOD, CAST(NULL AS CHAR(128)) AS DATA_TYPE_OWNER, CAST(C.DATA_LENGTH * CASE WHEN C.DATA_TYPE IN (22,23,30,43,44,46) AND C.DATA_PRECISION = 1 THEN (CASE C.COLLATION_TYPE WHEN 63 THEN 1 WHEN 249 THEN 4 WHEN 248 THEN 4 WHEN 87 THEN 2 WHEN 28 THEN 2 WHEN 55 THEN 4 WHEN 54 THEN 4 WHEN 101 THEN 2 WHEN 46 THEN 4 WHEN 45 THEN 4 WHEN 224 THEN 4 ELSE 1 END) ELSE 1 END AS SIGNED) AS DATA_LENGTH, CAST(CASE WHEN C.DATA_TYPE IN (0,11,12,17,18,19,22,23,27,28,29,30,36,37,38,43,44) THEN NULL ELSE CASE WHEN C.DATA_PRECISION < 0 THEN NULL ELSE C.DATA_PRECISION END END AS SIGNED) AS DATA_PRECISION, CAST(CASE WHEN C.DATA_TYPE IN (0,11,12,17,19,22,23,27,28,29,30,42,43,44) THEN NULL ELSE CASE WHEN C.DATA_SCALE < -84 THEN NULL ELSE C.DATA_SCALE END END AS SIGNED) AS DATA_SCALE, CAST((CASE WHEN C.NULLABLE = 0 THEN 'N' WHEN (C.COLUMN_FLAGS & (5 * POWER(2, 13))) = 5 * POWER(2, 13) THEN 'N' ELSE 'Y' END) AS CHAR(1)) AS NULLABLE, CAST(CASE WHEN (C.COLUMN_FLAGS & 64) = 0 THEN C.COLUMN_ID ELSE NULL END AS SIGNED) AS COLUMN_ID, CAST(LENGTH(C.CUR_DEFAULT_VALUE_V2) AS SIGNED) AS DEFAULT_LENGTH, CAST(C.CUR_DEFAULT_VALUE_V2 AS /* TODO: LONG() */ CHAR(262144)) AS DATA_DEFAULT, CAST(STAT.DISTINCT_CNT AS SIGNED) AS NUM_DISTINCT, CAST(STAT.MIN_VALUE AS /* TODO: RAW */ CHAR(128)) AS LOW_VALUE, CAST(STAT.MAX_VALUE AS /* TODO: RAW */ CHAR(128)) AS HIGH_VALUE, CAST(STAT.DENSITY AS SIGNED) AS DENSITY, CAST(STAT.NULL_CNT AS SIGNED) AS NUM_NULLS, CAST(STAT.BUCKET_CNT AS SIGNED) AS NUM_BUCKETS, CAST(STAT.LAST_ANALYZED AS DATE) AS LAST_ANALYZED, CAST(STAT.SAMPLE_SIZE AS SIGNED) AS SAMPLE_SIZE, CAST(CASE C.DATA_TYPE WHEN 22 THEN 'CHAR_CS' WHEN 23 THEN 'CHAR_CS' WHEN 30 THEN (CASE WHEN C.COLLATION_TYPE = 63 THEN 'NULL' ELSE 'CHAR_CS' END) WHEN 43 THEN 'NCHAR_CS' WHEN 44 THEN 'NCHAR_CS' ELSE '' END AS CHAR(44)) AS CHARACTER_SET_NAME, CAST(NULL AS SIGNED) AS CHAR_COL_DECL_LENGTH, CAST(CASE STAT.GLOBAL_STATS WHEN 0 THEN 'NO' WHEN 1 THEN 'YES' ELSE NULL END AS CHAR(3)) AS GLOBAL_STATS, CAST(CASE STAT.USER_STATS WHEN 0 THEN 'NO' WHEN 1 THEN 'YES' ELSE NULL END AS CHAR(3)) AS USER_STATS, CAST(NULL AS CHAR(80)) AS NOTES, CAST(STAT.AVG_LEN AS SIGNED) AS AVG_COL_LEN, CAST(CASE WHEN C.DATA_TYPE IN (22,23,43,44) THEN C.DATA_LENGTH ELSE 0 END AS SIGNED) AS CHAR_LENGTH, CAST(CASE C.DATA_TYPE WHEN 22 THEN (CASE WHEN C.DATA_PRECISION = 1 THEN 'C' ELSE 'B' END) WHEN 23 THEN (CASE WHEN C.DATA_PRECISION = 1 THEN 'C' ELSE 'B' END) WHEN 43 THEN (CASE WHEN C.DATA_PRECISION = 1 THEN 'C' ELSE 'B' END) WHEN 44 THEN (CASE WHEN C.DATA_PRECISION = 1 THEN 'C' ELSE 'B' END) ELSE NULL END AS CHAR(1)) AS CHAR_USED, CAST(NULL AS CHAR(3)) AS V80_FMT_IMAGE, CAST(NULL AS CHAR(3)) AS DATA_UPGRADED, CAST(CASE WHEN (C.COLUMN_FLAGS & 64) = 0 THEN 'NO' ELSE 'YES' END AS CHAR(3)) AS HIDDEN_COLUMN, CAST(CASE WHEN (C.COLUMN_FLAGS & 1) = 1 THEN 'YES' ELSE 'NO' END AS CHAR(3)) AS VIRTUAL_COLUMN, CAST(NULL AS SIGNED) AS SEGMENT_COLUMN_ID, CAST(NULL AS SIGNED) AS INTERNAL_COLUMN_ID, CAST((CASE WHEN STAT.HISTOGRAM_TYPE = 1 THEN 'FREQUENCY' WHEN STAT.HISTOGRAM_TYPE = 3 THEN 'TOP-FREQUENCY' WHEN STAT.HISTOGRAM_TYPE = 4 THEN 'HYBRID' ELSE NULL END) AS CHAR(15)) AS HISTOGRAM, CAST(C.COLUMN_NAME AS CHAR(4000)) AS QUALIFIED_COL_NAME, CAST('YES' AS CHAR(3)) AS USER_GENERATED, CAST(NULL AS CHAR(3)) AS DEFAULT_ON_NULL, CAST(NULL AS CHAR(3)) AS IDENTITY_COLUMN, CAST(NULL AS CHAR(128)) AS EVALUATION_EDITION, CAST(NULL AS CHAR(128)) AS UNUSABLE_BEFORE, CAST(NULL AS CHAR(128)) AS UNUSABLE_BEGINNING, CAST(NULL AS CHAR(100)) AS COLLATION, CAST(NULL AS SIGNED) AS COLLATED_COLUMN_ID FROM (SELECT TENANT_ID, TABLE_ID, DATABASE_ID, TABLE_NAME, TABLE_TYPE FROM OCEANBASE.__ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, DATABASE_ID, TABLE_NAME, TABLE_TYPE FROM OCEANBASE.__ALL_VIRTUAL_TABLE) T JOIN OCEANBASE.__ALL_VIRTUAL_DATABASE DB ON DB.TENANT_ID = T.TENANT_ID AND DB.DATABASE_ID = T.DATABASE_ID JOIN (SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, DATA_TYPE, COLLATION_TYPE, DATA_SCALE, DATA_LENGTH, DATA_PRECISION, NULLABLE, COLUMN_FLAGS, CUR_DEFAULT_VALUE_V2, IS_HIDDEN FROM OCEANBASE.__ALL_VIRTUAL_CORE_COLUMN_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, DATA_TYPE, COLLATION_TYPE, DATA_SCALE, DATA_LENGTH, DATA_PRECISION, NULLABLE, COLUMN_FLAGS, CUR_DEFAULT_VALUE_V2, IS_HIDDEN FROM OCEANBASE.__ALL_VIRTUAL_COLUMN) C ON C.TENANT_ID = T.TENANT_ID AND C.TABLE_ID = T.TABLE_ID AND C.IS_HIDDEN = 0 LEFT JOIN OCEANBASE.__ALL_VIRTUAL_COLUMN_STAT STAT ON C.TENANT_ID = STAT.TENANT_ID AND C.TABLE_ID = STAT.TABLE_ID AND C.COLUMN_ID = STAT.COLUMN_ID AND STAT.OBJECT_TYPE = 1 WHERE T.TABLE_TYPE IN (0,1,3,4,5,6,7,8,9) )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT/*+leading(DB,T,C,STAT)*/ CAST(DB.TENANT_ID AS SIGNED) AS CON_ID, CAST(DB.DATABASE_NAME AS CHAR(128)) AS OWNER, CAST(T.TABLE_NAME AS CHAR(128)) AS TABLE_NAME, CAST(C.COLUMN_NAME AS CHAR(128)) AS COLUMN_NAME, CAST(CASE C.DATA_TYPE WHEN 0 THEN 'VARCHAR2' WHEN 1 THEN 'NUMBER' WHEN 2 THEN 'NUMBER' WHEN 3 THEN 'NUMBER' WHEN 4 THEN 'NUMBER' WHEN 5 THEN 'NUMBER' WHEN 6 THEN 'NUMBER' WHEN 7 THEN 'NUMBER' WHEN 8 THEN 'NUMBER' WHEN 9 THEN 'NUMBER' WHEN 10 THEN 'NUMBER' WHEN 11 THEN 'BINARY_FLOAT' WHEN 12 THEN 'BINARY_DOUBLE' WHEN 13 THEN 'NUMBER' WHEN 14 THEN 'NUMBER' WHEN 15 THEN 'NUMBER' WHEN 16 THEN 'NUMBER' WHEN 17 THEN 'DATE' WHEN 18 THEN 'TIMESTAMP' WHEN 19 THEN 'DATE' WHEN 20 THEN 'TIME' WHEN 21 THEN 'YEAR' WHEN 22 THEN 'VARCHAR2' WHEN 23 THEN 'CHAR' WHEN 24 THEN 'HEX_STRING' WHEN 25 THEN 'UNDEFINED' WHEN 26 THEN 'UNKNOWN' WHEN 27 THEN 'TINYTEXT' WHEN 28 THEN 'TEXT' WHEN 29 THEN 'MEDIUMTEXT' WHEN 30 THEN (CASE C.COLLATION_TYPE WHEN 63 THEN 'BLOB' ELSE 'CLOB' END) WHEN 31 THEN 'BIT' WHEN 32 THEN 'ENUM' WHEN 33 THEN 'SET' WHEN 34 THEN 'ENUM_INNER' WHEN 35 THEN 'SET_INNER' WHEN 36 THEN CONCAT('TIMESTAMP(', CONCAT(C.DATA_SCALE, ') WITH TIME ZONE')) WHEN 37 THEN CONCAT('TIMESTAMP(', CONCAT(C.DATA_SCALE, ') WITH LOCAL TIME ZONE')) WHEN 38 THEN CONCAT('TIMESTAMP(', CONCAT(C.DATA_SCALE, ')')) WHEN 39 THEN 'RAW' WHEN 40 THEN CONCAT('INTERVAL YEAR(', CONCAT(C.DATA_SCALE, ') TO MONTH')) WHEN 41 THEN CONCAT('INTERVAL DAY(', CONCAT(FLOOR(C.DATA_SCALE/10), CONCAT(') TO SECOND(', CONCAT(MOD(C.DATA_SCALE, 10), ')')))) WHEN 42 THEN 'FLOAT' WHEN 43 THEN 'NVARCHAR2' WHEN 44 THEN 'NCHAR' WHEN 45 THEN 'UROWID' WHEN 46 THEN '' ELSE 'UNDEFINED' END AS CHAR(128)) AS DATA_TYPE, CAST(NULL AS CHAR(3)) AS DATA_TYPE_MOD, CAST(NULL AS CHAR(128)) AS DATA_TYPE_OWNER, CAST(C.DATA_LENGTH * CASE WHEN C.DATA_TYPE IN (22,23,30,43,44,46) AND C.DATA_PRECISION = 1 THEN (CASE C.COLLATION_TYPE WHEN 63 THEN 1 WHEN 249 THEN 4 WHEN 248 THEN 4 WHEN 87 THEN 2 WHEN 28 THEN 2 WHEN 55 THEN 4 WHEN 54 THEN 4 WHEN 101 THEN 2 WHEN 46 THEN 4 WHEN 45 THEN 4 WHEN 224 THEN 4 ELSE 1 END) ELSE 1 END AS SIGNED) AS DATA_LENGTH, CAST(CASE WHEN C.DATA_TYPE IN (0,11,12,17,18,19,22,23,27,28,29,30,36,37,38,43,44) THEN NULL ELSE CASE WHEN C.DATA_PRECISION < 0 THEN NULL ELSE C.DATA_PRECISION END END AS SIGNED) AS DATA_PRECISION, CAST(CASE WHEN C.DATA_TYPE IN (0,11,12,17,19,22,23,27,28,29,30,42,43,44) THEN NULL ELSE CASE WHEN C.DATA_SCALE < -84 THEN NULL ELSE C.DATA_SCALE END END AS SIGNED) AS DATA_SCALE, CAST((CASE WHEN C.NULLABLE = 0 THEN 'N' WHEN (C.COLUMN_FLAGS & (5 * POWER(2, 13))) = 5 * POWER(2, 13) THEN 'N' ELSE 'Y' END) AS CHAR(1)) AS NULLABLE, CAST(CASE WHEN (C.COLUMN_FLAGS & 64) = 0 THEN C.COLUMN_ID ELSE NULL END AS SIGNED) AS COLUMN_ID, CAST(LENGTH(C.CUR_DEFAULT_VALUE_V2) AS SIGNED) AS DEFAULT_LENGTH, CAST(C.CUR_DEFAULT_VALUE_V2 AS /* TODO: LONG() */ CHAR(262144)) AS DATA_DEFAULT, CAST(STAT.DISTINCT_CNT AS SIGNED) AS NUM_DISTINCT, CAST(STAT.MIN_VALUE AS /* TODO: RAW */ CHAR(128)) AS LOW_VALUE, CAST(STAT.MAX_VALUE AS /* TODO: RAW */ CHAR(128)) AS HIGH_VALUE, CAST(STAT.DENSITY AS SIGNED) AS DENSITY, CAST(STAT.NULL_CNT AS SIGNED) AS NUM_NULLS, CAST(STAT.BUCKET_CNT AS SIGNED) AS NUM_BUCKETS, CAST(STAT.LAST_ANALYZED AS DATE) AS LAST_ANALYZED, CAST(STAT.SAMPLE_SIZE AS SIGNED) AS SAMPLE_SIZE, CAST(CASE C.DATA_TYPE WHEN 22 THEN 'CHAR_CS' WHEN 23 THEN 'CHAR_CS' WHEN 30 THEN (CASE WHEN C.COLLATION_TYPE = 63 THEN 'NULL' ELSE 'CHAR_CS' END) WHEN 43 THEN 'NCHAR_CS' WHEN 44 THEN 'NCHAR_CS' ELSE '' END AS CHAR(44)) AS CHARACTER_SET_NAME, CAST(NULL AS SIGNED) AS CHAR_COL_DECL_LENGTH, CAST(CASE STAT.GLOBAL_STATS WHEN 0 THEN 'NO' WHEN 1 THEN 'YES' ELSE NULL END AS CHAR(3)) AS GLOBAL_STATS, CAST(CASE STAT.USER_STATS WHEN 0 THEN 'NO' WHEN 1 THEN 'YES' ELSE NULL END AS CHAR(3)) AS USER_STATS, CAST(NULL AS CHAR(80)) AS NOTES, CAST(STAT.AVG_LEN AS SIGNED) AS AVG_COL_LEN, CAST(CASE WHEN C.DATA_TYPE IN (22,23,43,44) THEN C.DATA_LENGTH ELSE 0 END AS SIGNED) AS CHAR_LENGTH, CAST(CASE C.DATA_TYPE WHEN 22 THEN (CASE WHEN C.DATA_PRECISION = 1 THEN 'C' ELSE 'B' END) WHEN 23 THEN (CASE WHEN C.DATA_PRECISION = 1 THEN 'C' ELSE 'B' END) WHEN 43 THEN (CASE WHEN C.DATA_PRECISION = 1 THEN 'C' ELSE 'B' END) WHEN 44 THEN (CASE WHEN C.DATA_PRECISION = 1 THEN 'C' ELSE 'B' END) ELSE NULL END AS CHAR(1)) AS CHAR_USED, CAST(NULL AS CHAR(3)) AS V80_FMT_IMAGE, CAST(NULL AS CHAR(3)) AS DATA_UPGRADED, CAST(CASE WHEN (C.COLUMN_FLAGS & 64) = 0 THEN 'NO' ELSE 'YES' END AS CHAR(3)) AS HIDDEN_COLUMN, CAST(CASE WHEN (C.COLUMN_FLAGS & 1) = 1 THEN 'YES' ELSE 'NO' END AS CHAR(3)) AS VIRTUAL_COLUMN, CAST(NULL AS SIGNED) AS SEGMENT_COLUMN_ID, CAST(NULL AS SIGNED) AS INTERNAL_COLUMN_ID, CAST((CASE WHEN STAT.HISTOGRAM_TYPE = 1 THEN 'FREQUENCY' WHEN STAT.HISTOGRAM_TYPE = 3 THEN 'TOP-FREQUENCY' WHEN STAT.HISTOGRAM_TYPE = 4 THEN 'HYBRID' ELSE NULL END) AS CHAR(15)) AS HISTOGRAM, CAST(C.COLUMN_NAME AS CHAR(4000)) AS QUALIFIED_COL_NAME, CAST('YES' AS CHAR(3)) AS USER_GENERATED, CAST(NULL AS CHAR(3)) AS DEFAULT_ON_NULL, CAST(NULL AS CHAR(3)) AS IDENTITY_COLUMN, CAST(NULL AS CHAR(128)) AS EVALUATION_EDITION, CAST(NULL AS CHAR(128)) AS UNUSABLE_BEFORE, CAST(NULL AS CHAR(128)) AS UNUSABLE_BEGINNING, CAST(NULL AS CHAR(100)) AS COLLATION, CAST(NULL AS SIGNED) AS COLLATED_COLUMN_ID FROM (SELECT TENANT_ID, TABLE_ID, DATABASE_ID, TABLE_NAME, TABLE_TYPE FROM OCEANBASE.__ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, DATABASE_ID, TABLE_NAME, TABLE_TYPE FROM OCEANBASE.__ALL_VIRTUAL_TABLE) T JOIN OCEANBASE.__ALL_VIRTUAL_DATABASE DB ON DB.TENANT_ID = T.TENANT_ID AND DB.DATABASE_ID = T.DATABASE_ID JOIN (SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, DATA_TYPE, COLLATION_TYPE, DATA_SCALE, DATA_LENGTH, DATA_PRECISION, NULLABLE, COLUMN_FLAGS, CUR_DEFAULT_VALUE_V2, IS_HIDDEN FROM OCEANBASE.__ALL_VIRTUAL_CORE_COLUMN_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, DATA_TYPE, COLLATION_TYPE, DATA_SCALE, DATA_LENGTH, DATA_PRECISION, NULLABLE, COLUMN_FLAGS, CUR_DEFAULT_VALUE_V2, IS_HIDDEN FROM OCEANBASE.__ALL_VIRTUAL_COLUMN) C ON C.TENANT_ID = T.TENANT_ID AND C.TABLE_ID = T.TABLE_ID AND C.IS_HIDDEN = 0 LEFT JOIN OCEANBASE.__ALL_VIRTUAL_COLUMN_STAT STAT ON C.TENANT_ID = STAT.TENANT_ID AND C.TABLE_ID = STAT.TABLE_ID AND C.COLUMN_ID = STAT.COLUMN_ID AND STAT.OBJECT_TYPE = 1 WHERE T.TABLE_TYPE IN (0,1,3,4,5,6,7,8,9,14) )__"))) { 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 e6018ee9d..acffeeccf 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 @@ -260,7 +260,7 @@ int ObInnerTableSchema::dba_objects_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 CAST(B.DATABASE_NAME AS CHAR(128)) AS OWNER, CAST(A.OBJECT_NAME AS CHAR(128)) AS OBJECT_NAME, CAST(A.SUBOBJECT_NAME AS CHAR(128)) AS SUBOBJECT_NAME, CAST(A.OBJECT_ID AS SIGNED) AS OBJECT_ID, CAST(A.DATA_OBJECT_ID AS SIGNED) AS DATA_OBJECT_ID, CAST(A.OBJECT_TYPE AS CHAR(23)) AS OBJECT_TYPE, CAST(A.GMT_CREATE AS DATETIME) AS CREATED, CAST(A.GMT_MODIFIED AS DATETIME) AS LAST_DDL_TIME, CAST(A.GMT_CREATE AS DATETIME) AS TIMESTAMP, CAST(A.STATUS AS CHAR(7)) AS STATUS, CAST(A.TEMPORARY AS CHAR(1)) AS TEMPORARY, CAST(A.`GENERATED` AS CHAR(1)) AS "GENERATED", CAST(A.SECONDARY AS CHAR(1)) AS SECONDARY, CAST(A.NAMESPACE AS SIGNED) AS NAMESPACE, CAST(A.EDITION_NAME AS CHAR(128)) AS EDITION_NAME, CAST(NULL AS CHAR(18)) AS SHARING, CAST(NULL AS CHAR(1)) AS EDITIONABLE, CAST(NULL AS CHAR(1)) AS ORACLE_MAINTAINED, CAST(NULL AS CHAR(1)) AS APPLICATION, CAST(NULL AS CHAR(1)) AS DEFAULT_COLLATION, CAST(NULL AS CHAR(1)) AS DUPLICATED, CAST(NULL AS CHAR(1)) AS SHARDED, CAST(NULL AS CHAR(1)) AS IMPORTED_OBJECT, CAST(NULL AS SIGNED) AS CREATED_APPID, CAST(NULL AS SIGNED) AS CREATED_VSNID, CAST(NULL AS SIGNED) AS MODIFIED_APPID, CAST(NULL AS SIGNED) AS MODIFIED_VSNID FROM ( SELECT CAST(0 AS SIGNED) AS TENANT_ID, USEC_TO_TIME(B.SCHEMA_VERSION) AS GMT_CREATE, USEC_TO_TIME(A.SCHEMA_VERSION) AS GMT_MODIFIED, A.DATABASE_ID, A.TABLE_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, CAST(A.TABLE_ID AS SIGNED) AS OBJECT_ID, A.TABLET_ID AS DATA_OBJECT_ID, 'TABLE' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_CORE_ALL_TABLE A JOIN OCEANBASE.__ALL_VIRTUAL_CORE_ALL_TABLE B ON A.TENANT_ID = B.TENANT_ID AND B.TABLE_NAME = '__all_core_table' WHERE A.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,CAST((CASE WHEN DATABASE_ID = 201004 THEN TABLE_NAME WHEN TABLE_TYPE = 5 THEN SUBSTR(TABLE_NAME, 7 + POSITION('_' IN SUBSTR(TABLE_NAME, 7))) ELSE TABLE_NAME END) AS CHAR(128)) AS OBJECT_NAME ,NULL SUBOBJECT_NAME ,CAST(TABLE_ID AS SIGNED) AS OBJECT_ID ,(CASE WHEN TABLET_ID != 0 THEN TABLET_ID ELSE NULL END) DATA_OBJECT_ID ,CASE WHEN TABLE_TYPE IN (0,3,6,8,9) THEN 'TABLE' WHEN TABLE_TYPE IN (2) THEN 'VIRTUAL TABLE' WHEN TABLE_TYPE IN (1,4) THEN 'VIEW' WHEN TABLE_TYPE IN (5) THEN 'INDEX' WHEN TABLE_TYPE IN (7) THEN 'MATERIALIZED VIEW' ELSE NULL END AS OBJECT_TYPE ,CAST(CASE WHEN TABLE_TYPE IN (5) THEN CASE WHEN INDEX_STATUS = 2 THEN 'VALID' WHEN INDEX_STATUS = 3 THEN 'CHECKING' WHEN INDEX_STATUS = 4 THEN 'INELEGIBLE' WHEN INDEX_STATUS = 5 THEN 'ERROR' ELSE 'UNUSABLE' END ELSE CASE WHEN OBJECT_STATUS = 1 THEN 'VALID' ELSE 'INVALID' END END AS CHAR(10)) AS STATUS ,CASE WHEN TABLE_TYPE IN (6,8,9) THEN 'Y' ELSE 'N' END AS TEMPORARY ,CASE WHEN TABLE_TYPE IN (0,1) THEN 'Y' ELSE 'N' END AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_TABLE WHERE TENANT_ID = 0 AND TABLE_TYPE != 12 AND TABLE_TYPE != 13 UNION ALL SELECT CST.TENANT_ID ,CST.GMT_CREATE ,CST.GMT_MODIFIED ,DB.DATABASE_ID ,CST.constraint_name AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,CAST(TBL.TABLE_ID AS SIGNED) AS OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'INDEX' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_CONSTRAINT CST, OCEANBASE.__ALL_TABLE TBL, OCEANBASE.__ALL_DATABASE DB WHERE CST.TENANT_ID = 0 AND DB.DATABASE_ID = TBL.DATABASE_ID AND TBL.TABLE_ID = CST.TABLE_ID and CST.CONSTRAINT_TYPE = 1 UNION ALL SELECT P.TENANT_ID ,P.GMT_CREATE ,P.GMT_MODIFIED ,T.DATABASE_ID ,CAST((CASE WHEN T.DATABASE_ID = 201004 THEN T.TABLE_NAME WHEN T.TABLE_TYPE = 5 THEN SUBSTR(T.TABLE_NAME, 7 + POSITION('_' IN SUBSTR(T.TABLE_NAME, 7))) ELSE T.TABLE_NAME END) AS CHAR(128)) AS OBJECT_NAME ,P.PART_NAME SUBOBJECT_NAME ,P.PART_ID OBJECT_ID ,CASE WHEN P.TABLET_ID != 0 THEN P.TABLET_ID ELSE NULL END AS DATA_OBJECT_ID ,(CASE WHEN T.TABLE_TYPE = 5 THEN 'INDEX PARTITION' ELSE 'TABLE PARTITION' END) AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY , NULL AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_TABLE T JOIN OCEANBASE.__ALL_PART P ON T.TABLE_ID = P.TABLE_ID WHERE T.TENANT_ID = 0 AND T.TENANT_ID = P.TENANT_ID UNION ALL SELECT SUBP.TENANT_ID ,SUBP.GMT_CREATE ,SUBP.GMT_MODIFIED ,T.DATABASE_ID ,CAST((CASE WHEN T.DATABASE_ID = 201004 THEN T.TABLE_NAME WHEN T.TABLE_TYPE = 5 THEN SUBSTR(T.TABLE_NAME, 7 + POSITION('_' IN SUBSTR(T.TABLE_NAME, 7))) ELSE T.TABLE_NAME END) AS CHAR(128)) AS OBJECT_NAME ,SUBP.SUB_PART_NAME SUBOBJECT_NAME ,SUBP.SUB_PART_ID OBJECT_ID ,SUBP.TABLET_ID AS DATA_OBJECT_ID ,(CASE WHEN T.TABLE_TYPE = 5 THEN 'INDEX SUBPARTITION' ELSE 'TABLE SUBPARTITION' END) AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_TABLE T, OCEANBASE.__ALL_PART P,OCEANBASE.__ALL_SUB_PART SUBP WHERE T.TABLE_ID =P.TABLE_ID AND P.TABLE_ID=SUBP.TABLE_ID AND P.PART_ID =SUBP.PART_ID AND T.TENANT_ID = 0 AND T.TENANT_ID = P.TENANT_ID AND P.TENANT_ID = SUBP.TENANT_ID UNION ALL SELECT P.TENANT_ID ,P.GMT_CREATE ,P.GMT_MODIFIED ,P.DATABASE_ID ,P.PACKAGE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,CAST(P.PACKAGE_ID AS SIGNED) AS OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN TYPE = 1 THEN 'PACKAGE' WHEN TYPE = 2 THEN 'PACKAGE BODY' ELSE NULL END AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM OCEANBASE.__ALL_TENANT_ERROR E WHERE P.TENANT_ID = E.TENANT_ID AND P.PACKAGE_ID = E.OBJ_ID AND (E.OBJ_TYPE = 3 OR E.OBJ_TYPE = 5)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_PACKAGE P WHERE P.TENANT_ID = 0 UNION ALL SELECT R.TENANT_ID ,R.GMT_CREATE ,R.GMT_MODIFIED ,R.DATABASE_ID ,R.ROUTINE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,CAST(R.ROUTINE_ID AS SIGNED) AS OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN ROUTINE_TYPE = 1 THEN 'PROCEDURE' WHEN ROUTINE_TYPE = 2 THEN 'FUNCTION' ELSE NULL END AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM OCEANBASE.__ALL_TENANT_ERROR E WHERE R.TENANT_ID = E.TENANT_ID AND R.ROUTINE_ID = E.OBJ_ID AND (E.OBJ_TYPE = 9 OR E.OBJ_TYPE = 12)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_ROUTINE R WHERE (ROUTINE_TYPE = 1 OR ROUTINE_TYPE = 2) AND R.TENANT_ID = 0 UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,TYPE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,CAST(TYPE_ID AS SIGNED) AS OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_TYPE WHERE TENANT_ID = 0 UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,CAST(OBJECT_TYPE_ID AS SIGNED) AS OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE BODY' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_TENANT_OBJECT_TYPE WHERE TENANT_ID = 0 AND TYPE = 2 UNION ALL SELECT TENANT_ID ,T.GMT_CREATE ,T.GMT_MODIFIED ,T.DATABASE_ID ,T.TRIGGER_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,CAST(T.TRIGGER_ID AS SIGNED) AS OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TRIGGER' OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM OCEANBASE.__ALL_TENANT_ERROR E WHERE T.TENANT_ID = E.TENANT_ID AND T.TRIGGER_ID = E.OBJ_ID AND (E.OBJ_TYPE = 7)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_TENANT_TRIGGER T WHERE T.TENANT_ID = 0 UNION ALL SELECT TENANT_ID, GMT_CREATE, GMT_MODIFIED, DATABASE_ID, DATABASE_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, CAST(DATABASE_ID AS SIGNED) AS OBJECT_ID, NULL AS DATA_OBJECT_ID, 'DATABASE' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM OCEANBASE.__ALL_DATABASE WHERE TENANT_ID = 0 UNION ALL SELECT TENANT_ID, GMT_CREATE, GMT_MODIFIED, CAST(201001 AS SIGNED) AS DATABASE_ID, TABLEGROUP_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, CAST(TABLEGROUP_ID AS SIGNED) AS OBJECT_ID, NULL AS DATA_OBJECT_ID, 'TABLEGROUP' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM OCEANBASE.__ALL_TABLEGROUP WHERE TENANT_ID = 0 UNION ALL SELECT P.TENANT_ID, P.GMT_CREATE, P.GMT_MODIFIED, CAST(201001 AS SIGNED) AS DATABASE_ID, TG.TABLEGROUP_NAME AS OBJECT_NAME, P.PART_NAME SUBOBJECT_NAME, P.PART_ID OBJECT_ID, NULL AS DATA_OBJECT_ID, 'TABLEGROUP PARTITION' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, NULL AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM OCEANBASE.__ALL_TABLEGROUP TG JOIN OCEANBASE.__ALL_PART P ON TG.TABLEGROUP_ID = P.TABLE_ID WHERE TG.TENANT_ID = 0 AND TG.TENANT_ID = P.TENANT_ID UNION ALL SELECT SUBP.TENANT_ID, SUBP.GMT_CREATE, SUBP.GMT_MODIFIED, CAST(201001 AS SIGNED) AS DATABASE_ID, TG.TABLEGROUP_NAME AS OBJECT_NAME, SUBP.SUB_PART_NAME SUBOBJECT_NAME, SUBP.SUB_PART_ID OBJECT_ID, NULL DATA_OBJECT_ID, 'TABLEGROUP SUBPARTITION' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM OCEANBASE.__ALL_TABLEGROUP TG, OCEANBASE.__ALL_PART P,OCEANBASE.__ALL_SUB_PART SUBP WHERE TG.TABLEGROUP_ID = P.TABLE_ID AND P.TABLE_ID = SUBP.TABLE_ID AND P.PART_ID = SUBP.PART_ID AND TG.TENANT_ID = 0 AND TG.TENANT_ID = P.TENANT_ID AND P.TENANT_ID = SUBP.TENANT_ID ) A JOIN OCEANBASE.__ALL_DATABASE B ON A.TENANT_ID = B.TENANT_ID AND A.DATABASE_ID = B.DATABASE_ID AND B.TENANT_ID = 0 )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(B.DATABASE_NAME AS CHAR(128)) AS OWNER, CAST(A.OBJECT_NAME AS CHAR(128)) AS OBJECT_NAME, CAST(A.SUBOBJECT_NAME AS CHAR(128)) AS SUBOBJECT_NAME, CAST(A.OBJECT_ID AS SIGNED) AS OBJECT_ID, CAST(A.DATA_OBJECT_ID AS SIGNED) AS DATA_OBJECT_ID, CAST(A.OBJECT_TYPE AS CHAR(23)) AS OBJECT_TYPE, CAST(A.GMT_CREATE AS DATETIME) AS CREATED, CAST(A.GMT_MODIFIED AS DATETIME) AS LAST_DDL_TIME, CAST(A.GMT_CREATE AS DATETIME) AS TIMESTAMP, CAST(A.STATUS AS CHAR(7)) AS STATUS, CAST(A.TEMPORARY AS CHAR(1)) AS TEMPORARY, CAST(A.`GENERATED` AS CHAR(1)) AS "GENERATED", CAST(A.SECONDARY AS CHAR(1)) AS SECONDARY, CAST(A.NAMESPACE AS SIGNED) AS NAMESPACE, CAST(A.EDITION_NAME AS CHAR(128)) AS EDITION_NAME, CAST(NULL AS CHAR(18)) AS SHARING, CAST(NULL AS CHAR(1)) AS EDITIONABLE, CAST(NULL AS CHAR(1)) AS ORACLE_MAINTAINED, CAST(NULL AS CHAR(1)) AS APPLICATION, CAST(NULL AS CHAR(1)) AS DEFAULT_COLLATION, CAST(NULL AS CHAR(1)) AS DUPLICATED, CAST(NULL AS CHAR(1)) AS SHARDED, CAST(NULL AS CHAR(1)) AS IMPORTED_OBJECT, CAST(NULL AS SIGNED) AS CREATED_APPID, CAST(NULL AS SIGNED) AS CREATED_VSNID, CAST(NULL AS SIGNED) AS MODIFIED_APPID, CAST(NULL AS SIGNED) AS MODIFIED_VSNID FROM ( SELECT CAST(0 AS SIGNED) AS TENANT_ID, USEC_TO_TIME(B.SCHEMA_VERSION) AS GMT_CREATE, USEC_TO_TIME(A.SCHEMA_VERSION) AS GMT_MODIFIED, A.DATABASE_ID, A.TABLE_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, CAST(A.TABLE_ID AS SIGNED) AS OBJECT_ID, A.TABLET_ID AS DATA_OBJECT_ID, 'TABLE' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM OCEANBASE.__ALL_VIRTUAL_CORE_ALL_TABLE A JOIN OCEANBASE.__ALL_VIRTUAL_CORE_ALL_TABLE B ON A.TENANT_ID = B.TENANT_ID AND B.TABLE_NAME = '__all_core_table' WHERE A.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,CAST((CASE WHEN DATABASE_ID = 201004 THEN TABLE_NAME WHEN TABLE_TYPE = 5 THEN SUBSTR(TABLE_NAME, 7 + POSITION('_' IN SUBSTR(TABLE_NAME, 7))) ELSE TABLE_NAME END) AS CHAR(128)) AS OBJECT_NAME ,NULL SUBOBJECT_NAME ,CAST(TABLE_ID AS SIGNED) AS OBJECT_ID ,(CASE WHEN TABLET_ID != 0 THEN TABLET_ID ELSE NULL END) DATA_OBJECT_ID ,CASE WHEN TABLE_TYPE IN (0,3,6,8,9,14) THEN 'TABLE' WHEN TABLE_TYPE IN (2) THEN 'VIRTUAL TABLE' WHEN TABLE_TYPE IN (1,4) THEN 'VIEW' WHEN TABLE_TYPE IN (5) THEN 'INDEX' WHEN TABLE_TYPE IN (7) THEN 'MATERIALIZED VIEW' ELSE NULL END AS OBJECT_TYPE ,CAST(CASE WHEN TABLE_TYPE IN (5) THEN CASE WHEN INDEX_STATUS = 2 THEN 'VALID' WHEN INDEX_STATUS = 3 THEN 'CHECKING' WHEN INDEX_STATUS = 4 THEN 'INELEGIBLE' WHEN INDEX_STATUS = 5 THEN 'ERROR' ELSE 'UNUSABLE' END ELSE CASE WHEN OBJECT_STATUS = 1 THEN 'VALID' ELSE 'INVALID' END END AS CHAR(10)) AS STATUS ,CASE WHEN TABLE_TYPE IN (6,8,9) THEN 'Y' ELSE 'N' END AS TEMPORARY ,CASE WHEN TABLE_TYPE IN (0,1) THEN 'Y' ELSE 'N' END AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_TABLE WHERE TENANT_ID = 0 AND TABLE_TYPE != 12 AND TABLE_TYPE != 13 UNION ALL SELECT CST.TENANT_ID ,CST.GMT_CREATE ,CST.GMT_MODIFIED ,DB.DATABASE_ID ,CST.constraint_name AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,CAST(TBL.TABLE_ID AS SIGNED) AS OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'INDEX' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_CONSTRAINT CST, OCEANBASE.__ALL_TABLE TBL, OCEANBASE.__ALL_DATABASE DB WHERE CST.TENANT_ID = 0 AND DB.DATABASE_ID = TBL.DATABASE_ID AND TBL.TABLE_ID = CST.TABLE_ID and CST.CONSTRAINT_TYPE = 1 UNION ALL SELECT P.TENANT_ID ,P.GMT_CREATE ,P.GMT_MODIFIED ,T.DATABASE_ID ,CAST((CASE WHEN T.DATABASE_ID = 201004 THEN T.TABLE_NAME WHEN T.TABLE_TYPE = 5 THEN SUBSTR(T.TABLE_NAME, 7 + POSITION('_' IN SUBSTR(T.TABLE_NAME, 7))) ELSE T.TABLE_NAME END) AS CHAR(128)) AS OBJECT_NAME ,P.PART_NAME SUBOBJECT_NAME ,P.PART_ID OBJECT_ID ,CASE WHEN P.TABLET_ID != 0 THEN P.TABLET_ID ELSE NULL END AS DATA_OBJECT_ID ,(CASE WHEN T.TABLE_TYPE = 5 THEN 'INDEX PARTITION' ELSE 'TABLE PARTITION' END) AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY , NULL AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_TABLE T JOIN OCEANBASE.__ALL_PART P ON T.TABLE_ID = P.TABLE_ID WHERE T.TENANT_ID = 0 AND T.TENANT_ID = P.TENANT_ID UNION ALL SELECT SUBP.TENANT_ID ,SUBP.GMT_CREATE ,SUBP.GMT_MODIFIED ,T.DATABASE_ID ,CAST((CASE WHEN T.DATABASE_ID = 201004 THEN T.TABLE_NAME WHEN T.TABLE_TYPE = 5 THEN SUBSTR(T.TABLE_NAME, 7 + POSITION('_' IN SUBSTR(T.TABLE_NAME, 7))) ELSE T.TABLE_NAME END) AS CHAR(128)) AS OBJECT_NAME ,SUBP.SUB_PART_NAME SUBOBJECT_NAME ,SUBP.SUB_PART_ID OBJECT_ID ,SUBP.TABLET_ID AS DATA_OBJECT_ID ,(CASE WHEN T.TABLE_TYPE = 5 THEN 'INDEX SUBPARTITION' ELSE 'TABLE SUBPARTITION' END) AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_TABLE T, OCEANBASE.__ALL_PART P,OCEANBASE.__ALL_SUB_PART SUBP WHERE T.TABLE_ID =P.TABLE_ID AND P.TABLE_ID=SUBP.TABLE_ID AND P.PART_ID =SUBP.PART_ID AND T.TENANT_ID = 0 AND T.TENANT_ID = P.TENANT_ID AND P.TENANT_ID = SUBP.TENANT_ID UNION ALL SELECT P.TENANT_ID ,P.GMT_CREATE ,P.GMT_MODIFIED ,P.DATABASE_ID ,P.PACKAGE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,CAST(P.PACKAGE_ID AS SIGNED) AS OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN TYPE = 1 THEN 'PACKAGE' WHEN TYPE = 2 THEN 'PACKAGE BODY' ELSE NULL END AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM OCEANBASE.__ALL_TENANT_ERROR E WHERE P.TENANT_ID = E.TENANT_ID AND P.PACKAGE_ID = E.OBJ_ID AND (E.OBJ_TYPE = 3 OR E.OBJ_TYPE = 5)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_PACKAGE P WHERE P.TENANT_ID = 0 UNION ALL SELECT R.TENANT_ID ,R.GMT_CREATE ,R.GMT_MODIFIED ,R.DATABASE_ID ,R.ROUTINE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,CAST(R.ROUTINE_ID AS SIGNED) AS OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN ROUTINE_TYPE = 1 THEN 'PROCEDURE' WHEN ROUTINE_TYPE = 2 THEN 'FUNCTION' ELSE NULL END AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM OCEANBASE.__ALL_TENANT_ERROR E WHERE R.TENANT_ID = E.TENANT_ID AND R.ROUTINE_ID = E.OBJ_ID AND (E.OBJ_TYPE = 9 OR E.OBJ_TYPE = 12)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_ROUTINE R WHERE (ROUTINE_TYPE = 1 OR ROUTINE_TYPE = 2) AND R.TENANT_ID = 0 UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,TYPE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,CAST(TYPE_ID AS SIGNED) AS OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_TYPE WHERE TENANT_ID = 0 UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,CAST(OBJECT_TYPE_ID AS SIGNED) AS OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE BODY' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_TENANT_OBJECT_TYPE WHERE TENANT_ID = 0 AND TYPE = 2 UNION ALL SELECT TENANT_ID ,T.GMT_CREATE ,T.GMT_MODIFIED ,T.DATABASE_ID ,T.TRIGGER_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,CAST(T.TRIGGER_ID AS SIGNED) AS OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TRIGGER' OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM OCEANBASE.__ALL_TENANT_ERROR E WHERE T.TENANT_ID = E.TENANT_ID AND T.TRIGGER_ID = E.OBJ_ID AND (E.OBJ_TYPE = 7)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM OCEANBASE.__ALL_TENANT_TRIGGER T WHERE T.TENANT_ID = 0 UNION ALL SELECT TENANT_ID, GMT_CREATE, GMT_MODIFIED, DATABASE_ID, DATABASE_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, CAST(DATABASE_ID AS SIGNED) AS OBJECT_ID, NULL AS DATA_OBJECT_ID, 'DATABASE' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM OCEANBASE.__ALL_DATABASE WHERE TENANT_ID = 0 UNION ALL SELECT TENANT_ID, GMT_CREATE, GMT_MODIFIED, CAST(201001 AS SIGNED) AS DATABASE_ID, TABLEGROUP_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, CAST(TABLEGROUP_ID AS SIGNED) AS OBJECT_ID, NULL AS DATA_OBJECT_ID, 'TABLEGROUP' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM OCEANBASE.__ALL_TABLEGROUP WHERE TENANT_ID = 0 UNION ALL SELECT P.TENANT_ID, P.GMT_CREATE, P.GMT_MODIFIED, CAST(201001 AS SIGNED) AS DATABASE_ID, TG.TABLEGROUP_NAME AS OBJECT_NAME, P.PART_NAME SUBOBJECT_NAME, P.PART_ID OBJECT_ID, NULL AS DATA_OBJECT_ID, 'TABLEGROUP PARTITION' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, NULL AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM OCEANBASE.__ALL_TABLEGROUP TG JOIN OCEANBASE.__ALL_PART P ON TG.TABLEGROUP_ID = P.TABLE_ID WHERE TG.TENANT_ID = 0 AND TG.TENANT_ID = P.TENANT_ID UNION ALL SELECT SUBP.TENANT_ID, SUBP.GMT_CREATE, SUBP.GMT_MODIFIED, CAST(201001 AS SIGNED) AS DATABASE_ID, TG.TABLEGROUP_NAME AS OBJECT_NAME, SUBP.SUB_PART_NAME SUBOBJECT_NAME, SUBP.SUB_PART_ID OBJECT_ID, NULL DATA_OBJECT_ID, 'TABLEGROUP SUBPARTITION' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM OCEANBASE.__ALL_TABLEGROUP TG, OCEANBASE.__ALL_PART P,OCEANBASE.__ALL_SUB_PART SUBP WHERE TG.TABLEGROUP_ID = P.TABLE_ID AND P.TABLE_ID = SUBP.TABLE_ID AND P.PART_ID = SUBP.PART_ID AND TG.TENANT_ID = 0 AND TG.TENANT_ID = P.TENANT_ID AND P.TENANT_ID = SUBP.TENANT_ID ) A JOIN OCEANBASE.__ALL_DATABASE B ON A.TENANT_ID = B.TENANT_ID AND A.DATABASE_ID = B.DATABASE_ID AND B.TENANT_ID = 0 )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.21251_21300.cpp b/src/share/inner_table/ob_inner_table_schema.21251_21300.cpp index 67203b08d..433bb61ff 100644 --- a/src/share/inner_table/ob_inner_table_schema.21251_21300.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21251_21300.cpp @@ -110,7 +110,7 @@ int ObInnerTableSchema::dba_tab_statistics_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 CAST(DB.DATABASE_NAME AS CHAR(128)) AS OWNER, CAST(V.TABLE_NAME AS CHAR(128)) AS TABLE_NAME, CAST(V.PARTITION_NAME AS CHAR(128)) AS PARTITION_NAME, CAST(V.PARTITION_POSITION AS NUMBER) AS PARTITION_POSITION, CAST(V.SUBPARTITION_NAME AS CHAR(128)) AS SUBPARTITION_NAME, CAST(V.SUBPARTITION_POSITION AS NUMBER) AS SUBPARTITION_POSITION, CAST(V.OBJECT_TYPE AS CHAR(12)) AS OBJECT_TYPE, CAST(STAT.ROW_CNT AS NUMBER) AS NUM_ROWS, CAST(NULL AS NUMBER) AS BLOCKS, CAST(NULL AS NUMBER) AS EMPTY_BLOCKS, CAST(NULL AS NUMBER) AS AVG_SPACE, CAST(NULL AS NUMBER) AS CHAIN_CNT, CAST(STAT.AVG_ROW_LEN AS NUMBER) AS AVG_ROW_LEN, CAST(NULL AS NUMBER) AS AVG_SPACE_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS NUM_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS AVG_CACHED_BLOCKS, CAST(NULL AS NUMBER) AS AVG_CACHE_HIT_RATIO, CAST(NULL AS NUMBER) AS IM_IMCU_COUNT, CAST(NULL AS NUMBER) AS IM_BLOCK_COUNT, CAST(NULL AS DATETIME) AS IM_STAT_UPDATE_TIME, CAST(NULL AS NUMBER) AS SCAN_RATE, CAST(NULL AS NUMBER) AS SAMPLE_SIZE, CAST(STAT.LAST_ANALYZED AS DATETIME(6)) AS LAST_ANALYZED, CAST((CASE STAT.GLOBAL_STATS WHEN 0 THEN 'NO' WHEN 1 THEN 'YES' ELSE NULL END) AS CHAR(3)) AS GLOBAL_STATS, CAST((CASE STAT.USER_STATS WHEN 0 THEN 'NO' WHEN 1 THEN 'YES' ELSE NULL END) AS CHAR(3)) AS USER_STATS, CAST((CASE WHEN STAT.STATTYPE_LOCKED & 15 IS NULL THEN NULL ELSE (CASE STAT.STATTYPE_LOCKED & 15 WHEN 0 THEN NULL WHEN 1 THEN 'DATA' WHEN 2 THEN 'CACHE' ELSE 'ALL' END) END) AS CHAR(5)) AS STATTYPE_LOCKED, CAST((CASE STAT.STALE_STATS WHEN 0 THEN 'NO' WHEN 1 THEN 'YES' ELSE NULL END) AS CHAR(3)) AS STALE_STATS, CAST(NULL AS CHAR(7)) AS SCOPE FROM ( (SELECT CAST(0 AS SIGNED) AS TENANT_ID, DATABASE_ID, TABLE_ID, -2 AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM OCEANBASE.__ALL_VIRTUAL_CORE_ALL_TABLE WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, CASE WHEN PART_LEVEL = 0 THEN -2 ELSE -1 END AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM oceanbase.__all_table T WHERE T.TABLE_TYPE IN (0,2,3,6)) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, P.PART_ID, T.TABLE_NAME, P.PART_NAME, NULL, P.PART_IDX + 1, NULL, 'PARTITION' FROM oceanbase.__all_table T JOIN oceanbase.__all_part P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID WHERE T.TABLE_TYPE IN (0,2,3,6) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, SP.SUB_PART_ID AS PARTITION_ID, T.TABLE_NAME, P.PART_NAME, SP.SUB_PART_NAME, P.PART_IDX + 1, SP.SUB_PART_IDX + 1, 'SUBPARTITION' FROM oceanbase.__all_table T JOIN oceanbase.__all_part P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID JOIN oceanbase.__all_sub_part SP ON T.TENANT_ID = SP.TENANT_ID AND T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID WHERE T.TABLE_TYPE IN (0,2,3,6) ) V JOIN oceanbase.__all_database DB ON DB.TENANT_ID = V.TENANT_ID AND DB.DATABASE_ID = V.DATABASE_ID AND V.TENANT_ID = 0 LEFT JOIN oceanbase.__all_table_stat STAT ON V.TENANT_ID = STAT.TENANT_ID AND V.TABLE_ID = STAT.TABLE_ID AND (V.PARTITION_ID = STAT.PARTITION_ID OR V.PARTITION_ID = -2) AND STAT.INDEX_TYPE = 0 )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT CAST(DB.DATABASE_NAME AS CHAR(128)) AS OWNER, CAST(V.TABLE_NAME AS CHAR(128)) AS TABLE_NAME, CAST(V.PARTITION_NAME AS CHAR(128)) AS PARTITION_NAME, CAST(V.PARTITION_POSITION AS NUMBER) AS PARTITION_POSITION, CAST(V.SUBPARTITION_NAME AS CHAR(128)) AS SUBPARTITION_NAME, CAST(V.SUBPARTITION_POSITION AS NUMBER) AS SUBPARTITION_POSITION, CAST(V.OBJECT_TYPE AS CHAR(12)) AS OBJECT_TYPE, CAST(STAT.ROW_CNT AS NUMBER) AS NUM_ROWS, CAST(NULL AS NUMBER) AS BLOCKS, CAST(NULL AS NUMBER) AS EMPTY_BLOCKS, CAST(NULL AS NUMBER) AS AVG_SPACE, CAST(NULL AS NUMBER) AS CHAIN_CNT, CAST(STAT.AVG_ROW_LEN AS NUMBER) AS AVG_ROW_LEN, CAST(NULL AS NUMBER) AS AVG_SPACE_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS NUM_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS AVG_CACHED_BLOCKS, CAST(NULL AS NUMBER) AS AVG_CACHE_HIT_RATIO, CAST(NULL AS NUMBER) AS IM_IMCU_COUNT, CAST(NULL AS NUMBER) AS IM_BLOCK_COUNT, CAST(NULL AS DATETIME) AS IM_STAT_UPDATE_TIME, CAST(NULL AS NUMBER) AS SCAN_RATE, CAST(NULL AS NUMBER) AS SAMPLE_SIZE, CAST(STAT.LAST_ANALYZED AS DATETIME(6)) AS LAST_ANALYZED, CAST((CASE STAT.GLOBAL_STATS WHEN 0 THEN 'NO' WHEN 1 THEN 'YES' ELSE NULL END) AS CHAR(3)) AS GLOBAL_STATS, CAST((CASE STAT.USER_STATS WHEN 0 THEN 'NO' WHEN 1 THEN 'YES' ELSE NULL END) AS CHAR(3)) AS USER_STATS, CAST((CASE WHEN STAT.STATTYPE_LOCKED & 15 IS NULL THEN NULL ELSE (CASE STAT.STATTYPE_LOCKED & 15 WHEN 0 THEN NULL WHEN 1 THEN 'DATA' WHEN 2 THEN 'CACHE' ELSE 'ALL' END) END) AS CHAR(5)) AS STATTYPE_LOCKED, CAST((CASE STAT.STALE_STATS WHEN 0 THEN 'NO' WHEN 1 THEN 'YES' ELSE NULL END) AS CHAR(3)) AS STALE_STATS, CAST(NULL AS CHAR(7)) AS SCOPE FROM ( (SELECT CAST(0 AS SIGNED) AS TENANT_ID, DATABASE_ID, TABLE_ID, -2 AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM OCEANBASE.__ALL_VIRTUAL_CORE_ALL_TABLE WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, CASE WHEN PART_LEVEL = 0 THEN -2 ELSE -1 END AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM oceanbase.__all_table T WHERE T.TABLE_TYPE IN (0,2,3,6,14)) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, P.PART_ID, T.TABLE_NAME, P.PART_NAME, NULL, P.PART_IDX + 1, NULL, 'PARTITION' FROM oceanbase.__all_table T JOIN oceanbase.__all_part P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID WHERE T.TABLE_TYPE IN (0,2,3,6,14) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, SP.SUB_PART_ID AS PARTITION_ID, T.TABLE_NAME, P.PART_NAME, SP.SUB_PART_NAME, P.PART_IDX + 1, SP.SUB_PART_IDX + 1, 'SUBPARTITION' FROM oceanbase.__all_table T JOIN oceanbase.__all_part P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID JOIN oceanbase.__all_sub_part SP ON T.TENANT_ID = SP.TENANT_ID AND T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID WHERE T.TABLE_TYPE IN (0,2,3,6,14) ) V JOIN oceanbase.__all_database DB ON DB.TENANT_ID = V.TENANT_ID AND DB.DATABASE_ID = V.DATABASE_ID AND V.TENANT_ID = 0 LEFT JOIN oceanbase.__all_table_stat STAT ON V.TENANT_ID = STAT.TENANT_ID AND V.TABLE_ID = STAT.TABLE_ID AND (V.PARTITION_ID = STAT.PARTITION_ID OR V.PARTITION_ID = -2) AND STAT.INDEX_TYPE = 0 )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -160,7 +160,7 @@ int ObInnerTableSchema::dba_tab_col_statistics_schema(ObTableSchema &table_schem 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 cast(db.database_name as CHAR(128)) as OWNER, cast(t.table_name as CHAR(128)) as TABLE_NAME, cast(c.column_name as CHAR(128)) as COLUMN_NAME, cast(stat.distinct_cnt as NUMBER) as NUM_DISTINCT, cast(stat.min_value as CHAR(128)) as LOW_VALUE, cast(stat.max_value as CHAR(128)) as HIGH_VALUE, cast(stat.density as NUMBER) as DENSITY, cast(stat.null_cnt as NUMBER) as NUM_NULLS, cast(stat.bucket_cnt as NUMBER) as NUM_BUCKETS, cast(stat.last_analyzed as DATETIME(6)) as LAST_ANALYZED, cast(stat.sample_size as NUMBER) as SAMPLE_SIZE, CAST((CASE STAT.GLOBAL_STATS WHEN 0 THEN 'NO' WHEN 1 THEN 'YES' ELSE NULL END) AS CHAR(3)) AS GLOBAL_STATS, CAST((CASE STAT.USER_STATS WHEN 0 THEN 'NO' WHEN 1 THEN 'YES' ELSE NULL END) AS CHAR(3)) AS USER_STATS, cast(NULL as CHAR(80)) as NOTES, cast(stat.avg_len as NUMBER) as AVG_COL_LEN, cast((case when stat.histogram_type = 1 then 'FREQUENCY' when stat.histogram_type = 3 then 'TOP-FREQUENCY' when stat.histogram_type = 4 then 'HYBRID' else NULL end) as CHAR(15)) as HISTOGRAM, cast(NULL as CHAR(7)) SCOPE FROM (SELECT CAST(0 AS SIGNED) AS TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME FROM OCEANBASE.__ALL_VIRTUAL_CORE_ALL_TABLE WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID, database_id, table_id, table_name FROM oceanbase.__all_table where table_type in (0,2,3,6)) T JOIN oceanbase.__all_database db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND T.TENANT_ID = 0 JOIN (SELECT CAST(0 AS SIGNED) AS TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, IS_HIDDEN FROM oceanbase.__all_virtual_core_column_table WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, IS_HIDDEN FROM oceanbase.__all_column) c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id left join oceanbase.__all_column_stat stat ON c.table_id = stat.table_id AND c.column_id = stat.column_id AND stat.object_type = 1 WHERE c.is_hidden = 0 )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT cast(db.database_name as CHAR(128)) as OWNER, cast(t.table_name as CHAR(128)) as TABLE_NAME, cast(c.column_name as CHAR(128)) as COLUMN_NAME, cast(stat.distinct_cnt as NUMBER) as NUM_DISTINCT, cast(stat.min_value as CHAR(128)) as LOW_VALUE, cast(stat.max_value as CHAR(128)) as HIGH_VALUE, cast(stat.density as NUMBER) as DENSITY, cast(stat.null_cnt as NUMBER) as NUM_NULLS, cast(stat.bucket_cnt as NUMBER) as NUM_BUCKETS, cast(stat.last_analyzed as DATETIME(6)) as LAST_ANALYZED, cast(stat.sample_size as NUMBER) as SAMPLE_SIZE, CAST((CASE STAT.GLOBAL_STATS WHEN 0 THEN 'NO' WHEN 1 THEN 'YES' ELSE NULL END) AS CHAR(3)) AS GLOBAL_STATS, CAST((CASE STAT.USER_STATS WHEN 0 THEN 'NO' WHEN 1 THEN 'YES' ELSE NULL END) AS CHAR(3)) AS USER_STATS, cast(NULL as CHAR(80)) as NOTES, cast(stat.avg_len as NUMBER) as AVG_COL_LEN, cast((case when stat.histogram_type = 1 then 'FREQUENCY' when stat.histogram_type = 3 then 'TOP-FREQUENCY' when stat.histogram_type = 4 then 'HYBRID' else NULL end) as CHAR(15)) as HISTOGRAM, cast(NULL as CHAR(7)) SCOPE FROM (SELECT CAST(0 AS SIGNED) AS TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME FROM OCEANBASE.__ALL_VIRTUAL_CORE_ALL_TABLE WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID, database_id, table_id, table_name FROM oceanbase.__all_table where table_type in (0,2,3,6,14)) T JOIN oceanbase.__all_database db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND T.TENANT_ID = 0 JOIN (SELECT CAST(0 AS SIGNED) AS TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, IS_HIDDEN FROM oceanbase.__all_virtual_core_column_table WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, IS_HIDDEN FROM oceanbase.__all_column) c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id left join oceanbase.__all_column_stat stat ON c.table_id = stat.table_id AND c.column_id = stat.column_id AND stat.object_type = 1 WHERE c.is_hidden = 0 )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -210,7 +210,7 @@ int ObInnerTableSchema::dba_part_col_statistics_schema(ObTableSchema &table_sche 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 cast(db.database_name as CHAR(128)) as OWNER, cast(t.table_name as CHAR(128)) as TABLE_NAME, cast (part.part_name as CHAR(128)) as PARTITION_NAME, cast(c.column_name as CHAR(128)) as COLUMN_NAME, cast(stat.distinct_cnt as NUMBER) as NUM_DISTINCT, cast(stat.min_value as CHAR(128)) as LOW_VALUE, cast(stat.max_value as CHAR(128)) as HIGH_VALUE, cast(stat.density as NUMBER) as DENSITY, cast(stat.null_cnt as NUMBER) as NUM_NULLS, cast(stat.bucket_cnt as NUMBER) as NUM_BUCKETS, cast(stat.last_analyzed as DATETIME(6)) as LAST_ANALYZED, cast(stat.sample_size as NUMBER) as SAMPLE_SIZE, CAST((CASE STAT.GLOBAL_STATS WHEN 0 THEN 'NO' WHEN 1 THEN 'YES' ELSE NULL END) AS CHAR(3)) AS GLOBAL_STATS, CAST((CASE STAT.USER_STATS WHEN 0 THEN 'NO' WHEN 1 THEN 'YES' ELSE NULL END) AS CHAR(3)) AS USER_STATS, cast(NULL as CHAR(80)) as NOTES, cast(stat.avg_len as NUMBER) as AVG_COL_LEN, cast((case when stat.histogram_type = 1 then 'FREQUENCY' when stat.histogram_type = 3 then 'TOP-FREQUENCY' when stat.histogram_type = 4 then 'HYBRID' else NULL end) as CHAR(15)) as HISTOGRAM FROM oceanbase.__all_table t JOIN oceanbase.__all_database db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND T.TENANT_ID = 0 JOIN oceanbase.__all_column c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id JOIN oceanbase.__all_part part on t.tenant_id = part.tenant_id and t.table_id = part.table_id left join oceanbase.__all_column_stat stat ON c.table_id = stat.table_id AND c.column_id = stat.column_id AND part.part_id = stat.partition_id AND stat.object_type = 2 WHERE c.is_hidden = 0 AND t.table_type in (0,3,6) )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT cast(db.database_name as CHAR(128)) as OWNER, cast(t.table_name as CHAR(128)) as TABLE_NAME, cast (part.part_name as CHAR(128)) as PARTITION_NAME, cast(c.column_name as CHAR(128)) as COLUMN_NAME, cast(stat.distinct_cnt as NUMBER) as NUM_DISTINCT, cast(stat.min_value as CHAR(128)) as LOW_VALUE, cast(stat.max_value as CHAR(128)) as HIGH_VALUE, cast(stat.density as NUMBER) as DENSITY, cast(stat.null_cnt as NUMBER) as NUM_NULLS, cast(stat.bucket_cnt as NUMBER) as NUM_BUCKETS, cast(stat.last_analyzed as DATETIME(6)) as LAST_ANALYZED, cast(stat.sample_size as NUMBER) as SAMPLE_SIZE, CAST((CASE STAT.GLOBAL_STATS WHEN 0 THEN 'NO' WHEN 1 THEN 'YES' ELSE NULL END) AS CHAR(3)) AS GLOBAL_STATS, CAST((CASE STAT.USER_STATS WHEN 0 THEN 'NO' WHEN 1 THEN 'YES' ELSE NULL END) AS CHAR(3)) AS USER_STATS, cast(NULL as CHAR(80)) as NOTES, cast(stat.avg_len as NUMBER) as AVG_COL_LEN, cast((case when stat.histogram_type = 1 then 'FREQUENCY' when stat.histogram_type = 3 then 'TOP-FREQUENCY' when stat.histogram_type = 4 then 'HYBRID' else NULL end) as CHAR(15)) as HISTOGRAM FROM oceanbase.__all_table t JOIN oceanbase.__all_database db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND T.TENANT_ID = 0 JOIN oceanbase.__all_column c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id JOIN oceanbase.__all_part part on t.tenant_id = part.tenant_id and t.table_id = part.table_id left join oceanbase.__all_column_stat stat ON c.table_id = stat.table_id AND c.column_id = stat.column_id AND part.part_id = stat.partition_id AND stat.object_type = 2 WHERE c.is_hidden = 0 AND t.table_type in (0,3,6,14) )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -260,7 +260,7 @@ int ObInnerTableSchema::dba_subpart_col_statistics_schema(ObTableSchema &table_s 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 cast(db.database_name as CHAR(128)) as OWNER, cast(t.table_name as CHAR(128)) as TABLE_NAME, cast (subpart.sub_part_name as CHAR(128)) as SUBPARTITION_NAME, cast(c.column_name as CHAR(128)) as COLUMN_NAME, cast(stat.distinct_cnt as NUMBER) as NUM_DISTINCT, cast(stat.min_value as CHAR(128)) as LOW_VALUE, cast(stat.max_value as CHAR(128)) as HIGH_VALUE, cast(stat.density as NUMBER) as DENSITY, cast(stat.null_cnt as NUMBER) as NUM_NULLS, cast(stat.bucket_cnt as NUMBER) as NUM_BUCKETS, cast(stat.last_analyzed as DATETIME(6)) as LAST_ANALYZED, cast(stat.sample_size as NUMBER) as SAMPLE_SIZE, CAST((CASE STAT.GLOBAL_STATS WHEN 0 THEN 'NO' WHEN 1 THEN 'YES' ELSE NULL END) AS CHAR(3)) AS GLOBAL_STATS, CAST((CASE STAT.USER_STATS WHEN 0 THEN 'NO' WHEN 1 THEN 'YES' ELSE NULL END) AS CHAR(3)) AS USER_STATS, cast(NULL as CHAR(80)) as NOTES, cast(stat.avg_len as NUMBER) as AVG_COL_LEN, cast((case when stat.histogram_type = 1 then 'FREQUENCY' when stat.histogram_type = 3 then 'TOP-FREQUENCY' when stat.histogram_type = 4 then 'HYBRID' else NULL end) as CHAR(15)) as HISTOGRAM FROM oceanbase.__all_table t JOIN oceanbase.__all_database db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND T.TENANT_ID = 0 JOIN oceanbase.__all_column c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id JOIN oceanbase.__all_sub_part subpart on t.tenant_id = subpart.tenant_id and t.table_id = subpart.table_id left join oceanbase.__all_column_stat stat ON c.table_id = stat.table_id AND c.column_id = stat.column_id AND stat.partition_id = subpart.sub_part_id AND stat.object_type = 3 WHERE c.is_hidden = 0 AND t.table_type in (0,3,6) )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT cast(db.database_name as CHAR(128)) as OWNER, cast(t.table_name as CHAR(128)) as TABLE_NAME, cast (subpart.sub_part_name as CHAR(128)) as SUBPARTITION_NAME, cast(c.column_name as CHAR(128)) as COLUMN_NAME, cast(stat.distinct_cnt as NUMBER) as NUM_DISTINCT, cast(stat.min_value as CHAR(128)) as LOW_VALUE, cast(stat.max_value as CHAR(128)) as HIGH_VALUE, cast(stat.density as NUMBER) as DENSITY, cast(stat.null_cnt as NUMBER) as NUM_NULLS, cast(stat.bucket_cnt as NUMBER) as NUM_BUCKETS, cast(stat.last_analyzed as DATETIME(6)) as LAST_ANALYZED, cast(stat.sample_size as NUMBER) as SAMPLE_SIZE, CAST((CASE STAT.GLOBAL_STATS WHEN 0 THEN 'NO' WHEN 1 THEN 'YES' ELSE NULL END) AS CHAR(3)) AS GLOBAL_STATS, CAST((CASE STAT.USER_STATS WHEN 0 THEN 'NO' WHEN 1 THEN 'YES' ELSE NULL END) AS CHAR(3)) AS USER_STATS, cast(NULL as CHAR(80)) as NOTES, cast(stat.avg_len as NUMBER) as AVG_COL_LEN, cast((case when stat.histogram_type = 1 then 'FREQUENCY' when stat.histogram_type = 3 then 'TOP-FREQUENCY' when stat.histogram_type = 4 then 'HYBRID' else NULL end) as CHAR(15)) as HISTOGRAM FROM oceanbase.__all_table t JOIN oceanbase.__all_database db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND T.TENANT_ID = 0 JOIN oceanbase.__all_column c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id JOIN oceanbase.__all_sub_part subpart on t.tenant_id = subpart.tenant_id and t.table_id = subpart.table_id left join oceanbase.__all_column_stat stat ON c.table_id = stat.table_id AND c.column_id = stat.column_id AND stat.partition_id = subpart.sub_part_id AND stat.object_type = 3 WHERE c.is_hidden = 0 AND t.table_type in (0,3,6,14) )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -310,7 +310,7 @@ int ObInnerTableSchema::dba_tab_histograms_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 cast(db.database_name as CHAR(128)) as OWNER, cast(t.table_name as CHAR(128)) as TABLE_NAME, cast(c.column_name as CHAR(128)) as COLUMN_NAME, cast(hist.endpoint_num as NUMBER) as ENDPOINT_NUMBER, cast(NULL as NUMBER) as ENDPOINT_VALUE, cast(hist.endpoint_value as CHAR(4000)) as ENDPOINT_ACTUAL_VALUE, cast(hist.b_endpoint_value as CHAR(4000)) as ENDPOINT_ACTUAL_VALUE_RAW, cast(hist.endpoint_repeat_cnt as NUMBER) as ENDPOINT_REPEAT_COUNT, cast(NULL as CHAR(7)) as SCOPE FROM (SELECT CAST(0 AS SIGNED) AS TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME FROM OCEANBASE.__ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, database_id, table_id, table_name FROM oceanbase.__all_table where table_type in (0,3,6)) T JOIN oceanbase.__all_database db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND T.TENANT_ID = 0 JOIN oceanbase.__all_column c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id JOIN oceanbase.__all_histogram_stat hist ON c.table_id = hist.table_id AND c.column_id = hist.column_id AND hist.object_type = 1 WHERE c.is_hidden = 0 )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select cast(db.database_name as CHAR(128)) as OWNER, cast(t.table_name as CHAR(128)) as TABLE_NAME, cast(c.column_name as CHAR(128)) as COLUMN_NAME, cast(hist.endpoint_num as NUMBER) as ENDPOINT_NUMBER, cast(NULL as NUMBER) as ENDPOINT_VALUE, cast(hist.endpoint_value as CHAR(4000)) as ENDPOINT_ACTUAL_VALUE, cast(hist.b_endpoint_value as CHAR(4000)) as ENDPOINT_ACTUAL_VALUE_RAW, cast(hist.endpoint_repeat_cnt as NUMBER) as ENDPOINT_REPEAT_COUNT, cast(NULL as CHAR(7)) as SCOPE FROM (SELECT CAST(0 AS SIGNED) AS TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME FROM OCEANBASE.__ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, database_id, table_id, table_name FROM oceanbase.__all_table where table_type in (0,3,6,14)) T JOIN oceanbase.__all_database db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND T.TENANT_ID = 0 JOIN oceanbase.__all_column c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id JOIN oceanbase.__all_histogram_stat hist ON c.table_id = hist.table_id AND c.column_id = hist.column_id AND hist.object_type = 1 WHERE c.is_hidden = 0 )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -360,7 +360,7 @@ int ObInnerTableSchema::dba_part_histograms_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 cast(db.database_name as CHAR(128)) as OWNER, cast(t.table_name as CHAR(128)) as TABLE_NAME, cast(part.part_name as CHAR(128)) as PARTITION_NAME, cast(c.column_name as CHAR(128)) as COLUMN_NAME, cast(hist.endpoint_num as NUMBER) as ENDPOINT_NUMBER, cast(NULL as NUMBER) as ENDPOINT_VALUE, cast(hist.endpoint_value as CHAR(4000)) as ENDPOINT_ACTUAL_VALUE, cast(hist.b_endpoint_value as CHAR(4000)) as ENDPOINT_ACTUAL_VALUE_RAW, cast(hist.endpoint_repeat_cnt as NUMBER) as ENDPOINT_REPEAT_COUNT FROM oceanbase.__all_table t JOIN oceanbase.__all_database db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND T.TENANT_ID = 0 JOIN oceanbase.__all_column c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id JOIN oceanbase.__all_part part on t.tenant_id = part.tenant_id and t.table_id = part.table_id JOIN oceanbase.__all_histogram_stat hist ON c.table_id = hist.table_id AND c.column_id = hist.column_id AND part.part_id = hist.partition_id AND hist.object_type = 2 WHERE c.is_hidden = 0 AND t.table_type in (0,3,6) )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select cast(db.database_name as CHAR(128)) as OWNER, cast(t.table_name as CHAR(128)) as TABLE_NAME, cast(part.part_name as CHAR(128)) as PARTITION_NAME, cast(c.column_name as CHAR(128)) as COLUMN_NAME, cast(hist.endpoint_num as NUMBER) as ENDPOINT_NUMBER, cast(NULL as NUMBER) as ENDPOINT_VALUE, cast(hist.endpoint_value as CHAR(4000)) as ENDPOINT_ACTUAL_VALUE, cast(hist.b_endpoint_value as CHAR(4000)) as ENDPOINT_ACTUAL_VALUE_RAW, cast(hist.endpoint_repeat_cnt as NUMBER) as ENDPOINT_REPEAT_COUNT FROM oceanbase.__all_table t JOIN oceanbase.__all_database db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND T.TENANT_ID = 0 JOIN oceanbase.__all_column c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id JOIN oceanbase.__all_part part on t.tenant_id = part.tenant_id and t.table_id = part.table_id JOIN oceanbase.__all_histogram_stat hist ON c.table_id = hist.table_id AND c.column_id = hist.column_id AND part.part_id = hist.partition_id AND hist.object_type = 2 WHERE c.is_hidden = 0 AND t.table_type in (0,3,6,14) )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -410,7 +410,7 @@ int ObInnerTableSchema::dba_subpart_histograms_schema(ObTableSchema &table_schem 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 cast(db.database_name as CHAR(128)) as OWNER, cast(t.table_name as CHAR(128)) as TABLE_NAME, cast(subpart.sub_part_name as CHAR(128)) as SUBPARTITION_NAME, cast(c.column_name as CHAR(128)) as COLUMN_NAME, cast(hist.endpoint_num as NUMBER) as ENDPOINT_NUMBER, cast(NULL as NUMBER) as ENDPOINT_VALUE, cast(hist.endpoint_value as CHAR(4000)) as ENDPOINT_ACTUAL_VALUE, cast(hist.b_endpoint_value as CHAR(4000)) as ENDPOINT_ACTUAL_VALUE_RAW, cast(hist.endpoint_repeat_cnt as NUMBER) as ENDPOINT_REPEAT_COUNT FROM oceanbase.__all_table t JOIN oceanbase.__all_database db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND T.TENANT_ID = 0 JOIN oceanbase.__all_column c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id JOIN oceanbase.__all_sub_part subpart on t.tenant_id = subpart.tenant_id and t.table_id = subpart.table_id JOIN oceanbase.__all_histogram_stat hist ON c.table_id = hist.table_id AND c.column_id = hist.column_id AND hist.partition_id = subpart.sub_part_id AND hist.object_type = 3 WHERE c.is_hidden = 0 AND t.table_type in (0,3,6) )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select cast(db.database_name as CHAR(128)) as OWNER, cast(t.table_name as CHAR(128)) as TABLE_NAME, cast(subpart.sub_part_name as CHAR(128)) as SUBPARTITION_NAME, cast(c.column_name as CHAR(128)) as COLUMN_NAME, cast(hist.endpoint_num as NUMBER) as ENDPOINT_NUMBER, cast(NULL as NUMBER) as ENDPOINT_VALUE, cast(hist.endpoint_value as CHAR(4000)) as ENDPOINT_ACTUAL_VALUE, cast(hist.b_endpoint_value as CHAR(4000)) as ENDPOINT_ACTUAL_VALUE_RAW, cast(hist.endpoint_repeat_cnt as NUMBER) as ENDPOINT_REPEAT_COUNT FROM oceanbase.__all_table t JOIN oceanbase.__all_database db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND T.TENANT_ID = 0 JOIN oceanbase.__all_column c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id JOIN oceanbase.__all_sub_part subpart on t.tenant_id = subpart.tenant_id and t.table_id = subpart.table_id JOIN oceanbase.__all_histogram_stat hist ON c.table_id = hist.table_id AND c.column_id = hist.column_id AND hist.partition_id = subpart.sub_part_id AND hist.object_type = 3 WHERE c.is_hidden = 0 AND t.table_type in (0,3,6,14) )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -460,7 +460,7 @@ int ObInnerTableSchema::dba_tab_stats_history_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 CAST(DB.DATABASE_NAME AS CHAR(128)) AS OWNER, CAST(V.TABLE_NAME AS CHAR(128)) AS TABLE_NAME, CAST(V.PARTITION_NAME AS CHAR(128)) AS PARTITION_NAME, CAST(V.SUBPARTITION_NAME AS CHAR(128)) AS SUBPARTITION_NAME, CAST(STAT.SAVTIME AS DATETIME(6)) AS STATS_UPDATE_TIME FROM ( (SELECT CAST(0 AS SIGNED) AS TENANT_ID, DATABASE_ID, TABLE_ID, -2 AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM OCEANBASE.__ALL_VIRTUAL_CORE_ALL_TABLE WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, CASE WHEN PART_LEVEL = 0 THEN -2 ELSE -1 END AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM oceanbase.__all_table T WHERE T.TABLE_TYPE IN (0,3,6)) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, P.PART_ID, T.TABLE_NAME, P.PART_NAME, NULL, P.PART_IDX + 1, NULL, 'PARTITION' FROM oceanbase.__all_table T JOIN oceanbase.__all_part P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID WHERE T.TABLE_TYPE IN (0,3,6) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, SP.SUB_PART_ID AS PARTITION_ID, T.TABLE_NAME, P.PART_NAME, SP.SUB_PART_NAME, P.PART_IDX + 1, SP.SUB_PART_IDX + 1, 'SUBPARTITION' FROM oceanbase.__all_table T JOIN oceanbase.__all_part P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID JOIN oceanbase.__all_sub_part SP ON T.TENANT_ID = SP.TENANT_ID AND T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID WHERE T.TABLE_TYPE IN (0,3,6) ) V JOIN oceanbase.__all_database DB ON DB.TENANT_ID = V.TENANT_ID AND DB.DATABASE_ID = V.DATABASE_ID AND V.TENANT_ID = 0 LEFT JOIN oceanbase.__all_table_stat_history STAT ON V.TENANT_ID = STAT.TENANT_ID AND V.TABLE_ID = STAT.TABLE_ID AND (V.PARTITION_ID = STAT.PARTITION_ID OR V.PARTITION_ID = -2) AND STAT.INDEX_TYPE = 0 )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(DB.DATABASE_NAME AS CHAR(128)) AS OWNER, CAST(V.TABLE_NAME AS CHAR(128)) AS TABLE_NAME, CAST(V.PARTITION_NAME AS CHAR(128)) AS PARTITION_NAME, CAST(V.SUBPARTITION_NAME AS CHAR(128)) AS SUBPARTITION_NAME, CAST(STAT.SAVTIME AS DATETIME(6)) AS STATS_UPDATE_TIME FROM ( (SELECT CAST(0 AS SIGNED) AS TENANT_ID, DATABASE_ID, TABLE_ID, -2 AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM OCEANBASE.__ALL_VIRTUAL_CORE_ALL_TABLE WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, CASE WHEN PART_LEVEL = 0 THEN -2 ELSE -1 END AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM oceanbase.__all_table T WHERE T.TABLE_TYPE IN (0,3,6,14)) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, P.PART_ID, T.TABLE_NAME, P.PART_NAME, NULL, P.PART_IDX + 1, NULL, 'PARTITION' FROM oceanbase.__all_table T JOIN oceanbase.__all_part P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID WHERE T.TABLE_TYPE IN (0,3,6,14) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, SP.SUB_PART_ID AS PARTITION_ID, T.TABLE_NAME, P.PART_NAME, SP.SUB_PART_NAME, P.PART_IDX + 1, SP.SUB_PART_IDX + 1, 'SUBPARTITION' FROM oceanbase.__all_table T JOIN oceanbase.__all_part P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID JOIN oceanbase.__all_sub_part SP ON T.TENANT_ID = SP.TENANT_ID AND T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID WHERE T.TABLE_TYPE IN (0,3,6,14) ) V JOIN oceanbase.__all_database DB ON DB.TENANT_ID = V.TENANT_ID AND DB.DATABASE_ID = V.DATABASE_ID AND V.TENANT_ID = 0 LEFT JOIN oceanbase.__all_table_stat_history STAT ON V.TENANT_ID = STAT.TENANT_ID AND V.TABLE_ID = STAT.TABLE_ID AND (V.PARTITION_ID = STAT.PARTITION_ID OR V.PARTITION_ID = -2) AND STAT.INDEX_TYPE = 0 )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.21351_21400.cpp b/src/share/inner_table/ob_inner_table_schema.21351_21400.cpp index 58b2291da..ed2978647 100644 --- a/src/share/inner_table/ob_inner_table_schema.21351_21400.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21351_21400.cpp @@ -360,7 +360,7 @@ int ObInnerTableSchema::partitions_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 CAST('def' as CHAR(4096)) AS TABLE_CATALOG, DB.DATABASE_NAME AS TABLE_SCHEMA, T.TABLE_NAME 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 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) )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT CAST('def' as CHAR(4096)) AS TABLE_CATALOG, DB.DATABASE_NAME AS TABLE_SCHEMA, T.TABLE_NAME 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 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) )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.21401_21450.cpp b/src/share/inner_table/ob_inner_table_schema.21401_21450.cpp index 2e38edf62..7e843adee 100644 --- a/src/share/inner_table/ob_inner_table_schema.21401_21450.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21401_21450.cpp @@ -75,6 +75,106 @@ int ObInnerTableSchema::v_ob_timestamp_service_schema(ObTableSchema &table_schem return ret; } +int ObInnerTableSchema::dba_ob_external_table_files_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_DBA_OB_EXTERNAL_TABLE_FILES_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_DBA_OB_EXTERNAL_TABLE_FILES_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 B.TABLE_NAME AS TABLE_NAME, C.DATABASE_NAME AS TABLE_SCHEMA, 'P0' AS PARTITION_NAME, A.FILE_URL AS FILE_URL, A.FILE_SIZE AS FILE_SIZE FROM OCEANBASE.__ALL_EXTERNAL_TABLE_FILE A INNER JOIN OCEANBASE.__ALL_TABLE B ON A.TABLE_ID = B.TABLE_ID AND B.TENANT_ID = 0 INNER JOIN OCEANBASE.__ALL_DATABASE C ON B.DATABASE_ID = C.DATABASE_ID AND C.TENANT_ID = 0 WHERE B.TABLE_TYPE = 14 AND (A.DELETE_VERSION = 9223372036854775807 OR A.DELETE_VERSION < A.CREATE_VERSION) )__"))) { + 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::all_ob_external_table_files_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_OB_EXTERNAL_TABLE_FILES_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_ALL_OB_EXTERNAL_TABLE_FILES_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 B.TABLE_NAME AS TABLE_NAME, C.DATABASE_NAME AS TABLE_SCHEMA, 'P0' AS PARTITION_NAME, A.FILE_URL AS FILE_URL, A.FILE_SIZE AS FILE_SIZE FROM OCEANBASE.__ALL_EXTERNAL_TABLE_FILE A INNER JOIN OCEANBASE.__ALL_TABLE B ON A.TABLE_ID = B.TABLE_ID AND B.TENANT_ID = 0 INNER JOIN OCEANBASE.__ALL_DATABASE C ON B.DATABASE_ID = C.DATABASE_ID AND C.TENANT_ID = 0 WHERE B.TABLE_TYPE = 14 AND 0 = sys_privilege_check('table_acc', EFFECTIVE_TENANT_ID(), C.DATABASE_NAME, B.TABLE_NAME) AND (A.DELETE_VERSION = 9223372036854775807 OR A.DELETE_VERSION < A.CREATE_VERSION) )__"))) { + 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::dba_ob_table_stat_stale_info_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; @@ -125,6 +225,56 @@ int ObInnerTableSchema::dba_ob_table_stat_stale_info_schema(ObTableSchema &table return ret; } +int ObInnerTableSchema::cdb_ob_external_table_files_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_CDB_OB_EXTERNAL_TABLE_FILES_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_CDB_OB_EXTERNAL_TABLE_FILES_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 A.TENANT_ID AS TENANT_ID, B.TABLE_NAME AS TABLE_NAME, C.DATABASE_NAME AS TABLE_SCHEMA, 'P0' AS PARTITION_NAME, A.FILE_URL AS FILE_URL, A.FILE_SIZE AS FILE_SIZE FROM OCEANBASE.__ALL_VIRTUAL_EXTERNAL_TABLE_FILE A INNER JOIN OCEANBASE.__ALL_VIRTUAL_TABLE B ON A.TABLE_ID = B.TABLE_ID AND A.TENANT_ID=B.TENANT_ID INNER JOIN OCEANBASE.__ALL_VIRTUAL_DATABASE C ON B.DATABASE_ID = C.DATABASE_ID AND B.TENANT_ID=C.TENANT_ID WHERE B.TABLE_TYPE = 14 AND (A.DELETE_VERSION = 9223372036854775807 OR A.DELETE_VERSION < A.CREATE_VERSION) )__"))) { + 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.25001_25050.cpp b/src/share/inner_table/ob_inner_table_schema.25001_25050.cpp index a7f02560f..df85c5201 100644 --- a/src/share/inner_table/ob_inner_table_schema.25001_25050.cpp +++ b/src/share/inner_table/ob_inner_table_schema.25001_25050.cpp @@ -110,7 +110,7 @@ int ObInnerTableSchema::dba_objects_ora_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 CAST(B.DATABASE_NAME AS VARCHAR(128)) AS OWNER, CAST(A.OBJECT_NAME AS VARCHAR(128)) AS OBJECT_NAME, CAST(A.SUBOBJECT_NAME AS VARCHAR2(128)) AS SUBOBJECT_NAME, CAST(A.OBJECT_ID AS NUMBER) AS OBJECT_ID, CAST(A.DATA_OBJECT_ID AS NUMBER) AS DATA_OBJECT_ID, CAST(A.OBJECT_TYPE AS VARCHAR2(23)) AS OBJECT_TYPE, CAST(A.GMT_CREATE AS DATE) AS CREATED, CAST(A.GMT_MODIFIED AS DATE) AS LAST_DDL_TIME, CAST(TO_CHAR(A.GMT_CREATE) AS VARCHAR2(19)) AS TIMESTAMP, CAST(A.STATUS AS VARCHAR2(7)) AS STATUS, CAST(A.TEMPORARY AS VARCHAR2(1)) AS TEMPORARY, CAST(A."GENERATED" AS VARCHAR2(1)) AS "GENERATED", CAST(A.SECONDARY AS VARCHAR2(1)) AS SECONDARY, CAST(A.NAMESPACE AS NUMBER) AS NAMESPACE, CAST(A.EDITION_NAME AS VARCHAR2(128)) AS EDITION_NAME, CAST(NULL AS VARCHAR2(18)) AS SHARING, CAST(NULL AS VARCHAR2(1)) AS EDITIONABLE, CAST(NULL AS VARCHAR2(1)) AS ORACLE_MAINTAINED, CAST(NULL AS VARCHAR2(1)) AS APPLICATION, CAST(NULL AS VARCHAR2(1)) AS DEFAULT_COLLATION, CAST(NULL AS VARCHAR2(1)) AS DUPLICATED, CAST(NULL AS VARCHAR2(1)) AS SHARDED, CAST(NULL AS VARCHAR2(1)) AS IMPORTED_OBJECT, CAST(NULL AS NUMBER) AS CREATED_APPID, CAST(NULL AS NUMBER) AS CREATED_VSNID, CAST(NULL AS NUMBER) AS MODIFIED_APPID, CAST(NULL AS NUMBER) AS MODIFIED_VSNID FROM ( SELECT A.TENANT_ID, (TO_DATE('19700101','YYYYMMDD') + B.SCHEMA_VERSION / 86400 / 1000000 + TO_NUMBER(SUBSTR(TZ_OFFSET(SESSIONTIMEZONE),1,3))/24) AS GMT_CREATE, (TO_DATE('19700101','YYYYMMDD') + A.SCHEMA_VERSION / 86400 / 1000000 + TO_NUMBER(SUBSTR(TZ_OFFSET(SESSIONTIMEZONE),1,3))/24) AS GMT_MODIFIED, A.DATABASE_ID, A.TABLE_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, CAST(A.TABLE_ID AS NUMBER) AS OBJECT_ID, A.TABLE_ID AS DATA_OBJECT_ID, 'TABLE' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE A JOIN SYS.ALL_VIRTUAL_CORE_ALL_TABLE B ON A.TENANT_ID = B.TENANT_ID WHERE B.TABLE_NAME = '__all_core_table' AND A.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,CAST((CASE WHEN DATABASE_ID = 201004 THEN TABLE_NAME WHEN TABLE_TYPE = 5 THEN SUBSTR(TABLE_NAME, 7 + INSTR(SUBSTR(TABLE_NAME, 7), '_')) ELSE TABLE_NAME END) AS VARCHAR2(128)) AS OBJECT_NAME ,NULL SUBOBJECT_NAME ,TABLE_ID OBJECT_ID ,(CASE WHEN TABLET_ID != 0 THEN TABLET_ID ELSE NULL END) DATA_OBJECT_ID ,CASE WHEN TABLE_TYPE IN (0,3,6,8,9) THEN 'TABLE' WHEN TABLE_TYPE IN (2) THEN 'VIRTUAL TABLE' WHEN TABLE_TYPE IN (1,4) THEN 'VIEW' WHEN TABLE_TYPE IN (5) THEN 'INDEX' WHEN TABLE_TYPE IN (7) THEN 'MATERIALIZED VIEW' ELSE NULL END AS OBJECT_TYPE ,CAST(CASE WHEN TABLE_TYPE IN (5) THEN CASE WHEN INDEX_STATUS = 2 THEN 'VALID' WHEN INDEX_STATUS = 3 THEN 'CHECKING' WHEN INDEX_STATUS = 4 THEN 'INELEGIBLE' WHEN INDEX_STATUS = 5 THEN 'ERROR' ELSE 'UNUSABLE' END ELSE CASE WHEN OBJECT_STATUS = 1 THEN 'VALID' ELSE 'INVALID' END END AS VARCHAR2(10)) AS STATUS ,CASE WHEN TABLE_TYPE IN (6,8,9) THEN 'Y' ELSE 'N' END AS TEMPORARY ,CASE WHEN TABLE_TYPE IN (0,1) THEN 'Y' ELSE 'N' END AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() AND TABLE_TYPE != 12 AND TABLE_TYPE != 13 UNION ALL SELECT CST.TENANT_ID ,CST.GMT_CREATE ,CST.GMT_MODIFIED ,DB.DATABASE_ID ,CST.CONSTRAINT_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,TBL.TABLE_ID AS OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'INDEX' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_CONSTRAINT_REAL_AGENT CST, SYS.ALL_VIRTUAL_TABLE_REAL_AGENT TBL, SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB WHERE CST.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.DATABASE_ID = TBL.DATABASE_ID AND TBL.TABLE_ID = CST.TABLE_ID and CST.CONSTRAINT_TYPE = 1 AND TBL.TABLE_TYPE != 12 AND TBL.TABLE_TYPE != 13 UNION ALL SELECT P.TENANT_ID ,P.GMT_CREATE ,P.GMT_MODIFIED ,T.DATABASE_ID ,CAST((CASE WHEN T.DATABASE_ID = 201004 THEN T.TABLE_NAME WHEN T.TABLE_TYPE = 5 THEN SUBSTR(T.TABLE_NAME, 7 + INSTR(SUBSTR(T.TABLE_NAME, 7), '_')) ELSE T.TABLE_NAME END) AS VARCHAR2(128)) AS OBJECT_NAME ,P.PART_NAME SUBOBJECT_NAME ,P.PART_ID OBJECT_ID ,CASE WHEN P.TABLET_ID != 0 THEN P.TABLET_ID ELSE NULL END AS DATA_OBJECT_ID ,DECODE (T.TABLE_TYPE, 5, 'INDEX PARTITION', 'TABLE PARTITION') AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY , NULL AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TABLE_ID = P.TABLE_ID WHERE T.TENANT_ID = EFFECTIVE_TENANT_ID() AND P.TENANT_ID = EFFECTIVE_TENANT_ID() AND T.TABLE_TYPE != 12 AND T.TABLE_TYPE != 13 UNION ALL SELECT SUBP.TENANT_ID ,SUBP.GMT_CREATE ,SUBP.GMT_MODIFIED ,T.DATABASE_ID ,CAST((CASE WHEN T.DATABASE_ID = 201004 THEN T.TABLE_NAME WHEN T.TABLE_TYPE = 5 THEN SUBSTR(T.TABLE_NAME, 7 + INSTR(SUBSTR(T.TABLE_NAME, 7), '_')) ELSE T.TABLE_NAME END) AS VARCHAR2(128)) AS OBJECT_NAME ,SUBP.SUB_PART_NAME SUBOBJECT_NAME ,SUBP.SUB_PART_ID OBJECT_ID ,SUBP.TABLET_ID AS DATA_OBJECT_ID ,DECODE (T.TABLE_TYPE, 5, 'INDEX SUBPARTITION', 'TABLE SUBPARTITION') AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'Y' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T, SYS.ALL_VIRTUAL_PART_REAL_AGENT P,SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SUBP WHERE T.TABLE_ID =P.TABLE_ID AND P.TABLE_ID=SUBP.TABLE_ID AND P.PART_ID =SUBP.PART_ID AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND P.TENANT_ID = EFFECTIVE_TENANT_ID() AND SUBP.TENANT_ID = EFFECTIVE_TENANT_ID() AND T.TABLE_TYPE != 12 AND T.TABLE_TYPE != 13 UNION ALL SELECT EFFECTIVE_TENANT_ID() AS TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS NUMBER) AS DATABASE_ID ,PACKAGE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,PACKAGE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN TYPE = 1 THEN 'PACKAGE' WHEN TYPE = 2 THEN 'PACKAGE BODY' ELSE NULL END AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_PACKAGE_SYS_AGENT UNION ALL SELECT P.TENANT_ID ,P.GMT_CREATE ,P.GMT_MODIFIED ,P.DATABASE_ID ,P.PACKAGE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,P.PACKAGE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN TYPE = 1 THEN 'PACKAGE' WHEN TYPE = 2 THEN 'PACKAGE BODY' ELSE NULL END AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE P.TENANT_ID = E.TENANT_ID AND P.PACKAGE_ID = E.OBJ_ID AND (E.OBJ_TYPE = 3 OR E.OBJ_TYPE = 5)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_PACKAGE_REAL_AGENT P WHERE P.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT R.TENANT_ID ,R.GMT_CREATE ,R.GMT_MODIFIED ,R.DATABASE_ID ,R.ROUTINE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,R.ROUTINE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN ROUTINE_TYPE = 1 THEN 'PROCEDURE' WHEN ROUTINE_TYPE = 2 THEN 'FUNCTION' ELSE NULL END AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE R.TENANT_ID = E.TENANT_ID AND R.ROUTINE_ID = E.OBJ_ID AND (E.OBJ_TYPE = 9 OR E.OBJ_TYPE = 12)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_ROUTINE_REAL_AGENT R WHERE (ROUTINE_TYPE = 1 OR ROUTINE_TYPE = 2) AND R.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT EFFECTIVE_TENANT_ID() AS TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS NUMBER) AS DATABASE_ID ,TS.TYPE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,TS.TYPE_ID AS OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE' AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE TS.TENANT_ID = E.TENANT_ID AND TS.TYPE_ID = E.OBJ_ID AND E.OBJ_TYPE = 4) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TYPE_SYS_AGENT TS UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,TYPE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,TYPE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE' AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE TY.TENANT_ID = E.TENANT_ID AND TY.TYPE_ID = E.OBJ_ID AND E.OBJ_TYPE = 4) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TYPE_REAL_AGENT TY WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT EFFECTIVE_TENANT_ID() AS TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS NUMBER) AS DATABASE_ID ,OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,OBJECT_TYPE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE BODY' AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE EFFECTIVE_TENANT_ID() = E.TENANT_ID AND TS.OBJECT_TYPE_ID = E.OBJ_ID AND E.OBJ_TYPE = 6) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TENANT_OBJECT_TYPE_SYS_AGENT TS WHERE TYPE = 2 UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,OBJECT_TYPE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE BODY' AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE TY.TENANT_ID = E.TENANT_ID AND TY.OBJECT_TYPE_ID = E.OBJ_ID AND E.OBJ_TYPE = 6) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TENANT_OBJECT_TYPE_REAL_AGENT TY WHERE TENANT_ID = EFFECTIVE_TENANT_ID() and TYPE = 2 UNION ALL SELECT T.TENANT_ID ,T.GMT_CREATE ,T.GMT_MODIFIED ,T.DATABASE_ID ,T.TRIGGER_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,T.TRIGGER_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TRIGGER' OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE T.TENANT_ID = E.TENANT_ID AND T.TRIGGER_ID = E.OBJ_ID AND (E.OBJ_TYPE = 7)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TENANT_TRIGGER_REAL_AGENT T WHERE T.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,SEQUENCE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,SEQUENCE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'SEQUENCE' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_SEQUENCE_OBJECT_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,SYNONYM_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,SYNONYM_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'SYNONYM' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_SYNONYM_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS NUMBER) AS DATABASE_ID ,NAMESPACE AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,CONTEXT_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'CONTEXT' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,21 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_CONTEXT_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID, GMT_CREATE, GMT_MODIFIED, DATABASE_ID, DATABASE_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, DATABASE_ID AS OBJECT_ID, NULL AS DATA_OBJECT_ID, 'DATABASE' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID, GMT_CREATE, GMT_MODIFIED, CAST(201001 AS NUMBER) AS DATABASE_ID, TABLEGROUP_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, TABLEGROUP_ID AS OBJECT_ID, NULL AS DATA_OBJECT_ID, 'TABLEGROUP' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLEGROUP_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT P.TENANT_ID, P.GMT_CREATE, P.GMT_MODIFIED, CAST(201001 AS NUMBER) AS DATABASE_ID, TG.TABLEGROUP_NAME AS OBJECT_NAME, P.PART_NAME SUBOBJECT_NAME, P.PART_ID OBJECT_ID, NULL AS DATA_OBJECT_ID, 'TABLEGROUP PARTITION' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, NULL AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLEGROUP_REAL_AGENT TG JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON TG.TABLEGROUP_ID = P.TABLE_ID WHERE TG.TENANT_ID = EFFECTIVE_TENANT_ID() AND P.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT SUBP.TENANT_ID, SUBP.GMT_CREATE, SUBP.GMT_MODIFIED, CAST(201001 AS NUMBER) AS DATABASE_ID, TG.TABLEGROUP_NAME AS OBJECT_NAME, SUBP.SUB_PART_NAME SUBOBJECT_NAME, SUBP.SUB_PART_ID OBJECT_ID, NULL DATA_OBJECT_ID, 'TABLEGROUP SUBPARTITION' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'Y' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLEGROUP_REAL_AGENT TG, SYS.ALL_VIRTUAL_PART_REAL_AGENT P,SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SUBP WHERE TG.TABLEGROUP_ID = P.TABLE_ID AND P.TABLE_ID = SUBP.TABLE_ID AND P.PART_ID = SUBP.PART_ID AND TG.TENANT_ID = EFFECTIVE_TENANT_ID() AND P.TENANT_ID = EFFECTIVE_TENANT_ID() AND SUBP.TENANT_ID = EFFECTIVE_TENANT_ID() ) A JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT B ON A.TENANT_ID = B.TENANT_ID AND A.DATABASE_ID = B.DATABASE_ID AND B.TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(B.DATABASE_NAME AS VARCHAR(128)) AS OWNER, CAST(A.OBJECT_NAME AS VARCHAR(128)) AS OBJECT_NAME, CAST(A.SUBOBJECT_NAME AS VARCHAR2(128)) AS SUBOBJECT_NAME, CAST(A.OBJECT_ID AS NUMBER) AS OBJECT_ID, CAST(A.DATA_OBJECT_ID AS NUMBER) AS DATA_OBJECT_ID, CAST(A.OBJECT_TYPE AS VARCHAR2(23)) AS OBJECT_TYPE, CAST(A.GMT_CREATE AS DATE) AS CREATED, CAST(A.GMT_MODIFIED AS DATE) AS LAST_DDL_TIME, CAST(TO_CHAR(A.GMT_CREATE) AS VARCHAR2(19)) AS TIMESTAMP, CAST(A.STATUS AS VARCHAR2(7)) AS STATUS, CAST(A.TEMPORARY AS VARCHAR2(1)) AS TEMPORARY, CAST(A."GENERATED" AS VARCHAR2(1)) AS "GENERATED", CAST(A.SECONDARY AS VARCHAR2(1)) AS SECONDARY, CAST(A.NAMESPACE AS NUMBER) AS NAMESPACE, CAST(A.EDITION_NAME AS VARCHAR2(128)) AS EDITION_NAME, CAST(NULL AS VARCHAR2(18)) AS SHARING, CAST(NULL AS VARCHAR2(1)) AS EDITIONABLE, CAST(NULL AS VARCHAR2(1)) AS ORACLE_MAINTAINED, CAST(NULL AS VARCHAR2(1)) AS APPLICATION, CAST(NULL AS VARCHAR2(1)) AS DEFAULT_COLLATION, CAST(NULL AS VARCHAR2(1)) AS DUPLICATED, CAST(NULL AS VARCHAR2(1)) AS SHARDED, CAST(NULL AS VARCHAR2(1)) AS IMPORTED_OBJECT, CAST(NULL AS NUMBER) AS CREATED_APPID, CAST(NULL AS NUMBER) AS CREATED_VSNID, CAST(NULL AS NUMBER) AS MODIFIED_APPID, CAST(NULL AS NUMBER) AS MODIFIED_VSNID FROM ( SELECT A.TENANT_ID, (TO_DATE('19700101','YYYYMMDD') + B.SCHEMA_VERSION / 86400 / 1000000 + TO_NUMBER(SUBSTR(TZ_OFFSET(SESSIONTIMEZONE),1,3))/24) AS GMT_CREATE, (TO_DATE('19700101','YYYYMMDD') + A.SCHEMA_VERSION / 86400 / 1000000 + TO_NUMBER(SUBSTR(TZ_OFFSET(SESSIONTIMEZONE),1,3))/24) AS GMT_MODIFIED, A.DATABASE_ID, A.TABLE_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, CAST(A.TABLE_ID AS NUMBER) AS OBJECT_ID, A.TABLE_ID AS DATA_OBJECT_ID, 'TABLE' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE A JOIN SYS.ALL_VIRTUAL_CORE_ALL_TABLE B ON A.TENANT_ID = B.TENANT_ID WHERE B.TABLE_NAME = '__all_core_table' AND A.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,CAST((CASE WHEN DATABASE_ID = 201004 THEN TABLE_NAME WHEN TABLE_TYPE = 5 THEN SUBSTR(TABLE_NAME, 7 + INSTR(SUBSTR(TABLE_NAME, 7), '_')) ELSE TABLE_NAME END) AS VARCHAR2(128)) AS OBJECT_NAME ,NULL SUBOBJECT_NAME ,TABLE_ID OBJECT_ID ,(CASE WHEN TABLET_ID != 0 THEN TABLET_ID ELSE NULL END) DATA_OBJECT_ID ,CASE WHEN TABLE_TYPE IN (0,3,6,8,9,14) THEN 'TABLE' WHEN TABLE_TYPE IN (2) THEN 'VIRTUAL TABLE' WHEN TABLE_TYPE IN (1,4) THEN 'VIEW' WHEN TABLE_TYPE IN (5) THEN 'INDEX' WHEN TABLE_TYPE IN (7) THEN 'MATERIALIZED VIEW' ELSE NULL END AS OBJECT_TYPE ,CAST(CASE WHEN TABLE_TYPE IN (5) THEN CASE WHEN INDEX_STATUS = 2 THEN 'VALID' WHEN INDEX_STATUS = 3 THEN 'CHECKING' WHEN INDEX_STATUS = 4 THEN 'INELEGIBLE' WHEN INDEX_STATUS = 5 THEN 'ERROR' ELSE 'UNUSABLE' END ELSE CASE WHEN OBJECT_STATUS = 1 THEN 'VALID' ELSE 'INVALID' END END AS VARCHAR2(10)) AS STATUS ,CASE WHEN TABLE_TYPE IN (6,8,9) THEN 'Y' ELSE 'N' END AS TEMPORARY ,CASE WHEN TABLE_TYPE IN (0,1) THEN 'Y' ELSE 'N' END AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() AND TABLE_TYPE != 12 AND TABLE_TYPE != 13 UNION ALL SELECT CST.TENANT_ID ,CST.GMT_CREATE ,CST.GMT_MODIFIED ,DB.DATABASE_ID ,CST.CONSTRAINT_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,TBL.TABLE_ID AS OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'INDEX' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_CONSTRAINT_REAL_AGENT CST, SYS.ALL_VIRTUAL_TABLE_REAL_AGENT TBL, SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB WHERE CST.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.DATABASE_ID = TBL.DATABASE_ID AND TBL.TABLE_ID = CST.TABLE_ID and CST.CONSTRAINT_TYPE = 1 AND TBL.TABLE_TYPE != 12 AND TBL.TABLE_TYPE != 13 UNION ALL SELECT P.TENANT_ID ,P.GMT_CREATE ,P.GMT_MODIFIED ,T.DATABASE_ID ,CAST((CASE WHEN T.DATABASE_ID = 201004 THEN T.TABLE_NAME WHEN T.TABLE_TYPE = 5 THEN SUBSTR(T.TABLE_NAME, 7 + INSTR(SUBSTR(T.TABLE_NAME, 7), '_')) ELSE T.TABLE_NAME END) AS VARCHAR2(128)) AS OBJECT_NAME ,P.PART_NAME SUBOBJECT_NAME ,P.PART_ID OBJECT_ID ,CASE WHEN P.TABLET_ID != 0 THEN P.TABLET_ID ELSE NULL END AS DATA_OBJECT_ID ,DECODE (T.TABLE_TYPE, 5, 'INDEX PARTITION', 'TABLE PARTITION') AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY , NULL AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TABLE_ID = P.TABLE_ID WHERE T.TENANT_ID = EFFECTIVE_TENANT_ID() AND P.TENANT_ID = EFFECTIVE_TENANT_ID() AND T.TABLE_TYPE != 12 AND T.TABLE_TYPE != 13 UNION ALL SELECT SUBP.TENANT_ID ,SUBP.GMT_CREATE ,SUBP.GMT_MODIFIED ,T.DATABASE_ID ,CAST((CASE WHEN T.DATABASE_ID = 201004 THEN T.TABLE_NAME WHEN T.TABLE_TYPE = 5 THEN SUBSTR(T.TABLE_NAME, 7 + INSTR(SUBSTR(T.TABLE_NAME, 7), '_')) ELSE T.TABLE_NAME END) AS VARCHAR2(128)) AS OBJECT_NAME ,SUBP.SUB_PART_NAME SUBOBJECT_NAME ,SUBP.SUB_PART_ID OBJECT_ID ,SUBP.TABLET_ID AS DATA_OBJECT_ID ,DECODE (T.TABLE_TYPE, 5, 'INDEX SUBPARTITION', 'TABLE SUBPARTITION') AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'Y' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T, SYS.ALL_VIRTUAL_PART_REAL_AGENT P,SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SUBP WHERE T.TABLE_ID =P.TABLE_ID AND P.TABLE_ID=SUBP.TABLE_ID AND P.PART_ID =SUBP.PART_ID AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND P.TENANT_ID = EFFECTIVE_TENANT_ID() AND SUBP.TENANT_ID = EFFECTIVE_TENANT_ID() AND T.TABLE_TYPE != 12 AND T.TABLE_TYPE != 13 UNION ALL SELECT EFFECTIVE_TENANT_ID() AS TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS NUMBER) AS DATABASE_ID ,PACKAGE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,PACKAGE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN TYPE = 1 THEN 'PACKAGE' WHEN TYPE = 2 THEN 'PACKAGE BODY' ELSE NULL END AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_PACKAGE_SYS_AGENT UNION ALL SELECT P.TENANT_ID ,P.GMT_CREATE ,P.GMT_MODIFIED ,P.DATABASE_ID ,P.PACKAGE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,P.PACKAGE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN TYPE = 1 THEN 'PACKAGE' WHEN TYPE = 2 THEN 'PACKAGE BODY' ELSE NULL END AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE P.TENANT_ID = E.TENANT_ID AND P.PACKAGE_ID = E.OBJ_ID AND (E.OBJ_TYPE = 3 OR E.OBJ_TYPE = 5)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_PACKAGE_REAL_AGENT P WHERE P.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT R.TENANT_ID ,R.GMT_CREATE ,R.GMT_MODIFIED ,R.DATABASE_ID ,R.ROUTINE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,R.ROUTINE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN ROUTINE_TYPE = 1 THEN 'PROCEDURE' WHEN ROUTINE_TYPE = 2 THEN 'FUNCTION' ELSE NULL END AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE R.TENANT_ID = E.TENANT_ID AND R.ROUTINE_ID = E.OBJ_ID AND (E.OBJ_TYPE = 9 OR E.OBJ_TYPE = 12)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_ROUTINE_REAL_AGENT R WHERE (ROUTINE_TYPE = 1 OR ROUTINE_TYPE = 2) AND R.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT EFFECTIVE_TENANT_ID() AS TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS NUMBER) AS DATABASE_ID ,TS.TYPE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,TS.TYPE_ID AS OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE' AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE TS.TENANT_ID = E.TENANT_ID AND TS.TYPE_ID = E.OBJ_ID AND E.OBJ_TYPE = 4) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TYPE_SYS_AGENT TS UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,TYPE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,TYPE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE' AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE TY.TENANT_ID = E.TENANT_ID AND TY.TYPE_ID = E.OBJ_ID AND E.OBJ_TYPE = 4) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TYPE_REAL_AGENT TY WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT EFFECTIVE_TENANT_ID() AS TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS NUMBER) AS DATABASE_ID ,OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,OBJECT_TYPE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE BODY' AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE EFFECTIVE_TENANT_ID() = E.TENANT_ID AND TS.OBJECT_TYPE_ID = E.OBJ_ID AND E.OBJ_TYPE = 6) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TENANT_OBJECT_TYPE_SYS_AGENT TS WHERE TYPE = 2 UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,OBJECT_TYPE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE BODY' AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE TY.TENANT_ID = E.TENANT_ID AND TY.OBJECT_TYPE_ID = E.OBJ_ID AND E.OBJ_TYPE = 6) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TENANT_OBJECT_TYPE_REAL_AGENT TY WHERE TENANT_ID = EFFECTIVE_TENANT_ID() and TYPE = 2 UNION ALL SELECT T.TENANT_ID ,T.GMT_CREATE ,T.GMT_MODIFIED ,T.DATABASE_ID ,T.TRIGGER_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,T.TRIGGER_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TRIGGER' OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE T.TENANT_ID = E.TENANT_ID AND T.TRIGGER_ID = E.OBJ_ID AND (E.OBJ_TYPE = 7)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TENANT_TRIGGER_REAL_AGENT T WHERE T.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,SEQUENCE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,SEQUENCE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'SEQUENCE' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_SEQUENCE_OBJECT_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,SYNONYM_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,SYNONYM_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'SYNONYM' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_SYNONYM_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS NUMBER) AS DATABASE_ID ,NAMESPACE AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,CONTEXT_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'CONTEXT' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,21 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_CONTEXT_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID, GMT_CREATE, GMT_MODIFIED, DATABASE_ID, DATABASE_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, DATABASE_ID AS OBJECT_ID, NULL AS DATA_OBJECT_ID, 'DATABASE' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID, GMT_CREATE, GMT_MODIFIED, CAST(201001 AS NUMBER) AS DATABASE_ID, TABLEGROUP_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, TABLEGROUP_ID AS OBJECT_ID, NULL AS DATA_OBJECT_ID, 'TABLEGROUP' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLEGROUP_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT P.TENANT_ID, P.GMT_CREATE, P.GMT_MODIFIED, CAST(201001 AS NUMBER) AS DATABASE_ID, TG.TABLEGROUP_NAME AS OBJECT_NAME, P.PART_NAME SUBOBJECT_NAME, P.PART_ID OBJECT_ID, NULL AS DATA_OBJECT_ID, 'TABLEGROUP PARTITION' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, NULL AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLEGROUP_REAL_AGENT TG JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON TG.TABLEGROUP_ID = P.TABLE_ID WHERE TG.TENANT_ID = EFFECTIVE_TENANT_ID() AND P.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT SUBP.TENANT_ID, SUBP.GMT_CREATE, SUBP.GMT_MODIFIED, CAST(201001 AS NUMBER) AS DATABASE_ID, TG.TABLEGROUP_NAME AS OBJECT_NAME, SUBP.SUB_PART_NAME SUBOBJECT_NAME, SUBP.SUB_PART_ID OBJECT_ID, NULL DATA_OBJECT_ID, 'TABLEGROUP SUBPARTITION' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'Y' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLEGROUP_REAL_AGENT TG, SYS.ALL_VIRTUAL_PART_REAL_AGENT P,SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SUBP WHERE TG.TABLEGROUP_ID = P.TABLE_ID AND P.TABLE_ID = SUBP.TABLE_ID AND P.PART_ID = SUBP.PART_ID AND TG.TENANT_ID = EFFECTIVE_TENANT_ID() AND P.TENANT_ID = EFFECTIVE_TENANT_ID() AND SUBP.TENANT_ID = EFFECTIVE_TENANT_ID() ) A JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT B ON A.TENANT_ID = B.TENANT_ID AND A.DATABASE_ID = B.DATABASE_ID AND B.TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -160,7 +160,7 @@ int ObInnerTableSchema::all_objects_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 CAST(B.DATABASE_NAME AS VARCHAR(128)) AS OWNER, CAST(A.OBJECT_NAME AS VARCHAR(128)) AS OBJECT_NAME, CAST(A.SUBOBJECT_NAME AS VARCHAR2(128)) AS SUBOBJECT_NAME, CAST(A.OBJECT_ID AS NUMBER) AS OBJECT_ID, CAST(A.DATA_OBJECT_ID AS NUMBER) AS DATA_OBJECT_ID, CAST(A.OBJECT_TYPE AS VARCHAR2(23)) AS OBJECT_TYPE, CAST(A.GMT_CREATE AS DATE) AS CREATED, CAST(A.GMT_MODIFIED AS DATE) AS LAST_DDL_TIME, CAST(TO_CHAR(A.GMT_CREATE) AS VARCHAR2(19)) AS TIMESTAMP, CAST(A.STATUS AS VARCHAR2(7)) AS STATUS, CAST(A.TEMPORARY AS VARCHAR2(1)) AS TEMPORARY, CAST(A."GENERATED" AS VARCHAR2(1)) AS "GENERATED", CAST(A.SECONDARY AS VARCHAR2(1)) AS SECONDARY, CAST(A.NAMESPACE AS NUMBER) AS NAMESPACE, CAST(A.EDITION_NAME AS VARCHAR2(128)) AS EDITION_NAME, CAST(NULL AS VARCHAR2(18)) AS SHARING, CAST(NULL AS VARCHAR2(1)) AS EDITIONABLE, CAST(NULL AS VARCHAR2(1)) AS ORACLE_MAINTAINED, CAST(NULL AS VARCHAR2(1)) AS APPLICATION, CAST(NULL AS VARCHAR2(1)) AS DEFAULT_COLLATION, CAST(NULL AS VARCHAR2(1)) AS DUPLICATED, CAST(NULL AS VARCHAR2(1)) AS SHARDED, CAST(NULL AS VARCHAR2(1)) AS IMPORTED_OBJECT, CAST(NULL AS NUMBER) AS CREATED_APPID, CAST(NULL AS NUMBER) AS CREATED_VSNID, CAST(NULL AS NUMBER) AS MODIFIED_APPID, CAST(NULL AS NUMBER) AS MODIFIED_VSNID FROM ( SELECT A.TENANT_ID, (TO_DATE('19700101','YYYYMMDD') + B.SCHEMA_VERSION / 86400 / 1000000 + TO_NUMBER(SUBSTR(TZ_OFFSET(SESSIONTIMEZONE),1,3))/24) AS GMT_CREATE, (TO_DATE('19700101','YYYYMMDD') + A.SCHEMA_VERSION / 86400 / 1000000 + TO_NUMBER(SUBSTR(TZ_OFFSET(SESSIONTIMEZONE),1,3))/24) AS GMT_MODIFIED, A.DATABASE_ID, A.TABLE_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, CAST(A.TABLE_ID AS NUMBER) AS OBJECT_ID, CAST(A.TABLE_ID AS NUMBER) AS PRIV_OBJECT_ID, A.TABLE_ID AS DATA_OBJECT_ID, 'TABLE' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE A JOIN SYS.ALL_VIRTUAL_CORE_ALL_TABLE B ON A.TENANT_ID = B.TENANT_ID WHERE B.TABLE_NAME = '__all_core_table' AND A.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,CAST((CASE WHEN DATABASE_ID = 201004 THEN TABLE_NAME WHEN TABLE_TYPE = 5 THEN SUBSTR(TABLE_NAME, 7 + INSTR(SUBSTR(TABLE_NAME, 7), '_')) ELSE TABLE_NAME END) AS VARCHAR2(128)) AS OBJECT_NAME ,NULL SUBOBJECT_NAME ,TABLE_ID OBJECT_ID ,TABLE_ID PRIV_OBJECT_ID ,(CASE WHEN TABLET_ID != 0 THEN TABLET_ID ELSE NULL END) DATA_OBJECT_ID ,CASE WHEN TABLE_TYPE IN (0,3,6,8,9) THEN 'TABLE' WHEN TABLE_TYPE IN (2) THEN 'VIRTUAL TABLE' WHEN TABLE_TYPE IN (1,4) THEN 'VIEW' WHEN TABLE_TYPE IN (5) THEN 'INDEX' WHEN TABLE_TYPE IN (7) THEN 'MATERIALIZED VIEW' ELSE NULL END AS OBJECT_TYPE ,CAST(CASE WHEN TABLE_TYPE IN (5) THEN CASE WHEN INDEX_STATUS = 2 THEN 'VALID' WHEN INDEX_STATUS = 3 THEN 'CHECKING' WHEN INDEX_STATUS = 4 THEN 'INELEGIBLE' WHEN INDEX_STATUS = 5 THEN 'ERROR' ELSE 'UNUSABLE' END ELSE CASE WHEN OBJECT_STATUS = 1 THEN 'VALID' ELSE 'INVALID' END END AS VARCHAR2(10)) AS STATUS ,CASE WHEN TABLE_TYPE IN (6,8,9) THEN 'Y' ELSE 'N' END AS TEMPORARY ,CASE WHEN TABLE_TYPE IN (0,1) THEN 'Y' ELSE 'N' END AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() AND TABLE_TYPE != 12 AND TABLE_TYPE != 13 UNION ALL SELECT CST.TENANT_ID ,CST.GMT_CREATE ,CST.GMT_MODIFIED ,DB.DATABASE_ID ,CST.CONSTRAINT_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,TBL.TABLE_ID AS OBJECT_ID ,TBL.TABLE_ID AS PRIV_OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'INDEX' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_CONSTRAINT_REAL_AGENT CST, SYS.ALL_VIRTUAL_TABLE_REAL_AGENT TBL, SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB WHERE CST.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.DATABASE_ID = TBL.DATABASE_ID AND TBL.TABLE_ID = CST.TABLE_ID and CST.CONSTRAINT_TYPE = 1 AND TBL.TABLE_TYPE != 12 AND TBL.TABLE_TYPE != 13 UNION ALL SELECT P.TENANT_ID ,P.GMT_CREATE ,P.GMT_MODIFIED ,T.DATABASE_ID ,CAST((CASE WHEN T.DATABASE_ID = 201004 THEN T.TABLE_NAME WHEN T.TABLE_TYPE = 5 THEN SUBSTR(T.TABLE_NAME, 7 + INSTR(SUBSTR(T.TABLE_NAME, 7), '_')) ELSE T.TABLE_NAME END) AS VARCHAR2(128)) AS OBJECT_NAME ,P.PART_NAME SUBOBJECT_NAME ,P.PART_ID OBJECT_ID ,P.TABLE_ID PRIV_OBJECT_ID ,CASE WHEN P.TABLET_ID != 0 THEN P.TABLET_ID ELSE NULL END AS DATA_OBJECT_ID ,DECODE (T.TABLE_TYPE, 5, 'INDEX PARTITION', 'TABLE PARTITION') AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY , NULL AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TABLE_ID = P.TABLE_ID WHERE T.TENANT_ID = EFFECTIVE_TENANT_ID() AND P.TENANT_ID = EFFECTIVE_TENANT_ID() AND T.TABLE_TYPE != 12 AND T.TABLE_TYPE != 13 UNION ALL SELECT SUBP.TENANT_ID ,SUBP.GMT_CREATE ,SUBP.GMT_MODIFIED ,T.DATABASE_ID ,CAST((CASE WHEN T.DATABASE_ID = 201004 THEN T.TABLE_NAME WHEN T.TABLE_TYPE = 5 THEN SUBSTR(T.TABLE_NAME, 7 + INSTR(SUBSTR(T.TABLE_NAME, 7), '_')) ELSE T.TABLE_NAME END) AS VARCHAR2(128)) AS OBJECT_NAME ,SUBP.SUB_PART_NAME SUBOBJECT_NAME ,SUBP.SUB_PART_ID OBJECT_ID ,SUBP.TABLE_ID PRIV_OBJECT_ID ,SUBP.TABLET_ID AS DATA_OBJECT_ID ,DECODE (T.TABLE_TYPE, 5, 'INDEX SUBPARTITION', 'TABLE SUBPARTITION') AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'Y' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T, SYS.ALL_VIRTUAL_PART_REAL_AGENT P,SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SUBP WHERE T.TABLE_ID =P.TABLE_ID AND P.TABLE_ID=SUBP.TABLE_ID AND P.PART_ID =SUBP.PART_ID AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND P.TENANT_ID = EFFECTIVE_TENANT_ID() AND SUBP.TENANT_ID = EFFECTIVE_TENANT_ID() AND T.TABLE_TYPE != 12 AND T.TABLE_TYPE != 13 UNION ALL SELECT EFFECTIVE_TENANT_ID() AS TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS NUMBER) AS DATABASE_ID ,PACKAGE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,PACKAGE_ID OBJECT_ID ,PACKAGE_ID PRIV_OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN TYPE = 1 THEN 'PACKAGE' WHEN TYPE = 2 THEN 'PACKAGE BODY' ELSE NULL END AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_PACKAGE_SYS_AGENT UNION ALL SELECT P.TENANT_ID ,P.GMT_CREATE ,P.GMT_MODIFIED ,P.DATABASE_ID ,P.PACKAGE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,P.PACKAGE_ID OBJECT_ID ,P.PACKAGE_ID PRIV_OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN TYPE = 1 THEN 'PACKAGE' WHEN TYPE = 2 THEN 'PACKAGE BODY' ELSE NULL END AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE P.TENANT_ID = E.TENANT_ID AND P.PACKAGE_ID = E.OBJ_ID AND (E.OBJ_TYPE = 3 OR E.OBJ_TYPE = 5)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_PACKAGE_REAL_AGENT P WHERE P.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT R.TENANT_ID ,R.GMT_CREATE ,R.GMT_MODIFIED ,R.DATABASE_ID ,R.ROUTINE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,R.ROUTINE_ID OBJECT_ID ,R.ROUTINE_ID PRIV_OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN ROUTINE_TYPE = 1 THEN 'PROCEDURE' WHEN ROUTINE_TYPE = 2 THEN 'FUNCTION' ELSE NULL END AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE R.TENANT_ID = E.TENANT_ID AND R.ROUTINE_ID = E.OBJ_ID AND (E.OBJ_TYPE = 9 OR E.OBJ_TYPE = 12)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_ROUTINE_REAL_AGENT R WHERE (ROUTINE_TYPE = 1 OR ROUTINE_TYPE = 2) AND R.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT EFFECTIVE_TENANT_ID() AS TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS NUMBER) AS DATABASE_ID ,TS.TYPE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,TS.TYPE_ID AS OBJECT_ID ,TS.TYPE_ID AS PRIV_OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE' AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE TS.TENANT_ID = E.TENANT_ID AND TS.TYPE_ID = E.OBJ_ID AND E.OBJ_TYPE = 4) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TYPE_SYS_AGENT TS UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,TYPE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,TYPE_ID OBJECT_ID ,TYPE_ID PRIV_OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE' AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE TY.TENANT_ID = E.TENANT_ID AND TY.TYPE_ID = E.OBJ_ID AND E.OBJ_TYPE = 4) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TYPE_REAL_AGENT TY WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT EFFECTIVE_TENANT_ID() AS TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS NUMBER) AS DATABASE_ID ,OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,OBJECT_TYPE_ID OBJECT_ID ,OBJECT_TYPE_ID PRIV_OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE BODY' AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE EFFECTIVE_TENANT_ID() = E.TENANT_ID AND TS.OBJECT_TYPE_ID = E.OBJ_ID AND E.OBJ_TYPE = 6) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TENANT_OBJECT_TYPE_SYS_AGENT TS WHERE TYPE = 2 UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,OBJECT_TYPE_ID OBJECT_ID ,OBJECT_TYPE_ID PRIV_OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE BODY' AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE TY.TENANT_ID = E.TENANT_ID AND TY.OBJECT_TYPE_ID = E.OBJ_ID AND E.OBJ_TYPE = 6) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TENANT_OBJECT_TYPE_REAL_AGENT TY WHERE TENANT_ID = EFFECTIVE_TENANT_ID() and TYPE = 2 UNION ALL SELECT T.TENANT_ID ,T.GMT_CREATE ,T.GMT_MODIFIED ,T.DATABASE_ID ,T.TRIGGER_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,T.TRIGGER_ID OBJECT_ID ,T.TRIGGER_ID PRIV_OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TRIGGER' OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE T.TENANT_ID = E.TENANT_ID AND T.TRIGGER_ID = E.OBJ_ID AND (E.OBJ_TYPE = 7)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TENANT_TRIGGER_REAL_AGENT T WHERE T.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,SEQUENCE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,SEQUENCE_ID OBJECT_ID ,SEQUENCE_ID PRIV_OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'SEQUENCE' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_SEQUENCE_OBJECT_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,SYNONYM_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,SYNONYM_ID OBJECT_ID ,SYNONYM_ID PRIV_OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'SYNONYM' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_SYNONYM_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() /*UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS NUMBER) AS DATABASE_ID ,NAMESPACE AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,CONTEXT_ID OBJECT_ID ,CONTEXT_ID PRIV_OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'CONTEXT' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,21 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_CONTEXT_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID()*/ UNION ALL SELECT TENANT_ID, GMT_CREATE, GMT_MODIFIED, DATABASE_ID, DATABASE_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, DATABASE_ID AS OBJECT_ID, CAST(-1 AS NUMBER) AS PRIV_OBJECT_ID, NULL AS DATA_OBJECT_ID, 'DATABASE' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() /*UNION ALL SELECT TENANT_ID, GMT_CREATE, GMT_MODIFIED, CAST(201001 AS NUMBER) AS DATABASE_ID, TABLEGROUP_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, TABLEGROUP_ID AS OBJECT_ID, CAST(-1 AS NUMBER) AS PRIV_OBJECT_ID, NULL AS DATA_OBJECT_ID, 'TABLEGROUP' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLEGROUP_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT P.TENANT_ID, P.GMT_CREATE, P.GMT_MODIFIED, CAST(201001 AS NUMBER) AS DATABASE_ID, TG.TABLEGROUP_NAME AS OBJECT_NAME, P.PART_NAME SUBOBJECT_NAME, P.PART_ID OBJECT_ID, CAST(-1 AS NUMBER) AS PRIV_OBJECT_ID, NULL AS DATA_OBJECT_ID, 'TABLEGROUP PARTITION' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, NULL AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLEGROUP_REAL_AGENT TG JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON TG.TABLEGROUP_ID = P.TABLE_ID WHERE TG.TENANT_ID = EFFECTIVE_TENANT_ID() AND P.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT SUBP.TENANT_ID, SUBP.GMT_CREATE, SUBP.GMT_MODIFIED, CAST(201001 AS NUMBER) AS DATABASE_ID, TG.TABLEGROUP_NAME AS OBJECT_NAME, SUBP.SUB_PART_NAME SUBOBJECT_NAME, SUBP.SUB_PART_ID OBJECT_ID, CAST(-1 AS NUMBER) AS PRIV_OBJECT_ID, NULL DATA_OBJECT_ID, 'TABLEGROUP SUBPARTITION' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'Y' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLEGROUP_REAL_AGENT TG, SYS.ALL_VIRTUAL_PART_REAL_AGENT P,SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SUBP WHERE TG.TABLEGROUP_ID = P.TABLE_ID AND P.TABLE_ID = SUBP.TABLE_ID AND P.PART_ID = SUBP.PART_ID AND TG.TENANT_ID = EFFECTIVE_TENANT_ID() AND P.TENANT_ID = EFFECTIVE_TENANT_ID() AND SUBP.TENANT_ID = EFFECTIVE_TENANT_ID()*/ ) A JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT B ON A.TENANT_ID = B.TENANT_ID AND A.DATABASE_ID = B.DATABASE_ID AND B.TENANT_ID = EFFECTIVE_TENANT_ID() AND (A.DATABASE_ID = USERENV('SCHEMAID') OR (A.PRIV_OBJECT_ID != -1 AND USER_CAN_ACCESS_OBJ(DECODE(OBJECT_TYPE, 'TABLE', 1, 'VIEW', 1, 'INDEX', 1, 'MATERIALIZED VIEW', 1, 'TABLE PARTITION', 1, 'TABLE SUBPARTITION', 1, 'INDEX PARTITION', 1, 'INDEX SUBPARTITION', 1, 'SEQUENCE', 2, 'PACKAGE', 3, 'PACKAGE BODY', 3, 'TYPE', 4, 'TYPE BODY', 4, 'TRIGGER', 7, 'FUNCTION', 9, 'PROCEDURE', 12, 'SYNONYM', 13, 1), A.PRIV_OBJECT_ID, A.DATABASE_ID) = 1)) )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(B.DATABASE_NAME AS VARCHAR(128)) AS OWNER, CAST(A.OBJECT_NAME AS VARCHAR(128)) AS OBJECT_NAME, CAST(A.SUBOBJECT_NAME AS VARCHAR2(128)) AS SUBOBJECT_NAME, CAST(A.OBJECT_ID AS NUMBER) AS OBJECT_ID, CAST(A.DATA_OBJECT_ID AS NUMBER) AS DATA_OBJECT_ID, CAST(A.OBJECT_TYPE AS VARCHAR2(23)) AS OBJECT_TYPE, CAST(A.GMT_CREATE AS DATE) AS CREATED, CAST(A.GMT_MODIFIED AS DATE) AS LAST_DDL_TIME, CAST(TO_CHAR(A.GMT_CREATE) AS VARCHAR2(19)) AS TIMESTAMP, CAST(A.STATUS AS VARCHAR2(7)) AS STATUS, CAST(A.TEMPORARY AS VARCHAR2(1)) AS TEMPORARY, CAST(A."GENERATED" AS VARCHAR2(1)) AS "GENERATED", CAST(A.SECONDARY AS VARCHAR2(1)) AS SECONDARY, CAST(A.NAMESPACE AS NUMBER) AS NAMESPACE, CAST(A.EDITION_NAME AS VARCHAR2(128)) AS EDITION_NAME, CAST(NULL AS VARCHAR2(18)) AS SHARING, CAST(NULL AS VARCHAR2(1)) AS EDITIONABLE, CAST(NULL AS VARCHAR2(1)) AS ORACLE_MAINTAINED, CAST(NULL AS VARCHAR2(1)) AS APPLICATION, CAST(NULL AS VARCHAR2(1)) AS DEFAULT_COLLATION, CAST(NULL AS VARCHAR2(1)) AS DUPLICATED, CAST(NULL AS VARCHAR2(1)) AS SHARDED, CAST(NULL AS VARCHAR2(1)) AS IMPORTED_OBJECT, CAST(NULL AS NUMBER) AS CREATED_APPID, CAST(NULL AS NUMBER) AS CREATED_VSNID, CAST(NULL AS NUMBER) AS MODIFIED_APPID, CAST(NULL AS NUMBER) AS MODIFIED_VSNID FROM ( SELECT A.TENANT_ID, (TO_DATE('19700101','YYYYMMDD') + B.SCHEMA_VERSION / 86400 / 1000000 + TO_NUMBER(SUBSTR(TZ_OFFSET(SESSIONTIMEZONE),1,3))/24) AS GMT_CREATE, (TO_DATE('19700101','YYYYMMDD') + A.SCHEMA_VERSION / 86400 / 1000000 + TO_NUMBER(SUBSTR(TZ_OFFSET(SESSIONTIMEZONE),1,3))/24) AS GMT_MODIFIED, A.DATABASE_ID, A.TABLE_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, CAST(A.TABLE_ID AS NUMBER) AS OBJECT_ID, CAST(A.TABLE_ID AS NUMBER) AS PRIV_OBJECT_ID, A.TABLE_ID AS DATA_OBJECT_ID, 'TABLE' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE A JOIN SYS.ALL_VIRTUAL_CORE_ALL_TABLE B ON A.TENANT_ID = B.TENANT_ID WHERE B.TABLE_NAME = '__all_core_table' AND A.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,CAST((CASE WHEN DATABASE_ID = 201004 THEN TABLE_NAME WHEN TABLE_TYPE = 5 THEN SUBSTR(TABLE_NAME, 7 + INSTR(SUBSTR(TABLE_NAME, 7), '_')) ELSE TABLE_NAME END) AS VARCHAR2(128)) AS OBJECT_NAME ,NULL SUBOBJECT_NAME ,TABLE_ID OBJECT_ID ,TABLE_ID PRIV_OBJECT_ID ,(CASE WHEN TABLET_ID != 0 THEN TABLET_ID ELSE NULL END) DATA_OBJECT_ID ,CASE WHEN TABLE_TYPE IN (0,3,6,8,9,14) THEN 'TABLE' WHEN TABLE_TYPE IN (2) THEN 'VIRTUAL TABLE' WHEN TABLE_TYPE IN (1,4) THEN 'VIEW' WHEN TABLE_TYPE IN (5) THEN 'INDEX' WHEN TABLE_TYPE IN (7) THEN 'MATERIALIZED VIEW' ELSE NULL END AS OBJECT_TYPE ,CAST(CASE WHEN TABLE_TYPE IN (5) THEN CASE WHEN INDEX_STATUS = 2 THEN 'VALID' WHEN INDEX_STATUS = 3 THEN 'CHECKING' WHEN INDEX_STATUS = 4 THEN 'INELEGIBLE' WHEN INDEX_STATUS = 5 THEN 'ERROR' ELSE 'UNUSABLE' END ELSE CASE WHEN OBJECT_STATUS = 1 THEN 'VALID' ELSE 'INVALID' END END AS VARCHAR2(10)) AS STATUS ,CASE WHEN TABLE_TYPE IN (6,8,9) THEN 'Y' ELSE 'N' END AS TEMPORARY ,CASE WHEN TABLE_TYPE IN (0,1) THEN 'Y' ELSE 'N' END AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() AND TABLE_TYPE != 12 AND TABLE_TYPE != 13 UNION ALL SELECT CST.TENANT_ID ,CST.GMT_CREATE ,CST.GMT_MODIFIED ,DB.DATABASE_ID ,CST.CONSTRAINT_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,TBL.TABLE_ID AS OBJECT_ID ,TBL.TABLE_ID AS PRIV_OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'INDEX' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_CONSTRAINT_REAL_AGENT CST, SYS.ALL_VIRTUAL_TABLE_REAL_AGENT TBL, SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB WHERE CST.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.DATABASE_ID = TBL.DATABASE_ID AND TBL.TABLE_ID = CST.TABLE_ID and CST.CONSTRAINT_TYPE = 1 AND TBL.TABLE_TYPE != 12 AND TBL.TABLE_TYPE != 13 UNION ALL SELECT P.TENANT_ID ,P.GMT_CREATE ,P.GMT_MODIFIED ,T.DATABASE_ID ,CAST((CASE WHEN T.DATABASE_ID = 201004 THEN T.TABLE_NAME WHEN T.TABLE_TYPE = 5 THEN SUBSTR(T.TABLE_NAME, 7 + INSTR(SUBSTR(T.TABLE_NAME, 7), '_')) ELSE T.TABLE_NAME END) AS VARCHAR2(128)) AS OBJECT_NAME ,P.PART_NAME SUBOBJECT_NAME ,P.PART_ID OBJECT_ID ,P.TABLE_ID PRIV_OBJECT_ID ,CASE WHEN P.TABLET_ID != 0 THEN P.TABLET_ID ELSE NULL END AS DATA_OBJECT_ID ,DECODE (T.TABLE_TYPE, 5, 'INDEX PARTITION', 'TABLE PARTITION') AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY , NULL AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TABLE_ID = P.TABLE_ID WHERE T.TENANT_ID = EFFECTIVE_TENANT_ID() AND P.TENANT_ID = EFFECTIVE_TENANT_ID() AND T.TABLE_TYPE != 12 AND T.TABLE_TYPE != 13 UNION ALL SELECT SUBP.TENANT_ID ,SUBP.GMT_CREATE ,SUBP.GMT_MODIFIED ,T.DATABASE_ID ,CAST((CASE WHEN T.DATABASE_ID = 201004 THEN T.TABLE_NAME WHEN T.TABLE_TYPE = 5 THEN SUBSTR(T.TABLE_NAME, 7 + INSTR(SUBSTR(T.TABLE_NAME, 7), '_')) ELSE T.TABLE_NAME END) AS VARCHAR2(128)) AS OBJECT_NAME ,SUBP.SUB_PART_NAME SUBOBJECT_NAME ,SUBP.SUB_PART_ID OBJECT_ID ,SUBP.TABLE_ID PRIV_OBJECT_ID ,SUBP.TABLET_ID AS DATA_OBJECT_ID ,DECODE (T.TABLE_TYPE, 5, 'INDEX SUBPARTITION', 'TABLE SUBPARTITION') AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'Y' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T, SYS.ALL_VIRTUAL_PART_REAL_AGENT P,SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SUBP WHERE T.TABLE_ID =P.TABLE_ID AND P.TABLE_ID=SUBP.TABLE_ID AND P.PART_ID =SUBP.PART_ID AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND P.TENANT_ID = EFFECTIVE_TENANT_ID() AND SUBP.TENANT_ID = EFFECTIVE_TENANT_ID() AND T.TABLE_TYPE != 12 AND T.TABLE_TYPE != 13 UNION ALL SELECT EFFECTIVE_TENANT_ID() AS TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS NUMBER) AS DATABASE_ID ,PACKAGE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,PACKAGE_ID OBJECT_ID ,PACKAGE_ID PRIV_OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN TYPE = 1 THEN 'PACKAGE' WHEN TYPE = 2 THEN 'PACKAGE BODY' ELSE NULL END AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_PACKAGE_SYS_AGENT UNION ALL SELECT P.TENANT_ID ,P.GMT_CREATE ,P.GMT_MODIFIED ,P.DATABASE_ID ,P.PACKAGE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,P.PACKAGE_ID OBJECT_ID ,P.PACKAGE_ID PRIV_OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN TYPE = 1 THEN 'PACKAGE' WHEN TYPE = 2 THEN 'PACKAGE BODY' ELSE NULL END AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE P.TENANT_ID = E.TENANT_ID AND P.PACKAGE_ID = E.OBJ_ID AND (E.OBJ_TYPE = 3 OR E.OBJ_TYPE = 5)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_PACKAGE_REAL_AGENT P WHERE P.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT R.TENANT_ID ,R.GMT_CREATE ,R.GMT_MODIFIED ,R.DATABASE_ID ,R.ROUTINE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,R.ROUTINE_ID OBJECT_ID ,R.ROUTINE_ID PRIV_OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN ROUTINE_TYPE = 1 THEN 'PROCEDURE' WHEN ROUTINE_TYPE = 2 THEN 'FUNCTION' ELSE NULL END AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE R.TENANT_ID = E.TENANT_ID AND R.ROUTINE_ID = E.OBJ_ID AND (E.OBJ_TYPE = 9 OR E.OBJ_TYPE = 12)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_ROUTINE_REAL_AGENT R WHERE (ROUTINE_TYPE = 1 OR ROUTINE_TYPE = 2) AND R.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT EFFECTIVE_TENANT_ID() AS TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS NUMBER) AS DATABASE_ID ,TS.TYPE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,TS.TYPE_ID AS OBJECT_ID ,TS.TYPE_ID AS PRIV_OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE' AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE TS.TENANT_ID = E.TENANT_ID AND TS.TYPE_ID = E.OBJ_ID AND E.OBJ_TYPE = 4) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TYPE_SYS_AGENT TS UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,TYPE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,TYPE_ID OBJECT_ID ,TYPE_ID PRIV_OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE' AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE TY.TENANT_ID = E.TENANT_ID AND TY.TYPE_ID = E.OBJ_ID AND E.OBJ_TYPE = 4) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TYPE_REAL_AGENT TY WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT EFFECTIVE_TENANT_ID() AS TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS NUMBER) AS DATABASE_ID ,OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,OBJECT_TYPE_ID OBJECT_ID ,OBJECT_TYPE_ID PRIV_OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE BODY' AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE EFFECTIVE_TENANT_ID() = E.TENANT_ID AND TS.OBJECT_TYPE_ID = E.OBJ_ID AND E.OBJ_TYPE = 6) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TENANT_OBJECT_TYPE_SYS_AGENT TS WHERE TYPE = 2 UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,OBJECT_TYPE_ID OBJECT_ID ,OBJECT_TYPE_ID PRIV_OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE BODY' AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE TY.TENANT_ID = E.TENANT_ID AND TY.OBJECT_TYPE_ID = E.OBJ_ID AND E.OBJ_TYPE = 6) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TENANT_OBJECT_TYPE_REAL_AGENT TY WHERE TENANT_ID = EFFECTIVE_TENANT_ID() and TYPE = 2 UNION ALL SELECT T.TENANT_ID ,T.GMT_CREATE ,T.GMT_MODIFIED ,T.DATABASE_ID ,T.TRIGGER_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,T.TRIGGER_ID OBJECT_ID ,T.TRIGGER_ID PRIV_OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TRIGGER' OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE T.TENANT_ID = E.TENANT_ID AND T.TRIGGER_ID = E.OBJ_ID AND (E.OBJ_TYPE = 7)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TENANT_TRIGGER_REAL_AGENT T WHERE T.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,SEQUENCE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,SEQUENCE_ID OBJECT_ID ,SEQUENCE_ID PRIV_OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'SEQUENCE' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_SEQUENCE_OBJECT_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,SYNONYM_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,SYNONYM_ID OBJECT_ID ,SYNONYM_ID PRIV_OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'SYNONYM' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_SYNONYM_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() /*UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS NUMBER) AS DATABASE_ID ,NAMESPACE AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,CONTEXT_ID OBJECT_ID ,CONTEXT_ID PRIV_OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'CONTEXT' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,21 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_CONTEXT_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID()*/ UNION ALL SELECT TENANT_ID, GMT_CREATE, GMT_MODIFIED, DATABASE_ID, DATABASE_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, DATABASE_ID AS OBJECT_ID, CAST(-1 AS NUMBER) AS PRIV_OBJECT_ID, NULL AS DATA_OBJECT_ID, 'DATABASE' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() /*UNION ALL SELECT TENANT_ID, GMT_CREATE, GMT_MODIFIED, CAST(201001 AS NUMBER) AS DATABASE_ID, TABLEGROUP_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, TABLEGROUP_ID AS OBJECT_ID, CAST(-1 AS NUMBER) AS PRIV_OBJECT_ID, NULL AS DATA_OBJECT_ID, 'TABLEGROUP' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLEGROUP_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT P.TENANT_ID, P.GMT_CREATE, P.GMT_MODIFIED, CAST(201001 AS NUMBER) AS DATABASE_ID, TG.TABLEGROUP_NAME AS OBJECT_NAME, P.PART_NAME SUBOBJECT_NAME, P.PART_ID OBJECT_ID, CAST(-1 AS NUMBER) AS PRIV_OBJECT_ID, NULL AS DATA_OBJECT_ID, 'TABLEGROUP PARTITION' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, NULL AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLEGROUP_REAL_AGENT TG JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON TG.TABLEGROUP_ID = P.TABLE_ID WHERE TG.TENANT_ID = EFFECTIVE_TENANT_ID() AND P.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT SUBP.TENANT_ID, SUBP.GMT_CREATE, SUBP.GMT_MODIFIED, CAST(201001 AS NUMBER) AS DATABASE_ID, TG.TABLEGROUP_NAME AS OBJECT_NAME, SUBP.SUB_PART_NAME SUBOBJECT_NAME, SUBP.SUB_PART_ID OBJECT_ID, CAST(-1 AS NUMBER) AS PRIV_OBJECT_ID, NULL DATA_OBJECT_ID, 'TABLEGROUP SUBPARTITION' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'Y' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLEGROUP_REAL_AGENT TG, SYS.ALL_VIRTUAL_PART_REAL_AGENT P,SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SUBP WHERE TG.TABLEGROUP_ID = P.TABLE_ID AND P.TABLE_ID = SUBP.TABLE_ID AND P.PART_ID = SUBP.PART_ID AND TG.TENANT_ID = EFFECTIVE_TENANT_ID() AND P.TENANT_ID = EFFECTIVE_TENANT_ID() AND SUBP.TENANT_ID = EFFECTIVE_TENANT_ID()*/ ) A JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT B ON A.TENANT_ID = B.TENANT_ID AND A.DATABASE_ID = B.DATABASE_ID AND B.TENANT_ID = EFFECTIVE_TENANT_ID() AND (A.DATABASE_ID = USERENV('SCHEMAID') OR (A.PRIV_OBJECT_ID != -1 AND USER_CAN_ACCESS_OBJ(DECODE(OBJECT_TYPE, 'TABLE', 1, 'VIEW', 1, 'INDEX', 1, 'MATERIALIZED VIEW', 1, 'TABLE PARTITION', 1, 'TABLE SUBPARTITION', 1, 'INDEX PARTITION', 1, 'INDEX SUBPARTITION', 1, 'SEQUENCE', 2, 'PACKAGE', 3, 'PACKAGE BODY', 3, 'TYPE', 4, 'TYPE BODY', 4, 'TRIGGER', 7, 'FUNCTION', 9, 'PROCEDURE', 12, 'SYNONYM', 13, 1), A.PRIV_OBJECT_ID, A.DATABASE_ID) = 1)) )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -210,7 +210,7 @@ int ObInnerTableSchema::user_objects_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 CAST(A.OBJECT_NAME AS VARCHAR(128)) AS OBJECT_NAME, CAST(A.SUBOBJECT_NAME AS VARCHAR2(128)) AS SUBOBJECT_NAME, CAST(A.OBJECT_ID AS NUMBER) AS OBJECT_ID, CAST(A.DATA_OBJECT_ID AS NUMBER) AS DATA_OBJECT_ID, CAST(A.OBJECT_TYPE AS VARCHAR2(23)) AS OBJECT_TYPE, CAST(A.GMT_CREATE AS DATE) AS CREATED, CAST(A.GMT_MODIFIED AS DATE) AS LAST_DDL_TIME, CAST(TO_CHAR(A.GMT_CREATE) AS VARCHAR2(19)) AS TIMESTAMP, CAST(A.STATUS AS VARCHAR2(7)) AS STATUS, CAST(A.TEMPORARY AS VARCHAR2(1)) AS TEMPORARY, CAST(A."GENERATED" AS VARCHAR2(1)) AS "GENERATED", CAST(A.SECONDARY AS VARCHAR2(1)) AS SECONDARY, CAST(A.NAMESPACE AS NUMBER) AS NAMESPACE, CAST(A.EDITION_NAME AS VARCHAR2(128)) AS EDITION_NAME, CAST(NULL AS VARCHAR2(18)) AS SHARING, CAST(NULL AS VARCHAR2(1)) AS EDITIONABLE, CAST(NULL AS VARCHAR2(1)) AS ORACLE_MAINTAINED, CAST(NULL AS VARCHAR2(1)) AS APPLICATION, CAST(NULL AS VARCHAR2(1)) AS DEFAULT_COLLATION, CAST(NULL AS VARCHAR2(1)) AS DUPLICATED, CAST(NULL AS VARCHAR2(1)) AS SHARDED, CAST(NULL AS VARCHAR2(1)) AS IMPORTED_OBJECT, CAST(NULL AS NUMBER) AS CREATED_APPID, CAST(NULL AS NUMBER) AS CREATED_VSNID, CAST(NULL AS NUMBER) AS MODIFIED_APPID, CAST(NULL AS NUMBER) AS MODIFIED_VSNID FROM ( SELECT A.TENANT_ID, (TO_DATE('19700101','YYYYMMDD') + B.SCHEMA_VERSION / 86400 / 1000000 + TO_NUMBER(SUBSTR(TZ_OFFSET(SESSIONTIMEZONE),1,3))/24) AS GMT_CREATE, (TO_DATE('19700101','YYYYMMDD') + A.SCHEMA_VERSION / 86400 / 1000000 + TO_NUMBER(SUBSTR(TZ_OFFSET(SESSIONTIMEZONE),1,3))/24) AS GMT_MODIFIED, A.DATABASE_ID, A.TABLE_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, CAST(A.TABLE_ID AS NUMBER) AS OBJECT_ID, A.TABLE_ID AS DATA_OBJECT_ID, 'TABLE' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE A JOIN SYS.ALL_VIRTUAL_CORE_ALL_TABLE B ON A.TENANT_ID = B.TENANT_ID WHERE B.TABLE_NAME = '__all_core_table' AND A.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,CAST((CASE WHEN DATABASE_ID = 201004 THEN TABLE_NAME WHEN TABLE_TYPE = 5 THEN SUBSTR(TABLE_NAME, 7 + INSTR(SUBSTR(TABLE_NAME, 7), '_')) ELSE TABLE_NAME END) AS VARCHAR2(128)) AS OBJECT_NAME ,NULL SUBOBJECT_NAME ,TABLE_ID OBJECT_ID ,(CASE WHEN TABLET_ID != 0 THEN TABLET_ID ELSE NULL END) DATA_OBJECT_ID ,CASE WHEN TABLE_TYPE IN (0,3,6,8,9) THEN 'TABLE' WHEN TABLE_TYPE IN (2) THEN 'VIRTUAL TABLE' WHEN TABLE_TYPE IN (1,4) THEN 'VIEW' WHEN TABLE_TYPE IN (5) THEN 'INDEX' WHEN TABLE_TYPE IN (7) THEN 'MATERIALIZED VIEW' ELSE NULL END AS OBJECT_TYPE ,CAST(CASE WHEN TABLE_TYPE IN (5) THEN CASE WHEN INDEX_STATUS = 2 THEN 'VALID' WHEN INDEX_STATUS = 3 THEN 'CHECKING' WHEN INDEX_STATUS = 4 THEN 'INELEGIBLE' WHEN INDEX_STATUS = 5 THEN 'ERROR' ELSE 'UNUSABLE' END ELSE CASE WHEN OBJECT_STATUS = 1 THEN 'VALID' ELSE 'INVALID' END END AS VARCHAR2(10)) AS STATUS ,CASE WHEN TABLE_TYPE IN (6,8,9) THEN 'Y' ELSE 'N' END AS TEMPORARY ,CASE WHEN TABLE_TYPE IN (0,1) THEN 'Y' ELSE 'N' END AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() AND TABLE_TYPE != 12 AND TABLE_TYPE != 13 UNION ALL SELECT CST.TENANT_ID ,CST.GMT_CREATE ,CST.GMT_MODIFIED ,DB.DATABASE_ID ,CST.CONSTRAINT_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,TBL.TABLE_ID AS OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'INDEX' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_CONSTRAINT_REAL_AGENT CST, SYS.ALL_VIRTUAL_TABLE_REAL_AGENT TBL, SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB WHERE CST.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.DATABASE_ID = TBL.DATABASE_ID AND TBL.TABLE_ID = CST.TABLE_ID and CST.CONSTRAINT_TYPE = 1 AND TBL.TABLE_TYPE != 12 AND TBL.TABLE_TYPE != 13 UNION ALL SELECT P.TENANT_ID ,P.GMT_CREATE ,P.GMT_MODIFIED ,T.DATABASE_ID ,CAST((CASE WHEN T.DATABASE_ID = 201004 THEN T.TABLE_NAME WHEN T.TABLE_TYPE = 5 THEN SUBSTR(T.TABLE_NAME, 7 + INSTR(SUBSTR(T.TABLE_NAME, 7), '_')) ELSE T.TABLE_NAME END) AS VARCHAR2(128)) AS OBJECT_NAME ,P.PART_NAME SUBOBJECT_NAME ,P.PART_ID OBJECT_ID ,CASE WHEN P.TABLET_ID != 0 THEN P.TABLET_ID ELSE NULL END AS DATA_OBJECT_ID ,DECODE (T.TABLE_TYPE, 5, 'INDEX PARTITION', 'TABLE PARTITION') AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY , NULL AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TABLE_ID = P.TABLE_ID WHERE T.TENANT_ID = EFFECTIVE_TENANT_ID() AND P.TENANT_ID = EFFECTIVE_TENANT_ID() AND T.TABLE_TYPE != 12 AND T.TABLE_TYPE != 13 UNION ALL SELECT SUBP.TENANT_ID ,SUBP.GMT_CREATE ,SUBP.GMT_MODIFIED ,T.DATABASE_ID ,CAST((CASE WHEN T.DATABASE_ID = 201004 THEN T.TABLE_NAME WHEN T.TABLE_TYPE = 5 THEN SUBSTR(T.TABLE_NAME, 7 + INSTR(SUBSTR(T.TABLE_NAME, 7), '_')) ELSE T.TABLE_NAME END) AS VARCHAR2(128)) AS OBJECT_NAME ,SUBP.SUB_PART_NAME SUBOBJECT_NAME ,SUBP.SUB_PART_ID OBJECT_ID ,SUBP.TABLET_ID AS DATA_OBJECT_ID ,DECODE (T.TABLE_TYPE, 5, 'INDEX SUBPARTITION', 'TABLE SUBPARTITION') AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'Y' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T, SYS.ALL_VIRTUAL_PART_REAL_AGENT P,SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SUBP WHERE T.TABLE_ID =P.TABLE_ID AND P.TABLE_ID=SUBP.TABLE_ID AND P.PART_ID =SUBP.PART_ID AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND P.TENANT_ID = EFFECTIVE_TENANT_ID() AND SUBP.TENANT_ID = EFFECTIVE_TENANT_ID() AND T.TABLE_TYPE != 12 AND T.TABLE_TYPE != 13 UNION ALL SELECT EFFECTIVE_TENANT_ID() AS TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS NUMBER) AS DATABASE_ID ,PACKAGE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,PACKAGE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN TYPE = 1 THEN 'PACKAGE' WHEN TYPE = 2 THEN 'PACKAGE BODY' ELSE NULL END AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_PACKAGE_SYS_AGENT UNION ALL SELECT P.TENANT_ID ,P.GMT_CREATE ,P.GMT_MODIFIED ,P.DATABASE_ID ,P.PACKAGE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,P.PACKAGE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN TYPE = 1 THEN 'PACKAGE' WHEN TYPE = 2 THEN 'PACKAGE BODY' ELSE NULL END AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE P.TENANT_ID = E.TENANT_ID AND P.PACKAGE_ID = E.OBJ_ID AND (E.OBJ_TYPE = 3 OR E.OBJ_TYPE = 5)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_PACKAGE_REAL_AGENT P WHERE P.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT R.TENANT_ID ,R.GMT_CREATE ,R.GMT_MODIFIED ,R.DATABASE_ID ,R.ROUTINE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,R.ROUTINE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN ROUTINE_TYPE = 1 THEN 'PROCEDURE' WHEN ROUTINE_TYPE = 2 THEN 'FUNCTION' ELSE NULL END AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE R.TENANT_ID = E.TENANT_ID AND R.ROUTINE_ID = E.OBJ_ID AND (E.OBJ_TYPE = 9 OR E.OBJ_TYPE = 12)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_ROUTINE_REAL_AGENT R WHERE (ROUTINE_TYPE = 1 OR ROUTINE_TYPE = 2) AND R.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT EFFECTIVE_TENANT_ID() AS TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS NUMBER) AS DATABASE_ID ,TS.TYPE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,TS.TYPE_ID AS OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE' AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE TS.TENANT_ID = E.TENANT_ID AND TS.TYPE_ID = E.OBJ_ID AND E.OBJ_TYPE = 4) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TYPE_SYS_AGENT TS UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,TYPE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,TYPE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE' AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE TY.TENANT_ID = E.TENANT_ID AND TY.TYPE_ID = E.OBJ_ID AND E.OBJ_TYPE = 4) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TYPE_REAL_AGENT TY WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT EFFECTIVE_TENANT_ID() AS TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS NUMBER) AS DATABASE_ID ,OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,OBJECT_TYPE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE BODY' AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE EFFECTIVE_TENANT_ID() = E.TENANT_ID AND TS.OBJECT_TYPE_ID = E.OBJ_ID AND E.OBJ_TYPE = 6) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TENANT_OBJECT_TYPE_SYS_AGENT TS WHERE TYPE = 2 UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,OBJECT_TYPE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE BODY' AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE TY.TENANT_ID = E.TENANT_ID AND TY.OBJECT_TYPE_ID = E.OBJ_ID AND E.OBJ_TYPE = 6) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TENANT_OBJECT_TYPE_REAL_AGENT TY WHERE TENANT_ID = EFFECTIVE_TENANT_ID() and TYPE = 2 UNION ALL SELECT T.TENANT_ID ,T.GMT_CREATE ,T.GMT_MODIFIED ,T.DATABASE_ID ,T.TRIGGER_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,T.TRIGGER_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TRIGGER' OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE T.TENANT_ID = E.TENANT_ID AND T.TRIGGER_ID = E.OBJ_ID AND (E.OBJ_TYPE = 7)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TENANT_TRIGGER_REAL_AGENT T WHERE T.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,SEQUENCE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,SEQUENCE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'SEQUENCE' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_SEQUENCE_OBJECT_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,SYNONYM_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,SYNONYM_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'SYNONYM' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_SYNONYM_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() /*UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS NUMBER) AS DATABASE_ID ,NAMESPACE AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,CONTEXT_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'CONTEXT' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,21 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_CONTEXT_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID()*/ UNION ALL SELECT TENANT_ID, GMT_CREATE, GMT_MODIFIED, DATABASE_ID, DATABASE_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, DATABASE_ID AS OBJECT_ID, NULL AS DATA_OBJECT_ID, 'DATABASE' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() /*UNION ALL SELECT TENANT_ID, GMT_CREATE, GMT_MODIFIED, CAST(201001 AS NUMBER) AS DATABASE_ID, TABLEGROUP_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, TABLEGROUP_ID AS OBJECT_ID, NULL AS DATA_OBJECT_ID, 'TABLEGROUP' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLEGROUP_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT P.TENANT_ID, P.GMT_CREATE, P.GMT_MODIFIED, CAST(201001 AS NUMBER) AS DATABASE_ID, TG.TABLEGROUP_NAME AS OBJECT_NAME, P.PART_NAME SUBOBJECT_NAME, P.PART_ID OBJECT_ID, NULL AS DATA_OBJECT_ID, 'TABLEGROUP PARTITION' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, NULL AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLEGROUP_REAL_AGENT TG JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON TG.TABLEGROUP_ID = P.TABLE_ID WHERE TG.TENANT_ID = EFFECTIVE_TENANT_ID() AND P.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT SUBP.TENANT_ID, SUBP.GMT_CREATE, SUBP.GMT_MODIFIED, CAST(201001 AS NUMBER) AS DATABASE_ID, TG.TABLEGROUP_NAME AS OBJECT_NAME, SUBP.SUB_PART_NAME SUBOBJECT_NAME, SUBP.SUB_PART_ID OBJECT_ID, NULL DATA_OBJECT_ID, 'TABLEGROUP SUBPARTITION' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'Y' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLEGROUP_REAL_AGENT TG, SYS.ALL_VIRTUAL_PART_REAL_AGENT P,SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SUBP WHERE TG.TABLEGROUP_ID = P.TABLE_ID AND P.TABLE_ID = SUBP.TABLE_ID AND P.PART_ID = SUBP.PART_ID AND TG.TENANT_ID = EFFECTIVE_TENANT_ID() AND P.TENANT_ID = EFFECTIVE_TENANT_ID() AND SUBP.TENANT_ID = EFFECTIVE_TENANT_ID()*/ ) A JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT B ON A.TENANT_ID = B.TENANT_ID AND A.DATABASE_ID = B.DATABASE_ID AND B.TENANT_ID = EFFECTIVE_TENANT_ID() AND A.DATABASE_ID = USERENV('SCHEMAID') )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(A.OBJECT_NAME AS VARCHAR(128)) AS OBJECT_NAME, CAST(A.SUBOBJECT_NAME AS VARCHAR2(128)) AS SUBOBJECT_NAME, CAST(A.OBJECT_ID AS NUMBER) AS OBJECT_ID, CAST(A.DATA_OBJECT_ID AS NUMBER) AS DATA_OBJECT_ID, CAST(A.OBJECT_TYPE AS VARCHAR2(23)) AS OBJECT_TYPE, CAST(A.GMT_CREATE AS DATE) AS CREATED, CAST(A.GMT_MODIFIED AS DATE) AS LAST_DDL_TIME, CAST(TO_CHAR(A.GMT_CREATE) AS VARCHAR2(19)) AS TIMESTAMP, CAST(A.STATUS AS VARCHAR2(7)) AS STATUS, CAST(A.TEMPORARY AS VARCHAR2(1)) AS TEMPORARY, CAST(A."GENERATED" AS VARCHAR2(1)) AS "GENERATED", CAST(A.SECONDARY AS VARCHAR2(1)) AS SECONDARY, CAST(A.NAMESPACE AS NUMBER) AS NAMESPACE, CAST(A.EDITION_NAME AS VARCHAR2(128)) AS EDITION_NAME, CAST(NULL AS VARCHAR2(18)) AS SHARING, CAST(NULL AS VARCHAR2(1)) AS EDITIONABLE, CAST(NULL AS VARCHAR2(1)) AS ORACLE_MAINTAINED, CAST(NULL AS VARCHAR2(1)) AS APPLICATION, CAST(NULL AS VARCHAR2(1)) AS DEFAULT_COLLATION, CAST(NULL AS VARCHAR2(1)) AS DUPLICATED, CAST(NULL AS VARCHAR2(1)) AS SHARDED, CAST(NULL AS VARCHAR2(1)) AS IMPORTED_OBJECT, CAST(NULL AS NUMBER) AS CREATED_APPID, CAST(NULL AS NUMBER) AS CREATED_VSNID, CAST(NULL AS NUMBER) AS MODIFIED_APPID, CAST(NULL AS NUMBER) AS MODIFIED_VSNID FROM ( SELECT A.TENANT_ID, (TO_DATE('19700101','YYYYMMDD') + B.SCHEMA_VERSION / 86400 / 1000000 + TO_NUMBER(SUBSTR(TZ_OFFSET(SESSIONTIMEZONE),1,3))/24) AS GMT_CREATE, (TO_DATE('19700101','YYYYMMDD') + A.SCHEMA_VERSION / 86400 / 1000000 + TO_NUMBER(SUBSTR(TZ_OFFSET(SESSIONTIMEZONE),1,3))/24) AS GMT_MODIFIED, A.DATABASE_ID, A.TABLE_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, CAST(A.TABLE_ID AS NUMBER) AS OBJECT_ID, A.TABLE_ID AS DATA_OBJECT_ID, 'TABLE' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE A JOIN SYS.ALL_VIRTUAL_CORE_ALL_TABLE B ON A.TENANT_ID = B.TENANT_ID WHERE B.TABLE_NAME = '__all_core_table' AND A.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,CAST((CASE WHEN DATABASE_ID = 201004 THEN TABLE_NAME WHEN TABLE_TYPE = 5 THEN SUBSTR(TABLE_NAME, 7 + INSTR(SUBSTR(TABLE_NAME, 7), '_')) ELSE TABLE_NAME END) AS VARCHAR2(128)) AS OBJECT_NAME ,NULL SUBOBJECT_NAME ,TABLE_ID OBJECT_ID ,(CASE WHEN TABLET_ID != 0 THEN TABLET_ID ELSE NULL END) DATA_OBJECT_ID ,CASE WHEN TABLE_TYPE IN (0,3,6,8,9,14) THEN 'TABLE' WHEN TABLE_TYPE IN (2) THEN 'VIRTUAL TABLE' WHEN TABLE_TYPE IN (1,4) THEN 'VIEW' WHEN TABLE_TYPE IN (5) THEN 'INDEX' WHEN TABLE_TYPE IN (7) THEN 'MATERIALIZED VIEW' ELSE NULL END AS OBJECT_TYPE ,CAST(CASE WHEN TABLE_TYPE IN (5) THEN CASE WHEN INDEX_STATUS = 2 THEN 'VALID' WHEN INDEX_STATUS = 3 THEN 'CHECKING' WHEN INDEX_STATUS = 4 THEN 'INELEGIBLE' WHEN INDEX_STATUS = 5 THEN 'ERROR' ELSE 'UNUSABLE' END ELSE CASE WHEN OBJECT_STATUS = 1 THEN 'VALID' ELSE 'INVALID' END END AS VARCHAR2(10)) AS STATUS ,CASE WHEN TABLE_TYPE IN (6,8,9) THEN 'Y' ELSE 'N' END AS TEMPORARY ,CASE WHEN TABLE_TYPE IN (0,1) THEN 'Y' ELSE 'N' END AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() AND TABLE_TYPE != 12 AND TABLE_TYPE != 13 UNION ALL SELECT CST.TENANT_ID ,CST.GMT_CREATE ,CST.GMT_MODIFIED ,DB.DATABASE_ID ,CST.CONSTRAINT_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,TBL.TABLE_ID AS OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'INDEX' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_CONSTRAINT_REAL_AGENT CST, SYS.ALL_VIRTUAL_TABLE_REAL_AGENT TBL, SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB WHERE CST.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.DATABASE_ID = TBL.DATABASE_ID AND TBL.TABLE_ID = CST.TABLE_ID and CST.CONSTRAINT_TYPE = 1 AND TBL.TABLE_TYPE != 12 AND TBL.TABLE_TYPE != 13 UNION ALL SELECT P.TENANT_ID ,P.GMT_CREATE ,P.GMT_MODIFIED ,T.DATABASE_ID ,CAST((CASE WHEN T.DATABASE_ID = 201004 THEN T.TABLE_NAME WHEN T.TABLE_TYPE = 5 THEN SUBSTR(T.TABLE_NAME, 7 + INSTR(SUBSTR(T.TABLE_NAME, 7), '_')) ELSE T.TABLE_NAME END) AS VARCHAR2(128)) AS OBJECT_NAME ,P.PART_NAME SUBOBJECT_NAME ,P.PART_ID OBJECT_ID ,CASE WHEN P.TABLET_ID != 0 THEN P.TABLET_ID ELSE NULL END AS DATA_OBJECT_ID ,DECODE (T.TABLE_TYPE, 5, 'INDEX PARTITION', 'TABLE PARTITION') AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY , NULL AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TABLE_ID = P.TABLE_ID WHERE T.TENANT_ID = EFFECTIVE_TENANT_ID() AND P.TENANT_ID = EFFECTIVE_TENANT_ID() AND T.TABLE_TYPE != 12 AND T.TABLE_TYPE != 13 UNION ALL SELECT SUBP.TENANT_ID ,SUBP.GMT_CREATE ,SUBP.GMT_MODIFIED ,T.DATABASE_ID ,CAST((CASE WHEN T.DATABASE_ID = 201004 THEN T.TABLE_NAME WHEN T.TABLE_TYPE = 5 THEN SUBSTR(T.TABLE_NAME, 7 + INSTR(SUBSTR(T.TABLE_NAME, 7), '_')) ELSE T.TABLE_NAME END) AS VARCHAR2(128)) AS OBJECT_NAME ,SUBP.SUB_PART_NAME SUBOBJECT_NAME ,SUBP.SUB_PART_ID OBJECT_ID ,SUBP.TABLET_ID AS DATA_OBJECT_ID ,DECODE (T.TABLE_TYPE, 5, 'INDEX SUBPARTITION', 'TABLE SUBPARTITION') AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'Y' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T, SYS.ALL_VIRTUAL_PART_REAL_AGENT P,SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SUBP WHERE T.TABLE_ID =P.TABLE_ID AND P.TABLE_ID=SUBP.TABLE_ID AND P.PART_ID =SUBP.PART_ID AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND P.TENANT_ID = EFFECTIVE_TENANT_ID() AND SUBP.TENANT_ID = EFFECTIVE_TENANT_ID() AND T.TABLE_TYPE != 12 AND T.TABLE_TYPE != 13 UNION ALL SELECT EFFECTIVE_TENANT_ID() AS TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS NUMBER) AS DATABASE_ID ,PACKAGE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,PACKAGE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN TYPE = 1 THEN 'PACKAGE' WHEN TYPE = 2 THEN 'PACKAGE BODY' ELSE NULL END AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_PACKAGE_SYS_AGENT UNION ALL SELECT P.TENANT_ID ,P.GMT_CREATE ,P.GMT_MODIFIED ,P.DATABASE_ID ,P.PACKAGE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,P.PACKAGE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN TYPE = 1 THEN 'PACKAGE' WHEN TYPE = 2 THEN 'PACKAGE BODY' ELSE NULL END AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE P.TENANT_ID = E.TENANT_ID AND P.PACKAGE_ID = E.OBJ_ID AND (E.OBJ_TYPE = 3 OR E.OBJ_TYPE = 5)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_PACKAGE_REAL_AGENT P WHERE P.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT R.TENANT_ID ,R.GMT_CREATE ,R.GMT_MODIFIED ,R.DATABASE_ID ,R.ROUTINE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,R.ROUTINE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,CASE WHEN ROUTINE_TYPE = 1 THEN 'PROCEDURE' WHEN ROUTINE_TYPE = 2 THEN 'FUNCTION' ELSE NULL END AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE R.TENANT_ID = E.TENANT_ID AND R.ROUTINE_ID = E.OBJ_ID AND (E.OBJ_TYPE = 9 OR E.OBJ_TYPE = 12)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_ROUTINE_REAL_AGENT R WHERE (ROUTINE_TYPE = 1 OR ROUTINE_TYPE = 2) AND R.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT EFFECTIVE_TENANT_ID() AS TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS NUMBER) AS DATABASE_ID ,TS.TYPE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,TS.TYPE_ID AS OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE' AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE TS.TENANT_ID = E.TENANT_ID AND TS.TYPE_ID = E.OBJ_ID AND E.OBJ_TYPE = 4) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TYPE_SYS_AGENT TS UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,TYPE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,TYPE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE' AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE TY.TENANT_ID = E.TENANT_ID AND TY.TYPE_ID = E.OBJ_ID AND E.OBJ_TYPE = 4) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TYPE_REAL_AGENT TY WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT EFFECTIVE_TENANT_ID() AS TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS NUMBER) AS DATABASE_ID ,OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,OBJECT_TYPE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE BODY' AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE EFFECTIVE_TENANT_ID() = E.TENANT_ID AND TS.OBJECT_TYPE_ID = E.OBJ_ID AND E.OBJ_TYPE = 6) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TENANT_OBJECT_TYPE_SYS_AGENT TS WHERE TYPE = 2 UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,OBJECT_TYPE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TYPE BODY' AS OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE TY.TENANT_ID = E.TENANT_ID AND TY.OBJECT_TYPE_ID = E.OBJ_ID AND E.OBJ_TYPE = 6) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TENANT_OBJECT_TYPE_REAL_AGENT TY WHERE TENANT_ID = EFFECTIVE_TENANT_ID() and TYPE = 2 UNION ALL SELECT T.TENANT_ID ,T.GMT_CREATE ,T.GMT_MODIFIED ,T.DATABASE_ID ,T.TRIGGER_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,T.TRIGGER_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'TRIGGER' OBJECT_TYPE ,CASE WHEN EXISTS (SELECT OBJ_ID FROM SYS.ALL_VIRTUAL_TENANT_ERROR_REAL_AGENT E WHERE T.TENANT_ID = E.TENANT_ID AND T.TRIGGER_ID = E.OBJ_ID AND (E.OBJ_TYPE = 7)) THEN 'INVALID' ELSE 'VALID' END AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TENANT_TRIGGER_REAL_AGENT T WHERE T.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,SEQUENCE_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,SEQUENCE_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'SEQUENCE' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_SEQUENCE_OBJECT_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,DATABASE_ID ,SYNONYM_NAME AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,SYNONYM_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'SYNONYM' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY , 0 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_SYNONYM_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() /*UNION ALL SELECT TENANT_ID ,GMT_CREATE ,GMT_MODIFIED ,CAST(201006 AS NUMBER) AS DATABASE_ID ,NAMESPACE AS OBJECT_NAME ,NULL AS SUBOBJECT_NAME ,CONTEXT_ID OBJECT_ID ,NULL AS DATA_OBJECT_ID ,'CONTEXT' AS OBJECT_TYPE ,'VALID' AS STATUS ,'N' AS TEMPORARY ,'N' AS "GENERATED" ,'N' AS SECONDARY ,21 AS NAMESPACE ,NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_CONTEXT_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID()*/ UNION ALL SELECT TENANT_ID, GMT_CREATE, GMT_MODIFIED, DATABASE_ID, DATABASE_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, DATABASE_ID AS OBJECT_ID, NULL AS DATA_OBJECT_ID, 'DATABASE' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() /*UNION ALL SELECT TENANT_ID, GMT_CREATE, GMT_MODIFIED, CAST(201001 AS NUMBER) AS DATABASE_ID, TABLEGROUP_NAME AS OBJECT_NAME, NULL AS SUBOBJECT_NAME, TABLEGROUP_ID AS OBJECT_ID, NULL AS DATA_OBJECT_ID, 'TABLEGROUP' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'N' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLEGROUP_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT P.TENANT_ID, P.GMT_CREATE, P.GMT_MODIFIED, CAST(201001 AS NUMBER) AS DATABASE_ID, TG.TABLEGROUP_NAME AS OBJECT_NAME, P.PART_NAME SUBOBJECT_NAME, P.PART_ID OBJECT_ID, NULL AS DATA_OBJECT_ID, 'TABLEGROUP PARTITION' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, NULL AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLEGROUP_REAL_AGENT TG JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON TG.TABLEGROUP_ID = P.TABLE_ID WHERE TG.TENANT_ID = EFFECTIVE_TENANT_ID() AND P.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT SUBP.TENANT_ID, SUBP.GMT_CREATE, SUBP.GMT_MODIFIED, CAST(201001 AS NUMBER) AS DATABASE_ID, TG.TABLEGROUP_NAME AS OBJECT_NAME, SUBP.SUB_PART_NAME SUBOBJECT_NAME, SUBP.SUB_PART_ID OBJECT_ID, NULL DATA_OBJECT_ID, 'TABLEGROUP SUBPARTITION' AS OBJECT_TYPE, 'VALID' AS STATUS, 'N' AS TEMPORARY, 'Y' AS "GENERATED", 'N' AS SECONDARY, 0 AS NAMESPACE, NULL AS EDITION_NAME FROM SYS.ALL_VIRTUAL_TABLEGROUP_REAL_AGENT TG, SYS.ALL_VIRTUAL_PART_REAL_AGENT P,SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SUBP WHERE TG.TABLEGROUP_ID = P.TABLE_ID AND P.TABLE_ID = SUBP.TABLE_ID AND P.PART_ID = SUBP.PART_ID AND TG.TENANT_ID = EFFECTIVE_TENANT_ID() AND P.TENANT_ID = EFFECTIVE_TENANT_ID() AND SUBP.TENANT_ID = EFFECTIVE_TENANT_ID()*/ ) A JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT B ON A.TENANT_ID = B.TENANT_ID AND A.DATABASE_ID = B.DATABASE_ID AND B.TENANT_ID = EFFECTIVE_TENANT_ID() AND A.DATABASE_ID = USERENV('SCHEMAID') )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -910,7 +910,7 @@ int ObInnerTableSchema::all_tab_cols_v_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 CAST(DB.DATABASE_NAME AS VARCHAR2(128)) AS OWNER, CAST(T.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(C.COLUMN_NAME AS VARCHAR2(128)) AS COLUMN_NAME, CAST(DECODE(C.DATA_TYPE, 0, 'VARCHAR2', 1, 'NUMBER', 2, 'NUMBER', 3, 'NUMBER', 4, 'NUMBER', 5, 'NUMBER', 6, 'NUMBER', 7, 'NUMBER', 8, 'NUMBER', 9, 'NUMBER', 10, 'NUMBER', 11, 'BINARY_FLOAT', 12, 'BINARY_DOUBLE', 13, 'NUMBER', 14, 'NUMBER', 15, 'NUMBER', 16, 'NUMBER', 17, 'DATE', 18, 'TIMESTAMP', 19, 'DATE', 20, 'TIME', 21, 'YEAR', 22, 'VARCHAR2', 23, 'CHAR', 24, 'HEX_STRING', 25, 'UNDEFINED', 26, 'UNKNOWN', 27, 'TINYTEXT', 28, 'TEXT', 29, 'MEDIUMTEXT', 30, DECODE(C.COLLATION_TYPE, 63, 'BLOB', 'CLOB'), 31, 'BIT', 32, 'ENUM', 33, 'SET', 34, 'ENUM_INNER', 35, 'SET_INNER', 36, CONCAT('TIMESTAMP(', CONCAT(C.DATA_SCALE, ') WITH TIME ZONE')), 37, CONCAT('TIMESTAMP(', CONCAT(C.DATA_SCALE, ') WITH LOCAL TIME ZONE')), 38, CONCAT('TIMESTAMP(', CONCAT(C.DATA_SCALE, ')')), 39, 'RAW', 40, CONCAT('INTERVAL YEAR(', CONCAT(C.DATA_SCALE, ') TO MONTH')), 41, CONCAT('INTERVAL DAY(', CONCAT(TRUNC(C.DATA_SCALE/10), CONCAT(') TO SECOND(', CONCAT(MOD(C.DATA_SCALE, 10), ')')))), 42, 'FLOAT', 43, 'NVARCHAR2', 44, 'NCHAR', 45, 'UROWID', 46, 'LOB', 47, 'JSON', 48, 'GEOMETRY', 49, 'UDT', 'UNDEFINED') AS VARCHAR2(128)) AS DATA_TYPE, CAST(NULL AS VARCHAR2(3)) AS DATA_TYPE_MOD, CAST(NULL AS VARCHAR2(128)) AS DATA_TYPE_OWNER, CAST(CASE WHEN C.DATA_TYPE in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 14, 15, 16, 42) THEN 22 WHEN C.DATA_TYPE = 11 THEN 4 WHEN C.DATA_TYPE = 12 THEN 8 WHEN C.DATA_TYPE in (17, 19) THEN 7 WHEN C.DATA_TYPE in (18, 37, 38) THEN CASE WHEN C.DATA_SCALE = 0 THEN 7 ELSE 11 END WHEN C.DATA_TYPE = 41 THEN 11 WHEN C.DATA_TYPE = 40 THEN 5 WHEN C.DATA_TYPE = 30 THEN 4000 WHEN C.DATA_TYPE = 36 THEN 13 WHEN C.DATA_TYPE IN (0,22,43,46) AND C.DATA_PRECISION = 1 THEN LEAST(32767, C.DATA_LENGTH * DECODE(C.COLLATION_TYPE, 63, 1, 249, 4, 248, 4, 87, 2,28, 2, 55, 2, 54, 4, 101, 2, 46, 4, 45, 4, 224, 4, 1)) WHEN C.DATA_TYPE IN (23,44) AND C.DATA_PRECISION = 1 THEN LEAST(2000, C.DATA_LENGTH * DECODE(C.COLLATION_TYPE, 63, 1, 249, 4, 248, 4, 87, 2,28, 2, 55, 2, 54, 4, 101, 2, 46, 4, 45, 4, 224, 4, 1)) ELSE C.DATA_LENGTH END AS NUMBER) AS DATA_LENGTH, CAST(CASE WHEN C.DATA_TYPE IN (0,11,12,17,18,19,22,23,27,28,29,30,36,37,38,43,44) THEN NULL ELSE CASE WHEN C.DATA_PRECISION < 0 THEN NULL ELSE C.DATA_PRECISION END END AS NUMBER) AS DATA_PRECISION, CAST(CASE WHEN C.DATA_TYPE IN (0,11,12,17,19,22,23,27,28,29,30,42,43,44) THEN NULL ELSE CASE WHEN C.DATA_SCALE < -84 THEN NULL ELSE C.DATA_SCALE END END AS NUMBER) AS DATA_SCALE, CAST(DECODE(C.NULLABLE, 0, 'N', DECODE(BITAND(C.COLUMN_FLAGS, 5 * POWER(2, 13)), 5 * POWER(2, 13), 'N', 'Y')) AS VARCHAR2(1)) AS NULLABLE, CAST(DECODE(BITAND(C.COLUMN_FLAGS, 64), 0, C.COLUMN_ID, NULL) AS NUMBER) AS COLUMN_ID, CAST(LENGTHB(C.CUR_DEFAULT_VALUE_V2) AS NUMBER) AS DEFAULT_LENGTH, CAST(C.CUR_DEFAULT_VALUE_V2 AS /* TODO: LONG() */ VARCHAR(32767)) AS DATA_DEFAULT, CAST(STAT.DISTINCT_CNT AS NUMBER) AS NUM_DISTINCT, CAST(STAT.MIN_VALUE AS /* TODO: RAW */ VARCHAR(128)) AS LOW_VALUE, CAST(STAT.MAX_VALUE AS /* TODO: RAW */ VARCHAR(128)) AS HIGH_VALUE, CAST(STAT.DENSITY AS NUMBER) AS DENSITY, CAST(STAT.NULL_CNT AS NUMBER) AS NUM_NULLS, CAST(STAT.BUCKET_CNT AS NUMBER) AS NUM_BUCKETS, CAST(STAT.LAST_ANALYZED AS DATE) AS LAST_ANALYZED, CAST(STAT.SAMPLE_SIZE AS NUMBER) AS SAMPLE_SIZE, CAST(DECODE(C.DATA_TYPE, 22, 'CHAR_CS', 23, 'CHAR_CS', 30, DECODE(C.COLLATION_TYPE, 63, 'NULL', 'CHAR_CS'), 43, 'NCHAR_CS', 44, 'NCHAR_CS', '') AS VARCHAR2(44)) AS CHARACTER_SET_NAME, CAST(NULL AS NUMBER) AS CHAR_COL_DECL_LENGTH, CAST(DECODE(STAT.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(DECODE(STAT.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, CAST(NULL AS VARCHAR2(80)) AS NOTES, CAST(STAT.AVG_LEN AS NUMBER) AS AVG_COL_LEN, CAST(CASE WHEN C.DATA_TYPE IN (22,23,43,44) THEN C.DATA_LENGTH ELSE 0 END AS NUMBER) AS CHAR_LENGTH, CAST(DECODE(C.DATA_TYPE, 22, DECODE(C.DATA_PRECISION, 1, 'C', 'B'), 23, DECODE(C.DATA_PRECISION, 1, 'C', 'B'), 43, DECODE(C.DATA_PRECISION, 1, 'C', 'B'), 44, DECODE(C.DATA_PRECISION, 1, 'C', 'B'), NULL) AS VARCHAR2(1)) AS CHAR_USED, CAST(NULL AS VARCHAR2(3)) AS V80_FMT_IMAGE, CAST(NULL AS VARCHAR2(3)) AS DATA_UPGRADED, CAST(DECODE(BITAND(C.COLUMN_FLAGS, 64), 0, 'NO', 'YES') AS VARCHAR2(3)) AS HIDDEN_COLUMN, CAST(DECODE(BITAND(C.COLUMN_FLAGS, 1), 1, 'YES', 'NO') AS VARCHAR2(3)) AS VIRTUAL_COLUMN, CAST(NULL AS NUMBER) AS SEGMENT_COLUMN_ID, CAST(NULL AS NUMBER) AS INTERNAL_COLUMN_ID, CAST((CASE WHEN STAT.HISTOGRAM_TYPE = 1 THEN 'FREQUENCY' WHEN STAT.HISTOGRAM_TYPE = 3 THEN 'TOP-FREQUENCY' WHEN STAT.HISTOGRAM_TYPE = 4 THEN 'HYBRID' ELSE NULL END) AS VARCHAR2(15)) AS HISTOGRAM, CAST(C.COLUMN_NAME AS VARCHAR2(4000)) AS QUALIFIED_COL_NAME, CAST('YES' AS VARCHAR2(3)) AS USER_GENERATED, CAST(NULL AS VARCHAR2(3)) AS DEFAULT_ON_NULL, CAST(NULL AS VARCHAR2(3)) AS IDENTITY_COLUMN, CAST(NULL AS VARCHAR2(128)) AS EVALUATION_EDITION, CAST(NULL AS VARCHAR2(128)) AS UNUSABLE_BEFORE, CAST(NULL AS VARCHAR2(128)) AS UNUSABLE_BEGINNING, CAST(NULL AS VARCHAR2(100)) AS COLLATION, CAST(NULL AS NUMBER) AS COLLATED_COLUMN_ID FROM (SELECT TENANT_ID, TABLE_ID, DATABASE_ID, TABLE_NAME, TABLE_TYPE FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, DATABASE_ID, TABLE_NAME, TABLE_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() AND TABLE_TYPE IN (0,1,3,4,5,7,8,9)) T JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB ON DB.TENANT_ID = T.TENANT_ID AND DB.DATABASE_ID = T.DATABASE_ID AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() AND (T.DATABASE_ID = USERENV('SCHEMAID') OR USER_CAN_ACCESS_OBJ(1, T.TABLE_ID, T.DATABASE_ID) = 1) JOIN (SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, DATA_TYPE, COLLATION_TYPE, DATA_SCALE, DATA_LENGTH, DATA_PRECISION, NULLABLE, COLUMN_FLAGS, CUR_DEFAULT_VALUE_V2, IS_HIDDEN FROM SYS.ALL_VIRTUAL_CORE_COLUMN_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, DATA_TYPE, COLLATION_TYPE, DATA_SCALE, DATA_LENGTH, DATA_PRECISION, NULLABLE, COLUMN_FLAGS, CUR_DEFAULT_VALUE_V2, IS_HIDDEN FROM SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID()) C ON C.TENANT_ID = T.TENANT_ID AND C.TABLE_ID = T.TABLE_ID AND C.IS_HIDDEN = 0 LEFT JOIN SYS.ALL_VIRTUAL_COLUMN_STAT_REAL_AGENT STAT ON C.TENANT_ID = STAT.TENANT_ID AND C.TABLE_ID = STAT.TABLE_ID AND C.COLUMN_ID = STAT.COLUMN_ID AND STAT.OBJECT_TYPE = 1 AND STAT.TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(DB.DATABASE_NAME AS VARCHAR2(128)) AS OWNER, CAST(T.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(C.COLUMN_NAME AS VARCHAR2(128)) AS COLUMN_NAME, CAST(DECODE(C.DATA_TYPE, 0, 'VARCHAR2', 1, 'NUMBER', 2, 'NUMBER', 3, 'NUMBER', 4, 'NUMBER', 5, 'NUMBER', 6, 'NUMBER', 7, 'NUMBER', 8, 'NUMBER', 9, 'NUMBER', 10, 'NUMBER', 11, 'BINARY_FLOAT', 12, 'BINARY_DOUBLE', 13, 'NUMBER', 14, 'NUMBER', 15, 'NUMBER', 16, 'NUMBER', 17, 'DATE', 18, 'TIMESTAMP', 19, 'DATE', 20, 'TIME', 21, 'YEAR', 22, 'VARCHAR2', 23, 'CHAR', 24, 'HEX_STRING', 25, 'UNDEFINED', 26, 'UNKNOWN', 27, 'TINYTEXT', 28, 'TEXT', 29, 'MEDIUMTEXT', 30, DECODE(C.COLLATION_TYPE, 63, 'BLOB', 'CLOB'), 31, 'BIT', 32, 'ENUM', 33, 'SET', 34, 'ENUM_INNER', 35, 'SET_INNER', 36, CONCAT('TIMESTAMP(', CONCAT(C.DATA_SCALE, ') WITH TIME ZONE')), 37, CONCAT('TIMESTAMP(', CONCAT(C.DATA_SCALE, ') WITH LOCAL TIME ZONE')), 38, CONCAT('TIMESTAMP(', CONCAT(C.DATA_SCALE, ')')), 39, 'RAW', 40, CONCAT('INTERVAL YEAR(', CONCAT(C.DATA_SCALE, ') TO MONTH')), 41, CONCAT('INTERVAL DAY(', CONCAT(TRUNC(C.DATA_SCALE/10), CONCAT(') TO SECOND(', CONCAT(MOD(C.DATA_SCALE, 10), ')')))), 42, 'FLOAT', 43, 'NVARCHAR2', 44, 'NCHAR', 45, 'UROWID', 46, 'LOB', 47, 'JSON', 48, 'GEOMETRY', 49, 'UDT', 'UNDEFINED') AS VARCHAR2(128)) AS DATA_TYPE, CAST(NULL AS VARCHAR2(3)) AS DATA_TYPE_MOD, CAST(NULL AS VARCHAR2(128)) AS DATA_TYPE_OWNER, CAST(CASE WHEN C.DATA_TYPE in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 14, 15, 16, 42) THEN 22 WHEN C.DATA_TYPE = 11 THEN 4 WHEN C.DATA_TYPE = 12 THEN 8 WHEN C.DATA_TYPE in (17, 19) THEN 7 WHEN C.DATA_TYPE in (18, 37, 38) THEN CASE WHEN C.DATA_SCALE = 0 THEN 7 ELSE 11 END WHEN C.DATA_TYPE = 41 THEN 11 WHEN C.DATA_TYPE = 40 THEN 5 WHEN C.DATA_TYPE = 30 THEN 4000 WHEN C.DATA_TYPE = 36 THEN 13 WHEN C.DATA_TYPE IN (0,22,43,46) AND C.DATA_PRECISION = 1 THEN LEAST(32767, C.DATA_LENGTH * DECODE(C.COLLATION_TYPE, 63, 1, 249, 4, 248, 4, 87, 2,28, 2, 55, 2, 54, 4, 101, 2, 46, 4, 45, 4, 224, 4, 1)) WHEN C.DATA_TYPE IN (23,44) AND C.DATA_PRECISION = 1 THEN LEAST(2000, C.DATA_LENGTH * DECODE(C.COLLATION_TYPE, 63, 1, 249, 4, 248, 4, 87, 2,28, 2, 55, 2, 54, 4, 101, 2, 46, 4, 45, 4, 224, 4, 1)) ELSE C.DATA_LENGTH END AS NUMBER) AS DATA_LENGTH, CAST(CASE WHEN C.DATA_TYPE IN (0,11,12,17,18,19,22,23,27,28,29,30,36,37,38,43,44) THEN NULL ELSE CASE WHEN C.DATA_PRECISION < 0 THEN NULL ELSE C.DATA_PRECISION END END AS NUMBER) AS DATA_PRECISION, CAST(CASE WHEN C.DATA_TYPE IN (0,11,12,17,19,22,23,27,28,29,30,42,43,44) THEN NULL ELSE CASE WHEN C.DATA_SCALE < -84 THEN NULL ELSE C.DATA_SCALE END END AS NUMBER) AS DATA_SCALE, CAST(DECODE(C.NULLABLE, 0, 'N', DECODE(BITAND(C.COLUMN_FLAGS, 5 * POWER(2, 13)), 5 * POWER(2, 13), 'N', 'Y')) AS VARCHAR2(1)) AS NULLABLE, CAST(DECODE(BITAND(C.COLUMN_FLAGS, 64), 0, C.COLUMN_ID, NULL) AS NUMBER) AS COLUMN_ID, CAST(LENGTHB(C.CUR_DEFAULT_VALUE_V2) AS NUMBER) AS DEFAULT_LENGTH, CAST(C.CUR_DEFAULT_VALUE_V2 AS /* TODO: LONG() */ VARCHAR(32767)) AS DATA_DEFAULT, CAST(STAT.DISTINCT_CNT AS NUMBER) AS NUM_DISTINCT, CAST(STAT.MIN_VALUE AS /* TODO: RAW */ VARCHAR(128)) AS LOW_VALUE, CAST(STAT.MAX_VALUE AS /* TODO: RAW */ VARCHAR(128)) AS HIGH_VALUE, CAST(STAT.DENSITY AS NUMBER) AS DENSITY, CAST(STAT.NULL_CNT AS NUMBER) AS NUM_NULLS, CAST(STAT.BUCKET_CNT AS NUMBER) AS NUM_BUCKETS, CAST(STAT.LAST_ANALYZED AS DATE) AS LAST_ANALYZED, CAST(STAT.SAMPLE_SIZE AS NUMBER) AS SAMPLE_SIZE, CAST(DECODE(C.DATA_TYPE, 22, 'CHAR_CS', 23, 'CHAR_CS', 30, DECODE(C.COLLATION_TYPE, 63, 'NULL', 'CHAR_CS'), 43, 'NCHAR_CS', 44, 'NCHAR_CS', '') AS VARCHAR2(44)) AS CHARACTER_SET_NAME, CAST(NULL AS NUMBER) AS CHAR_COL_DECL_LENGTH, CAST(DECODE(STAT.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(DECODE(STAT.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, CAST(NULL AS VARCHAR2(80)) AS NOTES, CAST(STAT.AVG_LEN AS NUMBER) AS AVG_COL_LEN, CAST(CASE WHEN C.DATA_TYPE IN (22,23,43,44) THEN C.DATA_LENGTH ELSE 0 END AS NUMBER) AS CHAR_LENGTH, CAST(DECODE(C.DATA_TYPE, 22, DECODE(C.DATA_PRECISION, 1, 'C', 'B'), 23, DECODE(C.DATA_PRECISION, 1, 'C', 'B'), 43, DECODE(C.DATA_PRECISION, 1, 'C', 'B'), 44, DECODE(C.DATA_PRECISION, 1, 'C', 'B'), NULL) AS VARCHAR2(1)) AS CHAR_USED, CAST(NULL AS VARCHAR2(3)) AS V80_FMT_IMAGE, CAST(NULL AS VARCHAR2(3)) AS DATA_UPGRADED, CAST(DECODE(BITAND(C.COLUMN_FLAGS, 64), 0, 'NO', 'YES') AS VARCHAR2(3)) AS HIDDEN_COLUMN, CAST(DECODE(BITAND(C.COLUMN_FLAGS, 1), 1, 'YES', 'NO') AS VARCHAR2(3)) AS VIRTUAL_COLUMN, CAST(NULL AS NUMBER) AS SEGMENT_COLUMN_ID, CAST(NULL AS NUMBER) AS INTERNAL_COLUMN_ID, CAST((CASE WHEN STAT.HISTOGRAM_TYPE = 1 THEN 'FREQUENCY' WHEN STAT.HISTOGRAM_TYPE = 3 THEN 'TOP-FREQUENCY' WHEN STAT.HISTOGRAM_TYPE = 4 THEN 'HYBRID' ELSE NULL END) AS VARCHAR2(15)) AS HISTOGRAM, CAST(C.COLUMN_NAME AS VARCHAR2(4000)) AS QUALIFIED_COL_NAME, CAST('YES' AS VARCHAR2(3)) AS USER_GENERATED, CAST(NULL AS VARCHAR2(3)) AS DEFAULT_ON_NULL, CAST(NULL AS VARCHAR2(3)) AS IDENTITY_COLUMN, CAST(NULL AS VARCHAR2(128)) AS EVALUATION_EDITION, CAST(NULL AS VARCHAR2(128)) AS UNUSABLE_BEFORE, CAST(NULL AS VARCHAR2(128)) AS UNUSABLE_BEGINNING, CAST(NULL AS VARCHAR2(100)) AS COLLATION, CAST(NULL AS NUMBER) AS COLLATED_COLUMN_ID FROM (SELECT TENANT_ID, TABLE_ID, DATABASE_ID, TABLE_NAME, TABLE_TYPE FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, DATABASE_ID, TABLE_NAME, TABLE_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() AND TABLE_TYPE IN (0,1,3,4,5,7,8,9,14)) T JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB ON DB.TENANT_ID = T.TENANT_ID AND DB.DATABASE_ID = T.DATABASE_ID AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() AND (T.DATABASE_ID = USERENV('SCHEMAID') OR USER_CAN_ACCESS_OBJ(1, T.TABLE_ID, T.DATABASE_ID) = 1) JOIN (SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, DATA_TYPE, COLLATION_TYPE, DATA_SCALE, DATA_LENGTH, DATA_PRECISION, NULLABLE, COLUMN_FLAGS, CUR_DEFAULT_VALUE_V2, IS_HIDDEN FROM SYS.ALL_VIRTUAL_CORE_COLUMN_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, DATA_TYPE, COLLATION_TYPE, DATA_SCALE, DATA_LENGTH, DATA_PRECISION, NULLABLE, COLUMN_FLAGS, CUR_DEFAULT_VALUE_V2, IS_HIDDEN FROM SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID()) C ON C.TENANT_ID = T.TENANT_ID AND C.TABLE_ID = T.TABLE_ID AND C.IS_HIDDEN = 0 LEFT JOIN SYS.ALL_VIRTUAL_COLUMN_STAT_REAL_AGENT STAT ON C.TENANT_ID = STAT.TENANT_ID AND C.TABLE_ID = STAT.TABLE_ID AND C.COLUMN_ID = STAT.COLUMN_ID AND STAT.OBJECT_TYPE = 1 AND STAT.TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -960,7 +960,7 @@ int ObInnerTableSchema::dba_tab_cols_v_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 CAST(DB.DATABASE_NAME AS VARCHAR2(128)) AS OWNER, CAST(T.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(C.COLUMN_NAME AS VARCHAR2(128)) AS COLUMN_NAME, CAST(DECODE(C.DATA_TYPE, 0, 'VARCHAR2', 1, 'NUMBER', 2, 'NUMBER', 3, 'NUMBER', 4, 'NUMBER', 5, 'NUMBER', 6, 'NUMBER', 7, 'NUMBER', 8, 'NUMBER', 9, 'NUMBER', 10, 'NUMBER', 11, 'BINARY_FLOAT', 12, 'BINARY_DOUBLE', 13, 'NUMBER', 14, 'NUMBER', 15, 'NUMBER', 16, 'NUMBER', 17, 'DATE', 18, 'TIMESTAMP', 19, 'DATE', 20, 'TIME', 21, 'YEAR', 22, 'VARCHAR2', 23, 'CHAR', 24, 'HEX_STRING', 25, 'UNDEFINED', 26, 'UNKNOWN', 27, 'TINYTEXT', 28, 'TEXT', 29, 'MEDIUMTEXT', 30, DECODE(C.COLLATION_TYPE, 63, 'BLOB', 'CLOB'), 31, 'BIT', 32, 'ENUM', 33, 'SET', 34, 'ENUM_INNER', 35, 'SET_INNER', 36, CONCAT('TIMESTAMP(', CONCAT(C.DATA_SCALE, ') WITH TIME ZONE')), 37, CONCAT('TIMESTAMP(', CONCAT(C.DATA_SCALE, ') WITH LOCAL TIME ZONE')), 38, CONCAT('TIMESTAMP(', CONCAT(C.DATA_SCALE, ')')), 39, 'RAW', 40, CONCAT('INTERVAL YEAR(', CONCAT(C.DATA_SCALE, ') TO MONTH')), 41, CONCAT('INTERVAL DAY(', CONCAT(TRUNC(C.DATA_SCALE/10), CONCAT(') TO SECOND(', CONCAT(MOD(C.DATA_SCALE, 10), ')')))), 42, 'FLOAT', 43, 'NVARCHAR2', 44, 'NCHAR', 45, 'UROWID', 46, 'LOB', 47, 'JSON', 48, 'GEOMETRY', 49, 'UDT', 'UNDEFINED') AS VARCHAR2(128)) AS DATA_TYPE, CAST(NULL AS VARCHAR2(3)) AS DATA_TYPE_MOD, CAST(NULL AS VARCHAR2(128)) AS DATA_TYPE_OWNER, CAST(CASE WHEN C.DATA_TYPE in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 14, 15, 16, 42) THEN 22 WHEN C.DATA_TYPE = 11 THEN 4 WHEN C.DATA_TYPE = 12 THEN 8 WHEN C.DATA_TYPE in (17, 19) THEN 7 WHEN C.DATA_TYPE in (18, 37, 38) THEN CASE WHEN C.DATA_SCALE = 0 THEN 7 ELSE 11 END WHEN C.DATA_TYPE = 41 THEN 11 WHEN C.DATA_TYPE = 40 THEN 5 WHEN C.DATA_TYPE = 30 THEN 4000 WHEN C.DATA_TYPE = 36 THEN 13 WHEN C.DATA_TYPE IN (0,22,43,46) AND C.DATA_PRECISION = 1 THEN LEAST(32767, C.DATA_LENGTH * DECODE(C.COLLATION_TYPE, 63, 1, 249, 4, 248, 4, 87, 2,28, 2, 55, 2, 54, 4, 101, 2, 46, 4, 45, 4, 224, 4, 1)) WHEN C.DATA_TYPE IN (23,44) AND C.DATA_PRECISION = 1 THEN LEAST(2000, C.DATA_LENGTH * DECODE(C.COLLATION_TYPE, 63, 1, 249, 4, 248, 4, 87, 2,28, 2, 55, 2, 54, 4, 101, 2, 46, 4, 45, 4, 224, 4, 1)) ELSE C.DATA_LENGTH END AS NUMBER) AS DATA_LENGTH, CAST(CASE WHEN C.DATA_TYPE IN (0,11,12,17,18,19,22,23,27,28,29,30,36,37,38,43,44) THEN NULL ELSE CASE WHEN C.DATA_PRECISION < 0 THEN NULL ELSE C.DATA_PRECISION END END AS NUMBER) AS DATA_PRECISION, CAST(CASE WHEN C.DATA_TYPE IN (0,11,12,17,19,22,23,27,28,29,30,42,43,44) THEN NULL ELSE CASE WHEN C.DATA_SCALE < -84 THEN NULL ELSE C.DATA_SCALE END END AS NUMBER) AS DATA_SCALE, CAST(DECODE(C.NULLABLE, 0, 'N', DECODE(BITAND(C.COLUMN_FLAGS, 5 * POWER(2, 13)), 5 * POWER(2, 13), 'N', 'Y')) AS VARCHAR2(1)) AS NULLABLE, CAST(DECODE(BITAND(C.COLUMN_FLAGS, 64), 0, C.COLUMN_ID, NULL) AS NUMBER) AS COLUMN_ID, CAST(LENGTHB(C.CUR_DEFAULT_VALUE_V2) AS NUMBER) AS DEFAULT_LENGTH, CAST(C.CUR_DEFAULT_VALUE_V2 AS /* TODO: LONG() */ VARCHAR(32767)) AS DATA_DEFAULT, CAST(STAT.DISTINCT_CNT AS NUMBER) AS NUM_DISTINCT, CAST(STAT.MIN_VALUE AS /* TODO: RAW */ VARCHAR(128)) AS LOW_VALUE, CAST(STAT.MAX_VALUE AS /* TODO: RAW */ VARCHAR(128)) AS HIGH_VALUE, CAST(STAT.DENSITY AS NUMBER) AS DENSITY, CAST(STAT.NULL_CNT AS NUMBER) AS NUM_NULLS, CAST(STAT.BUCKET_CNT AS NUMBER) AS NUM_BUCKETS, CAST(STAT.LAST_ANALYZED AS DATE) AS LAST_ANALYZED, CAST(STAT.SAMPLE_SIZE AS NUMBER) AS SAMPLE_SIZE, CAST(DECODE(C.DATA_TYPE, 22, 'CHAR_CS', 23, 'CHAR_CS', 30, DECODE(C.COLLATION_TYPE, 63, 'NULL', 'CHAR_CS'), 43, 'NCHAR_CS', 44, 'NCHAR_CS', '') AS VARCHAR2(44)) AS CHARACTER_SET_NAME, CAST(NULL AS NUMBER) AS CHAR_COL_DECL_LENGTH, CAST(DECODE(STAT.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(DECODE(STAT.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, CAST(NULL AS VARCHAR2(80)) AS NOTES, CAST(STAT.AVG_LEN AS NUMBER) AS AVG_COL_LEN, CAST(CASE WHEN C.DATA_TYPE IN (22,23,43,44) THEN C.DATA_LENGTH ELSE 0 END AS NUMBER) AS CHAR_LENGTH, CAST(DECODE(C.DATA_TYPE, 22, DECODE(C.DATA_PRECISION, 1, 'C', 'B'), 23, DECODE(C.DATA_PRECISION, 1, 'C', 'B'), 43, DECODE(C.DATA_PRECISION, 1, 'C', 'B'), 44, DECODE(C.DATA_PRECISION, 1, 'C', 'B'), NULL) AS VARCHAR2(1)) AS CHAR_USED, CAST(NULL AS VARCHAR2(3)) AS V80_FMT_IMAGE, CAST(NULL AS VARCHAR2(3)) AS DATA_UPGRADED, CAST(DECODE(BITAND(C.COLUMN_FLAGS, 64), 0, 'NO', 'YES') AS VARCHAR2(3)) AS HIDDEN_COLUMN, CAST(DECODE(BITAND(C.COLUMN_FLAGS, 1), 1, 'YES', 'NO') AS VARCHAR2(3)) AS VIRTUAL_COLUMN, CAST(NULL AS NUMBER) AS SEGMENT_COLUMN_ID, CAST(NULL AS NUMBER) AS INTERNAL_COLUMN_ID, CAST((CASE WHEN STAT.HISTOGRAM_TYPE = 1 THEN 'FREQUENCY' WHEN STAT.HISTOGRAM_TYPE = 3 THEN 'TOP-FREQUENCY' WHEN STAT.HISTOGRAM_TYPE = 4 THEN 'HYBRID' ELSE NULL END) AS VARCHAR2(15)) AS HISTOGRAM, CAST(C.COLUMN_NAME AS VARCHAR2(4000)) AS QUALIFIED_COL_NAME, CAST('YES' AS VARCHAR2(3)) AS USER_GENERATED, CAST(NULL AS VARCHAR2(3)) AS DEFAULT_ON_NULL, CAST(NULL AS VARCHAR2(3)) AS IDENTITY_COLUMN, CAST(NULL AS VARCHAR2(128)) AS EVALUATION_EDITION, CAST(NULL AS VARCHAR2(128)) AS UNUSABLE_BEFORE, CAST(NULL AS VARCHAR2(128)) AS UNUSABLE_BEGINNING, CAST(NULL AS VARCHAR2(100)) AS COLLATION, CAST(NULL AS NUMBER) AS COLLATED_COLUMN_ID FROM (SELECT TENANT_ID, TABLE_ID, DATABASE_ID, TABLE_NAME, TABLE_TYPE FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, DATABASE_ID, TABLE_NAME, TABLE_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() AND TABLE_TYPE IN (0,1,3,4,5,7,8,9)) T JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB ON DB.TENANT_ID = T.TENANT_ID AND DB.DATABASE_ID = T.DATABASE_ID AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN (SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, DATA_TYPE, COLLATION_TYPE, DATA_SCALE, DATA_LENGTH, DATA_PRECISION, NULLABLE, COLUMN_FLAGS, CUR_DEFAULT_VALUE_V2, IS_HIDDEN FROM SYS.ALL_VIRTUAL_CORE_COLUMN_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, DATA_TYPE, COLLATION_TYPE, DATA_SCALE, DATA_LENGTH, DATA_PRECISION, NULLABLE, COLUMN_FLAGS, CUR_DEFAULT_VALUE_V2, IS_HIDDEN FROM SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID()) C ON C.TENANT_ID = T.TENANT_ID AND C.TABLE_ID = T.TABLE_ID AND C.IS_HIDDEN = 0 LEFT JOIN SYS.ALL_VIRTUAL_COLUMN_STAT_REAL_AGENT STAT ON C.TENANT_ID = STAT.TENANT_ID AND C.TABLE_ID = STAT.TABLE_ID AND C.COLUMN_ID = STAT.COLUMN_ID AND STAT.OBJECT_TYPE = 1 AND STAT.TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(DB.DATABASE_NAME AS VARCHAR2(128)) AS OWNER, CAST(T.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(C.COLUMN_NAME AS VARCHAR2(128)) AS COLUMN_NAME, CAST(DECODE(C.DATA_TYPE, 0, 'VARCHAR2', 1, 'NUMBER', 2, 'NUMBER', 3, 'NUMBER', 4, 'NUMBER', 5, 'NUMBER', 6, 'NUMBER', 7, 'NUMBER', 8, 'NUMBER', 9, 'NUMBER', 10, 'NUMBER', 11, 'BINARY_FLOAT', 12, 'BINARY_DOUBLE', 13, 'NUMBER', 14, 'NUMBER', 15, 'NUMBER', 16, 'NUMBER', 17, 'DATE', 18, 'TIMESTAMP', 19, 'DATE', 20, 'TIME', 21, 'YEAR', 22, 'VARCHAR2', 23, 'CHAR', 24, 'HEX_STRING', 25, 'UNDEFINED', 26, 'UNKNOWN', 27, 'TINYTEXT', 28, 'TEXT', 29, 'MEDIUMTEXT', 30, DECODE(C.COLLATION_TYPE, 63, 'BLOB', 'CLOB'), 31, 'BIT', 32, 'ENUM', 33, 'SET', 34, 'ENUM_INNER', 35, 'SET_INNER', 36, CONCAT('TIMESTAMP(', CONCAT(C.DATA_SCALE, ') WITH TIME ZONE')), 37, CONCAT('TIMESTAMP(', CONCAT(C.DATA_SCALE, ') WITH LOCAL TIME ZONE')), 38, CONCAT('TIMESTAMP(', CONCAT(C.DATA_SCALE, ')')), 39, 'RAW', 40, CONCAT('INTERVAL YEAR(', CONCAT(C.DATA_SCALE, ') TO MONTH')), 41, CONCAT('INTERVAL DAY(', CONCAT(TRUNC(C.DATA_SCALE/10), CONCAT(') TO SECOND(', CONCAT(MOD(C.DATA_SCALE, 10), ')')))), 42, 'FLOAT', 43, 'NVARCHAR2', 44, 'NCHAR', 45, 'UROWID', 46, 'LOB', 47, 'JSON', 48, 'GEOMETRY', 49, 'UDT', 'UNDEFINED') AS VARCHAR2(128)) AS DATA_TYPE, CAST(NULL AS VARCHAR2(3)) AS DATA_TYPE_MOD, CAST(NULL AS VARCHAR2(128)) AS DATA_TYPE_OWNER, CAST(CASE WHEN C.DATA_TYPE in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 14, 15, 16, 42) THEN 22 WHEN C.DATA_TYPE = 11 THEN 4 WHEN C.DATA_TYPE = 12 THEN 8 WHEN C.DATA_TYPE in (17, 19) THEN 7 WHEN C.DATA_TYPE in (18, 37, 38) THEN CASE WHEN C.DATA_SCALE = 0 THEN 7 ELSE 11 END WHEN C.DATA_TYPE = 41 THEN 11 WHEN C.DATA_TYPE = 40 THEN 5 WHEN C.DATA_TYPE = 30 THEN 4000 WHEN C.DATA_TYPE = 36 THEN 13 WHEN C.DATA_TYPE IN (0,22,43,46) AND C.DATA_PRECISION = 1 THEN LEAST(32767, C.DATA_LENGTH * DECODE(C.COLLATION_TYPE, 63, 1, 249, 4, 248, 4, 87, 2,28, 2, 55, 2, 54, 4, 101, 2, 46, 4, 45, 4, 224, 4, 1)) WHEN C.DATA_TYPE IN (23,44) AND C.DATA_PRECISION = 1 THEN LEAST(2000, C.DATA_LENGTH * DECODE(C.COLLATION_TYPE, 63, 1, 249, 4, 248, 4, 87, 2,28, 2, 55, 2, 54, 4, 101, 2, 46, 4, 45, 4, 224, 4, 1)) ELSE C.DATA_LENGTH END AS NUMBER) AS DATA_LENGTH, CAST(CASE WHEN C.DATA_TYPE IN (0,11,12,17,18,19,22,23,27,28,29,30,36,37,38,43,44) THEN NULL ELSE CASE WHEN C.DATA_PRECISION < 0 THEN NULL ELSE C.DATA_PRECISION END END AS NUMBER) AS DATA_PRECISION, CAST(CASE WHEN C.DATA_TYPE IN (0,11,12,17,19,22,23,27,28,29,30,42,43,44) THEN NULL ELSE CASE WHEN C.DATA_SCALE < -84 THEN NULL ELSE C.DATA_SCALE END END AS NUMBER) AS DATA_SCALE, CAST(DECODE(C.NULLABLE, 0, 'N', DECODE(BITAND(C.COLUMN_FLAGS, 5 * POWER(2, 13)), 5 * POWER(2, 13), 'N', 'Y')) AS VARCHAR2(1)) AS NULLABLE, CAST(DECODE(BITAND(C.COLUMN_FLAGS, 64), 0, C.COLUMN_ID, NULL) AS NUMBER) AS COLUMN_ID, CAST(LENGTHB(C.CUR_DEFAULT_VALUE_V2) AS NUMBER) AS DEFAULT_LENGTH, CAST(C.CUR_DEFAULT_VALUE_V2 AS /* TODO: LONG() */ VARCHAR(32767)) AS DATA_DEFAULT, CAST(STAT.DISTINCT_CNT AS NUMBER) AS NUM_DISTINCT, CAST(STAT.MIN_VALUE AS /* TODO: RAW */ VARCHAR(128)) AS LOW_VALUE, CAST(STAT.MAX_VALUE AS /* TODO: RAW */ VARCHAR(128)) AS HIGH_VALUE, CAST(STAT.DENSITY AS NUMBER) AS DENSITY, CAST(STAT.NULL_CNT AS NUMBER) AS NUM_NULLS, CAST(STAT.BUCKET_CNT AS NUMBER) AS NUM_BUCKETS, CAST(STAT.LAST_ANALYZED AS DATE) AS LAST_ANALYZED, CAST(STAT.SAMPLE_SIZE AS NUMBER) AS SAMPLE_SIZE, CAST(DECODE(C.DATA_TYPE, 22, 'CHAR_CS', 23, 'CHAR_CS', 30, DECODE(C.COLLATION_TYPE, 63, 'NULL', 'CHAR_CS'), 43, 'NCHAR_CS', 44, 'NCHAR_CS', '') AS VARCHAR2(44)) AS CHARACTER_SET_NAME, CAST(NULL AS NUMBER) AS CHAR_COL_DECL_LENGTH, CAST(DECODE(STAT.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(DECODE(STAT.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, CAST(NULL AS VARCHAR2(80)) AS NOTES, CAST(STAT.AVG_LEN AS NUMBER) AS AVG_COL_LEN, CAST(CASE WHEN C.DATA_TYPE IN (22,23,43,44) THEN C.DATA_LENGTH ELSE 0 END AS NUMBER) AS CHAR_LENGTH, CAST(DECODE(C.DATA_TYPE, 22, DECODE(C.DATA_PRECISION, 1, 'C', 'B'), 23, DECODE(C.DATA_PRECISION, 1, 'C', 'B'), 43, DECODE(C.DATA_PRECISION, 1, 'C', 'B'), 44, DECODE(C.DATA_PRECISION, 1, 'C', 'B'), NULL) AS VARCHAR2(1)) AS CHAR_USED, CAST(NULL AS VARCHAR2(3)) AS V80_FMT_IMAGE, CAST(NULL AS VARCHAR2(3)) AS DATA_UPGRADED, CAST(DECODE(BITAND(C.COLUMN_FLAGS, 64), 0, 'NO', 'YES') AS VARCHAR2(3)) AS HIDDEN_COLUMN, CAST(DECODE(BITAND(C.COLUMN_FLAGS, 1), 1, 'YES', 'NO') AS VARCHAR2(3)) AS VIRTUAL_COLUMN, CAST(NULL AS NUMBER) AS SEGMENT_COLUMN_ID, CAST(NULL AS NUMBER) AS INTERNAL_COLUMN_ID, CAST((CASE WHEN STAT.HISTOGRAM_TYPE = 1 THEN 'FREQUENCY' WHEN STAT.HISTOGRAM_TYPE = 3 THEN 'TOP-FREQUENCY' WHEN STAT.HISTOGRAM_TYPE = 4 THEN 'HYBRID' ELSE NULL END) AS VARCHAR2(15)) AS HISTOGRAM, CAST(C.COLUMN_NAME AS VARCHAR2(4000)) AS QUALIFIED_COL_NAME, CAST('YES' AS VARCHAR2(3)) AS USER_GENERATED, CAST(NULL AS VARCHAR2(3)) AS DEFAULT_ON_NULL, CAST(NULL AS VARCHAR2(3)) AS IDENTITY_COLUMN, CAST(NULL AS VARCHAR2(128)) AS EVALUATION_EDITION, CAST(NULL AS VARCHAR2(128)) AS UNUSABLE_BEFORE, CAST(NULL AS VARCHAR2(128)) AS UNUSABLE_BEGINNING, CAST(NULL AS VARCHAR2(100)) AS COLLATION, CAST(NULL AS NUMBER) AS COLLATED_COLUMN_ID FROM (SELECT TENANT_ID, TABLE_ID, DATABASE_ID, TABLE_NAME, TABLE_TYPE FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, DATABASE_ID, TABLE_NAME, TABLE_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() AND TABLE_TYPE IN (0,1,3,4,5,7,8,9,14)) T JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB ON DB.TENANT_ID = T.TENANT_ID AND DB.DATABASE_ID = T.DATABASE_ID AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN (SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, DATA_TYPE, COLLATION_TYPE, DATA_SCALE, DATA_LENGTH, DATA_PRECISION, NULLABLE, COLUMN_FLAGS, CUR_DEFAULT_VALUE_V2, IS_HIDDEN FROM SYS.ALL_VIRTUAL_CORE_COLUMN_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, DATA_TYPE, COLLATION_TYPE, DATA_SCALE, DATA_LENGTH, DATA_PRECISION, NULLABLE, COLUMN_FLAGS, CUR_DEFAULT_VALUE_V2, IS_HIDDEN FROM SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID()) C ON C.TENANT_ID = T.TENANT_ID AND C.TABLE_ID = T.TABLE_ID AND C.IS_HIDDEN = 0 LEFT JOIN SYS.ALL_VIRTUAL_COLUMN_STAT_REAL_AGENT STAT ON C.TENANT_ID = STAT.TENANT_ID AND C.TABLE_ID = STAT.TABLE_ID AND C.COLUMN_ID = STAT.COLUMN_ID AND STAT.OBJECT_TYPE = 1 AND STAT.TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1010,7 +1010,7 @@ int ObInnerTableSchema::user_tab_cols_v_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 CAST(T.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(C.COLUMN_NAME AS VARCHAR2(128)) AS COLUMN_NAME, CAST(DECODE(C.DATA_TYPE, 0, 'VARCHAR2', 1, 'NUMBER', 2, 'NUMBER', 3, 'NUMBER', 4, 'NUMBER', 5, 'NUMBER', 6, 'NUMBER', 7, 'NUMBER', 8, 'NUMBER', 9, 'NUMBER', 10, 'NUMBER', 11, 'BINARY_FLOAT', 12, 'BINARY_DOUBLE', 13, 'NUMBER', 14, 'NUMBER', 15, 'NUMBER', 16, 'NUMBER', 17, 'DATE', 18, 'TIMESTAMP', 19, 'DATE', 20, 'TIME', 21, 'YEAR', 22, 'VARCHAR2', 23, 'CHAR', 24, 'HEX_STRING', 25, 'UNDEFINED', 26, 'UNKNOWN', 27, 'TINYTEXT', 28, 'TEXT', 29, 'MEDIUMTEXT', 30, DECODE(C.COLLATION_TYPE, 63, 'BLOB', 'CLOB'), 31, 'BIT', 32, 'ENUM', 33, 'SET', 34, 'ENUM_INNER', 35, 'SET_INNER', 36, CONCAT('TIMESTAMP(', CONCAT(C.DATA_SCALE, ') WITH TIME ZONE')), 37, CONCAT('TIMESTAMP(', CONCAT(C.DATA_SCALE, ') WITH LOCAL TIME ZONE')), 38, CONCAT('TIMESTAMP(', CONCAT(C.DATA_SCALE, ')')), 39, 'RAW', 40, CONCAT('INTERVAL YEAR(', CONCAT(C.DATA_SCALE, ') TO MONTH')), 41, CONCAT('INTERVAL DAY(', CONCAT(TRUNC(C.DATA_SCALE/10), CONCAT(') TO SECOND(', CONCAT(MOD(C.DATA_SCALE, 10), ')')))), 42, 'FLOAT', 43, 'NVARCHAR2', 44, 'NCHAR', 45, 'UROWID', 46, 'LOB', 47, 'JSON', 48, 'GEOMETRY', 49, 'UDT', 'UNDEFINED') AS VARCHAR2(128)) AS DATA_TYPE, CAST(NULL AS VARCHAR2(3)) AS DATA_TYPE_MOD, CAST(NULL AS VARCHAR2(128)) AS DATA_TYPE_OWNER, CAST(CASE WHEN C.DATA_TYPE in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 14, 15, 16, 42) THEN 22 WHEN C.DATA_TYPE = 11 THEN 4 WHEN C.DATA_TYPE = 12 THEN 8 WHEN C.DATA_TYPE in (17, 19) THEN 7 WHEN C.DATA_TYPE in (18, 37, 38) THEN CASE WHEN C.DATA_SCALE = 0 THEN 7 ELSE 11 END WHEN C.DATA_TYPE = 41 THEN 11 WHEN C.DATA_TYPE = 40 THEN 5 WHEN C.DATA_TYPE = 30 THEN 4000 WHEN C.DATA_TYPE = 36 THEN 13 WHEN C.DATA_TYPE IN (0,22,43,46) AND C.DATA_PRECISION = 1 THEN LEAST(32767, C.DATA_LENGTH * DECODE(C.COLLATION_TYPE, 63, 1, 249, 4, 248, 4, 87, 2,28, 2, 55, 2, 54, 4, 101, 2, 46, 4, 45, 4, 224, 4, 1)) WHEN C.DATA_TYPE IN (23,44) AND C.DATA_PRECISION = 1 THEN LEAST(2000, C.DATA_LENGTH * DECODE(C.COLLATION_TYPE, 63, 1, 249, 4, 248, 4, 87, 2,28, 2, 55, 2, 54, 4, 101, 2, 46, 4, 45, 4, 224, 4, 1)) ELSE C.DATA_LENGTH END AS NUMBER) AS DATA_LENGTH, CAST(CASE WHEN C.DATA_TYPE IN (0,11,12,17,18,19,22,23,27,28,29,30,36,37,38,43,44) THEN NULL ELSE CASE WHEN C.DATA_PRECISION < 0 THEN NULL ELSE C.DATA_PRECISION END END AS NUMBER) AS DATA_PRECISION, CAST(CASE WHEN C.DATA_TYPE IN (0,11,12,17,19,22,23,27,28,29,30,42,43,44) THEN NULL ELSE CASE WHEN C.DATA_SCALE < -84 THEN NULL ELSE C.DATA_SCALE END END AS NUMBER) AS DATA_SCALE, CAST(DECODE(C.NULLABLE, 0, 'N', DECODE(BITAND(C.COLUMN_FLAGS, 5 * POWER(2, 13)), 5 * POWER(2, 13), 'N', 'Y')) AS VARCHAR2(1)) AS NULLABLE, CAST(DECODE(BITAND(C.COLUMN_FLAGS, 64), 0, C.COLUMN_ID, NULL) AS NUMBER) AS COLUMN_ID, CAST(LENGTHB(C.CUR_DEFAULT_VALUE_V2) AS NUMBER) AS DEFAULT_LENGTH, CAST(C.CUR_DEFAULT_VALUE_V2 AS /* TODO: LONG() */ VARCHAR(32767)) AS DATA_DEFAULT, CAST(STAT.DISTINCT_CNT AS NUMBER) AS NUM_DISTINCT, CAST(STAT.MIN_VALUE AS /* TODO: RAW */ VARCHAR(128)) AS LOW_VALUE, CAST(STAT.MAX_VALUE AS /* TODO: RAW */ VARCHAR(128)) AS HIGH_VALUE, CAST(STAT.DENSITY AS NUMBER) AS DENSITY, CAST(STAT.NULL_CNT AS NUMBER) AS NUM_NULLS, CAST(STAT.BUCKET_CNT AS NUMBER) AS NUM_BUCKETS, CAST(STAT.LAST_ANALYZED AS DATE) AS LAST_ANALYZED, CAST(STAT.SAMPLE_SIZE AS NUMBER) AS SAMPLE_SIZE, CAST(DECODE(C.DATA_TYPE, 22, 'CHAR_CS', 23, 'CHAR_CS', 30, DECODE(C.COLLATION_TYPE, 63, 'NULL', 'CHAR_CS'), 43, 'NCHAR_CS', 44, 'NCHAR_CS', '') AS VARCHAR2(44)) AS CHARACTER_SET_NAME, CAST(NULL AS NUMBER) AS CHAR_COL_DECL_LENGTH, CAST(DECODE(STAT.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(DECODE(STAT.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, CAST(NULL AS VARCHAR2(80)) AS NOTES, CAST(STAT.AVG_LEN AS NUMBER) AS AVG_COL_LEN, CAST(CASE WHEN C.DATA_TYPE IN (22,23,43,44) THEN C.DATA_LENGTH ELSE 0 END AS NUMBER) AS CHAR_LENGTH, CAST(DECODE(C.DATA_TYPE, 22, DECODE(C.DATA_PRECISION, 1, 'C', 'B'), 23, DECODE(C.DATA_PRECISION, 1, 'C', 'B'), 43, DECODE(C.DATA_PRECISION, 1, 'C', 'B'), 44, DECODE(C.DATA_PRECISION, 1, 'C', 'B'), NULL) AS VARCHAR2(1)) AS CHAR_USED, CAST(NULL AS VARCHAR2(3)) AS V80_FMT_IMAGE, CAST(NULL AS VARCHAR2(3)) AS DATA_UPGRADED, CAST(DECODE(BITAND(C.COLUMN_FLAGS, 64), 0, 'NO', 'YES') AS VARCHAR2(3)) AS HIDDEN_COLUMN, CAST(DECODE(BITAND(C.COLUMN_FLAGS, 1), 1, 'YES', 'NO') AS VARCHAR2(3)) AS VIRTUAL_COLUMN, CAST(NULL AS NUMBER) AS SEGMENT_COLUMN_ID, CAST(NULL AS NUMBER) AS INTERNAL_COLUMN_ID, CAST((CASE WHEN STAT.HISTOGRAM_TYPE = 1 THEN 'FREQUENCY' WHEN STAT.HISTOGRAM_TYPE = 3 THEN 'TOP-FREQUENCY' WHEN STAT.HISTOGRAM_TYPE = 4 THEN 'HYBRID' ELSE NULL END) AS VARCHAR2(15)) AS HISTOGRAM, CAST(C.COLUMN_NAME AS VARCHAR2(4000)) AS QUALIFIED_COL_NAME, CAST('YES' AS VARCHAR2(3)) AS USER_GENERATED, CAST(NULL AS VARCHAR2(3)) AS DEFAULT_ON_NULL, CAST(NULL AS VARCHAR2(3)) AS IDENTITY_COLUMN, CAST(NULL AS VARCHAR2(128)) AS EVALUATION_EDITION, CAST(NULL AS VARCHAR2(128)) AS UNUSABLE_BEFORE, CAST(NULL AS VARCHAR2(128)) AS UNUSABLE_BEGINNING, CAST(NULL AS VARCHAR2(100)) AS COLLATION, CAST(NULL AS NUMBER) AS COLLATED_COLUMN_ID FROM (SELECT TENANT_ID, TABLE_ID, DATABASE_ID, TABLE_NAME, TABLE_TYPE FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, DATABASE_ID, TABLE_NAME, TABLE_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() AND TABLE_TYPE IN (0,1,3,4,5,7,8,9)) T JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB ON DB.TENANT_ID = T.TENANT_ID AND DB.DATABASE_ID = T.DATABASE_ID AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() AND T.DATABASE_ID = USERENV('SCHEMAID') JOIN (SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, DATA_TYPE, COLLATION_TYPE, DATA_SCALE, DATA_LENGTH, DATA_PRECISION, NULLABLE, COLUMN_FLAGS, CUR_DEFAULT_VALUE_V2, IS_HIDDEN FROM SYS.ALL_VIRTUAL_CORE_COLUMN_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, DATA_TYPE, COLLATION_TYPE, DATA_SCALE, DATA_LENGTH, DATA_PRECISION, NULLABLE, COLUMN_FLAGS, CUR_DEFAULT_VALUE_V2, IS_HIDDEN FROM SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID()) C ON C.TENANT_ID = T.TENANT_ID AND C.TABLE_ID = T.TABLE_ID AND C.IS_HIDDEN = 0 LEFT JOIN SYS.ALL_VIRTUAL_COLUMN_STAT_REAL_AGENT STAT ON C.TENANT_ID = STAT.TENANT_ID AND C.TABLE_ID = STAT.TABLE_ID AND C.COLUMN_ID = STAT.COLUMN_ID AND STAT.OBJECT_TYPE = 1 AND STAT.TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(T.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(C.COLUMN_NAME AS VARCHAR2(128)) AS COLUMN_NAME, CAST(DECODE(C.DATA_TYPE, 0, 'VARCHAR2', 1, 'NUMBER', 2, 'NUMBER', 3, 'NUMBER', 4, 'NUMBER', 5, 'NUMBER', 6, 'NUMBER', 7, 'NUMBER', 8, 'NUMBER', 9, 'NUMBER', 10, 'NUMBER', 11, 'BINARY_FLOAT', 12, 'BINARY_DOUBLE', 13, 'NUMBER', 14, 'NUMBER', 15, 'NUMBER', 16, 'NUMBER', 17, 'DATE', 18, 'TIMESTAMP', 19, 'DATE', 20, 'TIME', 21, 'YEAR', 22, 'VARCHAR2', 23, 'CHAR', 24, 'HEX_STRING', 25, 'UNDEFINED', 26, 'UNKNOWN', 27, 'TINYTEXT', 28, 'TEXT', 29, 'MEDIUMTEXT', 30, DECODE(C.COLLATION_TYPE, 63, 'BLOB', 'CLOB'), 31, 'BIT', 32, 'ENUM', 33, 'SET', 34, 'ENUM_INNER', 35, 'SET_INNER', 36, CONCAT('TIMESTAMP(', CONCAT(C.DATA_SCALE, ') WITH TIME ZONE')), 37, CONCAT('TIMESTAMP(', CONCAT(C.DATA_SCALE, ') WITH LOCAL TIME ZONE')), 38, CONCAT('TIMESTAMP(', CONCAT(C.DATA_SCALE, ')')), 39, 'RAW', 40, CONCAT('INTERVAL YEAR(', CONCAT(C.DATA_SCALE, ') TO MONTH')), 41, CONCAT('INTERVAL DAY(', CONCAT(TRUNC(C.DATA_SCALE/10), CONCAT(') TO SECOND(', CONCAT(MOD(C.DATA_SCALE, 10), ')')))), 42, 'FLOAT', 43, 'NVARCHAR2', 44, 'NCHAR', 45, 'UROWID', 46, 'LOB', 47, 'JSON', 48, 'GEOMETRY', 49, 'UDT', 'UNDEFINED') AS VARCHAR2(128)) AS DATA_TYPE, CAST(NULL AS VARCHAR2(3)) AS DATA_TYPE_MOD, CAST(NULL AS VARCHAR2(128)) AS DATA_TYPE_OWNER, CAST(CASE WHEN C.DATA_TYPE in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 14, 15, 16, 42) THEN 22 WHEN C.DATA_TYPE = 11 THEN 4 WHEN C.DATA_TYPE = 12 THEN 8 WHEN C.DATA_TYPE in (17, 19) THEN 7 WHEN C.DATA_TYPE in (18, 37, 38) THEN CASE WHEN C.DATA_SCALE = 0 THEN 7 ELSE 11 END WHEN C.DATA_TYPE = 41 THEN 11 WHEN C.DATA_TYPE = 40 THEN 5 WHEN C.DATA_TYPE = 30 THEN 4000 WHEN C.DATA_TYPE = 36 THEN 13 WHEN C.DATA_TYPE IN (0,22,43,46) AND C.DATA_PRECISION = 1 THEN LEAST(32767, C.DATA_LENGTH * DECODE(C.COLLATION_TYPE, 63, 1, 249, 4, 248, 4, 87, 2,28, 2, 55, 2, 54, 4, 101, 2, 46, 4, 45, 4, 224, 4, 1)) WHEN C.DATA_TYPE IN (23,44) AND C.DATA_PRECISION = 1 THEN LEAST(2000, C.DATA_LENGTH * DECODE(C.COLLATION_TYPE, 63, 1, 249, 4, 248, 4, 87, 2,28, 2, 55, 2, 54, 4, 101, 2, 46, 4, 45, 4, 224, 4, 1)) ELSE C.DATA_LENGTH END AS NUMBER) AS DATA_LENGTH, CAST(CASE WHEN C.DATA_TYPE IN (0,11,12,17,18,19,22,23,27,28,29,30,36,37,38,43,44) THEN NULL ELSE CASE WHEN C.DATA_PRECISION < 0 THEN NULL ELSE C.DATA_PRECISION END END AS NUMBER) AS DATA_PRECISION, CAST(CASE WHEN C.DATA_TYPE IN (0,11,12,17,19,22,23,27,28,29,30,42,43,44) THEN NULL ELSE CASE WHEN C.DATA_SCALE < -84 THEN NULL ELSE C.DATA_SCALE END END AS NUMBER) AS DATA_SCALE, CAST(DECODE(C.NULLABLE, 0, 'N', DECODE(BITAND(C.COLUMN_FLAGS, 5 * POWER(2, 13)), 5 * POWER(2, 13), 'N', 'Y')) AS VARCHAR2(1)) AS NULLABLE, CAST(DECODE(BITAND(C.COLUMN_FLAGS, 64), 0, C.COLUMN_ID, NULL) AS NUMBER) AS COLUMN_ID, CAST(LENGTHB(C.CUR_DEFAULT_VALUE_V2) AS NUMBER) AS DEFAULT_LENGTH, CAST(C.CUR_DEFAULT_VALUE_V2 AS /* TODO: LONG() */ VARCHAR(32767)) AS DATA_DEFAULT, CAST(STAT.DISTINCT_CNT AS NUMBER) AS NUM_DISTINCT, CAST(STAT.MIN_VALUE AS /* TODO: RAW */ VARCHAR(128)) AS LOW_VALUE, CAST(STAT.MAX_VALUE AS /* TODO: RAW */ VARCHAR(128)) AS HIGH_VALUE, CAST(STAT.DENSITY AS NUMBER) AS DENSITY, CAST(STAT.NULL_CNT AS NUMBER) AS NUM_NULLS, CAST(STAT.BUCKET_CNT AS NUMBER) AS NUM_BUCKETS, CAST(STAT.LAST_ANALYZED AS DATE) AS LAST_ANALYZED, CAST(STAT.SAMPLE_SIZE AS NUMBER) AS SAMPLE_SIZE, CAST(DECODE(C.DATA_TYPE, 22, 'CHAR_CS', 23, 'CHAR_CS', 30, DECODE(C.COLLATION_TYPE, 63, 'NULL', 'CHAR_CS'), 43, 'NCHAR_CS', 44, 'NCHAR_CS', '') AS VARCHAR2(44)) AS CHARACTER_SET_NAME, CAST(NULL AS NUMBER) AS CHAR_COL_DECL_LENGTH, CAST(DECODE(STAT.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(DECODE(STAT.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, CAST(NULL AS VARCHAR2(80)) AS NOTES, CAST(STAT.AVG_LEN AS NUMBER) AS AVG_COL_LEN, CAST(CASE WHEN C.DATA_TYPE IN (22,23,43,44) THEN C.DATA_LENGTH ELSE 0 END AS NUMBER) AS CHAR_LENGTH, CAST(DECODE(C.DATA_TYPE, 22, DECODE(C.DATA_PRECISION, 1, 'C', 'B'), 23, DECODE(C.DATA_PRECISION, 1, 'C', 'B'), 43, DECODE(C.DATA_PRECISION, 1, 'C', 'B'), 44, DECODE(C.DATA_PRECISION, 1, 'C', 'B'), NULL) AS VARCHAR2(1)) AS CHAR_USED, CAST(NULL AS VARCHAR2(3)) AS V80_FMT_IMAGE, CAST(NULL AS VARCHAR2(3)) AS DATA_UPGRADED, CAST(DECODE(BITAND(C.COLUMN_FLAGS, 64), 0, 'NO', 'YES') AS VARCHAR2(3)) AS HIDDEN_COLUMN, CAST(DECODE(BITAND(C.COLUMN_FLAGS, 1), 1, 'YES', 'NO') AS VARCHAR2(3)) AS VIRTUAL_COLUMN, CAST(NULL AS NUMBER) AS SEGMENT_COLUMN_ID, CAST(NULL AS NUMBER) AS INTERNAL_COLUMN_ID, CAST((CASE WHEN STAT.HISTOGRAM_TYPE = 1 THEN 'FREQUENCY' WHEN STAT.HISTOGRAM_TYPE = 3 THEN 'TOP-FREQUENCY' WHEN STAT.HISTOGRAM_TYPE = 4 THEN 'HYBRID' ELSE NULL END) AS VARCHAR2(15)) AS HISTOGRAM, CAST(C.COLUMN_NAME AS VARCHAR2(4000)) AS QUALIFIED_COL_NAME, CAST('YES' AS VARCHAR2(3)) AS USER_GENERATED, CAST(NULL AS VARCHAR2(3)) AS DEFAULT_ON_NULL, CAST(NULL AS VARCHAR2(3)) AS IDENTITY_COLUMN, CAST(NULL AS VARCHAR2(128)) AS EVALUATION_EDITION, CAST(NULL AS VARCHAR2(128)) AS UNUSABLE_BEFORE, CAST(NULL AS VARCHAR2(128)) AS UNUSABLE_BEGINNING, CAST(NULL AS VARCHAR2(100)) AS COLLATION, CAST(NULL AS NUMBER) AS COLLATED_COLUMN_ID FROM (SELECT TENANT_ID, TABLE_ID, DATABASE_ID, TABLE_NAME, TABLE_TYPE FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, DATABASE_ID, TABLE_NAME, TABLE_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() AND TABLE_TYPE IN (0,1,3,4,5,7,8,9,14)) T JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB ON DB.TENANT_ID = T.TENANT_ID AND DB.DATABASE_ID = T.DATABASE_ID AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() AND T.DATABASE_ID = USERENV('SCHEMAID') JOIN (SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, DATA_TYPE, COLLATION_TYPE, DATA_SCALE, DATA_LENGTH, DATA_PRECISION, NULLABLE, COLUMN_FLAGS, CUR_DEFAULT_VALUE_V2, IS_HIDDEN FROM SYS.ALL_VIRTUAL_CORE_COLUMN_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, DATA_TYPE, COLLATION_TYPE, DATA_SCALE, DATA_LENGTH, DATA_PRECISION, NULLABLE, COLUMN_FLAGS, CUR_DEFAULT_VALUE_V2, IS_HIDDEN FROM SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID()) C ON C.TENANT_ID = T.TENANT_ID AND C.TABLE_ID = T.TABLE_ID AND C.IS_HIDDEN = 0 LEFT JOIN SYS.ALL_VIRTUAL_COLUMN_STAT_REAL_AGENT STAT ON C.TENANT_ID = STAT.TENANT_ID AND C.TABLE_ID = STAT.TABLE_ID AND C.COLUMN_ID = STAT.COLUMN_ID AND STAT.OBJECT_TYPE = 1 AND STAT.TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1360,7 +1360,7 @@ int ObInnerTableSchema::all_tables_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 CAST(DB.DATABASE_NAME AS VARCHAR2(128)) AS OWNER, CAST(T.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(TP.TABLESPACE_NAME AS VARCHAR2(30)) AS TABLESPACE_NAME, CAST(NULL AS VARCHAR2(128)) AS CLUSTER_NAME, CAST(NULL AS VARCHAR2(128)) AS IOT_NAME, CAST('VALID' AS VARCHAR2(8)) AS STATUS, CAST(T."PCTFREE" AS NUMBER) AS PCT_FREE, CAST(NULL AS NUMBER) AS PCT_USED, CAST(NULL AS NUMBER) AS INI_TRANS, CAST(NULL AS NUMBER) AS MAX_TRANS, CAST(NULL AS NUMBER) AS INITIAL_EXTENT, CAST(NULL AS NUMBER) AS NEXT_EXTENT, CAST(NULL AS NUMBER) AS MIN_EXTENTS, CAST(NULL AS NUMBER) AS MAX_EXTENTS, CAST(NULL AS NUMBER) AS PCT_INCREASE, CAST(NULL AS NUMBER) AS FREELISTS, CAST(NULL AS NUMBER) AS FREELIST_GROUPS, CAST(NULL AS VARCHAR2(3)) AS LOGGING, CAST(NULL AS VARCHAR2(1)) AS BACKED_UP, CAST(INFO.ROW_COUNT AS NUMBER) AS NUM_ROWS, CAST(NULL AS NUMBER) AS BLOCKS, CAST(NULL AS NUMBER) AS EMPTY_BLOCKS, CAST(NULL AS NUMBER) AS AVG_SPACE, CAST(NULL AS NUMBER) AS CHAIN_CNT, CAST(NULL AS NUMBER) AS AVG_ROW_LEN, CAST(NULL AS NUMBER) AS AVG_SPACE_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS NUM_FREELIST_BLOCKS, CAST(NULL AS VARCHAR2(10)) AS DEGREE, CAST(NULL AS VARCHAR2(10)) AS INSTANCES, CAST(NULL AS VARCHAR2(5)) AS CACHE, CAST(NULL AS VARCHAR2(8)) AS TABLE_LOCK, CAST(NULL AS NUMBER) AS SAMPLE_SIZE, CAST(NULL AS DATE) AS LAST_ANALYZED, CAST( CASE WHEN T.PART_LEVEL = 0 THEN 'NO' ELSE 'YES' END AS VARCHAR2(3)) AS PARTITIONED, CAST(NULL AS VARCHAR2(12)) AS IOT_TYPE, CAST(DECODE (T.TABLE_TYPE, 8, 'Y', 9, 'Y', 'N') AS VARCHAR2(1)) AS TEMPORARY, CAST(NULL AS VARCHAR2(1)) AS SECONDARY, CAST('NO' AS VARCHAR2(3)) AS NESTED, CAST(NULL AS VARCHAR2(7)) AS BUFFER_POOL, CAST(NULL AS VARCHAR2(7)) AS FLASH_CACHE, CAST(NULL AS VARCHAR2(7)) AS CELL_FLASH_CACHE, CAST(NULL AS VARCHAR2(8)) AS ROW_MOVEMENT, CAST(NULL AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(NULL AS VARCHAR2(3)) AS USER_STATS, CAST(DECODE (T.TABLE_TYPE, 8, 'SYS$SESSION', 9, 'SYS$TRANSACTION', NULL) AS VARCHAR2(15)) AS DURATION, CAST(NULL AS VARCHAR2(8)) AS SKIP_CORRUPT, CAST(NULL AS VARCHAR2(3)) AS MONITORING, CAST(NULL AS VARCHAR2(128)) AS CLUSTER_OWNER, CAST(NULL AS VARCHAR2(8)) AS DEPENDENCIES, CAST(NULL AS VARCHAR2(8)) AS COMPRESSION, CAST(NULL AS VARCHAR2(30)) AS COMPRESS_FOR, CAST(CASE WHEN DB.IN_RECYCLEBIN = 1 THEN 'YES' ELSE 'NO' END AS VARCHAR2(3)) AS DROPPED, CAST(NULL AS VARCHAR2(3)) AS READ_ONLY, CAST(NULL AS VARCHAR2(3)) AS SEGMENT_CREATED, CAST(NULL AS VARCHAR2(7)) AS RESULT_CACHE, CAST(NULL AS VARCHAR2(3)) AS CLUSTERING, CAST(NULL AS VARCHAR2(23)) AS ACTIVITY_TRACKING, CAST(NULL AS VARCHAR2(25)) AS DML_TIMESTAMP, CAST(NULL AS VARCHAR2(3)) AS HAS_IDENTITY, CAST(NULL AS VARCHAR2(3)) AS CONTAINER_DATA, CAST(NULL AS VARCHAR2(8)) AS INMEMORY, CAST(NULL AS VARCHAR2(8)) AS INMEMORY_PRIORITY, CAST(NULL AS VARCHAR2(15)) AS INMEMORY_DISTRIBUTE, CAST(NULL AS VARCHAR2(17)) AS INMEMORY_COMPRESSION, CAST(NULL AS VARCHAR2(13)) AS INMEMORY_DUPLICATE, CAST(NULL AS VARCHAR2(100)) AS DEFAULT_COLLATION, CAST(NULL AS VARCHAR2(1)) AS DUPLICATED, CAST(NULL AS VARCHAR2(1)) AS SHARDED, CAST(NULL AS VARCHAR2(1)) AS EXTERNALLY_SHARDED, CAST(NULL AS VARCHAR2(1)) AS EXTERNALLY_DUPLICATED, CAST(NULL AS VARCHAR2(3)) AS EXTERNAL, CAST(NULL AS VARCHAR2(3)) AS HYBRID, CAST(NULL AS VARCHAR2(24)) AS CELLMEMORY, CAST(NULL AS VARCHAR2(3)) AS CONTAINERS_DEFAULT, CAST(NULL AS VARCHAR2(3)) AS CONTAINER_MAP, CAST(NULL AS VARCHAR2(3)) AS EXTENDED_DATA_LINK, CAST(NULL AS VARCHAR2(3)) AS EXTENDED_DATA_LINK_MAP, CAST(NULL AS VARCHAR2(12)) AS INMEMORY_SERVICE, CAST(NULL AS VARCHAR2(1000)) AS INMEMORY_SERVICE_NAME, CAST(NULL AS VARCHAR2(3)) AS CONTAINER_MAP_OBJECT, CAST(NULL AS VARCHAR2(8)) AS MEMOPTIMIZE_READ, CAST(NULL AS VARCHAR2(8)) AS MEMOPTIMIZE_WRITE, CAST(NULL AS VARCHAR2(3)) AS HAS_SENSITIVE_COLUMN, CAST(NULL AS VARCHAR2(3)) AS ADMIT_NULL, CAST(NULL AS VARCHAR2(3)) AS DATA_LINK_DML_ENABLED, CAST(NULL AS VARCHAR2(8)) AS LOGICAL_REPLICATION FROM (SELECT TENANT_ID, TABLE_ID, SUM(ROW_CNT) AS ROW_COUNT FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT TS WHERE TS.TENANT_ID = EFFECTIVE_TENANT_ID() GROUP BY TENANT_ID, TABLE_ID ) INFO RIGHT JOIN (SELECT TENANT_ID, TABLE_ID, TABLE_NAME, DATABASE_ID, "PCTFREE", PART_LEVEL, TABLE_TYPE, TABLESPACE_ID FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, TABLE_NAME, DATABASE_ID, "PCTFREE", PART_LEVEL, TABLE_TYPE, TABLESPACE_ID FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() ) T ON T.TENANT_ID = INFO.TENANT_ID AND T.TABLE_ID = INFO.TABLE_ID AND INFO.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB ON DB.TENANT_ID = T.TENANT_ID AND DB.DATABASE_ID = T.DATABASE_ID AND T.TABLE_TYPE IN (0, 3, 8, 9) AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.DATABASE_NAME != '__recyclebin' AND (T.DATABASE_ID = USERENV('SCHEMAID') OR USER_CAN_ACCESS_OBJ(1, T.TABLE_ID, T.DATABASE_ID) =1) LEFT JOIN SYS.ALL_VIRTUAL_TENANT_TABLESPACE_REAL_AGENT TP ON TP.TABLESPACE_ID = T.TABLESPACE_ID AND T.TENANT_ID = TP.TENANT_ID AND TP.TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(DB.DATABASE_NAME AS VARCHAR2(128)) AS OWNER, CAST(T.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(TP.TABLESPACE_NAME AS VARCHAR2(30)) AS TABLESPACE_NAME, CAST(NULL AS VARCHAR2(128)) AS CLUSTER_NAME, CAST(NULL AS VARCHAR2(128)) AS IOT_NAME, CAST('VALID' AS VARCHAR2(8)) AS STATUS, CAST(T."PCTFREE" AS NUMBER) AS PCT_FREE, CAST(NULL AS NUMBER) AS PCT_USED, CAST(NULL AS NUMBER) AS INI_TRANS, CAST(NULL AS NUMBER) AS MAX_TRANS, CAST(NULL AS NUMBER) AS INITIAL_EXTENT, CAST(NULL AS NUMBER) AS NEXT_EXTENT, CAST(NULL AS NUMBER) AS MIN_EXTENTS, CAST(NULL AS NUMBER) AS MAX_EXTENTS, CAST(NULL AS NUMBER) AS PCT_INCREASE, CAST(NULL AS NUMBER) AS FREELISTS, CAST(NULL AS NUMBER) AS FREELIST_GROUPS, CAST(NULL AS VARCHAR2(3)) AS LOGGING, CAST(NULL AS VARCHAR2(1)) AS BACKED_UP, CAST(INFO.ROW_COUNT AS NUMBER) AS NUM_ROWS, CAST(NULL AS NUMBER) AS BLOCKS, CAST(NULL AS NUMBER) AS EMPTY_BLOCKS, CAST(NULL AS NUMBER) AS AVG_SPACE, CAST(NULL AS NUMBER) AS CHAIN_CNT, CAST(NULL AS NUMBER) AS AVG_ROW_LEN, CAST(NULL AS NUMBER) AS AVG_SPACE_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS NUM_FREELIST_BLOCKS, CAST(NULL AS VARCHAR2(10)) AS DEGREE, CAST(NULL AS VARCHAR2(10)) AS INSTANCES, CAST(NULL AS VARCHAR2(5)) AS CACHE, CAST(NULL AS VARCHAR2(8)) AS TABLE_LOCK, CAST(NULL AS NUMBER) AS SAMPLE_SIZE, CAST(NULL AS DATE) AS LAST_ANALYZED, CAST( CASE WHEN T.PART_LEVEL = 0 THEN 'NO' ELSE 'YES' END AS VARCHAR2(3)) AS PARTITIONED, CAST(NULL AS VARCHAR2(12)) AS IOT_TYPE, CAST(DECODE (T.TABLE_TYPE, 8, 'Y', 9, 'Y', 'N') AS VARCHAR2(1)) AS TEMPORARY, CAST(NULL AS VARCHAR2(1)) AS SECONDARY, CAST('NO' AS VARCHAR2(3)) AS NESTED, CAST(NULL AS VARCHAR2(7)) AS BUFFER_POOL, CAST(NULL AS VARCHAR2(7)) AS FLASH_CACHE, CAST(NULL AS VARCHAR2(7)) AS CELL_FLASH_CACHE, CAST(NULL AS VARCHAR2(8)) AS ROW_MOVEMENT, CAST(NULL AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(NULL AS VARCHAR2(3)) AS USER_STATS, CAST(DECODE (T.TABLE_TYPE, 8, 'SYS$SESSION', 9, 'SYS$TRANSACTION', NULL) AS VARCHAR2(15)) AS DURATION, CAST(NULL AS VARCHAR2(8)) AS SKIP_CORRUPT, CAST(NULL AS VARCHAR2(3)) AS MONITORING, CAST(NULL AS VARCHAR2(128)) AS CLUSTER_OWNER, CAST(NULL AS VARCHAR2(8)) AS DEPENDENCIES, CAST(NULL AS VARCHAR2(8)) AS COMPRESSION, CAST(NULL AS VARCHAR2(30)) AS COMPRESS_FOR, CAST(CASE WHEN DB.IN_RECYCLEBIN = 1 THEN 'YES' ELSE 'NO' END AS VARCHAR2(3)) AS DROPPED, CAST(NULL AS VARCHAR2(3)) AS READ_ONLY, CAST(NULL AS VARCHAR2(3)) AS SEGMENT_CREATED, CAST(NULL AS VARCHAR2(7)) AS RESULT_CACHE, CAST(NULL AS VARCHAR2(3)) AS CLUSTERING, CAST(NULL AS VARCHAR2(23)) AS ACTIVITY_TRACKING, CAST(NULL AS VARCHAR2(25)) AS DML_TIMESTAMP, CAST(NULL AS VARCHAR2(3)) AS HAS_IDENTITY, CAST(NULL AS VARCHAR2(3)) AS CONTAINER_DATA, CAST(NULL AS VARCHAR2(8)) AS INMEMORY, CAST(NULL AS VARCHAR2(8)) AS INMEMORY_PRIORITY, CAST(NULL AS VARCHAR2(15)) AS INMEMORY_DISTRIBUTE, CAST(NULL AS VARCHAR2(17)) AS INMEMORY_COMPRESSION, CAST(NULL AS VARCHAR2(13)) AS INMEMORY_DUPLICATE, CAST(NULL AS VARCHAR2(100)) AS DEFAULT_COLLATION, CAST(NULL AS VARCHAR2(1)) AS DUPLICATED, CAST(NULL AS VARCHAR2(1)) AS SHARDED, CAST(NULL AS VARCHAR2(1)) AS EXTERNALLY_SHARDED, CAST(NULL AS VARCHAR2(1)) AS EXTERNALLY_DUPLICATED, CAST(NULL AS VARCHAR2(3)) AS EXTERNAL, CAST(NULL AS VARCHAR2(3)) AS HYBRID, CAST(NULL AS VARCHAR2(24)) AS CELLMEMORY, CAST(NULL AS VARCHAR2(3)) AS CONTAINERS_DEFAULT, CAST(NULL AS VARCHAR2(3)) AS CONTAINER_MAP, CAST(NULL AS VARCHAR2(3)) AS EXTENDED_DATA_LINK, CAST(NULL AS VARCHAR2(3)) AS EXTENDED_DATA_LINK_MAP, CAST(NULL AS VARCHAR2(12)) AS INMEMORY_SERVICE, CAST(NULL AS VARCHAR2(1000)) AS INMEMORY_SERVICE_NAME, CAST(NULL AS VARCHAR2(3)) AS CONTAINER_MAP_OBJECT, CAST(NULL AS VARCHAR2(8)) AS MEMOPTIMIZE_READ, CAST(NULL AS VARCHAR2(8)) AS MEMOPTIMIZE_WRITE, CAST(NULL AS VARCHAR2(3)) AS HAS_SENSITIVE_COLUMN, CAST(NULL AS VARCHAR2(3)) AS ADMIT_NULL, CAST(NULL AS VARCHAR2(3)) AS DATA_LINK_DML_ENABLED, CAST(NULL AS VARCHAR2(8)) AS LOGICAL_REPLICATION FROM (SELECT TENANT_ID, TABLE_ID, SUM(ROW_CNT) AS ROW_COUNT FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT TS WHERE TS.TENANT_ID = EFFECTIVE_TENANT_ID() GROUP BY TENANT_ID, TABLE_ID ) INFO RIGHT JOIN (SELECT TENANT_ID, TABLE_ID, TABLE_NAME, DATABASE_ID, "PCTFREE", PART_LEVEL, TABLE_TYPE, TABLESPACE_ID FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, TABLE_NAME, DATABASE_ID, "PCTFREE", PART_LEVEL, TABLE_TYPE, TABLESPACE_ID FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() ) T ON T.TENANT_ID = INFO.TENANT_ID AND T.TABLE_ID = INFO.TABLE_ID AND INFO.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB ON DB.TENANT_ID = T.TENANT_ID AND DB.DATABASE_ID = T.DATABASE_ID AND T.TABLE_TYPE IN (0, 3, 8, 9, 14) AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.DATABASE_NAME != '__recyclebin' AND (T.DATABASE_ID = USERENV('SCHEMAID') OR USER_CAN_ACCESS_OBJ(1, T.TABLE_ID, T.DATABASE_ID) =1) LEFT JOIN SYS.ALL_VIRTUAL_TENANT_TABLESPACE_REAL_AGENT TP ON TP.TABLESPACE_ID = T.TABLESPACE_ID AND T.TENANT_ID = TP.TENANT_ID AND TP.TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1410,7 +1410,7 @@ int ObInnerTableSchema::dba_tables_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 CAST(DB.DATABASE_NAME AS VARCHAR2(128)) AS OWNER, CAST(T.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(TP.TABLESPACE_NAME AS VARCHAR2(30)) AS TABLESPACE_NAME, CAST(NULL AS VARCHAR2(128)) AS CLUSTER_NAME, CAST(NULL AS VARCHAR2(128)) AS IOT_NAME, CAST('VALID' AS VARCHAR2(8)) AS STATUS, CAST(T."PCTFREE" AS NUMBER) AS PCT_FREE, CAST(NULL AS NUMBER) AS PCT_USED, CAST(NULL AS NUMBER) AS INI_TRANS, CAST(NULL AS NUMBER) AS MAX_TRANS, CAST(NULL AS NUMBER) AS INITIAL_EXTENT, CAST(NULL AS NUMBER) AS NEXT_EXTENT, CAST(NULL AS NUMBER) AS MIN_EXTENTS, CAST(NULL AS NUMBER) AS MAX_EXTENTS, CAST(NULL AS NUMBER) AS PCT_INCREASE, CAST(NULL AS NUMBER) AS FREELISTS, CAST(NULL AS NUMBER) AS FREELIST_GROUPS, CAST(NULL AS VARCHAR2(3)) AS LOGGING, CAST(NULL AS VARCHAR2(1)) AS BACKED_UP, CAST(INFO.ROW_COUNT AS NUMBER) AS NUM_ROWS, CAST(NULL AS NUMBER) AS BLOCKS, CAST(NULL AS NUMBER) AS EMPTY_BLOCKS, CAST(NULL AS NUMBER) AS AVG_SPACE, CAST(NULL AS NUMBER) AS CHAIN_CNT, CAST(NULL AS NUMBER) AS AVG_ROW_LEN, CAST(NULL AS NUMBER) AS AVG_SPACE_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS NUM_FREELIST_BLOCKS, CAST(NULL AS VARCHAR2(10)) AS DEGREE, CAST(NULL AS VARCHAR2(10)) AS INSTANCES, CAST(NULL AS VARCHAR2(5)) AS CACHE, CAST(NULL AS VARCHAR2(8)) AS TABLE_LOCK, CAST(NULL AS NUMBER) AS SAMPLE_SIZE, CAST(NULL AS DATE) AS LAST_ANALYZED, CAST( CASE WHEN T.PART_LEVEL = 0 THEN 'NO' ELSE 'YES' END AS VARCHAR2(3)) AS PARTITIONED, CAST(NULL AS VARCHAR2(12)) AS IOT_TYPE, CAST(DECODE (T.TABLE_TYPE, 8, 'Y', 9, 'Y', 'N') AS VARCHAR2(1)) AS TEMPORARY, CAST(NULL AS VARCHAR2(1)) AS SECONDARY, CAST('NO' AS VARCHAR2(3)) AS NESTED, CAST(NULL AS VARCHAR2(7)) AS BUFFER_POOL, CAST(NULL AS VARCHAR2(7)) AS FLASH_CACHE, CAST(NULL AS VARCHAR2(7)) AS CELL_FLASH_CACHE, CAST(NULL AS VARCHAR2(8)) AS ROW_MOVEMENT, CAST(NULL AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(NULL AS VARCHAR2(3)) AS USER_STATS, CAST(DECODE (T.TABLE_TYPE, 8, 'SYS$SESSION', 9, 'SYS$TRANSACTION', NULL) AS VARCHAR2(15)) AS DURATION, CAST(NULL AS VARCHAR2(8)) AS SKIP_CORRUPT, CAST(NULL AS VARCHAR2(3)) AS MONITORING, CAST(NULL AS VARCHAR2(128)) AS CLUSTER_OWNER, CAST(NULL AS VARCHAR2(8)) AS DEPENDENCIES, CAST(NULL AS VARCHAR2(8)) AS COMPRESSION, CAST(NULL AS VARCHAR2(30)) AS COMPRESS_FOR, CAST(CASE WHEN DB.IN_RECYCLEBIN = 1 THEN 'YES' ELSE 'NO' END AS VARCHAR2(3)) AS DROPPED, CAST(NULL AS VARCHAR2(3)) AS READ_ONLY, CAST(NULL AS VARCHAR2(3)) AS SEGMENT_CREATED, CAST(NULL AS VARCHAR2(7)) AS RESULT_CACHE, CAST(NULL AS VARCHAR2(3)) AS CLUSTERING, CAST(NULL AS VARCHAR2(23)) AS ACTIVITY_TRACKING, CAST(NULL AS VARCHAR2(25)) AS DML_TIMESTAMP, CAST(NULL AS VARCHAR2(3)) AS HAS_IDENTITY, CAST(NULL AS VARCHAR2(3)) AS CONTAINER_DATA, CAST(NULL AS VARCHAR2(8)) AS INMEMORY, CAST(NULL AS VARCHAR2(8)) AS INMEMORY_PRIORITY, CAST(NULL AS VARCHAR2(15)) AS INMEMORY_DISTRIBUTE, CAST(NULL AS VARCHAR2(17)) AS INMEMORY_COMPRESSION, CAST(NULL AS VARCHAR2(13)) AS INMEMORY_DUPLICATE, CAST(NULL AS VARCHAR2(100)) AS DEFAULT_COLLATION, CAST(NULL AS VARCHAR2(1)) AS DUPLICATED, CAST(NULL AS VARCHAR2(1)) AS SHARDED, CAST(NULL AS VARCHAR2(1)) AS EXTERNALLY_SHARDED, CAST(NULL AS VARCHAR2(1)) AS EXTERNALLY_DUPLICATED, CAST(NULL AS VARCHAR2(3)) AS EXTERNAL, CAST(NULL AS VARCHAR2(3)) AS HYBRID, CAST(NULL AS VARCHAR2(24)) AS CELLMEMORY, CAST(NULL AS VARCHAR2(3)) AS CONTAINERS_DEFAULT, CAST(NULL AS VARCHAR2(3)) AS CONTAINER_MAP, CAST(NULL AS VARCHAR2(3)) AS EXTENDED_DATA_LINK, CAST(NULL AS VARCHAR2(3)) AS EXTENDED_DATA_LINK_MAP, CAST(NULL AS VARCHAR2(12)) AS INMEMORY_SERVICE, CAST(NULL AS VARCHAR2(1000)) AS INMEMORY_SERVICE_NAME, CAST(NULL AS VARCHAR2(3)) AS CONTAINER_MAP_OBJECT, CAST(NULL AS VARCHAR2(8)) AS MEMOPTIMIZE_READ, CAST(NULL AS VARCHAR2(8)) AS MEMOPTIMIZE_WRITE, CAST(NULL AS VARCHAR2(3)) AS HAS_SENSITIVE_COLUMN, CAST(NULL AS VARCHAR2(3)) AS ADMIT_NULL, CAST(NULL AS VARCHAR2(3)) AS DATA_LINK_DML_ENABLED, CAST(NULL AS VARCHAR2(8)) AS LOGICAL_REPLICATION FROM (SELECT TENANT_ID, TABLE_ID, SUM(ROW_CNT) AS ROW_COUNT FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT TS WHERE TS.TENANT_ID = EFFECTIVE_TENANT_ID() GROUP BY TENANT_ID, TABLE_ID ) INFO RIGHT JOIN (SELECT TENANT_ID, TABLE_ID, TABLE_NAME, DATABASE_ID, "PCTFREE", PART_LEVEL, TABLE_TYPE, TABLESPACE_ID FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, TABLE_NAME, DATABASE_ID, "PCTFREE", PART_LEVEL, TABLE_TYPE, TABLESPACE_ID FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() AND TABLE_TYPE != 12 AND TABLE_TYPE != 13 ) T ON T.TENANT_ID = INFO.TENANT_ID AND T.TABLE_ID = INFO.TABLE_ID AND INFO.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB ON DB.TENANT_ID = T.TENANT_ID AND DB.DATABASE_ID = T.DATABASE_ID AND T.TABLE_TYPE IN (0, 3, 8, 9) AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.DATABASE_NAME != '__recyclebin' LEFT JOIN SYS.ALL_VIRTUAL_TENANT_TABLESPACE_REAL_AGENT TP ON TP.TABLESPACE_ID = T.TABLESPACE_ID AND T.TENANT_ID = TP.TENANT_ID AND TP.TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(DB.DATABASE_NAME AS VARCHAR2(128)) AS OWNER, CAST(T.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(TP.TABLESPACE_NAME AS VARCHAR2(30)) AS TABLESPACE_NAME, CAST(NULL AS VARCHAR2(128)) AS CLUSTER_NAME, CAST(NULL AS VARCHAR2(128)) AS IOT_NAME, CAST('VALID' AS VARCHAR2(8)) AS STATUS, CAST(T."PCTFREE" AS NUMBER) AS PCT_FREE, CAST(NULL AS NUMBER) AS PCT_USED, CAST(NULL AS NUMBER) AS INI_TRANS, CAST(NULL AS NUMBER) AS MAX_TRANS, CAST(NULL AS NUMBER) AS INITIAL_EXTENT, CAST(NULL AS NUMBER) AS NEXT_EXTENT, CAST(NULL AS NUMBER) AS MIN_EXTENTS, CAST(NULL AS NUMBER) AS MAX_EXTENTS, CAST(NULL AS NUMBER) AS PCT_INCREASE, CAST(NULL AS NUMBER) AS FREELISTS, CAST(NULL AS NUMBER) AS FREELIST_GROUPS, CAST(NULL AS VARCHAR2(3)) AS LOGGING, CAST(NULL AS VARCHAR2(1)) AS BACKED_UP, CAST(INFO.ROW_COUNT AS NUMBER) AS NUM_ROWS, CAST(NULL AS NUMBER) AS BLOCKS, CAST(NULL AS NUMBER) AS EMPTY_BLOCKS, CAST(NULL AS NUMBER) AS AVG_SPACE, CAST(NULL AS NUMBER) AS CHAIN_CNT, CAST(NULL AS NUMBER) AS AVG_ROW_LEN, CAST(NULL AS NUMBER) AS AVG_SPACE_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS NUM_FREELIST_BLOCKS, CAST(NULL AS VARCHAR2(10)) AS DEGREE, CAST(NULL AS VARCHAR2(10)) AS INSTANCES, CAST(NULL AS VARCHAR2(5)) AS CACHE, CAST(NULL AS VARCHAR2(8)) AS TABLE_LOCK, CAST(NULL AS NUMBER) AS SAMPLE_SIZE, CAST(NULL AS DATE) AS LAST_ANALYZED, CAST( CASE WHEN T.PART_LEVEL = 0 THEN 'NO' ELSE 'YES' END AS VARCHAR2(3)) AS PARTITIONED, CAST(NULL AS VARCHAR2(12)) AS IOT_TYPE, CAST(DECODE (T.TABLE_TYPE, 8, 'Y', 9, 'Y', 'N') AS VARCHAR2(1)) AS TEMPORARY, CAST(NULL AS VARCHAR2(1)) AS SECONDARY, CAST('NO' AS VARCHAR2(3)) AS NESTED, CAST(NULL AS VARCHAR2(7)) AS BUFFER_POOL, CAST(NULL AS VARCHAR2(7)) AS FLASH_CACHE, CAST(NULL AS VARCHAR2(7)) AS CELL_FLASH_CACHE, CAST(NULL AS VARCHAR2(8)) AS ROW_MOVEMENT, CAST(NULL AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(NULL AS VARCHAR2(3)) AS USER_STATS, CAST(DECODE (T.TABLE_TYPE, 8, 'SYS$SESSION', 9, 'SYS$TRANSACTION', NULL) AS VARCHAR2(15)) AS DURATION, CAST(NULL AS VARCHAR2(8)) AS SKIP_CORRUPT, CAST(NULL AS VARCHAR2(3)) AS MONITORING, CAST(NULL AS VARCHAR2(128)) AS CLUSTER_OWNER, CAST(NULL AS VARCHAR2(8)) AS DEPENDENCIES, CAST(NULL AS VARCHAR2(8)) AS COMPRESSION, CAST(NULL AS VARCHAR2(30)) AS COMPRESS_FOR, CAST(CASE WHEN DB.IN_RECYCLEBIN = 1 THEN 'YES' ELSE 'NO' END AS VARCHAR2(3)) AS DROPPED, CAST(NULL AS VARCHAR2(3)) AS READ_ONLY, CAST(NULL AS VARCHAR2(3)) AS SEGMENT_CREATED, CAST(NULL AS VARCHAR2(7)) AS RESULT_CACHE, CAST(NULL AS VARCHAR2(3)) AS CLUSTERING, CAST(NULL AS VARCHAR2(23)) AS ACTIVITY_TRACKING, CAST(NULL AS VARCHAR2(25)) AS DML_TIMESTAMP, CAST(NULL AS VARCHAR2(3)) AS HAS_IDENTITY, CAST(NULL AS VARCHAR2(3)) AS CONTAINER_DATA, CAST(NULL AS VARCHAR2(8)) AS INMEMORY, CAST(NULL AS VARCHAR2(8)) AS INMEMORY_PRIORITY, CAST(NULL AS VARCHAR2(15)) AS INMEMORY_DISTRIBUTE, CAST(NULL AS VARCHAR2(17)) AS INMEMORY_COMPRESSION, CAST(NULL AS VARCHAR2(13)) AS INMEMORY_DUPLICATE, CAST(NULL AS VARCHAR2(100)) AS DEFAULT_COLLATION, CAST(NULL AS VARCHAR2(1)) AS DUPLICATED, CAST(NULL AS VARCHAR2(1)) AS SHARDED, CAST(NULL AS VARCHAR2(1)) AS EXTERNALLY_SHARDED, CAST(NULL AS VARCHAR2(1)) AS EXTERNALLY_DUPLICATED, CAST(NULL AS VARCHAR2(3)) AS EXTERNAL, CAST(NULL AS VARCHAR2(3)) AS HYBRID, CAST(NULL AS VARCHAR2(24)) AS CELLMEMORY, CAST(NULL AS VARCHAR2(3)) AS CONTAINERS_DEFAULT, CAST(NULL AS VARCHAR2(3)) AS CONTAINER_MAP, CAST(NULL AS VARCHAR2(3)) AS EXTENDED_DATA_LINK, CAST(NULL AS VARCHAR2(3)) AS EXTENDED_DATA_LINK_MAP, CAST(NULL AS VARCHAR2(12)) AS INMEMORY_SERVICE, CAST(NULL AS VARCHAR2(1000)) AS INMEMORY_SERVICE_NAME, CAST(NULL AS VARCHAR2(3)) AS CONTAINER_MAP_OBJECT, CAST(NULL AS VARCHAR2(8)) AS MEMOPTIMIZE_READ, CAST(NULL AS VARCHAR2(8)) AS MEMOPTIMIZE_WRITE, CAST(NULL AS VARCHAR2(3)) AS HAS_SENSITIVE_COLUMN, CAST(NULL AS VARCHAR2(3)) AS ADMIT_NULL, CAST(NULL AS VARCHAR2(3)) AS DATA_LINK_DML_ENABLED, CAST(NULL AS VARCHAR2(8)) AS LOGICAL_REPLICATION FROM (SELECT TENANT_ID, TABLE_ID, SUM(ROW_CNT) AS ROW_COUNT FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT TS WHERE TS.TENANT_ID = EFFECTIVE_TENANT_ID() GROUP BY TENANT_ID, TABLE_ID ) INFO RIGHT JOIN (SELECT TENANT_ID, TABLE_ID, TABLE_NAME, DATABASE_ID, "PCTFREE", PART_LEVEL, TABLE_TYPE, TABLESPACE_ID FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, TABLE_NAME, DATABASE_ID, "PCTFREE", PART_LEVEL, TABLE_TYPE, TABLESPACE_ID FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() AND TABLE_TYPE != 12 AND TABLE_TYPE != 13 ) T ON T.TENANT_ID = INFO.TENANT_ID AND T.TABLE_ID = INFO.TABLE_ID AND INFO.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB ON DB.TENANT_ID = T.TENANT_ID AND DB.DATABASE_ID = T.DATABASE_ID AND T.TABLE_TYPE IN (0, 3, 8, 9, 14) AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.DATABASE_NAME != '__recyclebin' LEFT JOIN SYS.ALL_VIRTUAL_TENANT_TABLESPACE_REAL_AGENT TP ON TP.TABLESPACE_ID = T.TABLESPACE_ID AND T.TENANT_ID = TP.TENANT_ID AND TP.TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1460,7 +1460,7 @@ int ObInnerTableSchema::user_tables_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 CAST(T.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(TP.TABLESPACE_NAME AS VARCHAR2(30)) AS TABLESPACE_NAME, CAST(NULL AS VARCHAR2(128)) AS CLUSTER_NAME, CAST(NULL AS VARCHAR2(128)) AS IOT_NAME, CAST('VALID' AS VARCHAR2(8)) AS STATUS, CAST(T."PCTFREE" AS NUMBER) AS PCT_FREE, CAST(NULL AS NUMBER) AS PCT_USED, CAST(NULL AS NUMBER) AS INI_TRANS, CAST(NULL AS NUMBER) AS MAX_TRANS, CAST(NULL AS NUMBER) AS INITIAL_EXTENT, CAST(NULL AS NUMBER) AS NEXT_EXTENT, CAST(NULL AS NUMBER) AS MIN_EXTENTS, CAST(NULL AS NUMBER) AS MAX_EXTENTS, CAST(NULL AS NUMBER) AS PCT_INCREASE, CAST(NULL AS NUMBER) AS FREELISTS, CAST(NULL AS NUMBER) AS FREELIST_GROUPS, CAST(NULL AS VARCHAR2(3)) AS LOGGING, CAST(NULL AS VARCHAR2(1)) AS BACKED_UP, CAST(INFO.ROW_COUNT AS NUMBER) AS NUM_ROWS, CAST(NULL AS NUMBER) AS BLOCKS, CAST(NULL AS NUMBER) AS EMPTY_BLOCKS, CAST(NULL AS NUMBER) AS AVG_SPACE, CAST(NULL AS NUMBER) AS CHAIN_CNT, CAST(NULL AS NUMBER) AS AVG_ROW_LEN, CAST(NULL AS NUMBER) AS AVG_SPACE_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS NUM_FREELIST_BLOCKS, CAST(NULL AS VARCHAR2(10)) AS DEGREE, CAST(NULL AS VARCHAR2(10)) AS INSTANCES, CAST(NULL AS VARCHAR2(5)) AS CACHE, CAST(NULL AS VARCHAR2(8)) AS TABLE_LOCK, CAST(NULL AS NUMBER) AS SAMPLE_SIZE, CAST(NULL AS DATE) AS LAST_ANALYZED, CAST( CASE WHEN T.PART_LEVEL = 0 THEN 'NO' ELSE 'YES' END AS VARCHAR2(3)) AS PARTITIONED, CAST(NULL AS VARCHAR2(12)) AS IOT_TYPE, CAST(DECODE (T.TABLE_TYPE, 8, 'Y', 9, 'Y', 'N') AS VARCHAR2(1)) AS TEMPORARY, CAST(NULL AS VARCHAR2(1)) AS SECONDARY, CAST('NO' AS VARCHAR2(3)) AS NESTED, CAST(NULL AS VARCHAR2(7)) AS BUFFER_POOL, CAST(NULL AS VARCHAR2(7)) AS FLASH_CACHE, CAST(NULL AS VARCHAR2(7)) AS CELL_FLASH_CACHE, CAST(NULL AS VARCHAR2(8)) AS ROW_MOVEMENT, CAST(NULL AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(NULL AS VARCHAR2(3)) AS USER_STATS, CAST(DECODE (T.TABLE_TYPE, 8, 'SYS$SESSION', 9, 'SYS$TRANSACTION', NULL) AS VARCHAR2(15)) AS DURATION, CAST(NULL AS VARCHAR2(8)) AS SKIP_CORRUPT, CAST(NULL AS VARCHAR2(3)) AS MONITORING, CAST(NULL AS VARCHAR2(128)) AS CLUSTER_OWNER, CAST(NULL AS VARCHAR2(8)) AS DEPENDENCIES, CAST(NULL AS VARCHAR2(8)) AS COMPRESSION, CAST(NULL AS VARCHAR2(30)) AS COMPRESS_FOR, CAST(CASE WHEN DB.IN_RECYCLEBIN = 1 THEN 'YES' ELSE 'NO' END AS VARCHAR2(3)) AS DROPPED, CAST(NULL AS VARCHAR2(3)) AS READ_ONLY, CAST(NULL AS VARCHAR2(3)) AS SEGMENT_CREATED, CAST(NULL AS VARCHAR2(7)) AS RESULT_CACHE, CAST(NULL AS VARCHAR2(3)) AS CLUSTERING, CAST(NULL AS VARCHAR2(23)) AS ACTIVITY_TRACKING, CAST(NULL AS VARCHAR2(25)) AS DML_TIMESTAMP, CAST(NULL AS VARCHAR2(3)) AS HAS_IDENTITY, CAST(NULL AS VARCHAR2(3)) AS CONTAINER_DATA, CAST(NULL AS VARCHAR2(8)) AS INMEMORY, CAST(NULL AS VARCHAR2(8)) AS INMEMORY_PRIORITY, CAST(NULL AS VARCHAR2(15)) AS INMEMORY_DISTRIBUTE, CAST(NULL AS VARCHAR2(17)) AS INMEMORY_COMPRESSION, CAST(NULL AS VARCHAR2(13)) AS INMEMORY_DUPLICATE, CAST(NULL AS VARCHAR2(100)) AS DEFAULT_COLLATION, CAST(NULL AS VARCHAR2(1)) AS DUPLICATED, CAST(NULL AS VARCHAR2(1)) AS SHARDED, CAST(NULL AS VARCHAR2(1)) AS EXTERNALLY_SHARDED, CAST(NULL AS VARCHAR2(1)) AS EXTERNALLY_DUPLICATED, CAST(NULL AS VARCHAR2(3)) AS EXTERNAL, CAST(NULL AS VARCHAR2(3)) AS HYBRID, CAST(NULL AS VARCHAR2(24)) AS CELLMEMORY, CAST(NULL AS VARCHAR2(3)) AS CONTAINERS_DEFAULT, CAST(NULL AS VARCHAR2(3)) AS CONTAINER_MAP, CAST(NULL AS VARCHAR2(3)) AS EXTENDED_DATA_LINK, CAST(NULL AS VARCHAR2(3)) AS EXTENDED_DATA_LINK_MAP, CAST(NULL AS VARCHAR2(12)) AS INMEMORY_SERVICE, CAST(NULL AS VARCHAR2(1000)) AS INMEMORY_SERVICE_NAME, CAST(NULL AS VARCHAR2(3)) AS CONTAINER_MAP_OBJECT, CAST(NULL AS VARCHAR2(8)) AS MEMOPTIMIZE_READ, CAST(NULL AS VARCHAR2(8)) AS MEMOPTIMIZE_WRITE, CAST(NULL AS VARCHAR2(3)) AS HAS_SENSITIVE_COLUMN, CAST(NULL AS VARCHAR2(3)) AS ADMIT_NULL, CAST(NULL AS VARCHAR2(3)) AS DATA_LINK_DML_ENABLED, CAST(NULL AS VARCHAR2(8)) AS LOGICAL_REPLICATION FROM (SELECT TENANT_ID, TABLE_ID, SUM(ROW_CNT) AS ROW_COUNT FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT TS WHERE TS.TENANT_ID = EFFECTIVE_TENANT_ID() GROUP BY TENANT_ID, TABLE_ID ) INFO RIGHT JOIN (SELECT TENANT_ID, TABLE_ID, TABLE_NAME, DATABASE_ID, "PCTFREE", PART_LEVEL, TABLE_TYPE, TABLESPACE_ID FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, TABLE_NAME, DATABASE_ID, "PCTFREE", PART_LEVEL, TABLE_TYPE, TABLESPACE_ID FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() AND TABLE_TYPE != 12 AND TABLE_TYPE != 13 ) T ON T.TENANT_ID = INFO.TENANT_ID AND T.TABLE_ID = INFO.TABLE_ID AND INFO.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB ON DB.TENANT_ID = T.TENANT_ID AND DB.DATABASE_ID = T.DATABASE_ID AND T.TABLE_TYPE IN (0, 3, 8, 9) AND T.DATABASE_ID = USERENV('SCHEMAID') AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.DATABASE_NAME != '__recyclebin' LEFT JOIN SYS.ALL_VIRTUAL_TENANT_TABLESPACE_REAL_AGENT TP ON TP.TABLESPACE_ID = T.TABLESPACE_ID AND T.TENANT_ID = TP.TENANT_ID AND TP.TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(T.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(TP.TABLESPACE_NAME AS VARCHAR2(30)) AS TABLESPACE_NAME, CAST(NULL AS VARCHAR2(128)) AS CLUSTER_NAME, CAST(NULL AS VARCHAR2(128)) AS IOT_NAME, CAST('VALID' AS VARCHAR2(8)) AS STATUS, CAST(T."PCTFREE" AS NUMBER) AS PCT_FREE, CAST(NULL AS NUMBER) AS PCT_USED, CAST(NULL AS NUMBER) AS INI_TRANS, CAST(NULL AS NUMBER) AS MAX_TRANS, CAST(NULL AS NUMBER) AS INITIAL_EXTENT, CAST(NULL AS NUMBER) AS NEXT_EXTENT, CAST(NULL AS NUMBER) AS MIN_EXTENTS, CAST(NULL AS NUMBER) AS MAX_EXTENTS, CAST(NULL AS NUMBER) AS PCT_INCREASE, CAST(NULL AS NUMBER) AS FREELISTS, CAST(NULL AS NUMBER) AS FREELIST_GROUPS, CAST(NULL AS VARCHAR2(3)) AS LOGGING, CAST(NULL AS VARCHAR2(1)) AS BACKED_UP, CAST(INFO.ROW_COUNT AS NUMBER) AS NUM_ROWS, CAST(NULL AS NUMBER) AS BLOCKS, CAST(NULL AS NUMBER) AS EMPTY_BLOCKS, CAST(NULL AS NUMBER) AS AVG_SPACE, CAST(NULL AS NUMBER) AS CHAIN_CNT, CAST(NULL AS NUMBER) AS AVG_ROW_LEN, CAST(NULL AS NUMBER) AS AVG_SPACE_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS NUM_FREELIST_BLOCKS, CAST(NULL AS VARCHAR2(10)) AS DEGREE, CAST(NULL AS VARCHAR2(10)) AS INSTANCES, CAST(NULL AS VARCHAR2(5)) AS CACHE, CAST(NULL AS VARCHAR2(8)) AS TABLE_LOCK, CAST(NULL AS NUMBER) AS SAMPLE_SIZE, CAST(NULL AS DATE) AS LAST_ANALYZED, CAST( CASE WHEN T.PART_LEVEL = 0 THEN 'NO' ELSE 'YES' END AS VARCHAR2(3)) AS PARTITIONED, CAST(NULL AS VARCHAR2(12)) AS IOT_TYPE, CAST(DECODE (T.TABLE_TYPE, 8, 'Y', 9, 'Y', 'N') AS VARCHAR2(1)) AS TEMPORARY, CAST(NULL AS VARCHAR2(1)) AS SECONDARY, CAST('NO' AS VARCHAR2(3)) AS NESTED, CAST(NULL AS VARCHAR2(7)) AS BUFFER_POOL, CAST(NULL AS VARCHAR2(7)) AS FLASH_CACHE, CAST(NULL AS VARCHAR2(7)) AS CELL_FLASH_CACHE, CAST(NULL AS VARCHAR2(8)) AS ROW_MOVEMENT, CAST(NULL AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(NULL AS VARCHAR2(3)) AS USER_STATS, CAST(DECODE (T.TABLE_TYPE, 8, 'SYS$SESSION', 9, 'SYS$TRANSACTION', NULL) AS VARCHAR2(15)) AS DURATION, CAST(NULL AS VARCHAR2(8)) AS SKIP_CORRUPT, CAST(NULL AS VARCHAR2(3)) AS MONITORING, CAST(NULL AS VARCHAR2(128)) AS CLUSTER_OWNER, CAST(NULL AS VARCHAR2(8)) AS DEPENDENCIES, CAST(NULL AS VARCHAR2(8)) AS COMPRESSION, CAST(NULL AS VARCHAR2(30)) AS COMPRESS_FOR, CAST(CASE WHEN DB.IN_RECYCLEBIN = 1 THEN 'YES' ELSE 'NO' END AS VARCHAR2(3)) AS DROPPED, CAST(NULL AS VARCHAR2(3)) AS READ_ONLY, CAST(NULL AS VARCHAR2(3)) AS SEGMENT_CREATED, CAST(NULL AS VARCHAR2(7)) AS RESULT_CACHE, CAST(NULL AS VARCHAR2(3)) AS CLUSTERING, CAST(NULL AS VARCHAR2(23)) AS ACTIVITY_TRACKING, CAST(NULL AS VARCHAR2(25)) AS DML_TIMESTAMP, CAST(NULL AS VARCHAR2(3)) AS HAS_IDENTITY, CAST(NULL AS VARCHAR2(3)) AS CONTAINER_DATA, CAST(NULL AS VARCHAR2(8)) AS INMEMORY, CAST(NULL AS VARCHAR2(8)) AS INMEMORY_PRIORITY, CAST(NULL AS VARCHAR2(15)) AS INMEMORY_DISTRIBUTE, CAST(NULL AS VARCHAR2(17)) AS INMEMORY_COMPRESSION, CAST(NULL AS VARCHAR2(13)) AS INMEMORY_DUPLICATE, CAST(NULL AS VARCHAR2(100)) AS DEFAULT_COLLATION, CAST(NULL AS VARCHAR2(1)) AS DUPLICATED, CAST(NULL AS VARCHAR2(1)) AS SHARDED, CAST(NULL AS VARCHAR2(1)) AS EXTERNALLY_SHARDED, CAST(NULL AS VARCHAR2(1)) AS EXTERNALLY_DUPLICATED, CAST(NULL AS VARCHAR2(3)) AS EXTERNAL, CAST(NULL AS VARCHAR2(3)) AS HYBRID, CAST(NULL AS VARCHAR2(24)) AS CELLMEMORY, CAST(NULL AS VARCHAR2(3)) AS CONTAINERS_DEFAULT, CAST(NULL AS VARCHAR2(3)) AS CONTAINER_MAP, CAST(NULL AS VARCHAR2(3)) AS EXTENDED_DATA_LINK, CAST(NULL AS VARCHAR2(3)) AS EXTENDED_DATA_LINK_MAP, CAST(NULL AS VARCHAR2(12)) AS INMEMORY_SERVICE, CAST(NULL AS VARCHAR2(1000)) AS INMEMORY_SERVICE_NAME, CAST(NULL AS VARCHAR2(3)) AS CONTAINER_MAP_OBJECT, CAST(NULL AS VARCHAR2(8)) AS MEMOPTIMIZE_READ, CAST(NULL AS VARCHAR2(8)) AS MEMOPTIMIZE_WRITE, CAST(NULL AS VARCHAR2(3)) AS HAS_SENSITIVE_COLUMN, CAST(NULL AS VARCHAR2(3)) AS ADMIT_NULL, CAST(NULL AS VARCHAR2(3)) AS DATA_LINK_DML_ENABLED, CAST(NULL AS VARCHAR2(8)) AS LOGICAL_REPLICATION FROM (SELECT TENANT_ID, TABLE_ID, SUM(ROW_CNT) AS ROW_COUNT FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT TS WHERE TS.TENANT_ID = EFFECTIVE_TENANT_ID() GROUP BY TENANT_ID, TABLE_ID ) INFO RIGHT JOIN (SELECT TENANT_ID, TABLE_ID, TABLE_NAME, DATABASE_ID, "PCTFREE", PART_LEVEL, TABLE_TYPE, TABLESPACE_ID FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, TABLE_NAME, DATABASE_ID, "PCTFREE", PART_LEVEL, TABLE_TYPE, TABLESPACE_ID FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() AND TABLE_TYPE != 12 AND TABLE_TYPE != 13 ) T ON T.TENANT_ID = INFO.TENANT_ID AND T.TABLE_ID = INFO.TABLE_ID AND INFO.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB ON DB.TENANT_ID = T.TENANT_ID AND DB.DATABASE_ID = T.DATABASE_ID AND T.TABLE_TYPE IN (0, 3, 8, 9, 14) AND T.DATABASE_ID = USERENV('SCHEMAID') AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.DATABASE_NAME != '__recyclebin' LEFT JOIN SYS.ALL_VIRTUAL_TENANT_TABLESPACE_REAL_AGENT TP ON TP.TABLESPACE_ID = T.TABLESPACE_ID AND T.TENANT_ID = TP.TENANT_ID AND TP.TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1510,7 +1510,7 @@ int ObInnerTableSchema::dba_tab_comments_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 A.DATABASE_NAME AS OWNER, CAST(B.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(CASE WHEN TABLE_TYPE = 0 OR TABLE_TYPE = 2 OR TABLE_TYPE = 3 OR TABLE_TYPE = 8 OR TABLE_TYPE = 9 THEN 'TABLE' WHEN TABLE_TYPE = 1 OR TABLE_TYPE = 4 OR TABLE_TYPE = 7 THEN 'VIEW' ELSE NULL END AS VARCHAR2(11)) AS TABLE_TYPE, CAST(B."COMMENT" AS VARCHAR(4000)) AS COMMENTS FROM SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT A JOIN SYS.ALL_VIRTUAL_TABLE_REAL_AGENT B ON A.DATABASE_ID = B.DATABASE_ID AND A.TENANT_ID = EFFECTIVE_TENANT_ID() AND B.TENANT_ID = EFFECTIVE_TENANT_ID() AND B.TABLE_TYPE != 5 AND B.TABLE_TYPE != 12 AND B.TABLE_TYPE != 13 )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT A.DATABASE_NAME AS OWNER, CAST(B.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(CASE WHEN TABLE_TYPE = 0 OR TABLE_TYPE = 2 OR TABLE_TYPE = 3 OR TABLE_TYPE = 8 OR TABLE_TYPE = 9 THEN 'TABLE' WHEN TABLE_TYPE = 1 OR TABLE_TYPE = 4 OR TABLE_TYPE = 7 THEN 'VIEW' WHEN TABLE_TYPE = 14 THEN 'EXTERNAL_TABLE' ELSE NULL END AS VARCHAR2(11)) AS TABLE_TYPE, CAST(B."COMMENT" AS VARCHAR(4000)) AS COMMENTS FROM SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT A JOIN SYS.ALL_VIRTUAL_TABLE_REAL_AGENT B ON A.DATABASE_ID = B.DATABASE_ID AND A.TENANT_ID = EFFECTIVE_TENANT_ID() AND B.TENANT_ID = EFFECTIVE_TENANT_ID() AND B.TABLE_TYPE != 5 AND B.TABLE_TYPE != 12 AND B.TABLE_TYPE != 13 )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1560,7 +1560,7 @@ int ObInnerTableSchema::all_tab_comments_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 A.DATABASE_NAME AS OWNER, CAST(B.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(CASE WHEN TABLE_TYPE = 0 OR TABLE_TYPE = 2 OR TABLE_TYPE = 3 OR TABLE_TYPE = 8 OR TABLE_TYPE = 9 THEN 'TABLE' WHEN TABLE_TYPE = 1 OR TABLE_TYPE = 4 OR TABLE_TYPE = 7 THEN 'VIEW' ELSE NULL END AS VARCHAR2(11)) AS TABLE_TYPE, CAST(B."COMMENT" AS VARCHAR(4000)) AS COMMENTS FROM SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT A JOIN SYS.ALL_VIRTUAL_TABLE_REAL_AGENT B ON A.DATABASE_ID = B.DATABASE_ID AND A.TENANT_ID = EFFECTIVE_TENANT_ID() AND B.TENANT_ID = EFFECTIVE_TENANT_ID() AND B.TABLE_TYPE != 5 AND B.TABLE_TYPE != 12 AND B.TABLE_TYPE != 13 AND (A.DATABASE_ID = USERENV('SCHEMAID') OR USER_CAN_ACCESS_OBJ(1, TABLE_ID, A.DATABASE_ID) = 1) )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT A.DATABASE_NAME AS OWNER, CAST(B.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(CASE WHEN TABLE_TYPE = 0 OR TABLE_TYPE = 2 OR TABLE_TYPE = 3 OR TABLE_TYPE = 8 OR TABLE_TYPE = 9 THEN 'TABLE' WHEN TABLE_TYPE = 1 OR TABLE_TYPE = 4 OR TABLE_TYPE = 7 THEN 'VIEW' WHEN TABLE_TYPE = 14 THEN 'EXTERNAL_TABLE' ELSE NULL END AS VARCHAR2(11)) AS TABLE_TYPE, CAST(B."COMMENT" AS VARCHAR(4000)) AS COMMENTS FROM SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT A JOIN SYS.ALL_VIRTUAL_TABLE_REAL_AGENT B ON A.DATABASE_ID = B.DATABASE_ID AND A.TENANT_ID = EFFECTIVE_TENANT_ID() AND B.TENANT_ID = EFFECTIVE_TENANT_ID() AND B.TABLE_TYPE != 5 AND B.TABLE_TYPE != 12 AND B.TABLE_TYPE != 13 AND (A.DATABASE_ID = USERENV('SCHEMAID') OR USER_CAN_ACCESS_OBJ(1, TABLE_ID, A.DATABASE_ID) = 1) )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1610,7 +1610,7 @@ int ObInnerTableSchema::user_tab_comments_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 CAST(B.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(CASE WHEN TABLE_TYPE = 0 OR TABLE_TYPE = 2 OR TABLE_TYPE = 3 OR TABLE_TYPE = 8 OR TABLE_TYPE = 9 THEN 'TABLE' WHEN TABLE_TYPE = 1 OR TABLE_TYPE = 4 OR TABLE_TYPE = 7 THEN 'VIEW' ELSE NULL END AS VARCHAR2(11)) AS TABLE_TYPE, CAST(B."COMMENT" AS VARCHAR(4000)) AS COMMENTS FROM SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT A JOIN SYS.ALL_VIRTUAL_TABLE_REAL_AGENT B ON A.DATABASE_ID = B.DATABASE_ID AND A.TENANT_ID = EFFECTIVE_TENANT_ID() AND B.TENANT_ID = EFFECTIVE_TENANT_ID() AND B.TABLE_TYPE != 5 AND B.TABLE_TYPE != 12 AND B.TABLE_TYPE != 13 AND A.DATABASE_NAME = SYS_CONTEXT('USERENV','CURRENT_USER') )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(B.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(CASE WHEN TABLE_TYPE = 0 OR TABLE_TYPE = 2 OR TABLE_TYPE = 3 OR TABLE_TYPE = 8 OR TABLE_TYPE = 9 THEN 'TABLE' WHEN TABLE_TYPE = 1 OR TABLE_TYPE = 4 OR TABLE_TYPE = 7 THEN 'VIEW' WHEN TABLE_TYPE = 14 THEN 'EXTERNAL_TABLE' ELSE NULL END AS VARCHAR2(11)) AS TABLE_TYPE, CAST(B."COMMENT" AS VARCHAR(4000)) AS COMMENTS FROM SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT A JOIN SYS.ALL_VIRTUAL_TABLE_REAL_AGENT B ON A.DATABASE_ID = B.DATABASE_ID AND A.TENANT_ID = EFFECTIVE_TENANT_ID() AND B.TENANT_ID = EFFECTIVE_TENANT_ID() AND B.TABLE_TYPE != 5 AND B.TABLE_TYPE != 12 AND B.TABLE_TYPE != 13 AND A.DATABASE_NAME = SYS_CONTEXT('USERENV','CURRENT_USER') )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.25051_25100.cpp b/src/share/inner_table/ob_inner_table_schema.25051_25100.cpp index 861cd8029..83f0c0f25 100644 --- a/src/share/inner_table/ob_inner_table_schema.25051_25100.cpp +++ b/src/share/inner_table/ob_inner_table_schema.25051_25100.cpp @@ -1860,7 +1860,7 @@ int ObInnerTableSchema::all_all_tables_ora_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 CAST(DB.DATABASE_NAME AS VARCHAR2(128)) AS OWNER, CAST(T.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(NULL AS VARCHAR2(30)) AS TABLESPACE_NAME, CAST(NULL AS VARCHAR2(128)) AS CLUSTER_NAME, CAST(NULL AS VARCHAR2(128)) AS IOT_NAME, CAST('VALID' AS VARCHAR2(8)) AS STATUS, CAST(T."PCTFREE" AS NUMBER) AS PCT_FREE, CAST(NULL AS NUMBER) AS PCT_USED, CAST(NULL AS NUMBER) AS INI_TRANS, CAST(NULL AS NUMBER) AS MAX_TRANS, CAST(NULL AS NUMBER) AS INITIAL_EXTENT, CAST(NULL AS NUMBER) AS NEXT_EXTENT, CAST(NULL AS NUMBER) AS MIN_EXTENTS, CAST(NULL AS NUMBER) AS MAX_EXTENTS, CAST(NULL AS NUMBER) AS PCT_INCREASE, CAST(NULL AS NUMBER) AS FREELISTS, CAST(NULL AS NUMBER) AS FREELIST_GROUPS, CAST(NULL AS VARCHAR2(3)) AS LOGGING, CAST(NULL AS VARCHAR2(1)) AS BACKED_UP, CAST(INFO.ROW_COUNT AS NUMBER) AS NUM_ROWS, CAST(NULL AS NUMBER) AS BLOCKS, CAST(NULL AS NUMBER) AS EMPTY_BLOCKS, CAST(NULL AS NUMBER) AS AVG_SPACE, CAST(NULL AS NUMBER) AS CHAIN_CNT, CAST(NULL AS NUMBER) AS AVG_ROW_LEN, CAST(NULL AS NUMBER) AS AVG_SPACE_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS NUM_FREELIST_BLOCKS, CAST(NULL AS VARCHAR2(10)) AS DEGREE, CAST(NULL AS VARCHAR2(10)) AS INSTANCES, CAST(NULL AS VARCHAR2(5)) AS CACHE, CAST(NULL AS VARCHAR2(8)) AS TABLE_LOCK, CAST(NULL AS NUMBER) AS SAMPLE_SIZE, CAST(NULL AS DATE) AS LAST_ANALYZED, CAST( CASE WHEN T.PART_LEVEL = 0 THEN 'NO' ELSE 'YES' END AS VARCHAR2(3)) AS PARTITIONED, CAST(NULL AS VARCHAR2(12)) AS IOT_TYPE, CAST(NULL AS VARCHAR2(16)) AS OBJECT_ID_TYPE, CAST(NULL AS VARCHAR2(128)) AS TABLE_TYPE_OWNER, CAST(NULL AS VARCHAR2(128)) AS TABLE_TYPE, CAST(DECODE (T.TABLE_TYPE, 8, 'YES', 9, 'YES', 'NO') AS VARCHAR2(1)) AS TEMPORARY, CAST(NULL AS VARCHAR2(1)) AS SECONDARY, CAST(NULL AS VARCHAR2(3)) AS NESTED, CAST(NULL AS VARCHAR2(7)) AS BUFFER_POOL, CAST(NULL AS VARCHAR2(7)) AS FLASH_CACHE, CAST(NULL AS VARCHAR2(7)) AS CELL_FLASH_CACHE, CAST(NULL AS VARCHAR2(8)) AS ROW_MOVEMENT, CAST(NULL AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(NULL AS VARCHAR2(3)) AS USER_STATS, CAST( DECODE (T.TABLE_TYPE, 8, 'SYS$SESSION', 9, 'SYS$TRANSACTION', NULL) AS VARCHAR2(15)) AS DURATION, CAST(NULL AS VARCHAR2(8)) AS SKIP_CORRUPT, CAST(NULL AS VARCHAR2(3)) AS MONITORING, CAST(NULL AS VARCHAR2(30)) AS CLUSTER_OWNER, CAST(NULL AS VARCHAR2(8)) AS DEPENDENCIES, CAST(NULL AS VARCHAR2(8)) AS COMPRESSION, CAST(NULL AS VARCHAR2(30)) AS COMPRESS_FOR, CAST(CASE WHEN DB.IN_RECYCLEBIN = 1 THEN 'YES' ELSE 'NO' END AS VARCHAR2(3)) AS DROPPED, CAST(NULL AS VARCHAR2(3)) AS SEGMENT_CREATED, CAST(NULL AS VARCHAR2(8)) AS INMEMORY, CAST(NULL AS VARCHAR2(8)) AS INMEMORY_PRIORITY, CAST(NULL AS VARCHAR2(15)) AS INMEMORY_DISTRIBUTE, CAST(NULL AS VARCHAR2(17)) AS INMEMORY_COMPRESSION, CAST(NULL AS VARCHAR2(13)) AS INMEMORY_DUPLICATE, CAST(NULL AS VARCHAR2(3)) AS EXTERNAL, CAST(NULL AS VARCHAR2(3)) AS HYBRID, CAST(NULL AS VARCHAR2(24)) AS CELLMEMORY, CAST(NULL AS VARCHAR2(12)) AS INMEMORY_SERVICE, CAST(NULL AS VARCHAR2(1000)) AS INMEMORY_SERVICE_NAME, CAST(NULL AS VARCHAR2(8)) AS MEMOPTIMIZE_READ, CAST(NULL AS VARCHAR2(8)) AS MEMOPTIMIZE_WRITE, CAST(NULL AS VARCHAR2(3)) AS HAS_SENSITIVE_COLUMN, CAST(NULL AS VARCHAR2(8)) AS LOGICAL_REPLICATION FROM ( SELECT TENANT_ID, TABLE_ID, SUM(ROW_CNT) AS ROW_COUNT FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT TS WHERE TS.TENANT_ID = EFFECTIVE_TENANT_ID() GROUP BY TENANT_ID, TABLE_ID ) INFO RIGHT JOIN (SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME, TABLE_TYPE, "PCTFREE", PART_LEVEL FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME, TABLE_TYPE, "PCTFREE", PART_LEVEL FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT) T ON T.TENANT_ID = INFO.TENANT_ID AND T.TABLE_ID = INFO.TABLE_ID JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB ON T.TENANT_ID = DB.TENANT_ID AND T.DATABASE_ID = DB.DATABASE_ID WHERE T.TENANT_ID = EFFECTIVE_TENANT_ID() AND T.TABLE_TYPE IN (0, 3, 8, 9) AND DB.DATABASE_NAME != '__recyclebin' AND (T.DATABASE_ID = USERENV('SCHEMAID') OR USER_CAN_ACCESS_OBJ(1, T.TABLE_ID, T.DATABASE_ID) = 1) )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(DB.DATABASE_NAME AS VARCHAR2(128)) AS OWNER, CAST(T.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(NULL AS VARCHAR2(30)) AS TABLESPACE_NAME, CAST(NULL AS VARCHAR2(128)) AS CLUSTER_NAME, CAST(NULL AS VARCHAR2(128)) AS IOT_NAME, CAST('VALID' AS VARCHAR2(8)) AS STATUS, CAST(T."PCTFREE" AS NUMBER) AS PCT_FREE, CAST(NULL AS NUMBER) AS PCT_USED, CAST(NULL AS NUMBER) AS INI_TRANS, CAST(NULL AS NUMBER) AS MAX_TRANS, CAST(NULL AS NUMBER) AS INITIAL_EXTENT, CAST(NULL AS NUMBER) AS NEXT_EXTENT, CAST(NULL AS NUMBER) AS MIN_EXTENTS, CAST(NULL AS NUMBER) AS MAX_EXTENTS, CAST(NULL AS NUMBER) AS PCT_INCREASE, CAST(NULL AS NUMBER) AS FREELISTS, CAST(NULL AS NUMBER) AS FREELIST_GROUPS, CAST(NULL AS VARCHAR2(3)) AS LOGGING, CAST(NULL AS VARCHAR2(1)) AS BACKED_UP, CAST(INFO.ROW_COUNT AS NUMBER) AS NUM_ROWS, CAST(NULL AS NUMBER) AS BLOCKS, CAST(NULL AS NUMBER) AS EMPTY_BLOCKS, CAST(NULL AS NUMBER) AS AVG_SPACE, CAST(NULL AS NUMBER) AS CHAIN_CNT, CAST(NULL AS NUMBER) AS AVG_ROW_LEN, CAST(NULL AS NUMBER) AS AVG_SPACE_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS NUM_FREELIST_BLOCKS, CAST(NULL AS VARCHAR2(10)) AS DEGREE, CAST(NULL AS VARCHAR2(10)) AS INSTANCES, CAST(NULL AS VARCHAR2(5)) AS CACHE, CAST(NULL AS VARCHAR2(8)) AS TABLE_LOCK, CAST(NULL AS NUMBER) AS SAMPLE_SIZE, CAST(NULL AS DATE) AS LAST_ANALYZED, CAST( CASE WHEN T.PART_LEVEL = 0 THEN 'NO' ELSE 'YES' END AS VARCHAR2(3)) AS PARTITIONED, CAST(NULL AS VARCHAR2(12)) AS IOT_TYPE, CAST(NULL AS VARCHAR2(16)) AS OBJECT_ID_TYPE, CAST(NULL AS VARCHAR2(128)) AS TABLE_TYPE_OWNER, CAST(NULL AS VARCHAR2(128)) AS TABLE_TYPE, CAST(DECODE (T.TABLE_TYPE, 8, 'YES', 9, 'YES', 'NO') AS VARCHAR2(1)) AS TEMPORARY, CAST(NULL AS VARCHAR2(1)) AS SECONDARY, CAST(NULL AS VARCHAR2(3)) AS NESTED, CAST(NULL AS VARCHAR2(7)) AS BUFFER_POOL, CAST(NULL AS VARCHAR2(7)) AS FLASH_CACHE, CAST(NULL AS VARCHAR2(7)) AS CELL_FLASH_CACHE, CAST(NULL AS VARCHAR2(8)) AS ROW_MOVEMENT, CAST(NULL AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(NULL AS VARCHAR2(3)) AS USER_STATS, CAST( DECODE (T.TABLE_TYPE, 8, 'SYS$SESSION', 9, 'SYS$TRANSACTION', NULL) AS VARCHAR2(15)) AS DURATION, CAST(NULL AS VARCHAR2(8)) AS SKIP_CORRUPT, CAST(NULL AS VARCHAR2(3)) AS MONITORING, CAST(NULL AS VARCHAR2(30)) AS CLUSTER_OWNER, CAST(NULL AS VARCHAR2(8)) AS DEPENDENCIES, CAST(NULL AS VARCHAR2(8)) AS COMPRESSION, CAST(NULL AS VARCHAR2(30)) AS COMPRESS_FOR, CAST(CASE WHEN DB.IN_RECYCLEBIN = 1 THEN 'YES' ELSE 'NO' END AS VARCHAR2(3)) AS DROPPED, CAST(NULL AS VARCHAR2(3)) AS SEGMENT_CREATED, CAST(NULL AS VARCHAR2(8)) AS INMEMORY, CAST(NULL AS VARCHAR2(8)) AS INMEMORY_PRIORITY, CAST(NULL AS VARCHAR2(15)) AS INMEMORY_DISTRIBUTE, CAST(NULL AS VARCHAR2(17)) AS INMEMORY_COMPRESSION, CAST(NULL AS VARCHAR2(13)) AS INMEMORY_DUPLICATE, CAST(NULL AS VARCHAR2(3)) AS EXTERNAL, CAST(NULL AS VARCHAR2(3)) AS HYBRID, CAST(NULL AS VARCHAR2(24)) AS CELLMEMORY, CAST(NULL AS VARCHAR2(12)) AS INMEMORY_SERVICE, CAST(NULL AS VARCHAR2(1000)) AS INMEMORY_SERVICE_NAME, CAST(NULL AS VARCHAR2(8)) AS MEMOPTIMIZE_READ, CAST(NULL AS VARCHAR2(8)) AS MEMOPTIMIZE_WRITE, CAST(NULL AS VARCHAR2(3)) AS HAS_SENSITIVE_COLUMN, CAST(NULL AS VARCHAR2(8)) AS LOGICAL_REPLICATION FROM ( SELECT TENANT_ID, TABLE_ID, SUM(ROW_CNT) AS ROW_COUNT FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT TS WHERE TS.TENANT_ID = EFFECTIVE_TENANT_ID() GROUP BY TENANT_ID, TABLE_ID ) INFO RIGHT JOIN (SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME, TABLE_TYPE, "PCTFREE", PART_LEVEL FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME, TABLE_TYPE, "PCTFREE", PART_LEVEL FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT) T ON T.TENANT_ID = INFO.TENANT_ID AND T.TABLE_ID = INFO.TABLE_ID JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB ON T.TENANT_ID = DB.TENANT_ID AND T.DATABASE_ID = DB.DATABASE_ID WHERE T.TENANT_ID = EFFECTIVE_TENANT_ID() AND T.TABLE_TYPE IN (0, 3, 8, 9, 14) AND DB.DATABASE_NAME != '__recyclebin' AND (T.DATABASE_ID = USERENV('SCHEMAID') OR USER_CAN_ACCESS_OBJ(1, T.TABLE_ID, T.DATABASE_ID) = 1) )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1960,7 +1960,7 @@ int ObInnerTableSchema::user_all_tables_ora_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 CAST(T.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(NULL AS VARCHAR2(30)) AS TABLESPACE_NAME, CAST(NULL AS VARCHAR2(128)) AS CLUSTER_NAME, CAST(NULL AS VARCHAR2(128)) AS IOT_NAME, CAST('VALID' AS VARCHAR2(8)) AS STATUS, CAST(T."PCTFREE" AS NUMBER) AS PCT_FREE, CAST(NULL AS NUMBER) AS PCT_USED, CAST(NULL AS NUMBER) AS INI_TRANS, CAST(NULL AS NUMBER) AS MAX_TRANS, CAST(NULL AS NUMBER) AS INITIAL_EXTENT, CAST(NULL AS NUMBER) AS NEXT_EXTENT, CAST(NULL AS NUMBER) AS MIN_EXTENTS, CAST(NULL AS NUMBER) AS MAX_EXTENTS, CAST(NULL AS NUMBER) AS PCT_INCREASE, CAST(NULL AS NUMBER) AS FREELISTS, CAST(NULL AS NUMBER) AS FREELIST_GROUPS, CAST(NULL AS VARCHAR2(3)) AS LOGGING, CAST(NULL AS VARCHAR2(1)) AS BACKED_UP, CAST(INFO.ROW_COUNT AS NUMBER) AS NUM_ROWS, CAST(NULL AS NUMBER) AS BLOCKS, CAST(NULL AS NUMBER) AS EMPTY_BLOCKS, CAST(NULL AS NUMBER) AS AVG_SPACE, CAST(NULL AS NUMBER) AS CHAIN_CNT, CAST(NULL AS NUMBER) AS AVG_ROW_LEN, CAST(NULL AS NUMBER) AS AVG_SPACE_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS NUM_FREELIST_BLOCKS, CAST(NULL AS VARCHAR2(10)) AS DEGREE, CAST(NULL AS VARCHAR2(10)) AS INSTANCES, CAST(NULL AS VARCHAR2(5)) AS CACHE, CAST(NULL AS VARCHAR2(8)) AS TABLE_LOCK, CAST(NULL AS NUMBER) AS SAMPLE_SIZE, CAST(NULL AS DATE) AS LAST_ANALYZED, CAST( CASE WHEN T.PART_LEVEL = 0 THEN 'NO' ELSE 'YES' END AS VARCHAR2(3)) AS PARTITIONED, CAST(NULL AS VARCHAR2(12)) AS IOT_TYPE, CAST(NULL AS VARCHAR2(16)) AS OBJECT_ID_TYPE, CAST(NULL AS VARCHAR2(128)) AS TABLE_TYPE_OWNER, CAST(NULL AS VARCHAR2(128)) AS TABLE_TYPE, CAST(DECODE (T.TABLE_TYPE, 8, 'YES', 9, 'YES', 'NO') AS VARCHAR2(1)) AS TEMPORARY, CAST(NULL AS VARCHAR2(1)) AS SECONDARY, CAST(NULL AS VARCHAR2(3)) AS NESTED, CAST(NULL AS VARCHAR2(7)) AS BUFFER_POOL, CAST(NULL AS VARCHAR2(7)) AS FLASH_CACHE, CAST(NULL AS VARCHAR2(7)) AS CELL_FLASH_CACHE, CAST(NULL AS VARCHAR2(8)) AS ROW_MOVEMENT, CAST(NULL AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(NULL AS VARCHAR2(3)) AS USER_STATS, CAST( DECODE (T.TABLE_TYPE, 8, 'SYS$SESSION', 9, 'SYS$TRANSACTION', NULL) AS VARCHAR2(15)) AS DURATION, CAST(NULL AS VARCHAR2(8)) AS SKIP_CORRUPT, CAST(NULL AS VARCHAR2(3)) AS MONITORING, CAST(NULL AS VARCHAR2(30)) AS CLUSTER_OWNER, CAST(NULL AS VARCHAR2(8)) AS DEPENDENCIES, CAST(NULL AS VARCHAR2(8)) AS COMPRESSION, CAST(NULL AS VARCHAR2(30)) AS COMPRESS_FOR, CAST(CASE WHEN DB.IN_RECYCLEBIN = 1 THEN 'YES' ELSE 'NO' END AS VARCHAR2(3)) AS DROPPED, CAST(NULL AS VARCHAR2(3)) AS SEGMENT_CREATED, CAST(NULL AS VARCHAR2(8)) AS INMEMORY, CAST(NULL AS VARCHAR2(8)) AS INMEMORY_PRIORITY, CAST(NULL AS VARCHAR2(15)) AS INMEMORY_DISTRIBUTE, CAST(NULL AS VARCHAR2(17)) AS INMEMORY_COMPRESSION, CAST(NULL AS VARCHAR2(13)) AS INMEMORY_DUPLICATE, CAST(NULL AS VARCHAR2(3)) AS EXTERNAL, CAST(NULL AS VARCHAR2(3)) AS HYBRID, CAST(NULL AS VARCHAR2(24)) AS CELLMEMORY, CAST(NULL AS VARCHAR2(12)) AS INMEMORY_SERVICE, CAST(NULL AS VARCHAR2(1000)) AS INMEMORY_SERVICE_NAME, CAST(NULL AS VARCHAR2(8)) AS MEMOPTIMIZE_READ, CAST(NULL AS VARCHAR2(8)) AS MEMOPTIMIZE_WRITE, CAST(NULL AS VARCHAR2(3)) AS HAS_SENSITIVE_COLUMN, CAST(NULL AS VARCHAR2(8)) AS LOGICAL_REPLICATION FROM ( SELECT TENANT_ID, TABLE_ID, SUM(ROW_CNT) AS ROW_COUNT FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT TS WHERE TS.TENANT_ID = EFFECTIVE_TENANT_ID() GROUP BY TENANT_ID, TABLE_ID ) INFO RIGHT JOIN (SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME, TABLE_TYPE, "PCTFREE", PART_LEVEL FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME, TABLE_TYPE, "PCTFREE", PART_LEVEL FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT) T ON T.TENANT_ID = INFO.TENANT_ID AND T.TABLE_ID = INFO.TABLE_ID JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB ON T.TENANT_ID = DB.TENANT_ID AND T.DATABASE_ID = DB.DATABASE_ID WHERE T.TENANT_ID = EFFECTIVE_TENANT_ID() AND T.TABLE_TYPE IN (0, 3, 8, 9) AND DB.DATABASE_NAME != '__recyclebin' AND T.DATABASE_ID = USERENV('SCHEMAID') )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(T.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(NULL AS VARCHAR2(30)) AS TABLESPACE_NAME, CAST(NULL AS VARCHAR2(128)) AS CLUSTER_NAME, CAST(NULL AS VARCHAR2(128)) AS IOT_NAME, CAST('VALID' AS VARCHAR2(8)) AS STATUS, CAST(T."PCTFREE" AS NUMBER) AS PCT_FREE, CAST(NULL AS NUMBER) AS PCT_USED, CAST(NULL AS NUMBER) AS INI_TRANS, CAST(NULL AS NUMBER) AS MAX_TRANS, CAST(NULL AS NUMBER) AS INITIAL_EXTENT, CAST(NULL AS NUMBER) AS NEXT_EXTENT, CAST(NULL AS NUMBER) AS MIN_EXTENTS, CAST(NULL AS NUMBER) AS MAX_EXTENTS, CAST(NULL AS NUMBER) AS PCT_INCREASE, CAST(NULL AS NUMBER) AS FREELISTS, CAST(NULL AS NUMBER) AS FREELIST_GROUPS, CAST(NULL AS VARCHAR2(3)) AS LOGGING, CAST(NULL AS VARCHAR2(1)) AS BACKED_UP, CAST(INFO.ROW_COUNT AS NUMBER) AS NUM_ROWS, CAST(NULL AS NUMBER) AS BLOCKS, CAST(NULL AS NUMBER) AS EMPTY_BLOCKS, CAST(NULL AS NUMBER) AS AVG_SPACE, CAST(NULL AS NUMBER) AS CHAIN_CNT, CAST(NULL AS NUMBER) AS AVG_ROW_LEN, CAST(NULL AS NUMBER) AS AVG_SPACE_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS NUM_FREELIST_BLOCKS, CAST(NULL AS VARCHAR2(10)) AS DEGREE, CAST(NULL AS VARCHAR2(10)) AS INSTANCES, CAST(NULL AS VARCHAR2(5)) AS CACHE, CAST(NULL AS VARCHAR2(8)) AS TABLE_LOCK, CAST(NULL AS NUMBER) AS SAMPLE_SIZE, CAST(NULL AS DATE) AS LAST_ANALYZED, CAST( CASE WHEN T.PART_LEVEL = 0 THEN 'NO' ELSE 'YES' END AS VARCHAR2(3)) AS PARTITIONED, CAST(NULL AS VARCHAR2(12)) AS IOT_TYPE, CAST(NULL AS VARCHAR2(16)) AS OBJECT_ID_TYPE, CAST(NULL AS VARCHAR2(128)) AS TABLE_TYPE_OWNER, CAST(NULL AS VARCHAR2(128)) AS TABLE_TYPE, CAST(DECODE (T.TABLE_TYPE, 8, 'YES', 9, 'YES', 'NO') AS VARCHAR2(1)) AS TEMPORARY, CAST(NULL AS VARCHAR2(1)) AS SECONDARY, CAST(NULL AS VARCHAR2(3)) AS NESTED, CAST(NULL AS VARCHAR2(7)) AS BUFFER_POOL, CAST(NULL AS VARCHAR2(7)) AS FLASH_CACHE, CAST(NULL AS VARCHAR2(7)) AS CELL_FLASH_CACHE, CAST(NULL AS VARCHAR2(8)) AS ROW_MOVEMENT, CAST(NULL AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(NULL AS VARCHAR2(3)) AS USER_STATS, CAST( DECODE (T.TABLE_TYPE, 8, 'SYS$SESSION', 9, 'SYS$TRANSACTION', NULL) AS VARCHAR2(15)) AS DURATION, CAST(NULL AS VARCHAR2(8)) AS SKIP_CORRUPT, CAST(NULL AS VARCHAR2(3)) AS MONITORING, CAST(NULL AS VARCHAR2(30)) AS CLUSTER_OWNER, CAST(NULL AS VARCHAR2(8)) AS DEPENDENCIES, CAST(NULL AS VARCHAR2(8)) AS COMPRESSION, CAST(NULL AS VARCHAR2(30)) AS COMPRESS_FOR, CAST(CASE WHEN DB.IN_RECYCLEBIN = 1 THEN 'YES' ELSE 'NO' END AS VARCHAR2(3)) AS DROPPED, CAST(NULL AS VARCHAR2(3)) AS SEGMENT_CREATED, CAST(NULL AS VARCHAR2(8)) AS INMEMORY, CAST(NULL AS VARCHAR2(8)) AS INMEMORY_PRIORITY, CAST(NULL AS VARCHAR2(15)) AS INMEMORY_DISTRIBUTE, CAST(NULL AS VARCHAR2(17)) AS INMEMORY_COMPRESSION, CAST(NULL AS VARCHAR2(13)) AS INMEMORY_DUPLICATE, CAST(NULL AS VARCHAR2(3)) AS EXTERNAL, CAST(NULL AS VARCHAR2(3)) AS HYBRID, CAST(NULL AS VARCHAR2(24)) AS CELLMEMORY, CAST(NULL AS VARCHAR2(12)) AS INMEMORY_SERVICE, CAST(NULL AS VARCHAR2(1000)) AS INMEMORY_SERVICE_NAME, CAST(NULL AS VARCHAR2(8)) AS MEMOPTIMIZE_READ, CAST(NULL AS VARCHAR2(8)) AS MEMOPTIMIZE_WRITE, CAST(NULL AS VARCHAR2(3)) AS HAS_SENSITIVE_COLUMN, CAST(NULL AS VARCHAR2(8)) AS LOGICAL_REPLICATION FROM ( SELECT TENANT_ID, TABLE_ID, SUM(ROW_CNT) AS ROW_COUNT FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT TS WHERE TS.TENANT_ID = EFFECTIVE_TENANT_ID() GROUP BY TENANT_ID, TABLE_ID ) INFO RIGHT JOIN (SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME, TABLE_TYPE, "PCTFREE", PART_LEVEL FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME, TABLE_TYPE, "PCTFREE", PART_LEVEL FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT) T ON T.TENANT_ID = INFO.TENANT_ID AND T.TABLE_ID = INFO.TABLE_ID JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB ON T.TENANT_ID = DB.TENANT_ID AND T.DATABASE_ID = DB.DATABASE_ID WHERE T.TENANT_ID = EFFECTIVE_TENANT_ID() AND T.TABLE_TYPE IN (0, 3, 8, 9, 14) AND DB.DATABASE_NAME != '__recyclebin' AND T.DATABASE_ID = USERENV('SCHEMAID') )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.25201_25250.cpp b/src/share/inner_table/ob_inner_table_schema.25201_25250.cpp index d5f4de36c..0d80283af 100644 --- a/src/share/inner_table/ob_inner_table_schema.25201_25250.cpp +++ b/src/share/inner_table/ob_inner_table_schema.25201_25250.cpp @@ -1375,6 +1375,106 @@ int ObInnerTableSchema::dba_ob_table_opt_stat_gather_history_ora_schema(ObTableS return ret; } +int ObInnerTableSchema::dba_ob_external_table_files_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_DBA_OB_EXTERNAL_TABLE_FILES_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_DBA_OB_EXTERNAL_TABLE_FILES_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 B.TABLE_NAME AS TABLE_NAME, C.DATABASE_NAME AS OWNER, 'P0' AS PARTITION_NAME, A.FILE_URL AS FILE_URL, A.FILE_SIZE AS FILE_SIZE FROM SYS.ALL_VIRTUAL_EXTERNAL_TABLE_FILE_REAL_AGENT A INNER JOIN SYS.ALL_VIRTUAL_TABLE_REAL_AGENT B ON A.TABLE_ID = B.TABLE_ID INNER JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT C ON B.DATABASE_ID = C.DATABASE_ID AND B.TENANT_ID = C.TENANT_ID WHERE B.TENANT_ID = EFFECTIVE_TENANT_ID() AND B.TABLE_TYPE = 14 AND (A.DELETE_VERSION = 9223372036854775807 OR A.DELETE_VERSION < A.CREATE_VERSION) )__"))) { + 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::all_ob_external_table_files_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_OB_EXTERNAL_TABLE_FILES_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_ALL_OB_EXTERNAL_TABLE_FILES_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 B.TABLE_NAME AS TABLE_NAME, C.DATABASE_NAME AS OWNER, 'P0' AS PARTITION_NAME, A.FILE_URL AS FILE_URL, A.FILE_SIZE AS FILE_SIZE FROM SYS.ALL_VIRTUAL_EXTERNAL_TABLE_FILE_REAL_AGENT A INNER JOIN SYS.ALL_VIRTUAL_TABLE_REAL_AGENT B ON A.TABLE_ID = B.TABLE_ID INNER JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT C ON B.DATABASE_ID = C.DATABASE_ID AND B.TENANT_ID = C.TENANT_ID WHERE B.TENANT_ID = EFFECTIVE_TENANT_ID() AND B.TABLE_TYPE = 14 AND (C.DATABASE_ID = USERENV('SCHEMAID') OR USER_CAN_ACCESS_OBJ(1, B.TABLE_ID, C.DATABASE_ID) = 1) AND (A.DELETE_VERSION = 9223372036854775807 OR A.DELETE_VERSION < A.CREATE_VERSION) )__"))) { + 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::dba_ob_table_stat_stale_info_ora_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.28051_28100.cpp b/src/share/inner_table/ob_inner_table_schema.28051_28100.cpp index 1c117c09d..79a094fdb 100644 --- a/src/share/inner_table/ob_inner_table_schema.28051_28100.cpp +++ b/src/share/inner_table/ob_inner_table_schema.28051_28100.cpp @@ -1060,7 +1060,7 @@ int ObInnerTableSchema::all_tab_col_statistics_ora_schema(ObTableSchema &table_s 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 cast(db.database_name as VARCHAR2(128)) as OWNER, cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(stat.distinct_cnt as NUMBER) as NUM_DISTINCT, cast(stat.min_value as varchar(128)) as LOW_VALUE, cast(stat.max_value as varchar(128)) as HIGH_VALUE, cast(stat.density as NUMBER) as DENSITY, cast(stat.null_cnt as NUMBER) as NUM_NULLS, cast(stat.bucket_cnt as NUMBER) as NUM_BUCKETS, cast(stat.last_analyzed as DATE) as LAST_ANALYZED, cast(stat.sample_size as NUMBER) as SAMPLE_SIZE, CAST(decode(stat.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(decode(stat.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, cast(NULL as VARCHAR2(80)) as NOTES, cast(stat.avg_len as NUMBER) as AVG_COL_LEN, cast((case when stat.histogram_type = 1 then 'FREQUENCY' when stat.histogram_type = 3 then 'TOP-FREQUENCY' when stat.histogram_type = 4 then 'HYBRID' else NULL end) as VARCHAR2(15)) as HISTOGRAM, cast(NULL as VARCHAR2(7)) SCOPE FROM (SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE table_type in (0,2,3,8,9)) t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND (t.database_id = userenv('SCHEMAID') OR user_can_access_obj(1, t.table_id, t.database_id) = 1) AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN (SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, IS_HIDDEN FROM SYS.ALL_VIRTUAL_CORE_COLUMN_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, IS_HIDDEN FROM SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID()) c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id LEFT JOIN SYS.ALL_VIRTUAL_COLUMN_STAT_REAL_AGENT stat ON c.table_id = stat.table_id AND c.column_id = stat.column_id AND stat.object_type = 1 WHERE c.is_hidden = 0; )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select cast(db.database_name as VARCHAR2(128)) as OWNER, cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(stat.distinct_cnt as NUMBER) as NUM_DISTINCT, cast(stat.min_value as varchar(128)) as LOW_VALUE, cast(stat.max_value as varchar(128)) as HIGH_VALUE, cast(stat.density as NUMBER) as DENSITY, cast(stat.null_cnt as NUMBER) as NUM_NULLS, cast(stat.bucket_cnt as NUMBER) as NUM_BUCKETS, cast(stat.last_analyzed as DATE) as LAST_ANALYZED, cast(stat.sample_size as NUMBER) as SAMPLE_SIZE, CAST(decode(stat.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(decode(stat.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, cast(NULL as VARCHAR2(80)) as NOTES, cast(stat.avg_len as NUMBER) as AVG_COL_LEN, cast((case when stat.histogram_type = 1 then 'FREQUENCY' when stat.histogram_type = 3 then 'TOP-FREQUENCY' when stat.histogram_type = 4 then 'HYBRID' else NULL end) as VARCHAR2(15)) as HISTOGRAM, cast(NULL as VARCHAR2(7)) SCOPE FROM (SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE table_type in (0,2,3,8,9,14)) t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND (t.database_id = userenv('SCHEMAID') OR user_can_access_obj(1, t.table_id, t.database_id) = 1) AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN (SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, IS_HIDDEN FROM SYS.ALL_VIRTUAL_CORE_COLUMN_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, IS_HIDDEN FROM SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID()) c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id LEFT JOIN SYS.ALL_VIRTUAL_COLUMN_STAT_REAL_AGENT stat ON c.table_id = stat.table_id AND c.column_id = stat.column_id AND stat.object_type = 1 WHERE c.is_hidden = 0; )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1110,7 +1110,7 @@ int ObInnerTableSchema::dba_tab_col_statistics_ora_schema(ObTableSchema &table_s 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 cast(db.database_name as VARCHAR2(128)) as OWNER, cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(stat.distinct_cnt as NUMBER) as NUM_DISTINCT, cast(stat.min_value as varchar(128)) as LOW_VALUE, cast(stat.max_value as varchar(128)) as HIGH_VALUE, cast(stat.density as NUMBER) as DENSITY, cast(stat.null_cnt as NUMBER) as NUM_NULLS, cast(stat.bucket_cnt as NUMBER) as NUM_BUCKETS, cast(stat.last_analyzed as DATE) as LAST_ANALYZED, cast(stat.sample_size as NUMBER) as SAMPLE_SIZE, CAST(decode(stat.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(decode(stat.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, cast(NULL as VARCHAR2(80)) as NOTES, cast(stat.avg_len as NUMBER) as AVG_COL_LEN, cast((case when stat.histogram_type = 1 then 'FREQUENCY' when stat.histogram_type = 3 then 'TOP-FREQUENCY' when stat.histogram_type = 4 then 'HYBRID' else NULL end) as VARCHAR2(15)) as HISTOGRAM, cast(NULL as VARCHAR2(7)) SCOPE FROM (SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE table_type in (0,2,3,8,9)) t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND t.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN (SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, IS_HIDDEN FROM SYS.ALL_VIRTUAL_CORE_COLUMN_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, IS_HIDDEN FROM SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID()) c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id LEFT JOIN SYS.ALL_VIRTUAL_COLUMN_STAT_REAL_AGENT stat ON c.table_id = stat.table_id AND c.column_id = stat.column_id AND stat.object_type = 1 WHERE c.is_hidden = 0; )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select cast(db.database_name as VARCHAR2(128)) as OWNER, cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(stat.distinct_cnt as NUMBER) as NUM_DISTINCT, cast(stat.min_value as varchar(128)) as LOW_VALUE, cast(stat.max_value as varchar(128)) as HIGH_VALUE, cast(stat.density as NUMBER) as DENSITY, cast(stat.null_cnt as NUMBER) as NUM_NULLS, cast(stat.bucket_cnt as NUMBER) as NUM_BUCKETS, cast(stat.last_analyzed as DATE) as LAST_ANALYZED, cast(stat.sample_size as NUMBER) as SAMPLE_SIZE, CAST(decode(stat.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(decode(stat.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, cast(NULL as VARCHAR2(80)) as NOTES, cast(stat.avg_len as NUMBER) as AVG_COL_LEN, cast((case when stat.histogram_type = 1 then 'FREQUENCY' when stat.histogram_type = 3 then 'TOP-FREQUENCY' when stat.histogram_type = 4 then 'HYBRID' else NULL end) as VARCHAR2(15)) as HISTOGRAM, cast(NULL as VARCHAR2(7)) SCOPE FROM (SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE table_type in (0,2,3,8,9,14)) t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND t.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN (SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, IS_HIDDEN FROM SYS.ALL_VIRTUAL_CORE_COLUMN_TABLE UNION ALL SELECT TENANT_ID, TABLE_ID, COLUMN_ID, COLUMN_NAME, IS_HIDDEN FROM SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID()) c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id LEFT JOIN SYS.ALL_VIRTUAL_COLUMN_STAT_REAL_AGENT stat ON c.table_id = stat.table_id AND c.column_id = stat.column_id AND stat.object_type = 1 WHERE c.is_hidden = 0; )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1160,7 +1160,7 @@ int ObInnerTableSchema::user_tab_col_statistics_ora_schema(ObTableSchema &table_ 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 cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(stat.distinct_cnt as NUMBER) as NUM_DISTINCT, cast(stat.min_value as varchar(128)) as LOW_VALUE, cast(stat.max_value as varchar(128)) as HIGH_VALUE, cast(stat.density as NUMBER) as DENSITY, cast(stat.null_cnt as NUMBER) as NUM_NULLS, cast(stat.bucket_cnt as NUMBER) as NUM_BUCKETS, cast(stat.last_analyzed as DATE) as LAST_ANALYZED, cast(stat.sample_size as NUMBER) as SAMPLE_SIZE, CAST(decode(stat.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(decode(stat.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, cast(NULL as VARCHAR2(80)) as NOTES, cast(stat.avg_len as NUMBER) as AVG_COL_LEN, cast((case when stat.histogram_type = 1 then 'FREQUENCY' when stat.histogram_type = 3 then 'TOP-FREQUENCY' when stat.histogram_type = 4 then 'HYBRID' else NULL end) as VARCHAR2(15)) as HISTOGRAM, cast(NULL as VARCHAR2(7)) SCOPE FROM (SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE table_type in (0,2,3,8,9)) t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND t.database_id = userenv('SCHEMAID') AND t.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id LEFT JOIN SYS.ALL_VIRTUAL_COLUMN_STAT_REAL_AGENT stat ON c.table_id = stat.table_id AND c.column_id = stat.column_id AND stat.object_type = 1 WHERE c.is_hidden = 0; )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(stat.distinct_cnt as NUMBER) as NUM_DISTINCT, cast(stat.min_value as varchar(128)) as LOW_VALUE, cast(stat.max_value as varchar(128)) as HIGH_VALUE, cast(stat.density as NUMBER) as DENSITY, cast(stat.null_cnt as NUMBER) as NUM_NULLS, cast(stat.bucket_cnt as NUMBER) as NUM_BUCKETS, cast(stat.last_analyzed as DATE) as LAST_ANALYZED, cast(stat.sample_size as NUMBER) as SAMPLE_SIZE, CAST(decode(stat.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(decode(stat.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, cast(NULL as VARCHAR2(80)) as NOTES, cast(stat.avg_len as NUMBER) as AVG_COL_LEN, cast((case when stat.histogram_type = 1 then 'FREQUENCY' when stat.histogram_type = 3 then 'TOP-FREQUENCY' when stat.histogram_type = 4 then 'HYBRID' else NULL end) as VARCHAR2(15)) as HISTOGRAM, cast(NULL as VARCHAR2(7)) SCOPE FROM (SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE table_type in (0,2,3,8,9,14)) t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND t.database_id = userenv('SCHEMAID') AND t.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id LEFT JOIN SYS.ALL_VIRTUAL_COLUMN_STAT_REAL_AGENT stat ON c.table_id = stat.table_id AND c.column_id = stat.column_id AND stat.object_type = 1 WHERE c.is_hidden = 0; )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1210,7 +1210,7 @@ int ObInnerTableSchema::all_part_col_statistics_ora_schema(ObTableSchema &table_ 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 cast(db.database_name as VARCHAR2(128)) as OWNER, cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast (part.part_name as VARCHAR2(128)) as PARTITION_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(stat.distinct_cnt as NUMBER) as NUM_DISTINCT, cast(stat.min_value as /* TODO: RAW */ varchar(128)) as LOW_VALUE, cast(stat.max_value as /* TODO: RAW */ varchar(128)) as HIGH_VALUE, cast(stat.density as NUMBER) as DENSITY, cast(stat.null_cnt as NUMBER) as NUM_NULLS, cast(stat.bucket_cnt as NUMBER) as NUM_BUCKETS, cast(stat.sample_size as NUMBER) as SAMPLE_SIZE, cast(stat.last_analyzed as DATE) as LAST_ANALYZED, CAST(decode(stat.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(decode(stat.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, cast(NULL as VARCHAR2(80)) as NOTES, cast(stat.avg_len as NUMBER) as AVG_COL_LEN, cast((case when stat.histogram_type = 1 then 'FREQUENCY' when stat.histogram_type = 3 then 'TOP-FREQUENCY' when stat.histogram_type = 4 then 'HYBRID' else NULL end) as VARCHAR2(15)) as HISTOGRAM FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND (t.database_id = userenv('SCHEMAID') OR user_can_access_obj(1, t.table_id, t.database_id) = 1) AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND C.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT part on t.tenant_id = part.tenant_id and t.table_id = part.table_id left join SYS.ALL_VIRTUAL_COLUMN_STAT_REAL_AGENT stat ON c.table_id = stat.table_id AND c.column_id = stat.column_id AND part.part_id = stat.partition_id AND stat.object_type = 2 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9) )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select cast(db.database_name as VARCHAR2(128)) as OWNER, cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast (part.part_name as VARCHAR2(128)) as PARTITION_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(stat.distinct_cnt as NUMBER) as NUM_DISTINCT, cast(stat.min_value as /* TODO: RAW */ varchar(128)) as LOW_VALUE, cast(stat.max_value as /* TODO: RAW */ varchar(128)) as HIGH_VALUE, cast(stat.density as NUMBER) as DENSITY, cast(stat.null_cnt as NUMBER) as NUM_NULLS, cast(stat.bucket_cnt as NUMBER) as NUM_BUCKETS, cast(stat.sample_size as NUMBER) as SAMPLE_SIZE, cast(stat.last_analyzed as DATE) as LAST_ANALYZED, CAST(decode(stat.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(decode(stat.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, cast(NULL as VARCHAR2(80)) as NOTES, cast(stat.avg_len as NUMBER) as AVG_COL_LEN, cast((case when stat.histogram_type = 1 then 'FREQUENCY' when stat.histogram_type = 3 then 'TOP-FREQUENCY' when stat.histogram_type = 4 then 'HYBRID' else NULL end) as VARCHAR2(15)) as HISTOGRAM FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND (t.database_id = userenv('SCHEMAID') OR user_can_access_obj(1, t.table_id, t.database_id) = 1) AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND C.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT part on t.tenant_id = part.tenant_id and t.table_id = part.table_id left join SYS.ALL_VIRTUAL_COLUMN_STAT_REAL_AGENT stat ON c.table_id = stat.table_id AND c.column_id = stat.column_id AND part.part_id = stat.partition_id AND stat.object_type = 2 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9,14) )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1260,7 +1260,7 @@ int ObInnerTableSchema::dba_part_col_statistics_ora_schema(ObTableSchema &table_ 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 cast(db.database_name as VARCHAR2(128)) as OWNER, cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast (part.part_name as VARCHAR2(128)) as PARTITION_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(stat.distinct_cnt as NUMBER) as NUM_DISTINCT, cast(stat.min_value as /* TODO: RAW */ varchar(128)) as LOW_VALUE, cast(stat.max_value as /* TODO: RAW */ varchar(128)) as HIGH_VALUE, cast(stat.density as NUMBER) as DENSITY, cast(stat.null_cnt as NUMBER) as NUM_NULLS, cast(stat.bucket_cnt as NUMBER) as NUM_BUCKETS, cast(stat.sample_size as NUMBER) as SAMPLE_SIZE, cast(stat.last_analyzed as DATE) as LAST_ANALYZED, CAST(decode(stat.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(decode(stat.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, cast(NULL as VARCHAR2(80)) as NOTES, cast(stat.avg_len as NUMBER) as AVG_COL_LEN, cast((case when stat.histogram_type = 1 then 'FREQUENCY' when stat.histogram_type = 3 then 'TOP-FREQUENCY' when stat.histogram_type = 4 then 'HYBRID' else NULL end) as VARCHAR2(15)) as HISTOGRAM FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND C.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT part on t.tenant_id = part.tenant_id and t.table_id = part.table_id left join SYS.ALL_VIRTUAL_COLUMN_STAT_REAL_AGENT stat ON c.table_id = stat.table_id AND c.column_id = stat.column_id AND part.part_id = stat.partition_id AND stat.object_type = 2 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9) )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select cast(db.database_name as VARCHAR2(128)) as OWNER, cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast (part.part_name as VARCHAR2(128)) as PARTITION_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(stat.distinct_cnt as NUMBER) as NUM_DISTINCT, cast(stat.min_value as /* TODO: RAW */ varchar(128)) as LOW_VALUE, cast(stat.max_value as /* TODO: RAW */ varchar(128)) as HIGH_VALUE, cast(stat.density as NUMBER) as DENSITY, cast(stat.null_cnt as NUMBER) as NUM_NULLS, cast(stat.bucket_cnt as NUMBER) as NUM_BUCKETS, cast(stat.sample_size as NUMBER) as SAMPLE_SIZE, cast(stat.last_analyzed as DATE) as LAST_ANALYZED, CAST(decode(stat.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(decode(stat.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, cast(NULL as VARCHAR2(80)) as NOTES, cast(stat.avg_len as NUMBER) as AVG_COL_LEN, cast((case when stat.histogram_type = 1 then 'FREQUENCY' when stat.histogram_type = 3 then 'TOP-FREQUENCY' when stat.histogram_type = 4 then 'HYBRID' else NULL end) as VARCHAR2(15)) as HISTOGRAM FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND C.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT part on t.tenant_id = part.tenant_id and t.table_id = part.table_id left join SYS.ALL_VIRTUAL_COLUMN_STAT_REAL_AGENT stat ON c.table_id = stat.table_id AND c.column_id = stat.column_id AND part.part_id = stat.partition_id AND stat.object_type = 2 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9,14) )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1310,7 +1310,7 @@ int ObInnerTableSchema::user_part_col_statistics_ora_schema(ObTableSchema &table 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 cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast (part.part_name as VARCHAR2(128)) as PARTITION_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(stat.distinct_cnt as NUMBER) as NUM_DISTINCT, cast(stat.min_value as /* TODO: RAW */ varchar(128)) as LOW_VALUE, cast(stat.max_value as /* TODO: RAW */ varchar(128)) as HIGH_VALUE, cast(stat.density as NUMBER) as DENSITY, cast(stat.null_cnt as NUMBER) as NUM_NULLS, cast(stat.bucket_cnt as NUMBER) as NUM_BUCKETS, cast(stat.sample_size as NUMBER) as SAMPLE_SIZE, cast(stat.last_analyzed as DATE) as LAST_ANALYZED, CAST(decode(stat.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(decode(stat.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, cast(NULL as VARCHAR2(80)) as NOTES, cast(stat.avg_len as NUMBER) as AVG_COL_LEN, cast((case when stat.histogram_type = 1 then 'FREQUENCY' when stat.histogram_type = 3 then 'TOP-FREQUENCY' when stat.histogram_type = 4 then 'HYBRID' else NULL end) as VARCHAR2(15)) as HISTOGRAM FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND C.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT part on t.tenant_id = part.tenant_id and t.table_id = part.table_id left join SYS.ALL_VIRTUAL_COLUMN_STAT_REAL_AGENT stat ON c.table_id = stat.table_id AND c.column_id = stat.column_id AND part.part_id = stat.partition_id AND stat.object_type = 2 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9) AND t.database_id = USERENV('SCHEMAID') )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast (part.part_name as VARCHAR2(128)) as PARTITION_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(stat.distinct_cnt as NUMBER) as NUM_DISTINCT, cast(stat.min_value as /* TODO: RAW */ varchar(128)) as LOW_VALUE, cast(stat.max_value as /* TODO: RAW */ varchar(128)) as HIGH_VALUE, cast(stat.density as NUMBER) as DENSITY, cast(stat.null_cnt as NUMBER) as NUM_NULLS, cast(stat.bucket_cnt as NUMBER) as NUM_BUCKETS, cast(stat.sample_size as NUMBER) as SAMPLE_SIZE, cast(stat.last_analyzed as DATE) as LAST_ANALYZED, CAST(decode(stat.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(decode(stat.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, cast(NULL as VARCHAR2(80)) as NOTES, cast(stat.avg_len as NUMBER) as AVG_COL_LEN, cast((case when stat.histogram_type = 1 then 'FREQUENCY' when stat.histogram_type = 3 then 'TOP-FREQUENCY' when stat.histogram_type = 4 then 'HYBRID' else NULL end) as VARCHAR2(15)) as HISTOGRAM FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND C.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT part on t.tenant_id = part.tenant_id and t.table_id = part.table_id left join SYS.ALL_VIRTUAL_COLUMN_STAT_REAL_AGENT stat ON c.table_id = stat.table_id AND c.column_id = stat.column_id AND part.part_id = stat.partition_id AND stat.object_type = 2 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9,14) AND t.database_id = USERENV('SCHEMAID') )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1360,7 +1360,7 @@ int ObInnerTableSchema::all_subpart_col_statistics_ora_schema(ObTableSchema &tab 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 cast(db.database_name as VARCHAR2(128)) as OWNER, cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast (subpart.sub_part_name as VARCHAR2(128)) as SUBPARTITION_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(stat.distinct_cnt as NUMBER) as NUM_DISTINCT, cast(stat.min_value as /* TODO: RAW */ varchar(128)) as LOW_VALUE, cast(stat.max_value as /* TODO: RAW */ varchar(128)) as HIGH_VALUE, cast(stat.density as NUMBER) as DENSITY, cast(stat.null_cnt as NUMBER) as NUM_NULLS, cast(stat.bucket_cnt as NUMBER) as NUM_BUCKETS, cast(stat.sample_size as NUMBER) as SAMPLE_SIZE, cast(stat.last_analyzed as DATE) as LAST_ANALYZED, CAST(decode(stat.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(decode(stat.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, cast(NULL as VARCHAR2(80)) as NOTES, cast(stat.avg_len as NUMBER) as AVG_COL_LEN, cast((case when stat.histogram_type = 1 then 'FREQUENCY' when stat.histogram_type = 3 then 'TOP-FREQUENCY' when stat.histogram_type = 4 then 'HYBRID' else NULL end) as VARCHAR2(15)) as HISTOGRAM FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND (t.database_id = userenv('SCHEMAID') OR user_can_access_obj(1, t.table_id, t.database_id) = 1) AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND C.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT subpart on t.tenant_id = subpart.tenant_id and t.table_id = subpart.table_id left join SYS.ALL_VIRTUAL_COLUMN_STAT_REAL_AGENT stat ON c.table_id = stat.table_id AND c.column_id = stat.column_id AND stat.partition_id = subpart.sub_part_id AND stat.object_type = 3 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9) )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select cast(db.database_name as VARCHAR2(128)) as OWNER, cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast (subpart.sub_part_name as VARCHAR2(128)) as SUBPARTITION_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(stat.distinct_cnt as NUMBER) as NUM_DISTINCT, cast(stat.min_value as /* TODO: RAW */ varchar(128)) as LOW_VALUE, cast(stat.max_value as /* TODO: RAW */ varchar(128)) as HIGH_VALUE, cast(stat.density as NUMBER) as DENSITY, cast(stat.null_cnt as NUMBER) as NUM_NULLS, cast(stat.bucket_cnt as NUMBER) as NUM_BUCKETS, cast(stat.sample_size as NUMBER) as SAMPLE_SIZE, cast(stat.last_analyzed as DATE) as LAST_ANALYZED, CAST(decode(stat.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(decode(stat.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, cast(NULL as VARCHAR2(80)) as NOTES, cast(stat.avg_len as NUMBER) as AVG_COL_LEN, cast((case when stat.histogram_type = 1 then 'FREQUENCY' when stat.histogram_type = 3 then 'TOP-FREQUENCY' when stat.histogram_type = 4 then 'HYBRID' else NULL end) as VARCHAR2(15)) as HISTOGRAM FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND (t.database_id = userenv('SCHEMAID') OR user_can_access_obj(1, t.table_id, t.database_id) = 1) AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND C.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT subpart on t.tenant_id = subpart.tenant_id and t.table_id = subpart.table_id left join SYS.ALL_VIRTUAL_COLUMN_STAT_REAL_AGENT stat ON c.table_id = stat.table_id AND c.column_id = stat.column_id AND stat.partition_id = subpart.sub_part_id AND stat.object_type = 3 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9,14) )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1410,7 +1410,7 @@ int ObInnerTableSchema::dba_subpart_col_statistics_ora_schema(ObTableSchema &tab 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 cast(db.database_name as VARCHAR2(128)) as OWNER, cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast (subpart.sub_part_name as VARCHAR2(128)) as SUBPARTITION_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(stat.distinct_cnt as NUMBER) as NUM_DISTINCT, cast(stat.min_value as /* TODO: RAW */ varchar(128)) as LOW_VALUE, cast(stat.max_value as /* TODO: RAW */ varchar(128)) as HIGH_VALUE, cast(stat.density as NUMBER) as DENSITY, cast(stat.null_cnt as NUMBER) as NUM_NULLS, cast(stat.bucket_cnt as NUMBER) as NUM_BUCKETS, cast(stat.sample_size as NUMBER) as SAMPLE_SIZE, cast(stat.last_analyzed as DATE) as LAST_ANALYZED, CAST(decode(stat.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(decode(stat.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, cast(NULL as VARCHAR2(80)) as NOTES, cast(stat.avg_len as NUMBER) as AVG_COL_LEN, cast((case when stat.histogram_type = 1 then 'FREQUENCY' when stat.histogram_type = 3 then 'TOP-FREQUENCY' when stat.histogram_type = 4 then 'HYBRID' else NULL end) as VARCHAR2(15)) as HISTOGRAM FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND C.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT subpart on t.tenant_id = subpart.tenant_id and t.table_id = subpart.table_id left join SYS.ALL_VIRTUAL_COLUMN_STAT_REAL_AGENT stat ON c.table_id = stat.table_id AND c.column_id = stat.column_id AND stat.partition_id = subpart.sub_part_id AND stat.object_type = 3 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9) )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select cast(db.database_name as VARCHAR2(128)) as OWNER, cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast (subpart.sub_part_name as VARCHAR2(128)) as SUBPARTITION_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(stat.distinct_cnt as NUMBER) as NUM_DISTINCT, cast(stat.min_value as /* TODO: RAW */ varchar(128)) as LOW_VALUE, cast(stat.max_value as /* TODO: RAW */ varchar(128)) as HIGH_VALUE, cast(stat.density as NUMBER) as DENSITY, cast(stat.null_cnt as NUMBER) as NUM_NULLS, cast(stat.bucket_cnt as NUMBER) as NUM_BUCKETS, cast(stat.sample_size as NUMBER) as SAMPLE_SIZE, cast(stat.last_analyzed as DATE) as LAST_ANALYZED, CAST(decode(stat.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(decode(stat.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, cast(NULL as VARCHAR2(80)) as NOTES, cast(stat.avg_len as NUMBER) as AVG_COL_LEN, cast((case when stat.histogram_type = 1 then 'FREQUENCY' when stat.histogram_type = 3 then 'TOP-FREQUENCY' when stat.histogram_type = 4 then 'HYBRID' else NULL end) as VARCHAR2(15)) as HISTOGRAM FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND C.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT subpart on t.tenant_id = subpart.tenant_id and t.table_id = subpart.table_id left join SYS.ALL_VIRTUAL_COLUMN_STAT_REAL_AGENT stat ON c.table_id = stat.table_id AND c.column_id = stat.column_id AND stat.partition_id = subpart.sub_part_id AND stat.object_type = 3 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9,14) )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1460,7 +1460,7 @@ int ObInnerTableSchema::user_subpart_col_statistics_ora_schema(ObTableSchema &ta 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 cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast (subpart.sub_part_name as VARCHAR2(128)) as SUBPARTITION_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(stat.distinct_cnt as NUMBER) as NUM_DISTINCT, cast(stat.min_value as /* TODO: RAW */ varchar(128)) as LOW_VALUE, cast(stat.max_value as /* TODO: RAW */ varchar(128)) as HIGH_VALUE, cast(stat.density as NUMBER) as DENSITY, cast(stat.null_cnt as NUMBER) as NUM_NULLS, cast(stat.bucket_cnt as NUMBER) as NUM_BUCKETS, cast(stat.sample_size as NUMBER) as SAMPLE_SIZE, cast(stat.last_analyzed as DATE) as LAST_ANALYZED, CAST(decode(stat.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(decode(stat.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, cast(NULL as VARCHAR2(80)) as NOTES, cast(stat.avg_len as NUMBER) as AVG_COL_LEN, cast((case when stat.histogram_type = 1 then 'FREQUENCY' when stat.histogram_type = 3 then 'TOP-FREQUENCY' when stat.histogram_type = 4 then 'HYBRID' else NULL end) as VARCHAR2(15)) as HISTOGRAM FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND C.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT subpart on t.tenant_id = subpart.tenant_id and t.table_id = subpart.table_id left join SYS.ALL_VIRTUAL_COLUMN_STAT_REAL_AGENT stat ON c.table_id = stat.table_id AND c.column_id = stat.column_id AND stat.partition_id = subpart.sub_part_id AND stat.object_type = 3 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9) AND t.database_id = USERENV('SCHEMAID') )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast (subpart.sub_part_name as VARCHAR2(128)) as SUBPARTITION_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(stat.distinct_cnt as NUMBER) as NUM_DISTINCT, cast(stat.min_value as /* TODO: RAW */ varchar(128)) as LOW_VALUE, cast(stat.max_value as /* TODO: RAW */ varchar(128)) as HIGH_VALUE, cast(stat.density as NUMBER) as DENSITY, cast(stat.null_cnt as NUMBER) as NUM_NULLS, cast(stat.bucket_cnt as NUMBER) as NUM_BUCKETS, cast(stat.sample_size as NUMBER) as SAMPLE_SIZE, cast(stat.last_analyzed as DATE) as LAST_ANALYZED, CAST(decode(stat.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(decode(stat.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, cast(NULL as VARCHAR2(80)) as NOTES, cast(stat.avg_len as NUMBER) as AVG_COL_LEN, cast((case when stat.histogram_type = 1 then 'FREQUENCY' when stat.histogram_type = 3 then 'TOP-FREQUENCY' when stat.histogram_type = 4 then 'HYBRID' else NULL end) as VARCHAR2(15)) as HISTOGRAM FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND C.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT subpart on t.tenant_id = subpart.tenant_id and t.table_id = subpart.table_id left join SYS.ALL_VIRTUAL_COLUMN_STAT_REAL_AGENT stat ON c.table_id = stat.table_id AND c.column_id = stat.column_id AND stat.partition_id = subpart.sub_part_id AND stat.object_type = 3 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9,14) AND t.database_id = USERENV('SCHEMAID') )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1510,7 +1510,7 @@ int ObInnerTableSchema::all_tab_histograms_ora_schema(ObTableSchema &table_schem 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 cast(db.database_name as VARCHAR2(128)) as OWNER, cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(hist.endpoint_num as NUMBER) as ENDPOINT_NUMBER, cast(NULL as NUMBER) as ENDPOINT_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE, cast(hist.b_endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE_RAW, cast(hist.endpoint_repeat_cnt as NUMBER) as ENDPOINT_REPEAT_COUNT, cast(NULL as VARCHAR2(7)) as SCOPE FROM (SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE table_type in (0,2,3,8,9)) t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND (t.database_id = userenv('SCHEMAID') OR user_can_access_obj(1, t.table_id, t.database_id) = 1) AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND C.TENANT_ID = EFFECTIVE_TENANT_ID() join SYS.ALL_VIRTUAL_HISTOGRAM_STAT_REAL_AGENT hist ON c.table_id = hist.table_id AND c.column_id = hist.column_id AND hist.object_type = 1 WHERE c.is_hidden = 0 )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select cast(db.database_name as VARCHAR2(128)) as OWNER, cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(hist.endpoint_num as NUMBER) as ENDPOINT_NUMBER, cast(NULL as NUMBER) as ENDPOINT_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE, cast(hist.b_endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE_RAW, cast(hist.endpoint_repeat_cnt as NUMBER) as ENDPOINT_REPEAT_COUNT, cast(NULL as VARCHAR2(7)) as SCOPE FROM (SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE table_type in (0,2,3,8,9,14)) t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND (t.database_id = userenv('SCHEMAID') OR user_can_access_obj(1, t.table_id, t.database_id) = 1) AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND C.TENANT_ID = EFFECTIVE_TENANT_ID() join SYS.ALL_VIRTUAL_HISTOGRAM_STAT_REAL_AGENT hist ON c.table_id = hist.table_id AND c.column_id = hist.column_id AND hist.object_type = 1 WHERE c.is_hidden = 0 )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1560,7 +1560,7 @@ int ObInnerTableSchema::dba_tab_histograms_ora_schema(ObTableSchema &table_schem 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 cast(db.database_name as VARCHAR2(128)) as OWNER, cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(hist.endpoint_num as NUMBER) as ENDPOINT_NUMBER, cast(NULL as NUMBER) as ENDPOINT_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE, cast(hist.b_endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE_RAW, cast(hist.endpoint_repeat_cnt as NUMBER) as ENDPOINT_REPEAT_COUNT, cast(NULL as VARCHAR2(7)) as SCOPE FROM (SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE table_type in (0,2,3,8,9)) t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND C.TENANT_ID = EFFECTIVE_TENANT_ID() join SYS.ALL_VIRTUAL_HISTOGRAM_STAT_REAL_AGENT hist ON c.table_id = hist.table_id AND c.column_id = hist.column_id AND hist.object_type = 1 WHERE c.is_hidden = 0 )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select cast(db.database_name as VARCHAR2(128)) as OWNER, cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(hist.endpoint_num as NUMBER) as ENDPOINT_NUMBER, cast(NULL as NUMBER) as ENDPOINT_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE, cast(hist.b_endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE_RAW, cast(hist.endpoint_repeat_cnt as NUMBER) as ENDPOINT_REPEAT_COUNT, cast(NULL as VARCHAR2(7)) as SCOPE FROM (SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE table_type in (0,2,3,8,9,14)) t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND C.TENANT_ID = EFFECTIVE_TENANT_ID() join SYS.ALL_VIRTUAL_HISTOGRAM_STAT_REAL_AGENT hist ON c.table_id = hist.table_id AND c.column_id = hist.column_id AND hist.object_type = 1 WHERE c.is_hidden = 0 )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1610,7 +1610,7 @@ int ObInnerTableSchema::user_tab_histograms_ora_schema(ObTableSchema &table_sche 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 cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(hist.endpoint_num as NUMBER) as ENDPOINT_NUMBER, cast(NULL as NUMBER) as ENDPOINT_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE, cast(hist.b_endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE_RAW, cast(hist.endpoint_repeat_cnt as NUMBER) as ENDPOINT_REPEAT_COUNT, cast(NULL as VARCHAR2(7)) as SCOPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND C.TENANT_ID = EFFECTIVE_TENANT_ID() join SYS.ALL_VIRTUAL_HISTOGRAM_STAT_REAL_AGENT hist ON c.table_id = hist.table_id AND c.column_id = hist.column_id AND hist.object_type = 1 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9) AND t.database_id = USERENV('SCHEMAID') )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(hist.endpoint_num as NUMBER) as ENDPOINT_NUMBER, cast(NULL as NUMBER) as ENDPOINT_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE, cast(hist.b_endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE_RAW, cast(hist.endpoint_repeat_cnt as NUMBER) as ENDPOINT_REPEAT_COUNT, cast(NULL as VARCHAR2(7)) as SCOPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND C.TENANT_ID = EFFECTIVE_TENANT_ID() join SYS.ALL_VIRTUAL_HISTOGRAM_STAT_REAL_AGENT hist ON c.table_id = hist.table_id AND c.column_id = hist.column_id AND hist.object_type = 1 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9,14) AND t.database_id = USERENV('SCHEMAID') )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1660,7 +1660,7 @@ int ObInnerTableSchema::all_part_histograms_ora_schema(ObTableSchema &table_sche 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 cast(db.database_name as VARCHAR2(128)) as OWNER, cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast(part.part_name as VARCHAR2(128)) as PARTITION_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(hist.endpoint_num as NUMBER) as ENDPOINT_NUMBER, cast(NULL as NUMBER) as ENDPOINT_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE_RAW, cast(hist.endpoint_repeat_cnt as NUMBER) as ENDPOINT_REPEAT_COUNT FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND (t.database_id = userenv('SCHEMAID') OR user_can_access_obj(1, t.table_id, t.database_id) = 1) AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND C.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT part on t.tenant_id = part.tenant_id and t.table_id = part.table_id join SYS.ALL_VIRTUAL_HISTOGRAM_STAT_REAL_AGENT hist ON c.table_id = hist.table_id AND c.column_id = hist.column_id AND part.part_id = hist.partition_id AND hist.object_type = 2 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9) )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select cast(db.database_name as VARCHAR2(128)) as OWNER, cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast(part.part_name as VARCHAR2(128)) as PARTITION_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(hist.endpoint_num as NUMBER) as ENDPOINT_NUMBER, cast(NULL as NUMBER) as ENDPOINT_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE_RAW, cast(hist.endpoint_repeat_cnt as NUMBER) as ENDPOINT_REPEAT_COUNT FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND (t.database_id = userenv('SCHEMAID') OR user_can_access_obj(1, t.table_id, t.database_id) = 1) AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND C.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT part on t.tenant_id = part.tenant_id and t.table_id = part.table_id join SYS.ALL_VIRTUAL_HISTOGRAM_STAT_REAL_AGENT hist ON c.table_id = hist.table_id AND c.column_id = hist.column_id AND part.part_id = hist.partition_id AND hist.object_type = 2 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9,14) )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1710,7 +1710,7 @@ int ObInnerTableSchema::dba_part_histograms_ora_schema(ObTableSchema &table_sche 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 cast(db.database_name as VARCHAR2(128)) as OWNER, cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast(part.part_name as VARCHAR2(128)) as PARTITION_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(hist.endpoint_num as NUMBER) as ENDPOINT_NUMBER, cast(NULL as NUMBER) as ENDPOINT_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE_RAW, cast(hist.endpoint_repeat_cnt as NUMBER) as ENDPOINT_REPEAT_COUNT FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND C.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT part on t.tenant_id = part.tenant_id and t.table_id = part.table_id join SYS.ALL_VIRTUAL_HISTOGRAM_STAT_REAL_AGENT hist ON c.table_id = hist.table_id AND c.column_id = hist.column_id AND part.part_id = hist.partition_id AND hist.object_type = 2 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9) )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select cast(db.database_name as VARCHAR2(128)) as OWNER, cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast(part.part_name as VARCHAR2(128)) as PARTITION_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(hist.endpoint_num as NUMBER) as ENDPOINT_NUMBER, cast(NULL as NUMBER) as ENDPOINT_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE_RAW, cast(hist.endpoint_repeat_cnt as NUMBER) as ENDPOINT_REPEAT_COUNT FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND C.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT part on t.tenant_id = part.tenant_id and t.table_id = part.table_id join SYS.ALL_VIRTUAL_HISTOGRAM_STAT_REAL_AGENT hist ON c.table_id = hist.table_id AND c.column_id = hist.column_id AND part.part_id = hist.partition_id AND hist.object_type = 2 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9,14) )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1760,7 +1760,7 @@ int ObInnerTableSchema::user_part_histograms_ora_schema(ObTableSchema &table_sch 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 cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast(part.part_name as VARCHAR2(128)) as PARTITION_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(hist.endpoint_num as NUMBER) as ENDPOINT_NUMBER, cast(NULL as NUMBER) as ENDPOINT_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE_RAW, cast(hist.endpoint_repeat_cnt as NUMBER) as ENDPOINT_REPEAT_COUNT FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND C.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT part on t.tenant_id = part.tenant_id and t.table_id = part.table_id join SYS.ALL_VIRTUAL_HISTOGRAM_STAT_REAL_AGENT hist ON c.table_id = hist.table_id AND c.column_id = hist.column_id AND part.part_id = hist.partition_id AND hist.object_type = 2 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9) AND t.database_id = USERENV('SCHEMAID') )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast(part.part_name as VARCHAR2(128)) as PARTITION_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(hist.endpoint_num as NUMBER) as ENDPOINT_NUMBER, cast(NULL as NUMBER) as ENDPOINT_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE_RAW, cast(hist.endpoint_repeat_cnt as NUMBER) as ENDPOINT_REPEAT_COUNT FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND C.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT part on t.tenant_id = part.tenant_id and t.table_id = part.table_id join SYS.ALL_VIRTUAL_HISTOGRAM_STAT_REAL_AGENT hist ON c.table_id = hist.table_id AND c.column_id = hist.column_id AND part.part_id = hist.partition_id AND hist.object_type = 2 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9,14) AND t.database_id = USERENV('SCHEMAID') )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1810,7 +1810,7 @@ int ObInnerTableSchema::all_subpart_histograms_ora_schema(ObTableSchema &table_s 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 cast(db.database_name as VARCHAR2(128)) as OWNER, cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast(subpart.sub_part_name as VARCHAR2(128)) as SUBPARTITION_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(hist.endpoint_num as NUMBER) as ENDPOINT_NUMBER, cast(NULL as NUMBER) as ENDPOINT_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE_RAW, cast(hist.endpoint_repeat_cnt as NUMBER) as ENDPOINT_REPEAT_COUNT FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND (t.database_id = userenv('SCHEMAID') OR user_can_access_obj(1, t.table_id, t.database_id) = 1) AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND C.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT subpart on t.tenant_id = subpart.tenant_id and t.table_id = subpart.table_id join SYS.ALL_VIRTUAL_HISTOGRAM_STAT_REAL_AGENT hist ON c.table_id = hist.table_id AND c.column_id = hist.column_id AND hist.partition_id = subpart.sub_part_id AND hist.object_type = 3 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9) )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select cast(db.database_name as VARCHAR2(128)) as OWNER, cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast(subpart.sub_part_name as VARCHAR2(128)) as SUBPARTITION_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(hist.endpoint_num as NUMBER) as ENDPOINT_NUMBER, cast(NULL as NUMBER) as ENDPOINT_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE_RAW, cast(hist.endpoint_repeat_cnt as NUMBER) as ENDPOINT_REPEAT_COUNT FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND (t.database_id = userenv('SCHEMAID') OR user_can_access_obj(1, t.table_id, t.database_id) = 1) AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND C.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT subpart on t.tenant_id = subpart.tenant_id and t.table_id = subpart.table_id join SYS.ALL_VIRTUAL_HISTOGRAM_STAT_REAL_AGENT hist ON c.table_id = hist.table_id AND c.column_id = hist.column_id AND hist.partition_id = subpart.sub_part_id AND hist.object_type = 3 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9,14) )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1860,7 +1860,7 @@ int ObInnerTableSchema::dba_subpart_histograms_ora_schema(ObTableSchema &table_s 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 cast(db.database_name as VARCHAR2(128)) as OWNER, cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast(subpart.sub_part_name as VARCHAR2(128)) as SUBPARTITION_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(hist.endpoint_num as NUMBER) as ENDPOINT_NUMBER, cast(NULL as NUMBER) as ENDPOINT_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE_RAW, cast(hist.endpoint_repeat_cnt as NUMBER) as ENDPOINT_REPEAT_COUNT FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND C.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT subpart on t.tenant_id = subpart.tenant_id and t.table_id = subpart.table_id join SYS.ALL_VIRTUAL_HISTOGRAM_STAT_REAL_AGENT hist ON c.table_id = hist.table_id AND c.column_id = hist.column_id AND hist.partition_id = subpart.sub_part_id AND hist.object_type = 3 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9) )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select cast(db.database_name as VARCHAR2(128)) as OWNER, cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast(subpart.sub_part_name as VARCHAR2(128)) as SUBPARTITION_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(hist.endpoint_num as NUMBER) as ENDPOINT_NUMBER, cast(NULL as NUMBER) as ENDPOINT_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE_RAW, cast(hist.endpoint_repeat_cnt as NUMBER) as ENDPOINT_REPEAT_COUNT FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id AND db.database_id = t.database_id AND T.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND C.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT subpart on t.tenant_id = subpart.tenant_id and t.table_id = subpart.table_id join SYS.ALL_VIRTUAL_HISTOGRAM_STAT_REAL_AGENT hist ON c.table_id = hist.table_id AND c.column_id = hist.column_id AND hist.partition_id = subpart.sub_part_id AND hist.object_type = 3 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9,14) )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1910,7 +1910,7 @@ int ObInnerTableSchema::user_subpart_histograms_ora_schema(ObTableSchema &table_ 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 cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast(subpart.sub_part_name as VARCHAR2(128)) as SUBPARTITION_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(hist.endpoint_num as NUMBER) as ENDPOINT_NUMBER, cast(NULL as NUMBER) as ENDPOINT_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE_RAW, cast(hist.endpoint_repeat_cnt as NUMBER) as ENDPOINT_REPEAT_COUNT FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND C.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT subpart on t.tenant_id = subpart.tenant_id and t.table_id = subpart.table_id join SYS.ALL_VIRTUAL_HISTOGRAM_STAT_REAL_AGENT hist ON c.table_id = hist.table_id AND c.column_id = hist.column_id AND hist.partition_id = subpart.sub_part_id AND hist.object_type = 3 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9) AND t.database_id = USERENV('SCHEMAID') )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select cast(t.table_name as VARCHAR2(128)) as TABLE_NAME, cast(subpart.sub_part_name as VARCHAR2(128)) as SUBPARTITION_NAME, cast(c.column_name as VARCHAR2(128)) as COLUMN_NAME, cast(hist.endpoint_num as NUMBER) as ENDPOINT_NUMBER, cast(NULL as NUMBER) as ENDPOINT_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE, cast(hist.endpoint_value as VARCHAR2(4000)) as ENDPOINT_ACTUAL_VALUE_RAW, cast(hist.endpoint_repeat_cnt as NUMBER) as ENDPOINT_REPEAT_COUNT FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT t JOIN SYS.ALL_VIRTUAL_COLUMN_REAL_AGENT c ON c.tenant_id = t.tenant_id AND c.table_id = t.table_id AND C.TENANT_ID = EFFECTIVE_TENANT_ID() JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT subpart on t.tenant_id = subpart.tenant_id and t.table_id = subpart.table_id join SYS.ALL_VIRTUAL_HISTOGRAM_STAT_REAL_AGENT hist ON c.table_id = hist.table_id AND c.column_id = hist.column_id AND hist.partition_id = subpart.sub_part_id AND hist.object_type = 3 WHERE c.is_hidden = 0 AND t.table_type in (0,2,3,8,9,14) AND t.database_id = USERENV('SCHEMAID') )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1960,7 +1960,7 @@ int ObInnerTableSchema::all_tab_statistics_ora_schema(ObTableSchema &table_schem 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 CAST(DB.DATABASE_NAME AS VARCHAR2(128)) AS OWNER, CAST(V.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(V.PARTITION_NAME AS VARCHAR2(128)) AS PARTITION_NAME, CAST(V.PARTITION_POSITION AS NUMBER) AS PARTITION_POSITION, CAST(V.SUBPARTITION_NAME AS VARCHAR2(128)) AS SUBPARTITION_NAME, CAST(V.SUBPARTITION_POSITION AS NUMBER) AS SUBPARTITION_POSITION, CAST(V.OBJECT_TYPE AS VARCHAR2(12)) AS OBJECT_TYPE, CAST(STAT.ROW_CNT AS NUMBER) AS NUM_ROWS, CAST(NULL AS NUMBER) AS BLOCKS, CAST(NULL AS NUMBER) AS EMPTY_BLOCKS, CAST(NULL AS NUMBER) AS AVG_SPACE, CAST(NULL AS NUMBER) AS CHAIN_CNT, CAST(STAT.AVG_ROW_LEN AS NUMBER) AS AVG_ROW_LEN, CAST(NULL AS NUMBER) AS AVG_SPACE_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS NUM_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS AVG_CACHED_BLOCKS, CAST(NULL AS NUMBER) AS AVG_CACHE_HIT_RATIO, CAST(NULL AS NUMBER) AS IM_IMCU_COUNT, CAST(NULL AS NUMBER) AS IM_BLOCK_COUNT, CAST(NULL AS TIMESTAMP(9)) AS IM_STAT_UPDATE_TIME, CAST(NULL AS NUMBER) AS SCAN_RATE, CAST(NULL AS NUMBER) AS SAMPLE_SIZE, CAST(STAT.LAST_ANALYZED AS DATE) AS LAST_ANALYZED, CAST(decode(STAT.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(decode(STAT.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, CAST(decode(bitand(STAT.STATTYPE_LOCKED, 15), NULL, NULL, 0, NULL, 1, 'DATA', 2, 'CACHE', 'ALL') AS VARCHAR2(5)) AS STATTYPE_LOCKED, CAST(decode(STAT.STALE_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS STALE_STATS, CAST(NULL AS VARCHAR2(7)) AS SCOPE FROM ( (SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_ID AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, CASE WHEN PART_LEVEL = 0 THEN TABLE_ID ELSE -1 END AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T WHERE T.TABLE_TYPE IN (0,2,3,8,9)) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, P.PART_ID, T.TABLE_NAME, P.PART_NAME, NULL, P.PART_IDX + 1, NULL, 'PARTITION' FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID WHERE T.TABLE_TYPE IN (0,2,3,8,9) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, SP.SUB_PART_ID AS PARTITION_ID, T.TABLE_NAME, P.PART_NAME, SP.SUB_PART_NAME, P.PART_IDX + 1, SP.SUB_PART_IDX + 1, 'SUBPARTITION' FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SP ON T.TENANT_ID = SP.TENANT_ID AND T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID WHERE T.TABLE_TYPE IN (0,2,3,8,9) ) V JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB ON DB.TENANT_ID = V.TENANT_ID AND DB.DATABASE_ID = V.DATABASE_ID AND (V.DATABASE_ID = USERENV('SCHEMAID') OR USER_CAN_ACCESS_OBJ(1, V.TABLE_ID, V.DATABASE_ID) = 1) AND V.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() LEFT JOIN SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT STAT ON V.TENANT_ID = STAT.TENANT_ID AND V.TABLE_ID = STAT.TABLE_ID AND V.PARTITION_ID = STAT.PARTITION_ID )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT CAST(DB.DATABASE_NAME AS VARCHAR2(128)) AS OWNER, CAST(V.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(V.PARTITION_NAME AS VARCHAR2(128)) AS PARTITION_NAME, CAST(V.PARTITION_POSITION AS NUMBER) AS PARTITION_POSITION, CAST(V.SUBPARTITION_NAME AS VARCHAR2(128)) AS SUBPARTITION_NAME, CAST(V.SUBPARTITION_POSITION AS NUMBER) AS SUBPARTITION_POSITION, CAST(V.OBJECT_TYPE AS VARCHAR2(12)) AS OBJECT_TYPE, CAST(STAT.ROW_CNT AS NUMBER) AS NUM_ROWS, CAST(NULL AS NUMBER) AS BLOCKS, CAST(NULL AS NUMBER) AS EMPTY_BLOCKS, CAST(NULL AS NUMBER) AS AVG_SPACE, CAST(NULL AS NUMBER) AS CHAIN_CNT, CAST(STAT.AVG_ROW_LEN AS NUMBER) AS AVG_ROW_LEN, CAST(NULL AS NUMBER) AS AVG_SPACE_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS NUM_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS AVG_CACHED_BLOCKS, CAST(NULL AS NUMBER) AS AVG_CACHE_HIT_RATIO, CAST(NULL AS NUMBER) AS IM_IMCU_COUNT, CAST(NULL AS NUMBER) AS IM_BLOCK_COUNT, CAST(NULL AS TIMESTAMP(9)) AS IM_STAT_UPDATE_TIME, CAST(NULL AS NUMBER) AS SCAN_RATE, CAST(NULL AS NUMBER) AS SAMPLE_SIZE, CAST(STAT.LAST_ANALYZED AS DATE) AS LAST_ANALYZED, CAST(decode(STAT.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(decode(STAT.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, CAST(decode(bitand(STAT.STATTYPE_LOCKED, 15), NULL, NULL, 0, NULL, 1, 'DATA', 2, 'CACHE', 'ALL') AS VARCHAR2(5)) AS STATTYPE_LOCKED, CAST(decode(STAT.STALE_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS STALE_STATS, CAST(NULL AS VARCHAR2(7)) AS SCOPE FROM ( (SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_ID AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, CASE WHEN PART_LEVEL = 0 THEN TABLE_ID ELSE -1 END AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T WHERE T.TABLE_TYPE IN (0,2,3,8,9,14)) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, P.PART_ID, T.TABLE_NAME, P.PART_NAME, NULL, P.PART_IDX + 1, NULL, 'PARTITION' FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, SP.SUB_PART_ID AS PARTITION_ID, T.TABLE_NAME, P.PART_NAME, SP.SUB_PART_NAME, P.PART_IDX + 1, SP.SUB_PART_IDX + 1, 'SUBPARTITION' FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SP ON T.TENANT_ID = SP.TENANT_ID AND T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) ) V JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB ON DB.TENANT_ID = V.TENANT_ID AND DB.DATABASE_ID = V.DATABASE_ID AND (V.DATABASE_ID = USERENV('SCHEMAID') OR USER_CAN_ACCESS_OBJ(1, V.TABLE_ID, V.DATABASE_ID) = 1) AND V.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() LEFT JOIN SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT STAT ON V.TENANT_ID = STAT.TENANT_ID AND V.TABLE_ID = STAT.TABLE_ID AND V.PARTITION_ID = STAT.PARTITION_ID )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -2010,7 +2010,7 @@ int ObInnerTableSchema::dba_tab_statistics_ora_schema(ObTableSchema &table_schem 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 CAST(DB.DATABASE_NAME AS VARCHAR2(128)) AS OWNER, CAST(V.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(V.PARTITION_NAME AS VARCHAR2(128)) AS PARTITION_NAME, CAST(V.PARTITION_POSITION AS NUMBER) AS PARTITION_POSITION, CAST(V.SUBPARTITION_NAME AS VARCHAR2(128)) AS SUBPARTITION_NAME, CAST(V.SUBPARTITION_POSITION AS NUMBER) AS SUBPARTITION_POSITION, CAST(V.OBJECT_TYPE AS VARCHAR2(12)) AS OBJECT_TYPE, CAST(STAT.ROW_CNT AS NUMBER) AS NUM_ROWS, CAST(NULL AS NUMBER) AS BLOCKS, CAST(NULL AS NUMBER) AS EMPTY_BLOCKS, CAST(NULL AS NUMBER) AS AVG_SPACE, CAST(NULL AS NUMBER) AS CHAIN_CNT, CAST(STAT.AVG_ROW_LEN AS NUMBER) AS AVG_ROW_LEN, CAST(NULL AS NUMBER) AS AVG_SPACE_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS NUM_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS AVG_CACHED_BLOCKS, CAST(NULL AS NUMBER) AS AVG_CACHE_HIT_RATIO, CAST(NULL AS NUMBER) AS IM_IMCU_COUNT, CAST(NULL AS NUMBER) AS IM_BLOCK_COUNT, CAST(NULL AS TIMESTAMP(9)) AS IM_STAT_UPDATE_TIME, CAST(NULL AS NUMBER) AS SCAN_RATE, CAST(NULL AS NUMBER) AS SAMPLE_SIZE, CAST(STAT.LAST_ANALYZED AS DATE) AS LAST_ANALYZED, CAST(decode(STAT.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(decode(STAT.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, CAST(decode(bitand(STAT.STATTYPE_LOCKED, 15), NULL, NULL, 0, NULL, 1, 'DATA', 2, 'CACHE', 'ALL') AS VARCHAR2(5)) AS STATTYPE_LOCKED, CAST(decode(STAT.STALE_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS STALE_STATS, CAST(NULL AS VARCHAR2(7)) AS SCOPE FROM ( (SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_ID AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, CASE WHEN PART_LEVEL = 0 THEN TABLE_ID ELSE -1 END AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T WHERE T.TABLE_TYPE IN (0,2,3,8,9)) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, P.PART_ID, T.TABLE_NAME, P.PART_NAME, NULL, P.PART_IDX + 1, NULL, 'PARTITION' FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID WHERE T.TABLE_TYPE IN (0,2,3,8,9) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, SP.SUB_PART_ID AS PARTITION_ID, T.TABLE_NAME, P.PART_NAME, SP.SUB_PART_NAME, P.PART_IDX + 1, SP.SUB_PART_IDX + 1, 'SUBPARTITION' FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SP ON T.TENANT_ID = SP.TENANT_ID AND T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID WHERE T.TABLE_TYPE IN (0,2,3,8,9) ) V JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = V.tenant_id AND db.database_id = V.database_id AND V.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() LEFT JOIN SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT STAT ON V.TENANT_ID = STAT.TENANT_ID AND V.TABLE_ID = STAT.TABLE_ID AND V.PARTITION_ID = STAT.PARTITION_ID )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT CAST(DB.DATABASE_NAME AS VARCHAR2(128)) AS OWNER, CAST(V.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(V.PARTITION_NAME AS VARCHAR2(128)) AS PARTITION_NAME, CAST(V.PARTITION_POSITION AS NUMBER) AS PARTITION_POSITION, CAST(V.SUBPARTITION_NAME AS VARCHAR2(128)) AS SUBPARTITION_NAME, CAST(V.SUBPARTITION_POSITION AS NUMBER) AS SUBPARTITION_POSITION, CAST(V.OBJECT_TYPE AS VARCHAR2(12)) AS OBJECT_TYPE, CAST(STAT.ROW_CNT AS NUMBER) AS NUM_ROWS, CAST(NULL AS NUMBER) AS BLOCKS, CAST(NULL AS NUMBER) AS EMPTY_BLOCKS, CAST(NULL AS NUMBER) AS AVG_SPACE, CAST(NULL AS NUMBER) AS CHAIN_CNT, CAST(STAT.AVG_ROW_LEN AS NUMBER) AS AVG_ROW_LEN, CAST(NULL AS NUMBER) AS AVG_SPACE_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS NUM_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS AVG_CACHED_BLOCKS, CAST(NULL AS NUMBER) AS AVG_CACHE_HIT_RATIO, CAST(NULL AS NUMBER) AS IM_IMCU_COUNT, CAST(NULL AS NUMBER) AS IM_BLOCK_COUNT, CAST(NULL AS TIMESTAMP(9)) AS IM_STAT_UPDATE_TIME, CAST(NULL AS NUMBER) AS SCAN_RATE, CAST(NULL AS NUMBER) AS SAMPLE_SIZE, CAST(STAT.LAST_ANALYZED AS DATE) AS LAST_ANALYZED, CAST(decode(STAT.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(decode(STAT.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, CAST(decode(bitand(STAT.STATTYPE_LOCKED, 15), NULL, NULL, 0, NULL, 1, 'DATA', 2, 'CACHE', 'ALL') AS VARCHAR2(5)) AS STATTYPE_LOCKED, CAST(decode(STAT.STALE_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS STALE_STATS, CAST(NULL AS VARCHAR2(7)) AS SCOPE FROM ( (SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_ID AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, CASE WHEN PART_LEVEL = 0 THEN TABLE_ID ELSE -1 END AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T WHERE T.TABLE_TYPE IN (0,2,3,8,9,14)) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, P.PART_ID, T.TABLE_NAME, P.PART_NAME, NULL, P.PART_IDX + 1, NULL, 'PARTITION' FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, SP.SUB_PART_ID AS PARTITION_ID, T.TABLE_NAME, P.PART_NAME, SP.SUB_PART_NAME, P.PART_IDX + 1, SP.SUB_PART_IDX + 1, 'SUBPARTITION' FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SP ON T.TENANT_ID = SP.TENANT_ID AND T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) ) V JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = V.tenant_id AND db.database_id = V.database_id AND V.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() LEFT JOIN SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT STAT ON V.TENANT_ID = STAT.TENANT_ID AND V.TABLE_ID = STAT.TABLE_ID AND V.PARTITION_ID = STAT.PARTITION_ID )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -2060,7 +2060,7 @@ int ObInnerTableSchema::user_tab_statistics_ora_schema(ObTableSchema &table_sche 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 CAST(V.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(V.PARTITION_NAME AS VARCHAR2(128)) AS PARTITION_NAME, CAST(V.PARTITION_POSITION AS NUMBER) AS PARTITION_POSITION, CAST(V.SUBPARTITION_NAME AS VARCHAR2(128)) AS SUBPARTITION_NAME, CAST(V.SUBPARTITION_POSITION AS NUMBER) AS SUBPARTITION_POSITION, CAST(V.OBJECT_TYPE AS VARCHAR2(12)) AS OBJECT_TYPE, CAST(STAT.ROW_CNT AS NUMBER) AS NUM_ROWS, CAST(NULL AS NUMBER) AS BLOCKS, CAST(NULL AS NUMBER) AS EMPTY_BLOCKS, CAST(NULL AS NUMBER) AS AVG_SPACE, CAST(NULL AS NUMBER) AS CHAIN_CNT, CAST(STAT.AVG_ROW_LEN AS NUMBER) AS AVG_ROW_LEN, CAST(NULL AS NUMBER) AS AVG_SPACE_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS NUM_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS AVG_CACHED_BLOCKS, CAST(NULL AS NUMBER) AS AVG_CACHE_HIT_RATIO, CAST(NULL AS NUMBER) AS IM_IMCU_COUNT, CAST(NULL AS NUMBER) AS IM_BLOCK_COUNT, CAST(NULL AS TIMESTAMP(9)) AS IM_STAT_UPDATE_TIME, CAST(NULL AS NUMBER) AS SCAN_RATE, CAST(NULL AS NUMBER) AS SAMPLE_SIZE, CAST(STAT.LAST_ANALYZED AS DATE) AS LAST_ANALYZED, CAST(decode(STAT.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(decode(STAT.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, CAST(decode(bitand(STAT.STATTYPE_LOCKED, 15), NULL, NULL, 0, NULL, 1, 'DATA', 2, 'CACHE', 'ALL') AS VARCHAR2(5)) AS STATTYPE_LOCKED, CAST(decode(STAT.STALE_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS STALE_STATS, CAST(NULL AS VARCHAR2(7)) AS SCOPE FROM ( SELECT TENANT_ID, DATABASE_ID, TABLE_ID, CASE WHEN PART_LEVEL = 0 THEN TABLE_ID ELSE -1 END AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T WHERE T.TABLE_TYPE IN (0,2,3,8,9) AND t.database_id = USERENV('SCHEMAID') UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, P.PART_ID, T.TABLE_NAME, P.PART_NAME, NULL, P.PART_IDX + 1, NULL, 'PARTITION' FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID WHERE T.TABLE_TYPE IN (0,2,3,8,9) AND t.database_id = USERENV('SCHEMAID') UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, SP.SUB_PART_ID AS PARTITION_ID, T.TABLE_NAME, P.PART_NAME, SP.SUB_PART_NAME, P.PART_IDX + 1, SP.SUB_PART_IDX + 1, 'SUBPARTITION' FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SP ON T.TENANT_ID = SP.TENANT_ID AND T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID WHERE T.TABLE_TYPE IN (0,2,3,8,9) AND t.database_id = USERENV('SCHEMAID') ) V LEFT JOIN SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT STAT ON V.TENANT_ID = STAT.TENANT_ID AND V.TABLE_ID = STAT.TABLE_ID AND V.PARTITION_ID = STAT.PARTITION_ID )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT CAST(V.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(V.PARTITION_NAME AS VARCHAR2(128)) AS PARTITION_NAME, CAST(V.PARTITION_POSITION AS NUMBER) AS PARTITION_POSITION, CAST(V.SUBPARTITION_NAME AS VARCHAR2(128)) AS SUBPARTITION_NAME, CAST(V.SUBPARTITION_POSITION AS NUMBER) AS SUBPARTITION_POSITION, CAST(V.OBJECT_TYPE AS VARCHAR2(12)) AS OBJECT_TYPE, CAST(STAT.ROW_CNT AS NUMBER) AS NUM_ROWS, CAST(NULL AS NUMBER) AS BLOCKS, CAST(NULL AS NUMBER) AS EMPTY_BLOCKS, CAST(NULL AS NUMBER) AS AVG_SPACE, CAST(NULL AS NUMBER) AS CHAIN_CNT, CAST(STAT.AVG_ROW_LEN AS NUMBER) AS AVG_ROW_LEN, CAST(NULL AS NUMBER) AS AVG_SPACE_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS NUM_FREELIST_BLOCKS, CAST(NULL AS NUMBER) AS AVG_CACHED_BLOCKS, CAST(NULL AS NUMBER) AS AVG_CACHE_HIT_RATIO, CAST(NULL AS NUMBER) AS IM_IMCU_COUNT, CAST(NULL AS NUMBER) AS IM_BLOCK_COUNT, CAST(NULL AS TIMESTAMP(9)) AS IM_STAT_UPDATE_TIME, CAST(NULL AS NUMBER) AS SCAN_RATE, CAST(NULL AS NUMBER) AS SAMPLE_SIZE, CAST(STAT.LAST_ANALYZED AS DATE) AS LAST_ANALYZED, CAST(decode(STAT.GLOBAL_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS GLOBAL_STATS, CAST(decode(STAT.USER_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS USER_STATS, CAST(decode(bitand(STAT.STATTYPE_LOCKED, 15), NULL, NULL, 0, NULL, 1, 'DATA', 2, 'CACHE', 'ALL') AS VARCHAR2(5)) AS STATTYPE_LOCKED, CAST(decode(STAT.STALE_STATS, 0, 'NO', 1, 'YES', NULL) AS VARCHAR2(3)) AS STALE_STATS, CAST(NULL AS VARCHAR2(7)) AS SCOPE FROM ( SELECT TENANT_ID, DATABASE_ID, TABLE_ID, CASE WHEN PART_LEVEL = 0 THEN TABLE_ID ELSE -1 END AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) AND t.database_id = USERENV('SCHEMAID') UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, P.PART_ID, T.TABLE_NAME, P.PART_NAME, NULL, P.PART_IDX + 1, NULL, 'PARTITION' FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) AND t.database_id = USERENV('SCHEMAID') UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, SP.SUB_PART_ID AS PARTITION_ID, T.TABLE_NAME, P.PART_NAME, SP.SUB_PART_NAME, P.PART_IDX + 1, SP.SUB_PART_IDX + 1, 'SUBPARTITION' FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SP ON T.TENANT_ID = SP.TENANT_ID AND T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) AND t.database_id = USERENV('SCHEMAID') ) V LEFT JOIN SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT STAT ON V.TENANT_ID = STAT.TENANT_ID AND V.TABLE_ID = STAT.TABLE_ID AND V.PARTITION_ID = STAT.PARTITION_ID )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.28101_28150.cpp b/src/share/inner_table/ob_inner_table_schema.28101_28150.cpp index 824804c86..8824e8028 100644 --- a/src/share/inner_table/ob_inner_table_schema.28101_28150.cpp +++ b/src/share/inner_table/ob_inner_table_schema.28101_28150.cpp @@ -310,7 +310,7 @@ int ObInnerTableSchema::all_tab_stats_history_ora_schema(ObTableSchema &table_sc 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 CAST(DB.DATABASE_NAME AS VARCHAR2(128)) AS OWNER, CAST(V.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(V.PARTITION_NAME AS VARCHAR2(128)) AS PARTITION_NAME, CAST(V.SUBPARTITION_NAME AS VARCHAR2(128)) AS SUBPARTITION_NAME, CAST(STAT.SAVTIME AS TIMESTAMP(6) WITH TIME ZONE) AS STATS_UPDATE_TIME FROM ( (SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_ID AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, CASE WHEN PART_LEVEL = 0 THEN TABLE_ID ELSE -1 END AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T WHERE T.TABLE_TYPE IN (0,2,3,8,9)) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, P.PART_ID, T.TABLE_NAME, P.PART_NAME, NULL, P.PART_IDX + 1, NULL, 'PARTITION' FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID WHERE T.TABLE_TYPE IN (0,2,3,8,9) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, SP.SUB_PART_ID AS PARTITION_ID, T.TABLE_NAME, P.PART_NAME, SP.SUB_PART_NAME, P.PART_IDX + 1, SP.SUB_PART_IDX + 1, 'SUBPARTITION' FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SP ON T.TENANT_ID = SP.TENANT_ID AND T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID WHERE T.TABLE_TYPE IN (0,2,3,8,9) ) V JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB ON DB.TENANT_ID = V.TENANT_ID AND DB.DATABASE_ID = V.DATABASE_ID AND (V.DATABASE_ID = USERENV('SCHEMAID') OR USER_CAN_ACCESS_OBJ(1, V.TABLE_ID, V.DATABASE_ID) = 1) AND V.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() LEFT JOIN SYS.ALL_VIRTUAL_TABLE_STAT_HISTORY_REAL_AGENT STAT ON V.TENANT_ID = STAT.TENANT_ID AND V.TABLE_ID = STAT.TABLE_ID AND V.PARTITION_ID = STAT.PARTITION_ID AND STAT.INDEX_TYPE = 0; )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT CAST(DB.DATABASE_NAME AS VARCHAR2(128)) AS OWNER, CAST(V.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(V.PARTITION_NAME AS VARCHAR2(128)) AS PARTITION_NAME, CAST(V.SUBPARTITION_NAME AS VARCHAR2(128)) AS SUBPARTITION_NAME, CAST(STAT.SAVTIME AS TIMESTAMP(6) WITH TIME ZONE) AS STATS_UPDATE_TIME FROM ( (SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_ID AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, CASE WHEN PART_LEVEL = 0 THEN TABLE_ID ELSE -1 END AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T WHERE T.TABLE_TYPE IN (0,2,3,8,9,14)) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, P.PART_ID, T.TABLE_NAME, P.PART_NAME, NULL, P.PART_IDX + 1, NULL, 'PARTITION' FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, SP.SUB_PART_ID AS PARTITION_ID, T.TABLE_NAME, P.PART_NAME, SP.SUB_PART_NAME, P.PART_IDX + 1, SP.SUB_PART_IDX + 1, 'SUBPARTITION' FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SP ON T.TENANT_ID = SP.TENANT_ID AND T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) ) V JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB ON DB.TENANT_ID = V.TENANT_ID AND DB.DATABASE_ID = V.DATABASE_ID AND (V.DATABASE_ID = USERENV('SCHEMAID') OR USER_CAN_ACCESS_OBJ(1, V.TABLE_ID, V.DATABASE_ID) = 1) AND V.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() LEFT JOIN SYS.ALL_VIRTUAL_TABLE_STAT_HISTORY_REAL_AGENT STAT ON V.TENANT_ID = STAT.TENANT_ID AND V.TABLE_ID = STAT.TABLE_ID AND V.PARTITION_ID = STAT.PARTITION_ID AND STAT.INDEX_TYPE = 0; )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -360,7 +360,7 @@ int ObInnerTableSchema::dba_tab_stats_history_ora_schema(ObTableSchema &table_sc 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 CAST(DB.DATABASE_NAME AS VARCHAR2(128)) AS OWNER, CAST(V.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(V.PARTITION_NAME AS VARCHAR2(128)) AS PARTITION_NAME, CAST(V.SUBPARTITION_NAME AS VARCHAR2(128)) AS SUBPARTITION_NAME, CAST(STAT.SAVTIME AS TIMESTAMP(6) WITH TIME ZONE) AS STATS_UPDATE_TIME FROM ( (SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_ID AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, CASE WHEN PART_LEVEL = 0 THEN TABLE_ID ELSE -1 END AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T WHERE T.TABLE_TYPE IN (0,2,3,8,9)) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, P.PART_ID, T.TABLE_NAME, P.PART_NAME, NULL, P.PART_IDX + 1, NULL, 'PARTITION' FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID WHERE T.TABLE_TYPE IN (0,2,3,8,9) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, SP.SUB_PART_ID AS PARTITION_ID, T.TABLE_NAME, P.PART_NAME, SP.SUB_PART_NAME, P.PART_IDX + 1, SP.SUB_PART_IDX + 1, 'SUBPARTITION' FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SP ON T.TENANT_ID = SP.TENANT_ID AND T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID WHERE T.TABLE_TYPE IN (0,2,3,8,9) ) V JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = V.tenant_id AND db.database_id = V.database_id AND V.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() LEFT JOIN SYS.ALL_VIRTUAL_TABLE_STAT_HISTORY_REAL_AGENT STAT ON V.TENANT_ID = STAT.TENANT_ID AND V.TABLE_ID = STAT.TABLE_ID AND V.PARTITION_ID = STAT.PARTITION_ID AND STAT.INDEX_TYPE = 0; )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT CAST(DB.DATABASE_NAME AS VARCHAR2(128)) AS OWNER, CAST(V.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(V.PARTITION_NAME AS VARCHAR2(128)) AS PARTITION_NAME, CAST(V.SUBPARTITION_NAME AS VARCHAR2(128)) AS SUBPARTITION_NAME, CAST(STAT.SAVTIME AS TIMESTAMP(6) WITH TIME ZONE) AS STATS_UPDATE_TIME FROM ( (SELECT TENANT_ID, DATABASE_ID, TABLE_ID, TABLE_ID AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION ALL SELECT TENANT_ID, DATABASE_ID, TABLE_ID, CASE WHEN PART_LEVEL = 0 THEN TABLE_ID ELSE -1 END AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T WHERE T.TABLE_TYPE IN (0,2,3,8,9,14)) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, P.PART_ID, T.TABLE_NAME, P.PART_NAME, NULL, P.PART_IDX + 1, NULL, 'PARTITION' FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, SP.SUB_PART_ID AS PARTITION_ID, T.TABLE_NAME, P.PART_NAME, SP.SUB_PART_NAME, P.PART_IDX + 1, SP.SUB_PART_IDX + 1, 'SUBPARTITION' FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SP ON T.TENANT_ID = SP.TENANT_ID AND T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) ) V JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = V.tenant_id AND db.database_id = V.database_id AND V.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() LEFT JOIN SYS.ALL_VIRTUAL_TABLE_STAT_HISTORY_REAL_AGENT STAT ON V.TENANT_ID = STAT.TENANT_ID AND V.TABLE_ID = STAT.TABLE_ID AND V.PARTITION_ID = STAT.PARTITION_ID AND STAT.INDEX_TYPE = 0; )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -410,7 +410,7 @@ int ObInnerTableSchema::user_tab_stats_history_ora_schema(ObTableSchema &table_s 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 CAST(V.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(V.PARTITION_NAME AS VARCHAR2(128)) AS PARTITION_NAME, CAST(V.SUBPARTITION_NAME AS VARCHAR2(128)) AS SUBPARTITION_NAME, CAST(STAT.SAVTIME AS TIMESTAMP(6) WITH TIME ZONE) AS STATS_UPDATE_TIME FROM ( SELECT TENANT_ID, DATABASE_ID, TABLE_ID, CASE WHEN PART_LEVEL = 0 THEN TABLE_ID ELSE -1 END AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T WHERE T.TABLE_TYPE IN (0,2,3,8,9) AND t.database_id = USERENV('SCHEMAID') UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, P.PART_ID, T.TABLE_NAME, P.PART_NAME, NULL, P.PART_IDX + 1, NULL, 'PARTITION' FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID WHERE T.TABLE_TYPE IN (0,2,3,8,9) AND t.database_id = USERENV('SCHEMAID') UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, SP.SUB_PART_ID AS PARTITION_ID, T.TABLE_NAME, P.PART_NAME, SP.SUB_PART_NAME, P.PART_IDX + 1, SP.SUB_PART_IDX + 1, 'SUBPARTITION' FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SP ON T.TENANT_ID = SP.TENANT_ID AND T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID WHERE T.TABLE_TYPE IN (0,2,3,8,9) AND t.database_id = USERENV('SCHEMAID') ) V LEFT JOIN SYS.ALL_VIRTUAL_TABLE_STAT_HISTORY_REAL_AGENT STAT ON V.TENANT_ID = STAT.TENANT_ID AND V.TABLE_ID = STAT.TABLE_ID AND V.PARTITION_ID = STAT.PARTITION_ID AND STAT.INDEX_TYPE = 0; )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT CAST(V.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(V.PARTITION_NAME AS VARCHAR2(128)) AS PARTITION_NAME, CAST(V.SUBPARTITION_NAME AS VARCHAR2(128)) AS SUBPARTITION_NAME, CAST(STAT.SAVTIME AS TIMESTAMP(6) WITH TIME ZONE) AS STATS_UPDATE_TIME FROM ( SELECT TENANT_ID, DATABASE_ID, TABLE_ID, CASE WHEN PART_LEVEL = 0 THEN TABLE_ID ELSE -1 END AS PARTITION_ID, TABLE_NAME, NULL AS PARTITION_NAME, NULL AS SUBPARTITION_NAME, NULL AS PARTITION_POSITION, NULL AS SUBPARTITION_POSITION, 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) AND t.database_id = USERENV('SCHEMAID') UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, P.PART_ID, T.TABLE_NAME, P.PART_NAME, NULL, P.PART_IDX + 1, NULL, 'PARTITION' FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) AND t.database_id = USERENV('SCHEMAID') UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, T.TABLE_ID, SP.SUB_PART_ID AS PARTITION_ID, T.TABLE_NAME, P.PART_NAME, SP.SUB_PART_NAME, P.PART_IDX + 1, SP.SUB_PART_IDX + 1, 'SUBPARTITION' FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SP ON T.TENANT_ID = SP.TENANT_ID AND T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) AND t.database_id = USERENV('SCHEMAID') ) V LEFT JOIN SYS.ALL_VIRTUAL_TABLE_STAT_HISTORY_REAL_AGENT STAT ON V.TENANT_ID = STAT.TENANT_ID AND V.TABLE_ID = STAT.TABLE_ID AND V.PARTITION_ID = STAT.PARTITION_ID AND STAT.INDEX_TYPE = 0; )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.451_500.cpp b/src/share/inner_table/ob_inner_table_schema.451_500.cpp index 1121712e6..9f48250d0 100644 --- a/src/share/inner_table/ob_inner_table_schema.451_500.cpp +++ b/src/share/inner_table/ob_inner_table_schema.451_500.cpp @@ -25,6 +25,157 @@ using namespace common; namespace share { +int ObInnerTableSchema::all_external_table_file_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_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_EXTERNAL_TABLE_FILE_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(3); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_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_EXTERNAL_TABLE_FILE_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("table_id", //column_name + ++column_id, //column_id + 1, //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("part_id", //column_name + ++column_id, //column_id + 2, //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("file_id", //column_name + ++column_id, //column_id + 3, //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("file_url", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 16384, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("create_version", //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("delete_version", //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("file_size", //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 + } + 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(OB_ALL_EXTERNAL_TABLE_FILE_TID); + table_schema.set_aux_lob_meta_tid(OB_ALL_EXTERNAL_TABLE_FILE_AUX_LOB_META_TID); + table_schema.set_aux_lob_piece_tid(OB_ALL_EXTERNAL_TABLE_FILE_AUX_LOB_PIECE_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_task_opt_stat_gather_history_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.50451_50500.cpp b/src/share/inner_table/ob_inner_table_schema.50451_50500.cpp index 5b1e37927..cc9d2e768 100644 --- a/src/share/inner_table/ob_inner_table_schema.50451_50500.cpp +++ b/src/share/inner_table/ob_inner_table_schema.50451_50500.cpp @@ -25,6 +25,141 @@ using namespace common; namespace share { +int ObInnerTableSchema::all_external_table_file_aux_lob_meta_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_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_EXTERNAL_TABLE_FILE_AUX_LOB_META_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(2); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(AUX_LOB_META); + 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_EXTERNAL_TABLE_FILE_AUX_LOB_META_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("lob_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 16, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("seq_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 8192, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("binary_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("char_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("piece_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_data", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 262144, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + 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(OB_ALL_EXTERNAL_TABLE_FILE_AUX_LOB_META_TID); + table_schema.set_data_table_id(OB_ALL_EXTERNAL_TABLE_FILE_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_task_opt_stat_gather_history_aux_lob_meta_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.60451_60500.cpp b/src/share/inner_table/ob_inner_table_schema.60451_60500.cpp index 32f5bad90..b4a2ab554 100644 --- a/src/share/inner_table/ob_inner_table_schema.60451_60500.cpp +++ b/src/share/inner_table/ob_inner_table_schema.60451_60500.cpp @@ -25,6 +25,96 @@ using namespace common; namespace share { +int ObInnerTableSchema::all_external_table_file_aux_lob_piece_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_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_EXTERNAL_TABLE_FILE_AUX_LOB_PIECE_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(1); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(AUX_LOB_PIECE); + 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_EXTERNAL_TABLE_FILE_AUX_LOB_PIECE_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("piece_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("data_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_data", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 32, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + 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(OB_ALL_EXTERNAL_TABLE_FILE_AUX_LOB_PIECE_TID); + table_schema.set_data_table_id(OB_ALL_EXTERNAL_TABLE_FILE_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_task_opt_stat_gather_history_aux_lob_piece_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 e90a43a96..55e3122ff 100644 --- a/src/share/inner_table/ob_inner_table_schema.h +++ b/src/share/inner_table/ob_inner_table_schema.h @@ -519,6 +519,7 @@ public: static int all_tenant_rewrite_rules_schema(share::schema::ObTableSchema &table_schema); static int all_reserved_snapshot_schema(share::schema::ObTableSchema &table_schema); static int all_cluster_event_history_schema(share::schema::ObTableSchema &table_schema); + static int all_external_table_file_schema(share::schema::ObTableSchema &table_schema); static int all_task_opt_stat_gather_history_schema(share::schema::ObTableSchema &table_schema); static int all_table_opt_stat_gather_history_schema(share::schema::ObTableSchema &table_schema); static int tenant_virtual_all_table_schema(share::schema::ObTableSchema &table_schema); @@ -873,6 +874,7 @@ public: static int all_virtual_ls_arb_replica_task_history_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_archive_dest_status_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_io_scheduler_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_external_table_file_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_task_opt_stat_gather_history_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_table_opt_stat_gather_history_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_opt_stat_gather_monitor_schema(share::schema::ObTableSchema &table_schema); @@ -1087,6 +1089,7 @@ public: static int all_virtual_ls_arb_replica_task_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_ls_arb_replica_task_history_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_archive_dest_status_ora_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_external_table_file_real_agent_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_task_opt_stat_gather_history_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_table_opt_stat_gather_history_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_opt_stat_gather_monitor_ora_schema(share::schema::ObTableSchema &table_schema); @@ -1389,7 +1392,10 @@ public: static int gv_ob_thread_schema(share::schema::ObTableSchema &table_schema); static int v_ob_thread_schema(share::schema::ObTableSchema &table_schema); static int v_ob_timestamp_service_schema(share::schema::ObTableSchema &table_schema); + static int dba_ob_external_table_files_schema(share::schema::ObTableSchema &table_schema); + static int all_ob_external_table_files_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_table_stat_stale_info_schema(share::schema::ObTableSchema &table_schema); + static int cdb_ob_external_table_files_schema(share::schema::ObTableSchema &table_schema); static int dba_synonyms_schema(share::schema::ObTableSchema &table_schema); static int dba_objects_ora_schema(share::schema::ObTableSchema &table_schema); static int all_objects_schema(share::schema::ObTableSchema &table_schema); @@ -1614,6 +1620,8 @@ public: static int user_db_links_ora_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_task_opt_stat_gather_history_ora_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_table_opt_stat_gather_history_ora_schema(share::schema::ObTableSchema &table_schema); + static int dba_ob_external_table_files_ora_schema(share::schema::ObTableSchema &table_schema); + static int all_ob_external_table_files_ora_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_table_stat_stale_info_ora_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_sql_audit_ora_schema(share::schema::ObTableSchema &table_schema); static int v_ob_sql_audit_ora_schema(share::schema::ObTableSchema &table_schema); @@ -2005,6 +2013,7 @@ public: static int all_tenant_rewrite_rules_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_reserved_snapshot_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_cluster_event_history_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); + static int all_external_table_file_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_task_opt_stat_gather_history_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_table_opt_stat_gather_history_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_table_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); @@ -2240,6 +2249,7 @@ public: static int all_tenant_rewrite_rules_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_reserved_snapshot_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_cluster_event_history_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); + static int all_external_table_file_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_task_opt_stat_gather_history_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_table_opt_stat_gather_history_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_sql_plan_monitor_all_virtual_sql_plan_monitor_i1_schema(share::schema::ObTableSchema &table_schema); @@ -2671,6 +2681,7 @@ const schema_create_func sys_table_schema_creators [] = { ObInnerTableSchema::all_tenant_rewrite_rules_schema, ObInnerTableSchema::all_reserved_snapshot_schema, ObInnerTableSchema::all_cluster_event_history_schema, + ObInnerTableSchema::all_external_table_file_schema, ObInnerTableSchema::all_task_opt_stat_gather_history_schema, ObInnerTableSchema::all_table_opt_stat_gather_history_schema, NULL,}; @@ -3028,6 +3039,7 @@ const schema_create_func virtual_table_schema_creators [] = { ObInnerTableSchema::all_virtual_ls_arb_replica_task_history_schema, ObInnerTableSchema::all_virtual_archive_dest_status_schema, ObInnerTableSchema::all_virtual_io_scheduler_schema, + ObInnerTableSchema::all_virtual_external_table_file_schema, ObInnerTableSchema::all_virtual_task_opt_stat_gather_history_schema, ObInnerTableSchema::all_virtual_table_opt_stat_gather_history_schema, ObInnerTableSchema::all_virtual_opt_stat_gather_monitor_schema, @@ -3251,6 +3263,7 @@ const schema_create_func virtual_table_schema_creators [] = { ObInnerTableSchema::all_virtual_ls_arb_replica_task_ora_schema, ObInnerTableSchema::all_virtual_ls_arb_replica_task_history_ora_schema, ObInnerTableSchema::all_virtual_archive_dest_status_ora_schema, + ObInnerTableSchema::all_virtual_external_table_file_real_agent_ora_schema, ObInnerTableSchema::all_virtual_task_opt_stat_gather_history_ora_schema, ObInnerTableSchema::all_virtual_table_opt_stat_gather_history_ora_schema, ObInnerTableSchema::all_virtual_opt_stat_gather_monitor_ora_schema, @@ -3634,7 +3647,10 @@ const schema_create_func sys_view_schema_creators [] = { ObInnerTableSchema::gv_ob_thread_schema, ObInnerTableSchema::v_ob_thread_schema, ObInnerTableSchema::v_ob_timestamp_service_schema, + ObInnerTableSchema::dba_ob_external_table_files_schema, + ObInnerTableSchema::all_ob_external_table_files_schema, ObInnerTableSchema::dba_ob_table_stat_stale_info_schema, + ObInnerTableSchema::cdb_ob_external_table_files_schema, ObInnerTableSchema::dba_synonyms_schema, ObInnerTableSchema::dba_objects_ora_schema, ObInnerTableSchema::all_objects_schema, @@ -3859,6 +3875,8 @@ const schema_create_func sys_view_schema_creators [] = { ObInnerTableSchema::user_db_links_ora_schema, ObInnerTableSchema::dba_ob_task_opt_stat_gather_history_ora_schema, ObInnerTableSchema::dba_ob_table_opt_stat_gather_history_ora_schema, + ObInnerTableSchema::dba_ob_external_table_files_ora_schema, + ObInnerTableSchema::all_ob_external_table_files_ora_schema, ObInnerTableSchema::dba_ob_table_stat_stale_info_ora_schema, ObInnerTableSchema::gv_ob_sql_audit_ora_schema, ObInnerTableSchema::v_ob_sql_audit_ora_schema, @@ -4339,6 +4357,7 @@ const uint64_t tenant_space_tables [] = { OB_ALL_RLS_ATTRIBUTE_HISTORY_TID, OB_ALL_TENANT_REWRITE_RULES_TID, OB_ALL_RESERVED_SNAPSHOT_TID, + OB_ALL_EXTERNAL_TABLE_FILE_TID, OB_ALL_TASK_OPT_STAT_GATHER_HISTORY_TID, OB_ALL_TABLE_OPT_STAT_GATHER_HISTORY_TID, OB_TENANT_VIRTUAL_ALL_TABLE_TID, @@ -4720,6 +4739,7 @@ const uint64_t tenant_space_tables [] = { OB_ALL_VIRTUAL_LS_ARB_REPLICA_TASK_ORA_TID, OB_ALL_VIRTUAL_LS_ARB_REPLICA_TASK_HISTORY_ORA_TID, OB_ALL_VIRTUAL_ARCHIVE_DEST_STATUS_ORA_TID, + OB_ALL_VIRTUAL_EXTERNAL_TABLE_FILE_REAL_AGENT_ORA_TID, OB_ALL_VIRTUAL_TASK_OPT_STAT_GATHER_HISTORY_ORA_TID, OB_ALL_VIRTUAL_TABLE_OPT_STAT_GATHER_HISTORY_ORA_TID, OB_ALL_VIRTUAL_OPT_STAT_GATHER_MONITOR_ORA_TID, @@ -4945,6 +4965,8 @@ const uint64_t tenant_space_tables [] = { OB_GV_OB_THREAD_TID, OB_V_OB_THREAD_TID, OB_V_OB_TIMESTAMP_SERVICE_TID, + OB_DBA_OB_EXTERNAL_TABLE_FILES_TID, + OB_ALL_OB_EXTERNAL_TABLE_FILES_TID, OB_DBA_OB_TABLE_STAT_STALE_INFO_TID, OB_DBA_SYNONYMS_TID, OB_DBA_OBJECTS_ORA_TID, @@ -5170,6 +5192,8 @@ const uint64_t tenant_space_tables [] = { OB_USER_DB_LINKS_ORA_TID, OB_DBA_OB_TASK_OPT_STAT_GATHER_HISTORY_ORA_TID, OB_DBA_OB_TABLE_OPT_STAT_GATHER_HISTORY_ORA_TID, + OB_DBA_OB_EXTERNAL_TABLE_FILES_ORA_TID, + OB_ALL_OB_EXTERNAL_TABLE_FILES_ORA_TID, OB_DBA_OB_TABLE_STAT_STALE_INFO_ORA_TID, OB_GV_OB_SQL_AUDIT_ORA_TID, OB_V_OB_SQL_AUDIT_ORA_TID, @@ -5698,6 +5722,7 @@ const uint64_t tenant_space_tables [] = { OB_ALL_RLS_ATTRIBUTE_HISTORY_AUX_LOB_META_TID, OB_ALL_TENANT_REWRITE_RULES_AUX_LOB_META_TID, OB_ALL_RESERVED_SNAPSHOT_AUX_LOB_META_TID, + OB_ALL_EXTERNAL_TABLE_FILE_AUX_LOB_META_TID, OB_ALL_TASK_OPT_STAT_GATHER_HISTORY_AUX_LOB_META_TID, OB_ALL_TABLE_OPT_STAT_GATHER_HISTORY_AUX_LOB_META_TID, OB_ALL_TABLE_AUX_LOB_PIECE_TID, @@ -5912,6 +5937,7 @@ const uint64_t tenant_space_tables [] = { OB_ALL_RLS_ATTRIBUTE_HISTORY_AUX_LOB_PIECE_TID, OB_ALL_TENANT_REWRITE_RULES_AUX_LOB_PIECE_TID, OB_ALL_RESERVED_SNAPSHOT_AUX_LOB_PIECE_TID, + OB_ALL_EXTERNAL_TABLE_FILE_AUX_LOB_PIECE_TID, OB_ALL_TASK_OPT_STAT_GATHER_HISTORY_AUX_LOB_PIECE_TID, OB_ALL_TABLE_OPT_STAT_GATHER_HISTORY_AUX_LOB_PIECE_TID, }; @@ -6376,6 +6402,7 @@ const char* const tenant_space_table_names [] = { OB_ALL_RLS_ATTRIBUTE_HISTORY_TNAME, OB_ALL_TENANT_REWRITE_RULES_TNAME, OB_ALL_RESERVED_SNAPSHOT_TNAME, + OB_ALL_EXTERNAL_TABLE_FILE_TNAME, OB_ALL_TASK_OPT_STAT_GATHER_HISTORY_TNAME, OB_ALL_TABLE_OPT_STAT_GATHER_HISTORY_TNAME, OB_TENANT_VIRTUAL_ALL_TABLE_TNAME, @@ -6757,6 +6784,7 @@ const char* const tenant_space_table_names [] = { OB_ALL_VIRTUAL_LS_ARB_REPLICA_TASK_ORA_TNAME, OB_ALL_VIRTUAL_LS_ARB_REPLICA_TASK_HISTORY_ORA_TNAME, OB_ALL_VIRTUAL_ARCHIVE_DEST_STATUS_ORA_TNAME, + OB_ALL_VIRTUAL_EXTERNAL_TABLE_FILE_REAL_AGENT_ORA_TNAME, OB_ALL_VIRTUAL_TASK_OPT_STAT_GATHER_HISTORY_ORA_TNAME, OB_ALL_VIRTUAL_TABLE_OPT_STAT_GATHER_HISTORY_ORA_TNAME, OB_ALL_VIRTUAL_OPT_STAT_GATHER_MONITOR_ORA_TNAME, @@ -6982,6 +7010,8 @@ const char* const tenant_space_table_names [] = { OB_GV_OB_THREAD_TNAME, OB_V_OB_THREAD_TNAME, OB_V_OB_TIMESTAMP_SERVICE_TNAME, + OB_DBA_OB_EXTERNAL_TABLE_FILES_TNAME, + OB_ALL_OB_EXTERNAL_TABLE_FILES_TNAME, OB_DBA_OB_TABLE_STAT_STALE_INFO_TNAME, OB_DBA_SYNONYMS_TNAME, OB_DBA_OBJECTS_ORA_TNAME, @@ -7207,6 +7237,8 @@ const char* const tenant_space_table_names [] = { OB_USER_DB_LINKS_ORA_TNAME, OB_DBA_OB_TASK_OPT_STAT_GATHER_HISTORY_ORA_TNAME, OB_DBA_OB_TABLE_OPT_STAT_GATHER_HISTORY_ORA_TNAME, + OB_DBA_OB_EXTERNAL_TABLE_FILES_ORA_TNAME, + OB_ALL_OB_EXTERNAL_TABLE_FILES_ORA_TNAME, OB_DBA_OB_TABLE_STAT_STALE_INFO_ORA_TNAME, OB_GV_OB_SQL_AUDIT_ORA_TNAME, OB_V_OB_SQL_AUDIT_ORA_TNAME, @@ -7735,6 +7767,7 @@ const char* const tenant_space_table_names [] = { OB_ALL_RLS_ATTRIBUTE_HISTORY_AUX_LOB_META_TNAME, OB_ALL_TENANT_REWRITE_RULES_AUX_LOB_META_TNAME, OB_ALL_RESERVED_SNAPSHOT_AUX_LOB_META_TNAME, + OB_ALL_EXTERNAL_TABLE_FILE_AUX_LOB_META_TNAME, OB_ALL_TASK_OPT_STAT_GATHER_HISTORY_AUX_LOB_META_TNAME, OB_ALL_TABLE_OPT_STAT_GATHER_HISTORY_AUX_LOB_META_TNAME, OB_ALL_TABLE_AUX_LOB_PIECE_TNAME, @@ -7949,6 +7982,7 @@ const char* const tenant_space_table_names [] = { OB_ALL_RLS_ATTRIBUTE_HISTORY_AUX_LOB_PIECE_TNAME, OB_ALL_TENANT_REWRITE_RULES_AUX_LOB_PIECE_TNAME, OB_ALL_RESERVED_SNAPSHOT_AUX_LOB_PIECE_TNAME, + OB_ALL_EXTERNAL_TABLE_FILE_AUX_LOB_PIECE_TNAME, OB_ALL_TASK_OPT_STAT_GATHER_HISTORY_AUX_LOB_PIECE_TNAME, OB_ALL_TABLE_OPT_STAT_GATHER_HISTORY_AUX_LOB_PIECE_TNAME, }; @@ -10244,6 +10278,14 @@ LOBMapping const lob_aux_table_mappings [] = { ObInnerTableSchema::all_cluster_event_history_aux_lob_piece_schema }, + { + OB_ALL_EXTERNAL_TABLE_FILE_TID, + OB_ALL_EXTERNAL_TABLE_FILE_AUX_LOB_META_TID, + OB_ALL_EXTERNAL_TABLE_FILE_AUX_LOB_PIECE_TID, + ObInnerTableSchema::all_external_table_file_aux_lob_meta_schema, + ObInnerTableSchema::all_external_table_file_aux_lob_piece_schema + }, + { OB_ALL_TASK_OPT_STAT_GATHER_HISTORY_TID, OB_ALL_TASK_OPT_STAT_GATHER_HISTORY_AUX_LOB_META_TID, @@ -10297,12 +10339,12 @@ 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 = 232; -const int64_t OB_VIRTUAL_TABLE_COUNT = 659; -const int64_t OB_SYS_VIEW_COUNT = 679; -const int64_t OB_SYS_TENANT_TABLE_COUNT = 1575; +const int64_t OB_SYS_TABLE_COUNT = 233; +const int64_t OB_VIRTUAL_TABLE_COUNT = 661; +const int64_t OB_SYS_VIEW_COUNT = 684; +const int64_t OB_SYS_TENANT_TABLE_COUNT = 1583; const int64_t OB_CORE_SCHEMA_VERSION = 1; -const int64_t OB_BOOTSTRAP_SCHEMA_VERSION = 1578; +const int64_t OB_BOOTSTRAP_SCHEMA_VERSION = 1586; } // end namespace share } // end namespace oceanbase diff --git a/src/share/inner_table/ob_inner_table_schema.lob.cpp b/src/share/inner_table/ob_inner_table_schema.lob.cpp index 9c3148e28..ece16457c 100644 --- a/src/share/inner_table/ob_inner_table_schema.lob.cpp +++ b/src/share/inner_table/ob_inner_table_schema.lob.cpp @@ -21,7 +21,7 @@ inner_lob_map_t inner_lob_map; bool lob_mapping_init() { int ret = OB_SUCCESS; - if (OB_FAIL(inner_lob_map.create(235, ObModIds::OB_INNER_LOB_HASH_SET))) { + if (OB_FAIL(inner_lob_map.create(236, ObModIds::OB_INNER_LOB_HASH_SET))) { SERVER_LOG(WARN, "fail to create inner lob map", K(ret)); } else { for (int64_t i = 0; OB_SUCC(ret) && i < ARRAYSIZEOF(lob_aux_table_mappings); ++i) { diff --git a/src/share/inner_table/ob_inner_table_schema.vt.cpp b/src/share/inner_table/ob_inner_table_schema.vt.cpp index eb1ea0437..cfd2d9609 100644 --- a/src/share/inner_table/ob_inner_table_schema.vt.cpp +++ b/src/share/inner_table/ob_inner_table_schema.vt.cpp @@ -196,6 +196,13 @@ bool vt_mapping_init() tmp_vt_mapping.is_real_vt_ = true; } + { + int64_t idx = OB_ALL_VIRTUAL_EXTERNAL_TABLE_FILE_REAL_AGENT_ORA_TID - start_idx; + VTMapping &tmp_vt_mapping = vt_mappings[idx]; + tmp_vt_mapping.mapping_tid_ = OB_ALL_EXTERNAL_TABLE_FILE_TID; + tmp_vt_mapping.is_real_vt_ = true; + } + { int64_t idx = OB_ALL_VIRTUAL_FOREIGN_KEY_COLUMN_REAL_AGENT_ORA_TID - start_idx; VTMapping &tmp_vt_mapping = vt_mappings[idx]; 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 415e3a0a8..417cb0909 100644 --- a/src/share/inner_table/ob_inner_table_schema_constants.h +++ b/src/share/inner_table/ob_inner_table_schema_constants.h @@ -261,6 +261,7 @@ const uint64_t OB_ALL_RLS_ATTRIBUTE_HISTORY_TID = 442; // "__all_rls_attribute_h const uint64_t OB_ALL_TENANT_REWRITE_RULES_TID = 443; // "__all_tenant_rewrite_rules" const uint64_t OB_ALL_RESERVED_SNAPSHOT_TID = 444; // "__all_reserved_snapshot" const uint64_t OB_ALL_CLUSTER_EVENT_HISTORY_TID = 445; // "__all_cluster_event_history" +const uint64_t OB_ALL_EXTERNAL_TABLE_FILE_TID = 450; // "__all_external_table_file" const uint64_t OB_ALL_TASK_OPT_STAT_GATHER_HISTORY_TID = 451; // "__all_task_opt_stat_gather_history" const uint64_t OB_ALL_TABLE_OPT_STAT_GATHER_HISTORY_TID = 452; // "__all_table_opt_stat_gather_history" const uint64_t OB_TENANT_VIRTUAL_ALL_TABLE_TID = 10001; // "__tenant_virtual_all_table" @@ -615,6 +616,7 @@ const uint64_t OB_ALL_VIRTUAL_LS_ARB_REPLICA_TASK_TID = 12364; // "__all_virtual const uint64_t OB_ALL_VIRTUAL_LS_ARB_REPLICA_TASK_HISTORY_TID = 12365; // "__all_virtual_ls_arb_replica_task_history" const uint64_t OB_ALL_VIRTUAL_ARCHIVE_DEST_STATUS_TID = 12366; // "__all_virtual_archive_dest_status" const uint64_t OB_ALL_VIRTUAL_IO_SCHEDULER_TID = 12369; // "__all_virtual_io_scheduler" +const uint64_t OB_ALL_VIRTUAL_EXTERNAL_TABLE_FILE_TID = 12371; // "__all_virtual_external_table_file" const uint64_t OB_ALL_VIRTUAL_TASK_OPT_STAT_GATHER_HISTORY_TID = 12381; // "__all_virtual_task_opt_stat_gather_history" const uint64_t OB_ALL_VIRTUAL_TABLE_OPT_STAT_GATHER_HISTORY_TID = 12382; // "__all_virtual_table_opt_stat_gather_history" const uint64_t OB_ALL_VIRTUAL_OPT_STAT_GATHER_MONITOR_TID = 12383; // "__all_virtual_opt_stat_gather_monitor" @@ -829,6 +831,7 @@ const uint64_t OB_ALL_VIRTUAL_TRANS_SCHEDULER_ORA_TID = 15287; // "ALL_VIRTUAL_T const uint64_t OB_ALL_VIRTUAL_LS_ARB_REPLICA_TASK_ORA_TID = 15288; // "ALL_VIRTUAL_LS_ARB_REPLICA_TASK_ORA" const uint64_t OB_ALL_VIRTUAL_LS_ARB_REPLICA_TASK_HISTORY_ORA_TID = 15289; // "ALL_VIRTUAL_LS_ARB_REPLICA_TASK_HISTORY_ORA" const uint64_t OB_ALL_VIRTUAL_ARCHIVE_DEST_STATUS_ORA_TID = 15290; // "ALL_VIRTUAL_ARCHIVE_DEST_STATUS_ORA" +const uint64_t OB_ALL_VIRTUAL_EXTERNAL_TABLE_FILE_REAL_AGENT_ORA_TID = 15292; // "ALL_VIRTUAL_EXTERNAL_TABLE_FILE_REAL_AGENT_ORA" const uint64_t OB_ALL_VIRTUAL_TASK_OPT_STAT_GATHER_HISTORY_ORA_TID = 15294; // "ALL_VIRTUAL_TASK_OPT_STAT_GATHER_HISTORY_ORA" const uint64_t OB_ALL_VIRTUAL_TABLE_OPT_STAT_GATHER_HISTORY_ORA_TID = 15295; // "ALL_VIRTUAL_TABLE_OPT_STAT_GATHER_HISTORY_ORA" const uint64_t OB_ALL_VIRTUAL_OPT_STAT_GATHER_MONITOR_ORA_TID = 15296; // "ALL_VIRTUAL_OPT_STAT_GATHER_MONITOR_ORA" @@ -1131,7 +1134,10 @@ const uint64_t OB_DBA_OB_TABLE_OPT_STAT_GATHER_HISTORY_TID = 21379; // "DBA_OB_T const uint64_t OB_GV_OB_THREAD_TID = 21380; // "GV$OB_THREAD" const uint64_t OB_V_OB_THREAD_TID = 21381; // "V$OB_THREAD" const uint64_t OB_V_OB_TIMESTAMP_SERVICE_TID = 21404; // "V$OB_TIMESTAMP_SERVICE" +const uint64_t OB_DBA_OB_EXTERNAL_TABLE_FILES_TID = 21417; // "DBA_OB_EXTERNAL_TABLE_FILES" +const uint64_t OB_ALL_OB_EXTERNAL_TABLE_FILES_TID = 21418; // "ALL_OB_EXTERNAL_TABLE_FILES" const uint64_t OB_DBA_OB_TABLE_STAT_STALE_INFO_TID = 21423; // "DBA_OB_TABLE_STAT_STALE_INFO" +const uint64_t OB_CDB_OB_EXTERNAL_TABLE_FILES_TID = 21425; // "CDB_OB_EXTERNAL_TABLE_FILES" const uint64_t OB_DBA_SYNONYMS_TID = 25001; // "DBA_SYNONYMS" const uint64_t OB_DBA_OBJECTS_ORA_TID = 25002; // "DBA_OBJECTS_ORA" const uint64_t OB_ALL_OBJECTS_TID = 25003; // "ALL_OBJECTS" @@ -1356,6 +1362,8 @@ const uint64_t OB_DBA_DB_LINKS_ORA_TID = 25225; // "DBA_DB_LINKS_ORA" const uint64_t OB_USER_DB_LINKS_ORA_TID = 25226; // "USER_DB_LINKS_ORA" const uint64_t OB_DBA_OB_TASK_OPT_STAT_GATHER_HISTORY_ORA_TID = 25227; // "DBA_OB_TASK_OPT_STAT_GATHER_HISTORY_ORA" const uint64_t OB_DBA_OB_TABLE_OPT_STAT_GATHER_HISTORY_ORA_TID = 25228; // "DBA_OB_TABLE_OPT_STAT_GATHER_HISTORY_ORA" +const uint64_t OB_DBA_OB_EXTERNAL_TABLE_FILES_ORA_TID = 25234; // "DBA_OB_EXTERNAL_TABLE_FILES_ORA" +const uint64_t OB_ALL_OB_EXTERNAL_TABLE_FILES_ORA_TID = 25235; // "ALL_OB_EXTERNAL_TABLE_FILES_ORA" const uint64_t OB_DBA_OB_TABLE_STAT_STALE_INFO_ORA_TID = 25247; // "DBA_OB_TABLE_STAT_STALE_INFO_ORA" const uint64_t OB_GV_OB_SQL_AUDIT_ORA_TID = 28002; // "GV$OB_SQL_AUDIT_ORA" const uint64_t OB_V_OB_SQL_AUDIT_ORA_TID = 28003; // "V$OB_SQL_AUDIT_ORA" @@ -1747,6 +1755,7 @@ const uint64_t OB_ALL_RLS_ATTRIBUTE_HISTORY_AUX_LOB_META_TID = 50442; // "__all_ const uint64_t OB_ALL_TENANT_REWRITE_RULES_AUX_LOB_META_TID = 50443; // "__all_tenant_rewrite_rules_aux_lob_meta" const uint64_t OB_ALL_RESERVED_SNAPSHOT_AUX_LOB_META_TID = 50444; // "__all_reserved_snapshot_aux_lob_meta" const uint64_t OB_ALL_CLUSTER_EVENT_HISTORY_AUX_LOB_META_TID = 50445; // "__all_cluster_event_history_aux_lob_meta" +const uint64_t OB_ALL_EXTERNAL_TABLE_FILE_AUX_LOB_META_TID = 50450; // "__all_external_table_file_aux_lob_meta" const uint64_t OB_ALL_TASK_OPT_STAT_GATHER_HISTORY_AUX_LOB_META_TID = 50451; // "__all_task_opt_stat_gather_history_aux_lob_meta" const uint64_t OB_ALL_TABLE_OPT_STAT_GATHER_HISTORY_AUX_LOB_META_TID = 50452; // "__all_table_opt_stat_gather_history_aux_lob_meta" const uint64_t OB_ALL_TABLE_AUX_LOB_PIECE_TID = 60003; // "__all_table_aux_lob_piece" @@ -1982,6 +1991,7 @@ const uint64_t OB_ALL_RLS_ATTRIBUTE_HISTORY_AUX_LOB_PIECE_TID = 60442; // "__all const uint64_t OB_ALL_TENANT_REWRITE_RULES_AUX_LOB_PIECE_TID = 60443; // "__all_tenant_rewrite_rules_aux_lob_piece" const uint64_t OB_ALL_RESERVED_SNAPSHOT_AUX_LOB_PIECE_TID = 60444; // "__all_reserved_snapshot_aux_lob_piece" const uint64_t OB_ALL_CLUSTER_EVENT_HISTORY_AUX_LOB_PIECE_TID = 60445; // "__all_cluster_event_history_aux_lob_piece" +const uint64_t OB_ALL_EXTERNAL_TABLE_FILE_AUX_LOB_PIECE_TID = 60450; // "__all_external_table_file_aux_lob_piece" const uint64_t OB_ALL_TASK_OPT_STAT_GATHER_HISTORY_AUX_LOB_PIECE_TID = 60451; // "__all_task_opt_stat_gather_history_aux_lob_piece" const uint64_t OB_ALL_TABLE_OPT_STAT_GATHER_HISTORY_AUX_LOB_PIECE_TID = 60452; // "__all_table_opt_stat_gather_history_aux_lob_piece" const uint64_t OB_ALL_VIRTUAL_PLAN_CACHE_STAT_ALL_VIRTUAL_PLAN_CACHE_STAT_I1_TID = 14999; // "__all_virtual_plan_cache_stat" @@ -2400,6 +2410,7 @@ const char *const OB_ALL_RLS_ATTRIBUTE_HISTORY_TNAME = "__all_rls_attribute_hist const char *const OB_ALL_TENANT_REWRITE_RULES_TNAME = "__all_tenant_rewrite_rules"; const char *const OB_ALL_RESERVED_SNAPSHOT_TNAME = "__all_reserved_snapshot"; const char *const OB_ALL_CLUSTER_EVENT_HISTORY_TNAME = "__all_cluster_event_history"; +const char *const OB_ALL_EXTERNAL_TABLE_FILE_TNAME = "__all_external_table_file"; const char *const OB_ALL_TASK_OPT_STAT_GATHER_HISTORY_TNAME = "__all_task_opt_stat_gather_history"; const char *const OB_ALL_TABLE_OPT_STAT_GATHER_HISTORY_TNAME = "__all_table_opt_stat_gather_history"; const char *const OB_TENANT_VIRTUAL_ALL_TABLE_TNAME = "__tenant_virtual_all_table"; @@ -2754,6 +2765,7 @@ const char *const OB_ALL_VIRTUAL_LS_ARB_REPLICA_TASK_TNAME = "__all_virtual_ls_a const char *const OB_ALL_VIRTUAL_LS_ARB_REPLICA_TASK_HISTORY_TNAME = "__all_virtual_ls_arb_replica_task_history"; const char *const OB_ALL_VIRTUAL_ARCHIVE_DEST_STATUS_TNAME = "__all_virtual_archive_dest_status"; const char *const OB_ALL_VIRTUAL_IO_SCHEDULER_TNAME = "__all_virtual_io_scheduler"; +const char *const OB_ALL_VIRTUAL_EXTERNAL_TABLE_FILE_TNAME = "__all_virtual_external_table_file"; const char *const OB_ALL_VIRTUAL_TASK_OPT_STAT_GATHER_HISTORY_TNAME = "__all_virtual_task_opt_stat_gather_history"; const char *const OB_ALL_VIRTUAL_TABLE_OPT_STAT_GATHER_HISTORY_TNAME = "__all_virtual_table_opt_stat_gather_history"; const char *const OB_ALL_VIRTUAL_OPT_STAT_GATHER_MONITOR_TNAME = "__all_virtual_opt_stat_gather_monitor"; @@ -2968,6 +2980,7 @@ const char *const OB_ALL_VIRTUAL_TRANS_SCHEDULER_ORA_TNAME = "ALL_VIRTUAL_TRANS_ const char *const OB_ALL_VIRTUAL_LS_ARB_REPLICA_TASK_ORA_TNAME = "ALL_VIRTUAL_LS_ARB_REPLICA_TASK"; const char *const OB_ALL_VIRTUAL_LS_ARB_REPLICA_TASK_HISTORY_ORA_TNAME = "ALL_VIRTUAL_LS_ARB_REPLICA_TASK_HISTORY"; const char *const OB_ALL_VIRTUAL_ARCHIVE_DEST_STATUS_ORA_TNAME = "ALL_VIRTUAL_ARCHIVE_DEST_STATUS"; +const char *const OB_ALL_VIRTUAL_EXTERNAL_TABLE_FILE_REAL_AGENT_ORA_TNAME = "ALL_VIRTUAL_EXTERNAL_TABLE_FILE_REAL_AGENT"; const char *const OB_ALL_VIRTUAL_TASK_OPT_STAT_GATHER_HISTORY_ORA_TNAME = "ALL_VIRTUAL_TASK_OPT_STAT_GATHER_HISTORY"; const char *const OB_ALL_VIRTUAL_TABLE_OPT_STAT_GATHER_HISTORY_ORA_TNAME = "ALL_VIRTUAL_TABLE_OPT_STAT_GATHER_HISTORY"; const char *const OB_ALL_VIRTUAL_OPT_STAT_GATHER_MONITOR_ORA_TNAME = "ALL_VIRTUAL_OPT_STAT_GATHER_MONITOR"; @@ -3270,7 +3283,10 @@ const char *const OB_DBA_OB_TABLE_OPT_STAT_GATHER_HISTORY_TNAME = "DBA_OB_TABLE_ const char *const OB_GV_OB_THREAD_TNAME = "GV$OB_THREAD"; const char *const OB_V_OB_THREAD_TNAME = "V$OB_THREAD"; const char *const OB_V_OB_TIMESTAMP_SERVICE_TNAME = "V$OB_TIMESTAMP_SERVICE"; +const char *const OB_DBA_OB_EXTERNAL_TABLE_FILES_TNAME = "DBA_OB_EXTERNAL_TABLE_FILES"; +const char *const OB_ALL_OB_EXTERNAL_TABLE_FILES_TNAME = "ALL_OB_EXTERNAL_TABLE_FILES"; const char *const OB_DBA_OB_TABLE_STAT_STALE_INFO_TNAME = "DBA_OB_TABLE_STAT_STALE_INFO"; +const char *const OB_CDB_OB_EXTERNAL_TABLE_FILES_TNAME = "CDB_OB_EXTERNAL_TABLE_FILES"; const char *const OB_DBA_SYNONYMS_TNAME = "DBA_SYNONYMS"; const char *const OB_DBA_OBJECTS_ORA_TNAME = "DBA_OBJECTS"; const char *const OB_ALL_OBJECTS_TNAME = "ALL_OBJECTS"; @@ -3495,6 +3511,8 @@ const char *const OB_DBA_DB_LINKS_ORA_TNAME = "DBA_DB_LINKS"; const char *const OB_USER_DB_LINKS_ORA_TNAME = "USER_DB_LINKS"; const char *const OB_DBA_OB_TASK_OPT_STAT_GATHER_HISTORY_ORA_TNAME = "DBA_OB_TASK_OPT_STAT_GATHER_HISTORY"; const char *const OB_DBA_OB_TABLE_OPT_STAT_GATHER_HISTORY_ORA_TNAME = "DBA_OB_TABLE_OPT_STAT_GATHER_HISTORY"; +const char *const OB_DBA_OB_EXTERNAL_TABLE_FILES_ORA_TNAME = "DBA_OB_EXTERNAL_TABLE_FILES"; +const char *const OB_ALL_OB_EXTERNAL_TABLE_FILES_ORA_TNAME = "ALL_OB_EXTERNAL_TABLE_FILES"; const char *const OB_DBA_OB_TABLE_STAT_STALE_INFO_ORA_TNAME = "DBA_OB_TABLE_STAT_STALE_INFO"; const char *const OB_GV_OB_SQL_AUDIT_ORA_TNAME = "GV$OB_SQL_AUDIT"; const char *const OB_V_OB_SQL_AUDIT_ORA_TNAME = "V$OB_SQL_AUDIT"; @@ -3886,6 +3904,7 @@ const char *const OB_ALL_RLS_ATTRIBUTE_HISTORY_AUX_LOB_META_TNAME = "__all_rls_a const char *const OB_ALL_TENANT_REWRITE_RULES_AUX_LOB_META_TNAME = "__all_tenant_rewrite_rules_aux_lob_meta"; const char *const OB_ALL_RESERVED_SNAPSHOT_AUX_LOB_META_TNAME = "__all_reserved_snapshot_aux_lob_meta"; const char *const OB_ALL_CLUSTER_EVENT_HISTORY_AUX_LOB_META_TNAME = "__all_cluster_event_history_aux_lob_meta"; +const char *const OB_ALL_EXTERNAL_TABLE_FILE_AUX_LOB_META_TNAME = "__all_external_table_file_aux_lob_meta"; const char *const OB_ALL_TASK_OPT_STAT_GATHER_HISTORY_AUX_LOB_META_TNAME = "__all_task_opt_stat_gather_history_aux_lob_meta"; const char *const OB_ALL_TABLE_OPT_STAT_GATHER_HISTORY_AUX_LOB_META_TNAME = "__all_table_opt_stat_gather_history_aux_lob_meta"; const char *const OB_ALL_TABLE_AUX_LOB_PIECE_TNAME = "__all_table_aux_lob_piece"; @@ -4121,6 +4140,7 @@ const char *const OB_ALL_RLS_ATTRIBUTE_HISTORY_AUX_LOB_PIECE_TNAME = "__all_rls_ const char *const OB_ALL_TENANT_REWRITE_RULES_AUX_LOB_PIECE_TNAME = "__all_tenant_rewrite_rules_aux_lob_piece"; const char *const OB_ALL_RESERVED_SNAPSHOT_AUX_LOB_PIECE_TNAME = "__all_reserved_snapshot_aux_lob_piece"; const char *const OB_ALL_CLUSTER_EVENT_HISTORY_AUX_LOB_PIECE_TNAME = "__all_cluster_event_history_aux_lob_piece"; +const char *const OB_ALL_EXTERNAL_TABLE_FILE_AUX_LOB_PIECE_TNAME = "__all_external_table_file_aux_lob_piece"; const char *const OB_ALL_TASK_OPT_STAT_GATHER_HISTORY_AUX_LOB_PIECE_TNAME = "__all_task_opt_stat_gather_history_aux_lob_piece"; const char *const OB_ALL_TABLE_OPT_STAT_GATHER_HISTORY_AUX_LOB_PIECE_TNAME = "__all_table_opt_stat_gather_history_aux_lob_piece"; const char *const OB_ALL_VIRTUAL_PLAN_CACHE_STAT_ALL_VIRTUAL_PLAN_CACHE_STAT_I1_TNAME = "__idx_11003_all_virtual_plan_cache_stat_i1"; 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 596fc1668..af6becfca 100644 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -268,7 +268,11 @@ all_table_def = dict( ('b_interval_range', 'varchar:OB_MAX_B_HIGH_BOUND_VAL_LENGTH', 'true'), ('object_status', 'int', 'false', '1'), ('table_flags', 'int', 'false', '0'), - ('truncate_version', 'int', 'false', '-1') + ('truncate_version', 'int', 'false', '-1'), + ('external_file_location', 'varbinary:OB_MAX_VARCHAR_LENGTH', 'true'), + ('external_file_location_access_info', 'varbinary:OB_MAX_VARCHAR_LENGTH', 'true'), + ('external_file_format', 'varbinary:OB_MAX_VARCHAR_LENGTH', 'true'), + ('external_file_pattern', 'varbinary:OB_MAX_VARCHAR_LENGTH', 'true'), ], ) @@ -5461,7 +5465,29 @@ def_table_schema( # 448 : __all_backup_transferring_tablets # 449 : __all_wait_for_partition_split_tablet -# 450 : __all_external_table_file + +def_table_schema( + owner = 'jim.wjh', + table_name = '__all_external_table_file', + table_id = '450', + table_type = 'SYSTEM_TABLE', + gm_columns = [], + rowkey_columns = [ + ('table_id', 'int'), + ('part_id', 'int'), + ('file_id', 'int'), + ], + normal_columns = [ + ('file_url', 'varbinary:16384'), + ('create_version', 'int'), + ('delete_version', 'int'), + ('file_size', 'int'), + ], + in_tenant_space = True, +) + +# 451 : __all_task_opt_stat_gather_history +# 452 : __all_table_opt_stat_gather_history def_table_schema( owner = 'jiangxiu.wt', @@ -11551,7 +11577,12 @@ def_table_schema( ) # 12370: __all_virtual_wait_for_partition_split_tablet -# 12371: __all_virtual_external_table_file + +def_table_schema(**gen_iterate_virtual_table_def( + table_id = '12371', + table_name = '__all_virtual_external_table_file', + keywords = all_def_keywords['__all_external_table_file'])) + # 12372: __all_virtual_io_tracer # 12373: __all_virtual_mds_node_stat # 12374: __all_virtual_mds_event_history @@ -11948,7 +11979,9 @@ def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15288' def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15289', all_def_keywords['__all_virtual_ls_arb_replica_task_history']))) def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15290', all_def_keywords['__all_virtual_archive_dest_status']))) # 15291: __all_virtual_backup_transferring_tablets -# 15292: __all_virtual_external_table_file + +def_table_schema(**gen_oracle_mapping_real_virtual_table_def('15292', all_def_keywords['__all_external_table_file'])) + # 15293: __all_data_dictionary_in_log def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15294', all_def_keywords['__all_virtual_task_opt_stat_gather_history']))) def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15295', all_def_keywords['__all_virtual_table_opt_stat_gather_history']))) @@ -12454,7 +12487,7 @@ def_table_schema( on a.table_id = ts.table_id and a.tenant_id = ts.tenant_id where a.tenant_id = 0 - and a.table_type in (0, 1, 2, 3, 4) + and a.table_type in (0, 1, 2, 3, 4, 14) and b.database_name != '__recyclebin' and b.in_recyclebin = 0 and 0 = sys_privilege_check('table_acc', effective_tenant_id(), b.database_name, a.table_name) @@ -17009,7 +17042,7 @@ def_table_schema( ,NULL SUBOBJECT_NAME ,TABLE_ID OBJECT_ID ,(CASE WHEN TABLET_ID != 0 THEN TABLET_ID ELSE NULL END) DATA_OBJECT_ID - ,CASE WHEN TABLE_TYPE IN (0,3,6,8,9) THEN 'TABLE' + ,CASE WHEN TABLE_TYPE IN (0,3,6,8,9,14) THEN 'TABLE' WHEN TABLE_TYPE IN (2) THEN 'VIRTUAL TABLE' WHEN TABLE_TYPE IN (1,4) THEN 'VIEW' WHEN TABLE_TYPE IN (5) THEN 'INDEX' @@ -17524,7 +17557,7 @@ FROM ON DB.TENANT_ID = T.TENANT_ID AND DB.DATABASE_ID = T.DATABASE_ID - AND T.TABLE_TYPE IN (0, 3, 6, 8, 9) + AND T.TABLE_TYPE IN (0, 3, 6, 8, 9, 14) AND DB.DATABASE_NAME != '__recyclebin' LEFT JOIN @@ -17752,7 +17785,7 @@ FROM AND C.COLUMN_ID = STAT.COLUMN_ID AND STAT.OBJECT_TYPE = 1 WHERE - T.TABLE_TYPE IN (0,1,3,4,5,6,7,8,9) + T.TABLE_TYPE IN (0,1,3,4,5,6,7,8,9,14) """.replace("\n", " ") ) @@ -19048,7 +19081,7 @@ def_table_schema( ,NULL SUBOBJECT_NAME ,CAST(TABLE_ID AS SIGNED) AS OBJECT_ID ,(CASE WHEN TABLET_ID != 0 THEN TABLET_ID ELSE NULL END) DATA_OBJECT_ID - ,CASE WHEN TABLE_TYPE IN (0,3,6,8,9) THEN 'TABLE' + ,CASE WHEN TABLE_TYPE IN (0,3,6,8,9,14) THEN 'TABLE' WHEN TABLE_TYPE IN (2) THEN 'VIRTUAL TABLE' WHEN TABLE_TYPE IN (1,4) THEN 'VIEW' WHEN TABLE_TYPE IN (5) THEN 'INDEX' @@ -21182,7 +21215,7 @@ def_table_schema( 'TABLE' AS OBJECT_TYPE FROM oceanbase.__all_table T - WHERE T.TABLE_TYPE IN (0,2,3,6)) + WHERE T.TABLE_TYPE IN (0,2,3,6,14)) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, @@ -21200,7 +21233,7 @@ def_table_schema( oceanbase.__all_part P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID - WHERE T.TABLE_TYPE IN (0,2,3,6) + WHERE T.TABLE_TYPE IN (0,2,3,6,14) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, @@ -21223,7 +21256,7 @@ def_table_schema( ON T.TENANT_ID = SP.TENANT_ID AND T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID - WHERE T.TABLE_TYPE IN (0,2,3,6) + WHERE T.TABLE_TYPE IN (0,2,3,6,14) ) V JOIN oceanbase.__all_database DB @@ -21282,7 +21315,7 @@ def_table_schema( database_id, table_id, table_name - FROM oceanbase.__all_table where table_type in (0,2,3,6)) T + FROM oceanbase.__all_table where table_type in (0,2,3,6,14)) T JOIN oceanbase.__all_database db ON db.tenant_id = t.tenant_id @@ -21368,7 +21401,7 @@ def_table_schema( AND stat.object_type = 2 WHERE c.is_hidden = 0 - AND t.table_type in (0,3,6) + AND t.table_type in (0,3,6,14) """.replace("\n", " ") ) @@ -21425,7 +21458,7 @@ def_table_schema( AND stat.object_type = 3 WHERE c.is_hidden = 0 - AND t.table_type in (0,3,6) + AND t.table_type in (0,3,6,14) """.replace("\n", " ") ) @@ -21460,7 +21493,7 @@ def_table_schema( database_id, table_id, table_name - FROM oceanbase.__all_table where table_type in (0,3,6)) T + FROM oceanbase.__all_table where table_type in (0,3,6,14)) T JOIN oceanbase.__all_database db ON db.tenant_id = t.tenant_id @@ -21522,7 +21555,7 @@ def_table_schema( AND hist.object_type = 2 WHERE c.is_hidden = 0 - AND t.table_type in (0,3,6) + AND t.table_type in (0,3,6,14) """.replace("\n", " ") ) @@ -21568,7 +21601,7 @@ def_table_schema( AND hist.object_type = 3 WHERE c.is_hidden = 0 - AND t.table_type in (0,3,6) + AND t.table_type in (0,3,6,14) """.replace("\n", " ") ) @@ -21616,7 +21649,7 @@ def_table_schema( 'TABLE' AS OBJECT_TYPE FROM oceanbase.__all_table T - WHERE T.TABLE_TYPE IN (0,3,6)) + WHERE T.TABLE_TYPE IN (0,3,6,14)) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, @@ -21634,7 +21667,7 @@ def_table_schema( oceanbase.__all_part P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID - WHERE T.TABLE_TYPE IN (0,3,6) + WHERE T.TABLE_TYPE IN (0,3,6,14) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, @@ -21657,7 +21690,7 @@ def_table_schema( ON T.TENANT_ID = SP.TENANT_ID AND T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID - WHERE T.TABLE_TYPE IN (0,3,6) + WHERE T.TABLE_TYPE IN (0,3,6,14) ) V JOIN oceanbase.__all_database DB @@ -25835,7 +25868,7 @@ FROM 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) +WHERE T.TABLE_TYPE IN (3,6,8,9,14) """.replace("\n", " "), ) @@ -26303,13 +26336,62 @@ def_table_schema( # 21414: CDB_OB_TRANSFER_TASKS # 21415: DBA_OB_TRANSFER_TASK_HISTORY # 21416: CDB_OB_TRANSFER_TASK_HISTORY -# 21417: ALL_OB_EXTERNAL_TABLE_FILE -# 21418: CDB_OB_EXTERNAL_TABLE_FILE # 21419: GV$OB_PX_P2P_DATAHUB # 21420: V$OB_PX_P2P_DATAHUB # 21421: GV$SQL_JOIN_FILTER # 21422: V$SQL_JOIN_FILTER +def_table_schema( + owner = 'jim.wjh', + table_name = 'DBA_OB_EXTERNAL_TABLE_FILES', + table_id = '21417', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + in_tenant_space = True, + view_definition = """ + SELECT + B.TABLE_NAME AS TABLE_NAME, + C.DATABASE_NAME AS TABLE_SCHEMA, + 'P0' AS PARTITION_NAME, + A.FILE_URL AS FILE_URL, + A.FILE_SIZE AS FILE_SIZE + FROM + OCEANBASE.__ALL_EXTERNAL_TABLE_FILE A + INNER JOIN OCEANBASE.__ALL_TABLE B ON A.TABLE_ID = B.TABLE_ID AND B.TENANT_ID = 0 + INNER JOIN OCEANBASE.__ALL_DATABASE C ON B.DATABASE_ID = C.DATABASE_ID AND C.TENANT_ID = 0 + WHERE B.TABLE_TYPE = 14 AND (A.DELETE_VERSION = 9223372036854775807 OR A.DELETE_VERSION < A.CREATE_VERSION) +""".replace("\n", " ") +) + +def_table_schema( + owner = 'jim.wjh', + table_name = 'ALL_OB_EXTERNAL_TABLE_FILES', + table_id = '21418', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + in_tenant_space = True, + view_definition = """ + SELECT + B.TABLE_NAME AS TABLE_NAME, + C.DATABASE_NAME AS TABLE_SCHEMA, + 'P0' AS PARTITION_NAME, + A.FILE_URL AS FILE_URL, + A.FILE_SIZE AS FILE_SIZE + FROM + OCEANBASE.__ALL_EXTERNAL_TABLE_FILE A + INNER JOIN OCEANBASE.__ALL_TABLE B ON A.TABLE_ID = B.TABLE_ID AND B.TENANT_ID = 0 + INNER JOIN OCEANBASE.__ALL_DATABASE C ON B.DATABASE_ID = C.DATABASE_ID AND C.TENANT_ID = 0 + WHERE B.TABLE_TYPE = 14 + AND 0 = sys_privilege_check('table_acc', EFFECTIVE_TENANT_ID(), C.DATABASE_NAME, B.TABLE_NAME) + AND (A.DELETE_VERSION = 9223372036854775807 OR A.DELETE_VERSION < A.CREATE_VERSION) +""".replace("\n", " ") +) + + def_table_schema( owner = 'yibo.tyf', table_name = 'DBA_OB_TABLE_STAT_STALE_INFO', @@ -26457,6 +26539,31 @@ JOIN OCEANBASE.__ALL_OPTSTAT_GLOBAL_PREFS GP ) # 21424: V$OB_LS_LOG_RESTORE_STATUS +def_table_schema( + owner = 'jim.wjh', + table_name = 'CDB_OB_EXTERNAL_TABLE_FILES', + table_id = '21425', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + view_definition = """ + SELECT + A.TENANT_ID AS TENANT_ID, + B.TABLE_NAME AS TABLE_NAME, + C.DATABASE_NAME AS TABLE_SCHEMA, + 'P0' AS PARTITION_NAME, + A.FILE_URL AS FILE_URL, + A.FILE_SIZE AS FILE_SIZE + FROM + OCEANBASE.__ALL_VIRTUAL_EXTERNAL_TABLE_FILE A + INNER JOIN OCEANBASE.__ALL_VIRTUAL_TABLE B ON A.TABLE_ID = B.TABLE_ID AND A.TENANT_ID=B.TENANT_ID + INNER JOIN OCEANBASE.__ALL_VIRTUAL_DATABASE C ON B.DATABASE_ID = C.DATABASE_ID AND B.TENANT_ID=C.TENANT_ID + WHERE B.TABLE_TYPE = 14 AND (A.DELETE_VERSION = 9223372036854775807 OR A.DELETE_VERSION < A.CREATE_VERSION) +""".replace("\n", " ") +) + + ################################################################################ # Oracle System View (25000, 30000] # Data Dictionary View (25000, 28000] @@ -26594,7 +26701,7 @@ def_table_schema( ,NULL SUBOBJECT_NAME ,TABLE_ID OBJECT_ID ,(CASE WHEN TABLET_ID != 0 THEN TABLET_ID ELSE NULL END) DATA_OBJECT_ID - ,CASE WHEN TABLE_TYPE IN (0,3,6,8,9) THEN 'TABLE' + ,CASE WHEN TABLE_TYPE IN (0,3,6,8,9,14) THEN 'TABLE' WHEN TABLE_TYPE IN (2) THEN 'VIRTUAL TABLE' WHEN TABLE_TYPE IN (1,4) THEN 'VIEW' WHEN TABLE_TYPE IN (5) THEN 'INDEX' @@ -27125,7 +27232,7 @@ def_table_schema( ,TABLE_ID OBJECT_ID ,TABLE_ID PRIV_OBJECT_ID ,(CASE WHEN TABLET_ID != 0 THEN TABLET_ID ELSE NULL END) DATA_OBJECT_ID - ,CASE WHEN TABLE_TYPE IN (0,3,6,8,9) THEN 'TABLE' + ,CASE WHEN TABLE_TYPE IN (0,3,6,8,9,14) THEN 'TABLE' WHEN TABLE_TYPE IN (2) THEN 'VIRTUAL TABLE' WHEN TABLE_TYPE IN (1,4) THEN 'VIEW' WHEN TABLE_TYPE IN (5) THEN 'INDEX' @@ -27692,7 +27799,7 @@ def_table_schema( ,NULL SUBOBJECT_NAME ,TABLE_ID OBJECT_ID ,(CASE WHEN TABLET_ID != 0 THEN TABLET_ID ELSE NULL END) DATA_OBJECT_ID - ,CASE WHEN TABLE_TYPE IN (0,3,6,8,9) THEN 'TABLE' + ,CASE WHEN TABLE_TYPE IN (0,3,6,8,9,14) THEN 'TABLE' WHEN TABLE_TYPE IN (2) THEN 'VIRTUAL TABLE' WHEN TABLE_TYPE IN (1,4) THEN 'VIEW' WHEN TABLE_TYPE IN (5) THEN 'INDEX' @@ -29406,7 +29513,7 @@ FROM TABLE_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() - AND TABLE_TYPE IN (0,1,3,4,5,7,8,9)) T + AND TABLE_TYPE IN (0,1,3,4,5,7,8,9,14)) T JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB ON DB.TENANT_ID = T.TENANT_ID @@ -29623,7 +29730,7 @@ FROM TABLE_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() - AND TABLE_TYPE IN (0,1,3,4,5,7,8,9)) T + AND TABLE_TYPE IN (0,1,3,4,5,7,8,9,14)) T JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB ON DB.TENANT_ID = T.TENANT_ID @@ -29837,7 +29944,7 @@ FROM TABLE_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT WHERE TENANT_ID = EFFECTIVE_TENANT_ID() - AND TABLE_TYPE IN (0,1,3,4,5,7,8,9)) T + AND TABLE_TYPE IN (0,1,3,4,5,7,8,9,14)) T JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB ON DB.TENANT_ID = T.TENANT_ID @@ -30388,7 +30495,7 @@ FROM ON DB.TENANT_ID = T.TENANT_ID AND DB.DATABASE_ID = T.DATABASE_ID - AND T.TABLE_TYPE IN (0, 3, 8, 9) + AND T.TABLE_TYPE IN (0, 3, 8, 9, 14) AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.DATABASE_NAME != '__recyclebin' AND (T.DATABASE_ID = USERENV('SCHEMAID') @@ -30561,7 +30668,7 @@ FROM ON DB.TENANT_ID = T.TENANT_ID AND DB.DATABASE_ID = T.DATABASE_ID - AND T.TABLE_TYPE IN (0, 3, 8, 9) + AND T.TABLE_TYPE IN (0, 3, 8, 9, 14) AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.DATABASE_NAME != '__recyclebin' @@ -30731,7 +30838,7 @@ FROM ON DB.TENANT_ID = T.TENANT_ID AND DB.DATABASE_ID = T.DATABASE_ID - AND T.TABLE_TYPE IN (0, 3, 8, 9) + AND T.TABLE_TYPE IN (0, 3, 8, 9, 14) AND T.DATABASE_ID = USERENV('SCHEMAID') AND DB.TENANT_ID = EFFECTIVE_TENANT_ID() AND DB.DATABASE_NAME != '__recyclebin' @@ -30763,6 +30870,7 @@ def_table_schema( CAST(B.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(CASE WHEN TABLE_TYPE = 0 OR TABLE_TYPE = 2 OR TABLE_TYPE = 3 OR TABLE_TYPE = 8 OR TABLE_TYPE = 9 THEN 'TABLE' WHEN TABLE_TYPE = 1 OR TABLE_TYPE = 4 OR TABLE_TYPE = 7 THEN 'VIEW' + WHEN TABLE_TYPE = 14 THEN 'EXTERNAL_TABLE' ELSE NULL END AS VARCHAR2(11)) AS TABLE_TYPE, CAST(B."COMMENT" AS VARCHAR(4000)) AS COMMENTS FROM @@ -30793,6 +30901,7 @@ def_table_schema( CAST(B.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(CASE WHEN TABLE_TYPE = 0 OR TABLE_TYPE = 2 OR TABLE_TYPE = 3 OR TABLE_TYPE = 8 OR TABLE_TYPE = 9 THEN 'TABLE' WHEN TABLE_TYPE = 1 OR TABLE_TYPE = 4 OR TABLE_TYPE = 7 THEN 'VIEW' + WHEN TABLE_TYPE = 14 THEN 'EXTERNAL_TABLE' ELSE NULL END AS VARCHAR2(11)) AS TABLE_TYPE, CAST(B."COMMENT" AS VARCHAR(4000)) AS COMMENTS FROM @@ -30824,6 +30933,7 @@ def_table_schema( CAST(B.TABLE_NAME AS VARCHAR2(128)) AS TABLE_NAME, CAST(CASE WHEN TABLE_TYPE = 0 OR TABLE_TYPE = 2 OR TABLE_TYPE = 3 OR TABLE_TYPE = 8 OR TABLE_TYPE = 9 THEN 'TABLE' WHEN TABLE_TYPE = 1 OR TABLE_TYPE = 4 OR TABLE_TYPE = 7 THEN 'VIEW' + WHEN TABLE_TYPE = 14 THEN 'EXTERNAL_TABLE' ELSE NULL END AS VARCHAR2(11)) AS TABLE_TYPE, CAST(B."COMMENT" AS VARCHAR(4000)) AS COMMENTS FROM @@ -36240,7 +36350,7 @@ FROM AND T.DATABASE_ID = DB.DATABASE_ID WHERE T.TENANT_ID = EFFECTIVE_TENANT_ID() - AND T.TABLE_TYPE IN (0, 3, 8, 9) + AND T.TABLE_TYPE IN (0, 3, 8, 9, 14) AND DB.DATABASE_NAME != '__recyclebin' AND (T.DATABASE_ID = USERENV('SCHEMAID') OR USER_CAN_ACCESS_OBJ(1, T.TABLE_ID, T.DATABASE_ID) = 1) @@ -36522,7 +36632,7 @@ FROM AND T.DATABASE_ID = DB.DATABASE_ID WHERE T.TENANT_ID = EFFECTIVE_TENANT_ID() - AND T.TABLE_TYPE IN (0, 3, 8, 9) + AND T.TABLE_TYPE IN (0, 3, 8, 9, 14) AND DB.DATABASE_NAME != '__recyclebin' AND T.DATABASE_ID = USERENV('SCHEMAID') """.replace("\n", " ") @@ -43986,6 +44096,61 @@ def_table_schema( # 25246: V$SQL_JOIN_FILTER # 25247: DBA_OB_TABLE_STAT_STALE_INFO +def_table_schema( + owner = 'jim.wjh', + table_name = 'DBA_OB_EXTERNAL_TABLE_FILES', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '25234', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + in_tenant_space = True, + view_definition = """ + SELECT + B.TABLE_NAME AS TABLE_NAME, + C.DATABASE_NAME AS OWNER, + 'P0' AS PARTITION_NAME, + A.FILE_URL AS FILE_URL, + A.FILE_SIZE AS FILE_SIZE + FROM + SYS.ALL_VIRTUAL_EXTERNAL_TABLE_FILE_REAL_AGENT A + INNER JOIN SYS.ALL_VIRTUAL_TABLE_REAL_AGENT B ON A.TABLE_ID = B.TABLE_ID + INNER JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT C ON B.DATABASE_ID = C.DATABASE_ID AND B.TENANT_ID = C.TENANT_ID + WHERE B.TENANT_ID = EFFECTIVE_TENANT_ID() AND B.TABLE_TYPE = 14 AND + (A.DELETE_VERSION = 9223372036854775807 OR A.DELETE_VERSION < A.CREATE_VERSION) + """.replace("\n", " ") +) + +def_table_schema( + owner = 'jim.wjh', + table_name = 'ALL_OB_EXTERNAL_TABLE_FILES', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '25235', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + in_tenant_space = True, + view_definition = """ + SELECT + B.TABLE_NAME AS TABLE_NAME, + C.DATABASE_NAME AS OWNER, + 'P0' AS PARTITION_NAME, + A.FILE_URL AS FILE_URL, + A.FILE_SIZE AS FILE_SIZE + FROM + SYS.ALL_VIRTUAL_EXTERNAL_TABLE_FILE_REAL_AGENT A + INNER JOIN SYS.ALL_VIRTUAL_TABLE_REAL_AGENT B ON A.TABLE_ID = B.TABLE_ID + INNER JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT C ON B.DATABASE_ID = C.DATABASE_ID AND B.TENANT_ID = C.TENANT_ID + WHERE B.TENANT_ID = EFFECTIVE_TENANT_ID() AND B.TABLE_TYPE = 14 AND + (C.DATABASE_ID = USERENV('SCHEMAID') OR USER_CAN_ACCESS_OBJ(1, B.TABLE_ID, C.DATABASE_ID) = 1) AND + (A.DELETE_VERSION = 9223372036854775807 OR A.DELETE_VERSION < A.CREATE_VERSION) + """.replace("\n", " ") +) + def_table_schema( owner = 'yibo.tyf', table_name = 'DBA_OB_TABLE_STAT_STALE_INFO', @@ -46031,7 +46196,7 @@ FROM TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT - WHERE table_type in (0,2,3,8,9)) t + WHERE table_type in (0,2,3,8,9,14)) t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id @@ -46111,7 +46276,7 @@ FROM TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT - WHERE table_type in (0,2,3,8,9)) t + WHERE table_type in (0,2,3,8,9,14)) t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id @@ -46188,7 +46353,7 @@ FROM TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT - WHERE table_type in (0,2,3,8,9)) t + WHERE table_type in (0,2,3,8,9,14)) t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id @@ -46269,7 +46434,7 @@ FROM AND stat.object_type = 2 WHERE c.is_hidden = 0 - AND t.table_type in (0,2,3,8,9) + AND t.table_type in (0,2,3,8,9,14) """.replace("\n", " ") ) @@ -46330,7 +46495,7 @@ FROM AND stat.object_type = 2 WHERE c.is_hidden = 0 - AND t.table_type in (0,2,3,8,9) + AND t.table_type in (0,2,3,8,9,14) """.replace("\n", " ") ) @@ -46385,7 +46550,7 @@ FROM AND stat.object_type = 2 WHERE c.is_hidden = 0 - AND t.table_type in (0,2,3,8,9) + AND t.table_type in (0,2,3,8,9,14) AND t.database_id = USERENV('SCHEMAID') """.replace("\n", " ") ) @@ -46449,7 +46614,7 @@ FROM AND stat.object_type = 3 WHERE c.is_hidden = 0 - AND t.table_type in (0,2,3,8,9) + AND t.table_type in (0,2,3,8,9,14) """.replace("\n", " ") ) @@ -46510,7 +46675,7 @@ FROM AND stat.object_type = 3 WHERE c.is_hidden = 0 - AND t.table_type in (0,2,3,8,9) + AND t.table_type in (0,2,3,8,9,14) """.replace("\n", " ") ) @@ -46565,7 +46730,7 @@ FROM AND stat.object_type = 3 WHERE c.is_hidden = 0 - AND t.table_type in (0,2,3,8,9) + AND t.table_type in (0,2,3,8,9,14) AND t.database_id = USERENV('SCHEMAID') """.replace("\n", " ") ) @@ -46603,7 +46768,7 @@ FROM TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT - WHERE table_type in (0,2,3,8,9)) t + WHERE table_type in (0,2,3,8,9,14)) t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id @@ -46660,7 +46825,7 @@ FROM TABLE_ID, TABLE_NAME FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT - WHERE table_type in (0,2,3,8,9)) t + WHERE table_type in (0,2,3,8,9,14)) t JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db ON db.tenant_id = t.tenant_id @@ -46717,7 +46882,7 @@ FROM AND hist.object_type = 1 WHERE c.is_hidden = 0 - AND t.table_type in (0,2,3,8,9) + AND t.table_type in (0,2,3,8,9,14) AND t.database_id = USERENV('SCHEMAID') """.replace("\n", " ") ) @@ -46770,7 +46935,7 @@ FROM AND hist.object_type = 2 WHERE c.is_hidden = 0 - AND t.table_type in (0,2,3,8,9) + AND t.table_type in (0,2,3,8,9,14) """.replace("\n", " ") ) @@ -46820,7 +46985,7 @@ FROM AND hist.object_type = 2 WHERE c.is_hidden = 0 - AND t.table_type in (0,2,3,8,9) + AND t.table_type in (0,2,3,8,9,14) """.replace("\n", " ") ) @@ -46863,7 +47028,7 @@ FROM AND hist.object_type = 2 WHERE c.is_hidden = 0 - AND t.table_type in (0,2,3,8,9) + AND t.table_type in (0,2,3,8,9,14) AND t.database_id = USERENV('SCHEMAID') """.replace("\n", " ") ) @@ -46916,7 +47081,7 @@ FROM AND hist.object_type = 3 WHERE c.is_hidden = 0 - AND t.table_type in (0,2,3,8,9) + AND t.table_type in (0,2,3,8,9,14) """.replace("\n", " ") ) @@ -46966,7 +47131,7 @@ FROM AND hist.object_type = 3 WHERE c.is_hidden = 0 - AND t.table_type in (0,2,3,8,9) + AND t.table_type in (0,2,3,8,9,14) """.replace("\n", " ") ) @@ -47009,7 +47174,7 @@ FROM AND hist.object_type = 3 WHERE c.is_hidden = 0 - AND t.table_type in (0,2,3,8,9) + AND t.table_type in (0,2,3,8,9,14) AND t.database_id = USERENV('SCHEMAID') """.replace("\n", " ") ) @@ -47081,7 +47246,7 @@ def_table_schema( 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T - WHERE T.TABLE_TYPE IN (0,2,3,8,9)) + WHERE T.TABLE_TYPE IN (0,2,3,8,9,14)) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, @@ -47099,7 +47264,7 @@ def_table_schema( SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID - WHERE T.TABLE_TYPE IN (0,2,3,8,9) + WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, @@ -47122,7 +47287,7 @@ def_table_schema( ON T.TENANT_ID = SP.TENANT_ID AND T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID - WHERE T.TABLE_TYPE IN (0,2,3,8,9) + WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) ) V JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB @@ -47207,7 +47372,7 @@ def_table_schema( 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T - WHERE T.TABLE_TYPE IN (0,2,3,8,9)) + WHERE T.TABLE_TYPE IN (0,2,3,8,9,14)) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, @@ -47225,7 +47390,7 @@ def_table_schema( SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID - WHERE T.TABLE_TYPE IN (0,2,3,8,9) + WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, @@ -47248,7 +47413,7 @@ def_table_schema( ON T.TENANT_ID = SP.TENANT_ID AND T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID - WHERE T.TABLE_TYPE IN (0,2,3,8,9) + WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) ) V JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db @@ -47317,7 +47482,7 @@ def_table_schema( 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T - WHERE T.TABLE_TYPE IN (0,2,3,8,9) + WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) AND t.database_id = USERENV('SCHEMAID') UNION ALL SELECT T.TENANT_ID, @@ -47336,7 +47501,7 @@ def_table_schema( SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID - WHERE T.TABLE_TYPE IN (0,2,3,8,9) + WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) AND t.database_id = USERENV('SCHEMAID') UNION ALL SELECT T.TENANT_ID, @@ -47360,7 +47525,7 @@ def_table_schema( ON T.TENANT_ID = SP.TENANT_ID AND T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID - WHERE T.TABLE_TYPE IN (0,2,3,8,9) + WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) AND t.database_id = USERENV('SCHEMAID') ) V LEFT JOIN @@ -47640,7 +47805,7 @@ def_table_schema( 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T - WHERE T.TABLE_TYPE IN (0,2,3,8,9)) + WHERE T.TABLE_TYPE IN (0,2,3,8,9,14)) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, @@ -47658,7 +47823,7 @@ def_table_schema( SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID - WHERE T.TABLE_TYPE IN (0,2,3,8,9) + WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, @@ -47681,7 +47846,7 @@ def_table_schema( ON T.TENANT_ID = SP.TENANT_ID AND T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID - WHERE T.TABLE_TYPE IN (0,2,3,8,9) + WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) ) V JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT DB @@ -47744,7 +47909,7 @@ def_table_schema( 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T - WHERE T.TABLE_TYPE IN (0,2,3,8,9)) + WHERE T.TABLE_TYPE IN (0,2,3,8,9,14)) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, @@ -47762,7 +47927,7 @@ def_table_schema( SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID - WHERE T.TABLE_TYPE IN (0,2,3,8,9) + WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) UNION ALL SELECT T.TENANT_ID, T.DATABASE_ID, @@ -47785,7 +47950,7 @@ def_table_schema( ON T.TENANT_ID = SP.TENANT_ID AND T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID - WHERE T.TABLE_TYPE IN (0,2,3,8,9) + WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) ) V JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT db @@ -47832,7 +47997,7 @@ def_table_schema( 'TABLE' AS OBJECT_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T - WHERE T.TABLE_TYPE IN (0,2,3,8,9) + WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) AND t.database_id = USERENV('SCHEMAID') UNION ALL SELECT T.TENANT_ID, @@ -47851,7 +48016,7 @@ def_table_schema( SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TENANT_ID = P.TENANT_ID AND T.TABLE_ID = P.TABLE_ID - WHERE T.TABLE_TYPE IN (0,2,3,8,9) + WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) AND t.database_id = USERENV('SCHEMAID') UNION ALL SELECT T.TENANT_ID, @@ -47875,7 +48040,7 @@ def_table_schema( ON T.TENANT_ID = SP.TENANT_ID AND T.TABLE_ID = SP.TABLE_ID AND P.PART_ID = SP.PART_ID - WHERE T.TABLE_TYPE IN (0,2,3,8,9) + WHERE T.TABLE_TYPE IN (0,2,3,8,9,14) AND t.database_id = USERENV('SCHEMAID') ) V LEFT JOIN @@ -49323,6 +49488,7 @@ FROM ( """.replace("\n", " "), ) + # 28153: GV$OB_TENANTS # 28154: V$OB_TENANTS diff --git a/src/share/inner_table/ob_inner_table_schema_misc.ipp b/src/share/inner_table/ob_inner_table_schema_misc.ipp index 137d01ebe..0a6938d0b 100644 --- a/src/share/inner_table/ob_inner_table_schema_misc.ipp +++ b/src/share/inner_table/ob_inner_table_schema_misc.ipp @@ -1318,6 +1318,7 @@ case OB_ALL_VIRTUAL_DEF_SUB_PART_TID: case OB_ALL_VIRTUAL_DEF_SUB_PART_HISTORY_TID: case OB_ALL_VIRTUAL_DEPENDENCY_TID: case OB_ALL_VIRTUAL_ERROR_TID: +case OB_ALL_VIRTUAL_EXTERNAL_TABLE_FILE_TID: case OB_ALL_VIRTUAL_FOREIGN_KEY_TID: case OB_ALL_VIRTUAL_FOREIGN_KEY_COLUMN_TID: case OB_ALL_VIRTUAL_FOREIGN_KEY_COLUMN_HISTORY_TID: @@ -1889,6 +1890,21 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: break; } + case OB_ALL_VIRTUAL_EXTERNAL_TABLE_FILE_TID: { + ObIterateVirtualTable *iter = NULL; + if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { + SERVER_LOG(WARN, "create virtual table iterator failed", K(ret)); + } else if (OB_FAIL(iter->init(OB_ALL_EXTERNAL_TABLE_FILE_TID, index_schema, params))) { + SERVER_LOG(WARN, "virtual table iter init failed", K(ret)); + iter->~ObIterateVirtualTable(); + allocator.free(iter); + iter = NULL; + } else { + vt_iter = iter; + } + break; + } + case OB_ALL_VIRTUAL_FOREIGN_KEY_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -2023,7 +2039,9 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } + END_CREATE_VT_ITER_SWITCH_LAMBDA + BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_JOB_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -2038,9 +2056,7 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } - END_CREATE_VT_ITER_SWITCH_LAMBDA - BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_JOB_LOG_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -2325,7 +2341,9 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } + END_CREATE_VT_ITER_SWITCH_LAMBDA + BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_PART_INFO_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -2340,9 +2358,7 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } - END_CREATE_VT_ITER_SWITCH_LAMBDA - BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_PART_INFO_HISTORY_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -2627,7 +2643,9 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } + END_CREATE_VT_ITER_SWITCH_LAMBDA + BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_SECURITY_AUDIT_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -2642,9 +2660,7 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } - END_CREATE_VT_ITER_SWITCH_LAMBDA - BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_SECURITY_AUDIT_HISTORY_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -2929,7 +2945,9 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } + END_CREATE_VT_ITER_SWITCH_LAMBDA + BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_TABLE_STAT_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -2944,9 +2962,7 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } - END_CREATE_VT_ITER_SWITCH_LAMBDA - BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_TABLE_STAT_HISTORY_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -3231,7 +3247,9 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } + END_CREATE_VT_ITER_SWITCH_LAMBDA + BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_TENANT_OLS_USER_LEVEL_HISTORY_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -3246,9 +3264,7 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } - END_CREATE_VT_ITER_SWITCH_LAMBDA - BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_TENANT_PROFILE_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -3533,7 +3549,9 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } + END_CREATE_VT_ITER_SWITCH_LAMBDA + BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_TYPE_HISTORY_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -3548,9 +3566,7 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } - END_CREATE_VT_ITER_SWITCH_LAMBDA - BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_USER_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { diff --git a/src/share/location_cache/ob_location_service.cpp b/src/share/location_cache/ob_location_service.cpp index 190f2325b..18f7c1902 100644 --- a/src/share/location_cache/ob_location_service.cpp +++ b/src/share/location_cache/ob_location_service.cpp @@ -13,6 +13,7 @@ #define USING_LOG_PREFIX SHARE_LOCATION #include "share/location_cache/ob_location_service.h" +#include "share/inner_table/ob_inner_table_schema.h" namespace oceanbase { @@ -248,6 +249,17 @@ int ObLocationService::vtable_get( return ret; } +int ObLocationService::external_table_get( + const uint64_t tenant_id, + const uint64_t table_id, + ObIArray &locations) +{ + UNUSED(table_id); + bool is_cache_hit = false; + //using the locations from any distributed virtual table + return vtable_get(tenant_id, OB_ALL_VIRTUAL_PROCESSLIST_TID, 0, is_cache_hit, locations); +} + int ObLocationService::vtable_nonblock_renew( const uint64_t tenant_id, const uint64_t table_id) diff --git a/src/share/location_cache/ob_location_service.h b/src/share/location_cache/ob_location_service.h index 811338c52..b4dfa2007 100644 --- a/src/share/location_cache/ob_location_service.h +++ b/src/share/location_cache/ob_location_service.h @@ -168,6 +168,10 @@ public: bool &is_cache_hit, ObIArray &locations); + int external_table_get(const uint64_t tenant_id, + const uint64_t table_id, + ObIArray &locations); + // Nonblock way to renew the virtual table location // // @param [in] tenant_id: Tenant for virtual table. diff --git a/src/share/ob_i_tablet_scan.cpp b/src/share/ob_i_tablet_scan.cpp index 3d25344ee..884c58fdc 100644 --- a/src/share/ob_i_tablet_scan.cpp +++ b/src/share/ob_i_tablet_scan.cpp @@ -60,7 +60,9 @@ DEF_TO_STRING(ObVTableScanParam) N_FROZEN_VERSION, frozen_version_, K_(is_get), KPC_(output_exprs), - KPC_(op_filters)); + KPC_(op_filters), + K_(external_file_format), + K_(external_file_location)); J_OBJ_END(); return pos; } diff --git a/src/share/ob_i_tablet_scan.h b/src/share/ob_i_tablet_scan.h index 12c19ad01..a94792b92 100644 --- a/src/share/ob_i_tablet_scan.h +++ b/src/share/ob_i_tablet_scan.h @@ -23,6 +23,7 @@ #include "share/ob_ls_id.h" #include "share/schema/ob_schema_getter_guard.h" #include "storage/tx/ob_trans_define.h" +#include "sql/engine/cmd/ob_load_data_parser.h" namespace oceanbase { @@ -188,9 +189,10 @@ typedef common::ObSEArray ObM /** * This is the common interface for storage service. * - * So far there are two components that implement the interface: + * So far there are three components that implement the interface: * 1. partition storage * 2. virtual table + * 3. external table */ class ObVTableScanParam { @@ -214,12 +216,15 @@ ObVTableScanParam() : force_refresh_lc_(false), is_for_foreign_check_(false), output_exprs_(NULL), + calc_exprs_(NULL), aggregate_exprs_(NULL), op_(NULL), op_filters_(NULL), pd_storage_filters_(nullptr), pd_storage_flag_(false), row2exprs_projector_(NULL), + ext_file_column_exprs_(NULL), + ext_column_convert_exprs_(NULL), schema_guard_(NULL) { } @@ -283,6 +288,7 @@ ObVTableScanParam() : // // output column expressions, same size as %column_ids_. const sql::ExprFixedArray *output_exprs_; + const sql::ExprFixedArray *calc_exprs_; // aggregate expressions, for calculating aggregation in storage layer. const sql::ExprFixedArray *aggregate_exprs_; sql::ObPushdownOperator *op_; @@ -292,6 +298,13 @@ ObVTableScanParam() : // project storage output row to %output_exprs_ storage::ObRow2ExprsProjector *row2exprs_projector_; + // external table + const sql::ExprFixedArray *ext_file_column_exprs_; + const sql::ExprFixedArray *ext_column_convert_exprs_; + sql::ObExternalFileFormat external_file_format_; + ObString external_file_location_; + ObString external_file_access_info_; + virtual bool is_valid() const { return (tablet_id_.is_valid() && OB_INVALID_ID != index_id_ diff --git a/src/share/schema/ob_schema_printer.cpp b/src/share/schema/ob_schema_printer.cpp index 5dc007a42..4b57a340c 100644 --- a/src/share/schema/ob_schema_printer.cpp +++ b/src/share/schema/ob_schema_printer.cpp @@ -26,6 +26,7 @@ #include "share/ob_schema_status_proxy.h" #include "share/schema/ob_schema_getter_guard.h" #include "share/config/ob_server_config.h" +#include "sql/resolver/cmd/ob_load_data_stmt.h" #include "sql/resolver/expr/ob_raw_expr_util.h" #include "sql/resolver/expr/ob_raw_expr_printer.h" #include "sql/session/ob_sql_session_info.h" @@ -53,16 +54,15 @@ ObSchemaPrinter::ObSchemaPrinter(ObSchemaGetterGuard &schema_guard, bool strict_ { } -int ObSchemaPrinter::print_table_definition( - const uint64_t tenant_id, - const uint64_t table_id, - char* buf, - const int64_t& buf_len, - int64_t& pos, - const ObTimeZoneInfo *tz_info, - const common::ObLengthSemantics default_length_semantics, - bool agent_mode, - ObSQLMode sql_mode) const +int ObSchemaPrinter::print_table_definition(const uint64_t tenant_id, + const uint64_t table_id, + char* buf, + const int64_t& buf_len, + int64_t& pos, + const ObTimeZoneInfo *tz_info, + const common::ObLengthSemantics default_length_semantics, + bool agent_mode, + ObSQLMode sql_mode) const { //TODO(yaoying.yyy: refactor this function):consider index_position in @@ -70,7 +70,7 @@ int ObSchemaPrinter::print_table_definition( const ObTableSchema *table_schema = NULL; const ObDatabaseSchema *db_schema = NULL; ObArenaAllocator allocator(ObModIds::OB_SCHEMA); - const char* prefix_arr[3] = {"", " TEMPORARY", " GLOBAL TEMPORARY"}; + const char* prefix_arr[4] = {"", " TEMPORARY", " GLOBAL TEMPORARY", " EXTERNAL"}; int prefix_idx = 0; bool is_oracle_mode = false; if (OB_FAIL(schema_guard_.get_table_schema(tenant_id, table_id, table_schema))) { @@ -90,16 +90,17 @@ int ObSchemaPrinter::print_table_definition( prefix_idx = 1; } else if (table_schema->is_oracle_tmp_table()) { prefix_idx = 2; + } else if (table_schema->is_external_table()) { + prefix_idx = 3; } else { prefix_idx = 0; } ObString new_table_name; ObString new_db_name; - if (OB_FAIL(sql::ObSQLUtils::generate_new_name_with_escape_character( - allocator, - table_schema->get_table_name_str(), - new_table_name, - is_oracle_mode))) { + if (OB_FAIL(sql::ObSQLUtils::generate_new_name_with_escape_character(allocator, + table_schema->get_table_name_str(), + new_table_name, + is_oracle_mode))) { SHARE_SCHEMA_LOG(WARN, "fail to generate new name with escape character", K(ret), K(table_schema->get_table_name())); } else if (agent_mode && OB_FAIL(sql::ObSQLUtils::generate_new_name_with_escape_character( allocator, db_schema->get_database_name_str(), @@ -116,9 +117,7 @@ int ObSchemaPrinter::print_table_definition( } } - if (OB_FAIL(ret)) { - //do nothing... - } else { + if (OB_SUCC(ret)) { if (OB_FAIL(print_table_definition_columns(*table_schema, buf, buf_len, pos, tz_info, default_length_semantics, agent_mode, sql_mode))) { SHARE_SCHEMA_LOG(WARN, "fail to print columns", K(ret), K(*table_schema)); } else if (OB_FAIL(print_table_definition_rowkeys(*table_schema, buf, buf_len, pos))) { @@ -134,6 +133,8 @@ int ObSchemaPrinter::print_table_definition( SHARE_SCHEMA_LOG(WARN, "fail to print constraints", K(ret), K(*table_schema)); } else if (OB_FAIL(databuff_printf(buf, buf_len, pos, "\n) "))) { SHARE_SCHEMA_LOG(WARN, "fail to print )", K(ret)); + } else if (table_schema->is_external_table() && (OB_FAIL(print_external_table_file_info(*table_schema, allocator, buf, buf_len, pos)))) { + SHARE_SCHEMA_LOG(WARN, "fail to print external table file format", K(ret)); } else if (OB_FAIL(print_table_definition_table_options(*table_schema, buf, buf_len, pos, false, agent_mode, sql_mode))) { SHARE_SCHEMA_LOG(WARN, "fail to print table options", K(ret), K(*table_schema)); } else if (OB_FAIL(print_table_definition_partition_options(*table_schema, buf, buf_len, pos, agent_mode, tz_info))) { @@ -458,12 +459,10 @@ int ObSchemaPrinter::print_generated_column_definition(const ObColumnSchemaV2 &g SHARE_SCHEMA_LOG(WARN, "fail to print expr string", K(ret)); } else if ((OB_FAIL(databuff_printf(buf, buf_len, pos, ")")))) { SHARE_SCHEMA_LOG(WARN, "fail to print )", K(ret)); - } else if (gen_col.is_virtual_generated_column()) { - if (OB_FAIL(databuff_printf(buf, buf_len, pos, " VIRTUAL"))) { - SHARE_SCHEMA_LOG(WARN, "print virtual keyword failed", K(ret)); - } - } else if (OB_FAIL(databuff_printf(buf, buf_len, pos, " STORED"))) { - SHARE_SCHEMA_LOG(WARN, "print stored keyword failed", K(ret)); + } else if (!table_schema.is_external_table() + && OB_FAIL(databuff_printf(buf, buf_len, pos, gen_col.is_virtual_generated_column() ? + " VIRTUAL" : " STORED"))) { + SHARE_SCHEMA_LOG(WARN, "print virtual keyword failed", K(ret)); } } return ret; @@ -4825,6 +4824,77 @@ int ObSchemaPrinter::print_synonym_definition(const ObSynonymInfo &synonym_info, return ret; } +int ObSchemaPrinter::print_external_table_file_info(const ObTableSchema &table_schema, + ObIAllocator& allocator, + char* buf, + const int64_t& buf_len, + int64_t& pos) const +{ + int ret = OB_SUCCESS; + // 1. print file location, pattern + const ObString &location = table_schema.get_external_file_location(); + const ObString &pattern = table_schema.get_external_file_pattern(); + if (OB_FAIL(databuff_printf(buf, buf_len, pos, "\nLOCATION='%.*s'", location.length(), location.ptr()))) { + SHARE_SCHEMA_LOG(WARN, "fail to print LOCATION", K(ret)); + } else if (!pattern.empty() && OB_FAIL(databuff_printf(buf, buf_len, pos, "\nPATTERN='%.*s'", pattern.length(), pattern.ptr()))) { + SHARE_SCHEMA_LOG(WARN, "fail to print PATTERN", K(ret)); + } + + // 2. print file format + if (OB_SUCC(ret)) { + ObExternalFileFormat format; + if (OB_FAIL(format.load_from_string(table_schema.get_external_file_format(), allocator))) { + SHARE_SCHEMA_LOG(WARN, "fail to load from json string", K(ret)); + } else if (format.format_type_ != ObExternalFileFormat::CSV_FORMAT) { + SHARE_SCHEMA_LOG(WARN, "unsupported to print file format", K(ret), K(format.format_type_)); + } else { + const ObCSVGeneralFormat &csv = format.csv_format_; + const ObOriginFileFormat &origin_format = format.origin_file_format_str_; + if (OB_FAIL(databuff_printf(buf, buf_len, pos, "\nFORMAT (\n"))) { + SHARE_SCHEMA_LOG(WARN, "fail to print FORMAT (", K(ret)); + } else if (OB_FAIL(databuff_printf(buf, buf_len, pos, " TYPE = 'CSV',"))) { + SHARE_SCHEMA_LOG(WARN, "fail to print TYPE", K(ret)); + } else if (OB_FAIL(0 != csv.line_term_str_.case_compare(ObDataInFileStruct::DEFAULT_LINE_TERM_STR) && + databuff_printf(buf, buf_len, pos, "\n LINE_DELIMITER = %.*s,", origin_format.origin_line_term_str_.length(), origin_format.origin_line_term_str_.ptr()))) { + SHARE_SCHEMA_LOG(WARN, "fail to print LINE_DELIMITER", K(ret)); + } else if (OB_FAIL(0 != csv.field_term_str_.case_compare(ObDataInFileStruct::DEFAULT_FIELD_TERM_STR) && + databuff_printf(buf, buf_len, pos, "\n FIELD_DELIMITER = %.*s,", origin_format.origin_field_term_str_.length(), origin_format.origin_field_term_str_.ptr()))) { + SHARE_SCHEMA_LOG(WARN, "fail to print FIELD_DELIMITER", K(ret)); + } else if (OB_FAIL(ObDataInFileStruct::DEFAULT_FIELD_ESCAPED_CHAR != csv.field_escaped_char_ && + databuff_printf(buf, buf_len, pos, "\n ESCAPE = %.*s,", origin_format.origin_field_escaped_str_.length(), origin_format.origin_field_escaped_str_.ptr()))) { + SHARE_SCHEMA_LOG(WARN, "fail to print ESCAPE", K(ret)); + } else if (OB_FAIL(ObDataInFileStruct::DEFAULT_FIELD_ENCLOSED_CHAR != csv.field_enclosed_char_ && + databuff_printf(buf, buf_len, pos, "\n FIELD_OPTIONALLY_ENCLOSED_BY = %.*s,", origin_format.origin_field_enclosed_str_.length(), origin_format.origin_field_enclosed_str_.ptr()))) { + SHARE_SCHEMA_LOG(WARN, "fail to print FIELD_OPTIONALLY_ENCLOSED_BY", K(ret)); + } else if (OB_FAIL(databuff_printf(buf, buf_len, pos, "\n ENCODING = '%s',", ObCharset::charset_name(csv.cs_type_)))) { + SHARE_SCHEMA_LOG(WARN, "fail to print ENCODING", K(ret)); + } else if (OB_FAIL(0 != csv.skip_header_lines_ && + databuff_printf(buf, buf_len, pos, "\n SKIP_HEADER = %ld,", csv.skip_header_lines_))) { + SHARE_SCHEMA_LOG(WARN, "fail to print SKIP_HEADER", K(ret)); + } else if (OB_FAIL(csv.skip_blank_lines_ && + databuff_printf(buf, buf_len, pos, "\n SKIP_BLANK_LINES = TRUE,"))) { + SHARE_SCHEMA_LOG(WARN, "fail to print SKIP_BLANK_LINES", K(ret)); + } else if (OB_FAIL(csv.trim_space_ && + databuff_printf(buf, buf_len, pos, "\n TRIM_SPACE = TRUE,"))) { + SHARE_SCHEMA_LOG(WARN, "fail to print TRIM_SPACE", K(ret)); + } else if (OB_FAIL(csv.empty_field_as_null_ && + databuff_printf(buf, buf_len, pos, "\n EMPTY_FIELD_AS_NULL = TRUE,"))) { + SHARE_SCHEMA_LOG(WARN, "fail to print EMPTY_FIELD_AS_NULL", K(ret)); + } else if (OB_FAIL(0 != csv.null_if_.count() && + databuff_printf(buf, buf_len, pos, "\n NULL_IF = (%.*s),", origin_format.origin_null_if_str_.length(), origin_format.origin_null_if_str_.ptr()))) { + SHARE_SCHEMA_LOG(WARN, "fail to print NULL_IF", K(ret)); + } else { + --pos; + if (OB_FAIL(databuff_printf(buf, buf_len, pos, "\n)"))) { + SHARE_SCHEMA_LOG(WARN, "fail to print )", K(ret)); + } + } + } + } + return ret; +} + + } // end namespace schema } //end of namespace share } // end namespace oceanbase diff --git a/src/share/schema/ob_schema_printer.h b/src/share/schema/ob_schema_printer.h index 99fd4c39e..ac3c7a1fa 100644 --- a/src/share/schema/ob_schema_printer.h +++ b/src/share/schema/ob_schema_printer.h @@ -447,6 +447,11 @@ public: bool print_sub_part_element, bool agent_mode, const common::ObTimeZoneInfo *tz_info) const; + int print_external_table_file_info(const ObTableSchema &table_schema, + ObIAllocator& allocator, + char* buf, + const int64_t& buf_len, + int64_t& pos) const; private: static bool is_subpartition_valid_in_mysql(const ObTableSchema &table_schema) { diff --git a/src/share/schema/ob_schema_retrieve_utils.ipp b/src/share/schema/ob_schema_retrieve_utils.ipp index dde3c15e1..e0ac3c579 100644 --- a/src/share/schema/ob_schema_retrieve_utils.ipp +++ b/src/share/schema/ob_schema_retrieve_utils.ipp @@ -1285,6 +1285,19 @@ int ObSchemaRetrieveUtils::fill_table_schema( true, ignore_column_error, 0); EXTRACT_INT_FIELD_TO_CLASS_MYSQL_WITH_DEFAULT_VALUE(result, object_status, table_schema, int64_t, true, ignore_column_error, static_cast (ObObjectStatus::VALID)); EXTRACT_INT_FIELD_TO_CLASS_MYSQL_WITH_DEFAULT_VALUE(result, truncate_version, table_schema, int64_t, true, ignore_column_error, common::OB_INVALID_VERSION); + + ObString external_file_location; + ObString external_file_location_access_info; + ObString external_file_format; + ObString external_file_pattern; + EXTRACT_VARCHAR_FIELD_TO_CLASS_MYSQL_WITH_DEFAULT_VALUE( + result, external_file_location, table_schema, true/*skip null*/, true/*ignore column error*/, external_file_location); + EXTRACT_VARCHAR_FIELD_TO_CLASS_MYSQL_WITH_DEFAULT_VALUE( + result, external_file_location_access_info, table_schema, true/*skip null*/, true/*ignore column error*/, external_file_location_access_info); + EXTRACT_VARCHAR_FIELD_TO_CLASS_MYSQL_WITH_DEFAULT_VALUE( + result, external_file_format, table_schema, true/*skip null*/, true/*ignore column error*/, external_file_format); + EXTRACT_VARCHAR_FIELD_TO_CLASS_MYSQL_WITH_DEFAULT_VALUE( + result, external_file_pattern, table_schema, true/*skip null*/, true/*ignore column error*/, external_file_pattern); } if (OB_SUCC(ret) && OB_FAIL(fill_sys_table_lob_tid(table_schema))) { SHARE_SCHEMA_LOG(WARN, "fail to fill lob table id for inner table", K(ret), K(table_schema.get_table_id())); diff --git a/src/share/schema/ob_schema_service.cpp b/src/share/schema/ob_schema_service.cpp index 2ec8f100d..27de3f779 100644 --- a/src/share/schema/ob_schema_service.cpp +++ b/src/share/schema/ob_schema_service.cpp @@ -394,7 +394,15 @@ int AlterTableSchema::assign(const ObTableSchema &src_schema) LOG_WARN("Fail to deep copy expire info string", K(ret)); } else if (OB_FAIL(deep_copy_str(src_schema.parser_name_, parser_name_))) { LOG_WARN("deep copy parser name failed", K(ret)); - } else {} // no more to do + } else if (OB_FAIL(deep_copy_str(src_schema.external_file_location_, external_file_location_))) { + LOG_WARN("deep copy external_file_location failed", K(ret)); + } else if (OB_FAIL(deep_copy_str(src_schema.external_file_location_access_info_, external_file_location_access_info_))) { + LOG_WARN("deep copy external_file_location_access_info failed", K(ret)); + } else if (OB_FAIL(deep_copy_str(src_schema.external_file_format_, external_file_format_))) { + LOG_WARN("deep copy external_file_format failed", K(ret)); + } else if (OB_FAIL(deep_copy_str(src_schema.external_file_pattern_, external_file_pattern_))) { + LOG_WARN("deep copy external_file_pattern failed", K(ret)); + } //view schema view_schema_ = src_schema.view_schema_; diff --git a/src/share/schema/ob_schema_struct.cpp b/src/share/schema/ob_schema_struct.cpp index 06849d9ef..faa13fe5b 100644 --- a/src/share/schema/ob_schema_struct.cpp +++ b/src/share/schema/ob_schema_struct.cpp @@ -8886,6 +8886,10 @@ const char *ob_table_type_str(ObTableType type) type_ptr = "AUX LOB META"; break; } + case EXTERNAL_TABLE: { + type_ptr = "EXTERNAL TABLE"; + break; + } default: { LOG_WARN_RET(OB_ERR_UNEXPECTED, "unkonw table type", K(type)); break; @@ -10497,7 +10501,7 @@ ObRecycleObject::RecycleObjType ObRecycleObject::get_type_by_table_schema( type = INDEX; } else if (table_schema.is_view_table()) { type = VIEW; - } else if (table_schema.is_table() || table_schema.is_tmp_table()) { + } else if (table_schema.is_table() || table_schema.is_tmp_table() || table_schema.is_external_table()) { type = TABLE; } else if (table_schema.is_aux_vp_table()) { type = AUX_VP; diff --git a/src/share/schema/ob_schema_struct.h b/src/share/schema/ob_schema_struct.h index 267c087e4..9d05d843a 100644 --- a/src/share/schema/ob_schema_struct.h +++ b/src/share/schema/ob_schema_struct.h @@ -247,6 +247,7 @@ enum ObTableType AUX_VERTIAL_PARTITION_TABLE = 11, AUX_LOB_PIECE = 12, AUX_LOB_META = 13, + EXTERNAL_TABLE = 14, MAX_TABLE_TYPE }; diff --git a/src/share/schema/ob_table_schema.cpp b/src/share/schema/ob_table_schema.cpp index 49c8aa0ce..2235f0d79 100644 --- a/src/share/schema/ob_table_schema.cpp +++ b/src/share/schema/ob_table_schema.cpp @@ -292,6 +292,7 @@ bool ObSimpleTableSchemaV2::has_tablet() const || is_view_table() || is_aux_vp_table() || is_virtual_table(get_table_id()) // virtual table index + || is_external_table() ); } @@ -1327,7 +1328,15 @@ int ObTableSchema::assign(const ObTableSchema &src_schema) LOG_WARN("Fail to deep copy expire info string", K(ret)); } else if (OB_FAIL(deep_copy_str(src_schema.parser_name_, parser_name_))) { LOG_WARN("deep copy parser name failed", K(ret)); - } else {} // no more to do + } else if (OB_FAIL(deep_copy_str(src_schema.external_file_location_, external_file_location_))) { + LOG_WARN("deep copy external_file_location failed", K(ret)); + } else if (OB_FAIL(deep_copy_str(src_schema.external_file_location_access_info_, external_file_location_access_info_))) { + LOG_WARN("deep copy external_file_location_access_info failed", K(ret)); + } else if (OB_FAIL(deep_copy_str(src_schema.external_file_format_, external_file_format_))) { + LOG_WARN("deep copy external_file_format failed", K(ret)); + } else if (OB_FAIL(deep_copy_str(src_schema.external_file_pattern_, external_file_pattern_))) { + LOG_WARN("deep copy external_file_pattern failed", K(ret)); + } //view schema if (OB_SUCC(ret)) { @@ -1577,7 +1586,7 @@ bool ObTableSchema::is_valid() const } // TODO@nijia.nj data_length should be checked according specified charset - if ((is_table() || is_tmp_table()) && !column->is_column_stored_in_sstable()) { + if ((is_table() || is_tmp_table() || is_external_table()) && !column->is_column_stored_in_sstable()) { // When the column is a virtual generated column in the table, the column will not be stored, // so there is no need to calculate its length } else if (is_storage_index_table() && column->is_fulltext_column()) { @@ -2139,7 +2148,7 @@ int ObTableSchema::create_idx_name_automatically_oracle(common::ObString &idx_na // Generation rules: pk_name_sys_auto = tblname_OBPK_timestamp // check_name_sys_auto = tblname_OBCHECK_timestamp // unique_name_sys_auto = tblname_OBUNIQUE_timestamp -// If the length of cst_name exceeds the max len of it, the part of table_name will be truncated unitil the len of cst_name equaling to the max len +// If the length of cst_name exceeds the max len of it, the part of table_name will be truncated unitil the len of cst_name equaling to the max len // @param [in] cst_name // @return oceanbase error code defined in lib/ob_errno.def int ObTableSchema::create_cons_name_automatically(ObString &cst_name, @@ -2838,6 +2847,10 @@ int64_t ObTableSchema::get_convert_size() const convert_size += rls_group_ids_.get_data_size(); convert_size += rls_context_ids_.get_data_size(); + convert_size += external_file_format_.length() + 1; + convert_size += external_file_location_.length() + 1; + convert_size += external_file_location_access_info_.length() + 1; + convert_size += external_file_pattern_.length() + 1; return convert_size; } @@ -2913,9 +2926,15 @@ void ObTableSchema::reset() trigger_list_.reset(); table_dop_ = 1; table_flags_ = 0; + rls_policy_ids_.reset(); rls_group_ids_.reset(); rls_context_ids_.reset(); + + external_file_format_.reset(); + external_file_location_.reset(); + external_file_location_access_info_.reset(); + external_file_pattern_.reset(); ObSimpleTableSchemaV2::reset(); } @@ -3634,7 +3653,8 @@ int ObTableSchema::delete_column_internal(ObColumnSchemaV2 *column_schema, const } else if (table_id_ != column_schema->get_table_id()) { ret = OB_SCHEMA_ERROR; LOG_WARN("The column schema does not belong to this table", K(ret)); - } else if (!is_view_table() && !is_user_table() && !is_index_table() && !is_tmp_table() && !is_sys_table() && !is_aux_vp_table()) { + } else if (!is_view_table() && !is_user_table() && !is_index_table() && !is_tmp_table() + && !is_sys_table() && !is_aux_vp_table() && !is_external_table()) { ret = OB_NOT_SUPPORTED; LOG_WARN("Only NORMAL table and index table and SYSTEM table and view table are allowed", K(ret)); } else if (!for_view && ((!is_heap_table() && column_cnt_ <= MIN_COLUMN_COUNT_WITH_PK_TABLE) @@ -4263,6 +4283,8 @@ int ObTableSchema::check_alter_column_is_offline(const ObColumnSchemaV2 *src_col } else if (get_table_id() != src_column->get_table_id()) { ret = OB_INVALID_ARGUMENT; LOG_WARN("The column does not belong to this table", K(ret)); + } else if (is_external_table()) { + is_offline = false; } else if (!is_user_table() && !is_index_table() && !is_tmp_table() && !is_sys_table()) { ret = OB_INVALID_ARGUMENT; LOG_WARN("Only NORMAL table and INDEX table and SYSTEM table are allowed", K(ret)); @@ -4440,6 +4462,8 @@ int ObTableSchema::check_column_can_be_altered_online( } else if (get_table_id() != src_schema->get_table_id()) { ret = OB_INVALID_ARGUMENT; LOG_WARN("The column does not belong to this table", K(ret)); + } else if (is_external_table()) { + // external table canbe altered } else if (!is_user_table() && !is_index_table() && !is_tmp_table() && !is_sys_table()) { ret = OB_INVALID_ARGUMENT; LOG_WARN("Only NORMAL table and INDEX table and SYSTEM table are allowed", K(ret)); @@ -4699,7 +4723,7 @@ int ObTableSchema::check_row_length( int64_t row_length = 0; for (int64_t i = 0; OB_SUCC(ret) && i < column_cnt_; ++i) { col = column_array_[i]; - if ((is_table() || is_tmp_table()) && !col->is_column_stored_in_sstable()) { + if ((is_table() || is_tmp_table() || is_external_table()) && !col->is_column_stored_in_sstable()) { // The virtual column in the table does not actually store data, and does not count the length } else if (is_storage_index_table() && col->is_fulltext_column()) { // The full text column in the index only counts the length of one word segment @@ -4728,7 +4752,7 @@ int ObTableSchema::check_row_length( SQL_RESV_LOG(WARN, "fail to get byte length of column", K(ret)); } else { row_length -= src_byte_length; - if ((is_table() || is_tmp_table()) && !dst_schema->is_column_stored_in_sstable()) { + if ((is_table() || is_tmp_table() || is_external_table()) && !dst_schema->is_column_stored_in_sstable()) { // The virtual column in the table does not actually store data, and does not count the length } else if (is_storage_index_table() && dst_schema->is_fulltext_column()) { // The full text column in the index only counts the length of one word segment @@ -5072,8 +5096,10 @@ int ObTableSchema::get_rowid_version(int64_t rowkey_cnt, { int ret = OB_SUCCESS; - if (is_heap_table()) { + if (is_heap_table() && !is_external_table()) { version = is_extended_rowid_mode() ? ObURowIDData::EXT_HEAP_TABLE_ROWID_VERSION : ObURowIDData::HEAP_TABLE_ROWID_VERSION; + } else if (is_heap_table() && is_external_table()) { + version = ObURowIDData::EXTERNAL_TABLE_ROWID_VERSION; } else { version = ObURowIDData::PK_ROWID_VERSION; if (rowkey_cnt != serialize_col_cnt) { @@ -5822,6 +5848,13 @@ OB_DEF_SERIALIZE(ObTableSchema) rls_context_ids_); } LST_DO_CODE(OB_UNIS_ENCODE, object_status_, is_force_view_, truncate_version_); + if (OB_SUCC(ret)) { + LST_DO_CODE(OB_UNIS_ENCODE, + external_file_location_, + external_file_location_access_info_, + external_file_format_, + external_file_pattern_); + } }(); return ret; } @@ -6159,6 +6192,13 @@ OB_DEF_DESERIALIZE(ObTableSchema) rls_group_ids_, rls_context_ids_); LST_DO_CODE(OB_UNIS_DECODE, object_status_, is_force_view_, truncate_version_); + if (OB_SUCC(ret)) { + LST_DO_CODE(OB_UNIS_DECODE, + external_file_location_, + external_file_location_access_info_, + external_file_format_, + external_file_pattern_); + } } }(); return ret; @@ -6293,6 +6333,11 @@ OB_DEF_SERIALIZE_SIZE(ObTableSchema) OB_UNIS_ADD_LEN(object_status_); OB_UNIS_ADD_LEN(is_force_view_); OB_UNIS_ADD_LEN(truncate_version_); + + OB_UNIS_ADD_LEN(external_file_location_); + OB_UNIS_ADD_LEN(external_file_location_access_info_); + OB_UNIS_ADD_LEN(external_file_format_); + OB_UNIS_ADD_LEN(external_file_pattern_); return len; } diff --git a/src/share/schema/ob_table_schema.h b/src/share/schema/ob_table_schema.h index ea35747cc..eb7554b05 100644 --- a/src/share/schema/ob_table_schema.h +++ b/src/share/schema/ob_table_schema.h @@ -736,6 +736,7 @@ public: { return MATERIALIZED_VIEW == table_type; } inline bool is_in_recyclebin() const { return common::OB_RECYCLEBIN_SCHEMA_ID == database_id_; } + inline bool is_external_table() const { return EXTERNAL_TABLE == table_type_; } inline ObTenantTableId get_tenant_table_id() const { return ObTenantTableId(tenant_id_, table_id_); } inline ObTenantTableId get_tenant_data_table_id() const @@ -979,6 +980,10 @@ public: int set_compress_func_name(const char *compressor); int set_compress_func_name(const common::ObString &compressor); inline void set_dop(int64_t table_dop) { table_dop_ = table_dop; } + int set_external_file_location(const common::ObString &location) { return deep_copy_str(location, external_file_location_); } + int set_external_file_location_access_info(const common::ObString &access_info) { return deep_copy_str(access_info, external_file_location_access_info_); } + int set_external_file_format(const common::ObString &format) { return deep_copy_str(format, external_file_format_); } + int set_external_file_pattern(const common::ObString &pattern) { return deep_copy_str(pattern, external_file_pattern_); } template int add_column(const ColumnType &column); int delete_column(const common::ObString &column_name); @@ -1101,6 +1106,10 @@ public: inline uint64_t get_index_attributes_set() const { return index_attributes_set_; } inline int64_t get_dop() const { return table_dop_; } + const ObString &get_external_file_location() const { return external_file_location_; } + const ObString &get_external_file_location_access_info() const { return external_file_location_access_info_; } + const ObString &get_external_file_format() const { return external_file_format_; } + const ObString &get_external_file_pattern() const { return external_file_pattern_; } inline bool is_index_visible() const { return 0 == (index_attributes_set_ & ((uint64_t)(1) << INDEX_VISIBILITY)); @@ -1592,6 +1601,12 @@ protected: common::ObSArray rls_policy_ids_; common::ObSArray rls_group_ids_; common::ObSArray rls_context_ids_; + + //external table + common::ObString external_file_format_; + common::ObString external_file_location_; + common::ObString external_file_location_access_info_; + common::ObString external_file_pattern_; }; class ObPrintableTableSchema final : public ObTableSchema diff --git a/src/share/schema/ob_table_sql_service.cpp b/src/share/schema/ob_table_sql_service.cpp index 6132cb11e..63993b66d 100644 --- a/src/share/schema/ob_table_sql_service.cpp +++ b/src/share/schema/ob_table_sql_service.cpp @@ -2522,6 +2522,14 @@ int ObTableSqlService::gen_table_dml( && OB_UNLIKELY((OB_INVALID_VERSION != table.get_truncate_version()))) { ret = OB_NOT_SUPPORTED; LOG_WARN("truncate version is not support before 4.1", K(ret), K(table)); + } else if (OB_UNLIKELY(data_version < DATA_VERSION_4_2_0_0 + && (table.is_external_table() + || !table.get_external_file_location().empty() + || !table.get_external_file_format().empty() + || !table.get_external_file_location_access_info().empty() + || !table.get_external_file_pattern().empty()))) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("external table is not support before 4.2", K(ret), K(table)); } else { const ObPartitionOption &part_option = table.get_part_option(); const ObPartitionOption &sub_part_option = table.get_sub_part_option(); @@ -2631,6 +2639,14 @@ int ObTableSqlService::gen_table_dml( && OB_FAIL(dml.add_column("table_flags", table.get_table_flags()))) || (data_version >= DATA_VERSION_4_1_0_0 && OB_FAIL(dml.add_column("truncate_version", table.get_truncate_version()))) + || (data_version >= DATA_VERSION_4_2_0_0 + && OB_FAIL(dml.add_column("external_file_location", ObHexEscapeSqlStr(table.get_external_file_location())))) + || (data_version >= DATA_VERSION_4_2_0_0 + && OB_FAIL(dml.add_column("external_file_location_access_info", ObHexEscapeSqlStr(table.get_external_file_location_access_info())))) + || (data_version >= DATA_VERSION_4_2_0_0 + && OB_FAIL(dml.add_column("external_file_format", ObHexEscapeSqlStr(table.get_external_file_format())))) + || (data_version >= DATA_VERSION_4_2_0_0 + && OB_FAIL(dml.add_column("external_file_pattern", ObHexEscapeSqlStr(table.get_external_file_pattern())))) ) { LOG_WARN("add column failed", K(ret)); } diff --git a/src/share/stat/ob_basic_stats_estimator.cpp b/src/share/stat/ob_basic_stats_estimator.cpp index e89898a5f..cb92fb353 100644 --- a/src/share/stat/ob_basic_stats_estimator.cpp +++ b/src/share/stat/ob_basic_stats_estimator.cpp @@ -853,7 +853,7 @@ int ObBasicStatsEstimator::gen_tablet_list(const ObTableStatParam ¶m, ObSEArray tablet_ids; if (param.global_stat_param_.need_modify_) { if (param.part_level_ == share::schema::ObPartitionLevel::PARTITION_LEVEL_ZERO) { - if (OB_UNLIKELY(param.global_tablet_id_ == 0)) { + if (OB_UNLIKELY(param.global_tablet_id_ == ObTabletID::INVALID_TABLET_ID)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected error", K(ret), K(param)); } else if (OB_FAIL(tablet_ids.push_back(param.global_tablet_id_))) { diff --git a/src/share/stat/ob_dbms_stats_executor.cpp b/src/share/stat/ob_dbms_stats_executor.cpp index 579bad326..a31969a2e 100644 --- a/src/share/stat/ob_dbms_stats_executor.cpp +++ b/src/share/stat/ob_dbms_stats_executor.cpp @@ -51,6 +51,7 @@ int ObDbmsStatsExecutor::gather_table_stats(ObExecContext &ctx, param.tenant_id_))) { LOG_WARN("failed to create hash map", K(ret)); } else if (param.need_estimate_block_ && + share::schema::ObTableType::EXTERNAL_TABLE != param.ref_table_type_ && OB_FAIL(ObBasicStatsEstimator::estimate_block_count(ctx, param, extra.partition_id_block_map_))) { LOG_WARN("failed to estimate block count", K(ret)); @@ -116,7 +117,8 @@ int ObDbmsStatsExecutor::gather_table_stats(ObExecContext &ctx, history_tab_handles, history_col_handles))) { LOG_WARN("failed to batch write history stats", K(ret)); - } else if (OB_FAIL(ObBasicStatsEstimator::update_last_modified_count(ctx, param))) { + } else if (share::schema::ObTableType::EXTERNAL_TABLE != param.ref_table_type_ && + OB_FAIL(ObBasicStatsEstimator::update_last_modified_count(ctx, param))) { LOG_WARN("failed to update last modified count", K(ret)); } else {/*do nothing*/} } diff --git a/src/share/stat/ob_dbms_stats_utils.cpp b/src/share/stat/ob_dbms_stats_utils.cpp index c02447875..427226440 100644 --- a/src/share/stat/ob_dbms_stats_utils.cpp +++ b/src/share/stat/ob_dbms_stats_utils.cpp @@ -210,7 +210,7 @@ int ObDbmsStatsUtils::check_is_stat_table(share::schema::ObSchemaGetterGuard &sc } else if (OB_ISNULL(table_schema)) { //do nothing } else {//check user table - is_valid = table_schema->is_user_table(); + is_valid = table_schema->is_user_table() || table_schema->is_external_table(); } return ret; } diff --git a/src/share/stat/ob_stat_define.cpp b/src/share/stat/ob_stat_define.cpp index b8b218cce..259331a33 100644 --- a/src/share/stat/ob_stat_define.cpp +++ b/src/share/stat/ob_stat_define.cpp @@ -186,6 +186,7 @@ int ObTableStatParam::assign(const ObTableStatParam &other) need_estimate_block_ = other.need_estimate_block_; is_temp_table_ = other.is_temp_table_; allocator_ = other.allocator_; + ref_table_type_ = other.ref_table_type_; if (OB_FAIL(part_infos_.assign(other.part_infos_))) { LOG_WARN("failed to assign", K(ret)); } else if (OB_FAIL(subpart_infos_.assign(other.subpart_infos_))) { diff --git a/src/share/stat/ob_stat_define.h b/src/share/stat/ob_stat_define.h index ba075b732..bef70c04b 100644 --- a/src/share/stat/ob_stat_define.h +++ b/src/share/stat/ob_stat_define.h @@ -444,7 +444,8 @@ struct ObTableStatParam { data_table_id_(INVALID_GLOBAL_PART_ID), need_estimate_block_(true), is_temp_table_(false), - allocator_(NULL) + allocator_(NULL), + ref_table_type_(share::schema::ObTableType::MAX_TABLE_TYPE) {} int assign(const ObTableStatParam &other); @@ -516,6 +517,7 @@ struct ObTableStatParam { bool need_estimate_block_;//need estimate macro/micro block count bool is_temp_table_; common::ObIAllocator *allocator_; + share::schema::ObTableType ref_table_type_; TO_STRING_KV(K(tenant_id_), K(db_name_), @@ -559,7 +561,8 @@ struct ObTableStatParam { K(global_data_part_id_), K(data_table_id_), K(need_estimate_block_), - K(is_temp_table_)); + K(is_temp_table_), + K(ref_table_type_)); }; struct ObOptStat diff --git a/src/sql/CMakeLists.txt b/src/sql/CMakeLists.txt index 56eb9d64b..5e0db58f2 100644 --- a/src/sql/CMakeLists.txt +++ b/src/sql/CMakeLists.txt @@ -743,6 +743,7 @@ ob_set_subtarget(ob_sql engine_table engine/table/ob_table_scan_op.cpp engine/table/ob_index_lookup_op_impl.cpp engine/table/ob_table_scan_with_index_back_op.cpp + engine/table/ob_external_table_access_service.cpp ) ob_set_subtarget(ob_sql executor diff --git a/src/sql/code_generator/ob_dml_cg_service.cpp b/src/sql/code_generator/ob_dml_cg_service.cpp index 43db9ee1e..f717fb089 100644 --- a/src/sql/code_generator/ob_dml_cg_service.cpp +++ b/src/sql/code_generator/ob_dml_cg_service.cpp @@ -2444,6 +2444,9 @@ int ObDmlCgService::generate_table_loc_meta(const IndexDMLInfo &index_dml_info, //we will build the related tablet_id map when dml operator be opened in distributed plan loc_meta.unuse_related_pruning_ = (OB_PHY_PLAN_DISTRIBUTED == cg_.opt_ctx_->get_phy_plan_type() && !cg_.opt_ctx_->get_root_stmt()->is_insert_stmt()); + loc_meta.is_external_table_ = table_schema->is_external_table(); + loc_meta.is_external_files_on_disk_ = + ObSQLUtils::is_external_files_on_local_disk(table_schema->get_external_file_location()); } if (OB_SUCC(ret) && index_dml_info.is_primary_index_) { TableLocRelInfo *rel_info = nullptr; diff --git a/src/sql/code_generator/ob_static_engine_cg.cpp b/src/sql/code_generator/ob_static_engine_cg.cpp index 85151eaf9..78bd36a33 100644 --- a/src/sql/code_generator/ob_static_engine_cg.cpp +++ b/src/sql/code_generator/ob_static_engine_cg.cpp @@ -880,6 +880,7 @@ int ObStaticEngineCG::generate_calc_exprs( && T_FUN_SYS_ROWNUM != raw_expr->get_expr_type() && T_CTE_SEARCH_COLUMN != raw_expr->get_expr_type() && T_CTE_CYCLE_COLUMN != raw_expr->get_expr_type() + && T_PSEUDO_EXTERNAL_FILE_COL != raw_expr->get_expr_type() && !(raw_expr->is_const_expr() || raw_expr->has_flag(IS_USER_VARIABLE)) // TODO:@guoping.wgp, following T_FUN_SYS_PART restrictions should be removed later && !(T_FUN_SYS_PART_HASH == raw_expr->get_expr_type() || T_FUN_SYS_PART_KEY == raw_expr->get_expr_type())) { @@ -3845,6 +3846,11 @@ int ObStaticEngineCG::generate_normal_tsc(ObLogTableScan &op, ObTableScanSpec &s } } } + + if (OB_SUCC(ret) && op.get_table_type() == share::schema::EXTERNAL_TABLE) { + spec.is_external_table_ = true; + } + return ret; } diff --git a/src/sql/code_generator/ob_tsc_cg_service.cpp b/src/sql/code_generator/ob_tsc_cg_service.cpp index 99ebfc252..d591def22 100644 --- a/src/sql/code_generator/ob_tsc_cg_service.cpp +++ b/src/sql/code_generator/ob_tsc_cg_service.cpp @@ -23,6 +23,7 @@ using namespace share; using namespace share::schema; namespace sql { + int ObTscCgService::generate_tsc_ctdef(ObLogTableScan &op, ObTableScanCtDef &tsc_ctdef) { int ret = OB_SUCCESS; @@ -42,6 +43,34 @@ int ObTscCgService::generate_tsc_ctdef(ObLogTableScan &op, ObTableScanCtDef &tsc query_flag.scan_order_ = ObQueryFlag::Forward; } tsc_ctdef.scan_flags_ = query_flag; + + if (OB_SUCC(ret) && op.get_table_type() == share::schema::EXTERNAL_TABLE) { + const ObTableSchema *table_schema = nullptr; + ObSqlSchemaGuard *schema_guard = cg_.opt_ctx_->get_sql_schema_guard(); + ObBasicSessionInfo *session_info = cg_.opt_ctx_->get_session_info(); + if (OB_ISNULL(schema_guard) || OB_ISNULL(session_info)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("schema guard is null", K(ret)); + } else if (OB_FAIL(schema_guard->get_table_schema(op.get_table_id(), + op.get_ref_table_id(), + op.get_stmt(), + table_schema))) { + LOG_WARN("get table schema failed", K(ret), K(op.get_ref_table_id())); + } else if (OB_FAIL(ObSQLUtils::check_location_access_priv(table_schema->get_external_file_location(), + cg_.opt_ctx_->get_session_info()))) { + LOG_WARN("fail to check location access priv", K(ret)); + } else { + scan_ctdef.is_external_table_ = true; + if (OB_FAIL(scan_ctdef.external_file_format_str_.store_str(table_schema->get_external_file_format()))) { + LOG_WARN("fail to set string", K(ret)); + } else if (OB_FAIL(scan_ctdef.external_file_location_.store_str(table_schema->get_external_file_location()))) { + LOG_WARN("fail to set string", K(ret)); + } else if (OB_FAIL(scan_ctdef.external_file_access_info_.store_str(table_schema->get_external_file_location_access_info()))) { + LOG_WARN("fail to set access info", K(ret)); + } + } + } + if (OB_SUCC(ret) && (OB_NOT_NULL(op.get_flashback_query_expr()))) { if (OB_FAIL(cg_.generate_rt_expr(*op.get_flashback_query_expr(), tsc_ctdef.flashback_item_.flashback_query_expr_))) { @@ -147,6 +176,18 @@ int ObTscCgService::generate_tsc_ctdef(ObLogTableScan &op, ObTableScanCtDef &tsc OZ(op.extract_bnlj_param_idxs(bnlj_params)); OZ(tsc_ctdef.bnlj_param_idxs_.assign(bnlj_params)); } + + OZ (cg_.generate_rt_exprs(op.get_ext_file_column_exprs(), + tsc_ctdef.scan_ctdef_.pd_expr_spec_.ext_file_column_exprs_)); + OZ (cg_.generate_rt_exprs(op.get_ext_column_convert_exprs(), + tsc_ctdef.scan_ctdef_.pd_expr_spec_.ext_column_convert_exprs_)); + if (OB_SUCC(ret)) { + for (int i = 0; i < op.get_ext_file_column_exprs().count(); i++) { + tsc_ctdef.scan_ctdef_.pd_expr_spec_.ext_file_column_exprs_.at(i)->extra_ + = op.get_ext_file_column_exprs().at(i)->get_extra(); + } + } + LOG_DEBUG("generate tsc ctdef finish", K(ret), K(op), K(tsc_ctdef)); return ret; } @@ -659,6 +700,8 @@ int ObTscCgService::generate_access_ctdef(const ObLogTableScan &op, } } else if (T_PSEUDO_GROUP_ID == expr->get_expr_type()) { OZ(access_column_ids.push_back(common::OB_HIDDEN_GROUP_IDX_COLUMN_ID)); + } else if (T_PSEUDO_EXTERNAL_FILE_COL == expr->get_expr_type()) { + //TODO EXTERNAL-TABLE } else { ObColumnRefRawExpr* col_expr = static_cast(expr); bool is_mapping_vt_table = op.get_real_ref_table_id() != op.get_ref_table_id(); @@ -891,6 +934,9 @@ int ObTscCgService::generate_table_loc_meta(uint64_t table_loc_id, : table_schema.get_table_id(); loc_meta.ref_table_id_ = real_table_id; loc_meta.is_dup_table_ = table_schema.is_duplicate_table(); + loc_meta.is_external_table_ = table_schema.is_external_table(); + loc_meta.is_external_files_on_disk_ = + ObSQLUtils::is_external_files_on_local_disk(table_schema.get_external_file_location()); bool is_weak_read = false; if (OB_ISNULL(cg_.opt_ctx_) || OB_ISNULL(cg_.opt_ctx_->get_exec_ctx())) { ret = OB_INVALID_ARGUMENT; diff --git a/src/sql/das/ob_das_context.cpp b/src/sql/das/ob_das_context.cpp index f16ae6319..b8279ec91 100644 --- a/src/sql/das/ob_das_context.cpp +++ b/src/sql/das/ob_das_context.cpp @@ -138,6 +138,64 @@ ObDASTableLoc *ObDASCtx::get_table_loc_by_id(uint64_t table_loc_id, uint64_t ref return table_loc; } +ObDASTableLoc *ObDASCtx::get_external_table_loc_by_id(uint64_t table_loc_id, uint64_t ref_table_id) +{ + ObDASTableLoc *table_loc = nullptr; + FOREACH(tmp_node, external_table_locs_) { + if ((*tmp_node)->loc_meta_->table_loc_id_ == table_loc_id && + (*tmp_node)->loc_meta_->ref_table_id_ == ref_table_id) { + table_loc = *tmp_node; + } + } + return table_loc; +} + +int ObDASCtx::build_external_table_location( + uint64_t table_loc_id, + uint64_t ref_table_id, + ObIArray &locations) +{ + int ret = OB_SUCCESS; + ObDASTableLoc *local_location = NULL; + ObDASTabletLoc *local_tablet_loc = NULL; + if (OB_ISNULL(local_location = get_table_loc_by_id(table_loc_id, ref_table_id)) + || OB_ISNULL(local_tablet_loc = local_location->get_first_tablet_loc())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected location", K(ret)); + } else { + ObDASTableLoc *table_loc = NULL; + ObDASTableLocMeta *loc_meta = NULL; + + if (OB_ISNULL(table_loc = OB_NEWx(ObDASTableLoc, (&allocator_), (allocator_))) + || OB_ISNULL(loc_meta = OB_NEWx(ObDASTableLocMeta, (&allocator_), (allocator_)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("fail to allocate memory", K(ret)); + } else if (OB_FAIL(loc_meta->assign(*(local_tablet_loc->loc_meta_)))) { + LOG_WARN("fail to assign loc meta", K(ret)); + } else { + table_loc->loc_meta_ = loc_meta; + } + for (int64_t i = 0; OB_SUCC(ret) && i < locations.count(); i++) { + ObDASTabletLoc *tablet_loc = NULL; + if (OB_ISNULL(tablet_loc = OB_NEWx(ObDASTabletLoc, (&allocator_)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("fail to allocate memory", K(ret)); + } else { + tablet_loc->loc_meta_ = loc_meta; + tablet_loc->tablet_id_ = local_tablet_loc->tablet_id_; + tablet_loc->ls_id_ = local_tablet_loc->ls_id_; + tablet_loc->server_ = locations.at(i); + if (OB_FAIL(table_loc->add_tablet_loc(tablet_loc))) { + LOG_WARN("fail to add tablet location", K(ret)); + } + } + } + OZ (external_table_locs_.push_back(table_loc)); + LOG_DEBUG("external table distribution", K(locations), KPC(table_loc)); + } + return ret; +} + int ObDASCtx::extended_tablet_loc(ObDASTableLoc &table_loc, const ObTabletID &tablet_id, ObDASTabletLoc *&tablet_loc, diff --git a/src/sql/das/ob_das_context.h b/src/sql/das/ob_das_context.h index 54e3d9a6b..604aeed0e 100644 --- a/src/sql/das/ob_das_context.h +++ b/src/sql/das/ob_das_context.h @@ -42,6 +42,7 @@ class ObDASCtx public: ObDASCtx(common::ObIAllocator &allocator) : table_locs_(allocator), + external_table_locs_(allocator), schema_guard_(nullptr), location_router_(allocator), das_factory_(allocator), @@ -67,8 +68,10 @@ public: int init(const ObPhysicalPlan &plan, ObExecContext &ctx); ObDASTableLoc *get_table_loc_by_id(uint64_t table_loc_id, uint64_t ref_table_id); + ObDASTableLoc *get_external_table_loc_by_id(uint64_t table_loc_id, uint64_t ref_table_id); DASTableLocList &get_table_loc_list() { return table_locs_; } DASDelCtxList& get_das_del_ctx_list() {return del_ctx_list_;} + DASTableLocList &get_external_table_loc_list() { return external_table_locs_; } int extended_tablet_loc(ObDASTableLoc &table_loc, const common::ObTabletID &tablet_id, ObDASTabletLoc *&tablet_loc, @@ -97,6 +100,7 @@ public: { table_locs_.clear(); related_tablet_map_.clear(); + external_table_locs_.clear(); } ObDASTaskFactory &get_das_factory() { return das_factory_; } ObSchemaGetterGuard *&get_schema_guard() { return schema_guard_; } @@ -104,7 +108,11 @@ public: bool is_partition_hit(); void unmark_need_check_server(); + int build_external_table_location( + uint64_t table_loc_id, uint64_t ref_table_id, common::ObIArray &locations); + TO_STRING_KV(K_(table_locs), + K_(external_table_locs), K_(is_fk_cascading), K_(snapshot), K_(savepoint)); @@ -112,6 +120,11 @@ private: int check_same_server(const ObDASTabletLoc *tablet_loc); private: DASTableLocList table_locs_; + /* The external table locations stored in table_locs_ are fake local locations generated by optimizer. + * The real locations of external table are determined at runtime when building dfos by QC. + * external_cached_table_locs_ are "cached values" which only used by QC and do not need to serialized to SQC. + */ + DASTableLocList external_table_locs_; share::schema::ObSchemaGetterGuard *schema_guard_; ObDASLocationRouter location_router_; ObDASTaskFactory das_factory_; diff --git a/src/sql/das/ob_das_define.h b/src/sql/das/ob_das_define.h index d8dc3c7dc..acc66c349 100644 --- a/src/sql/das/ob_das_define.h +++ b/src/sql/das/ob_das_define.h @@ -113,7 +113,8 @@ public: K_(select_leader), K_(is_dup_table), K_(is_weak_read), - K_(unuse_related_pruning)); + K_(unuse_related_pruning), + K_(is_external_table)); uint64_t table_loc_id_; //location object id uint64_t ref_table_id_; //table object id @@ -126,7 +127,9 @@ public: uint64_t is_dup_table_ : 1; //mark if this table is a duplicated table uint64_t is_weak_read_ : 1; //mark if this tale can use weak read consistency uint64_t unuse_related_pruning_ : 1; //mark if this table use the related pruning to prune local index tablet_id - uint64_t reserved_ : 59; + uint64_t is_external_table_ : 1; //mark if this table is an external table + uint64_t is_external_files_on_disk_ : 1; //mark if files in external table are located at local disk + uint64_t reserved_ : 57; }; }; @@ -321,6 +324,7 @@ typedef common::ObFixedArray UIntFixedArray; typedef common::ObFixedArray IntFixedArray; typedef common::ObFixedArray ObjectIDFixedArray; typedef common::ObFixedArray DASTableLocFixedArray; +typedef common::ObFixedArray ExternalFileNameArray; //DAS: data access service //CtDef: Compile time Definition diff --git a/src/sql/das/ob_das_location_router.cpp b/src/sql/das/ob_das_location_router.cpp index 92b8694d1..18567ab3d 100644 --- a/src/sql/das/ob_das_location_router.cpp +++ b/src/sql/das/ob_das_location_router.cpp @@ -167,6 +167,12 @@ int ObDASTabletMapper::get_tablet_and_object_id( related_info_ptr = &related_info_; } if (OB_FAIL(ret)) { + } else if (table_schema_->is_external_table()) { + if (OB_FAIL(tmp_tablet_ids.push_back(ObTabletID(ObTabletID::INVALID_TABLET_ID)))) { + LOG_WARN("fail to push back tablet_id", KR(ret)); + } else if (OB_FAIL(tmp_part_ids.push_back(table_schema_->get_object_id()))) { + LOG_WARN("fail to push back object_id", KR(ret)); + } } else if (PARTITION_LEVEL_ZERO == part_level) { ObTabletID tablet_id; ObObjectID object_id; @@ -759,6 +765,8 @@ int ObDASLocationRouter::get(const ObDASTableLocMeta &loc_meta, if (OB_FAIL(get_vt_ls_location(ref_table_id, tablet_id, location))) { LOG_WARN("get virtual table ls location failed", K(ret), K(ref_table_id), K(tablet_id)); } + } else if (loc_meta.is_external_table_) { + ret = get_external_table_ls_location(location); } else { int64_t expire_renew_time = 2 * 1000000; // 2s bool is_cache_hit = false; @@ -981,5 +989,21 @@ OB_NOINLINE int ObDASLocationRouter::get_vt_ls_location(uint64_t table_id, } return ret; } + +int ObDASLocationRouter::get_external_table_ls_location(ObLSLocation &location) +{ + int ret = OB_SUCCESS; + int64_t now = ObTimeUtility::current_time(); + ObReplicaProperty mock_prop; + ObLSReplicaLocation ls_replica; + ObLSRestoreStatus ls_restore_status(ObLSRestoreStatus::RESTORE_NONE); + OZ (location.init(GCONF.cluster_id, MTL_ID(), ObLSID(ObLSID::VT_LS_ID), now)); + OZ (ls_replica.init(GCTX.self_addr(), common::LEADER, + GCONF.mysql_port, REPLICA_TYPE_FULL, + mock_prop, ls_restore_status, 1 /*proposal_id*/)); + OZ (location.add_replica_location(ls_replica)); + return ret; +} + } // namespace sql } // namespace oceanbase diff --git a/src/sql/das/ob_das_location_router.h b/src/sql/das/ob_das_location_router.h index 605c7173a..46cdbe51a 100644 --- a/src/sql/das/ob_das_location_router.h +++ b/src/sql/das/ob_das_location_router.h @@ -267,6 +267,7 @@ public: int get_full_ls_replica_loc(const common::ObObjectID &tenant_id, const ObDASTabletLoc &tablet_loc, share::ObLSReplicaLocation &replica_loc); + int get_external_table_ls_location(share::ObLSLocation &location); private: int get_vt_svr_pair(uint64_t vt_id, const VirtualSvrPair *&vt_svr_pair); int get_vt_tablet_loc(uint64_t table_id, diff --git a/src/sql/das/ob_das_scan_op.cpp b/src/sql/das/ob_das_scan_op.cpp index 55cb69292..24fba9f9b 100644 --- a/src/sql/das/ob_das_scan_op.cpp +++ b/src/sql/das/ob_das_scan_op.cpp @@ -50,7 +50,12 @@ OB_SERIALIZE_MEMBER(ObDASScanCtDef, aggregate_column_ids_, group_id_expr_, result_output_, - is_get_); + is_get_, + is_external_table_, + external_file_location_, + external_file_access_info_, + external_files_, + external_file_format_str_); OB_DEF_SERIALIZE(ObDASScanRtDef) { @@ -218,6 +223,9 @@ int ObDASScanOp::init_scan_param() scan_param_.frozen_version_ = scan_rtdef_->frozen_version_; scan_param_.force_refresh_lc_ = scan_rtdef_->force_refresh_lc_; scan_param_.output_exprs_ = &(scan_ctdef_->pd_expr_spec_.access_exprs_); + scan_param_.ext_file_column_exprs_ = &(scan_ctdef_->pd_expr_spec_.ext_file_column_exprs_); + scan_param_.ext_column_convert_exprs_ = &(scan_ctdef_->pd_expr_spec_.ext_column_convert_exprs_); + scan_param_.calc_exprs_ = &(scan_ctdef_->pd_expr_spec_.calc_exprs_); scan_param_.aggregate_exprs_ = &(scan_ctdef_->pd_expr_spec_.pd_storage_aggregate_output_); scan_param_.table_param_ = &(scan_ctdef_->table_param_); scan_param_.op_ = scan_rtdef_->p_pd_expr_op_; @@ -255,14 +263,29 @@ int ObDASScanOp::init_scan_param() if (OB_FAIL(scan_param_.column_ids_.assign(scan_ctdef_->access_column_ids_))) { LOG_WARN("init column ids failed", K(ret)); } + //external table scan params + if (OB_SUCC(ret) && scan_ctdef_->is_external_table_) { + scan_param_.external_file_access_info_ = scan_ctdef_->external_file_access_info_.str_; + scan_param_.external_file_location_ = scan_ctdef_->external_file_location_.str_; + if (OB_FAIL(scan_param_.external_file_format_.load_from_string(scan_ctdef_->external_file_format_str_.str_, *scan_param_.allocator_))) { + LOG_WARN("fail to load from string", K(ret)); + } else { + uint64_t max_idx = 0; + for (int i = 0; i < scan_param_.ext_file_column_exprs_->count(); i++) { + max_idx = std::max(max_idx, scan_param_.ext_file_column_exprs_->at(i)->extra_); + } + scan_param_.external_file_format_.csv_format_.file_column_nums_ = static_cast(max_idx); + } + } LOG_DEBUG("init scan param", K(scan_param_)); return ret; } ObITabletScan &ObDASScanOp::get_tsc_service() { - return is_virtual_table(scan_ctdef_->ref_table_id_) ? - *GCTX.vt_par_ser_ : *(MTL(ObAccessService *)); + return is_virtual_table(scan_ctdef_->ref_table_id_) ? *GCTX.vt_par_ser_ + : scan_ctdef_->is_external_table_ ? *GCTX.et_access_service_ + : *(MTL(ObAccessService *)); } int ObDASScanOp::open_op() diff --git a/src/sql/das/ob_das_scan_op.h b/src/sql/das/ob_das_scan_op.h index fda4fbc19..01c5c1b11 100644 --- a/src/sql/das/ob_das_scan_op.h +++ b/src/sql/das/ob_das_scan_op.h @@ -37,7 +37,12 @@ public: aggregate_column_ids_(alloc), group_id_expr_(nullptr), result_output_(alloc), - is_get_(false) + is_get_(false), + is_external_table_(false), + external_file_access_info_(alloc), + external_file_location_(alloc), + external_files_(alloc), + external_file_format_str_(alloc) { } //in das scan op, column described with column expr virtual bool has_expr() const override { return true; } @@ -64,7 +69,11 @@ public: K_(pd_expr_spec), KPC_(group_id_expr), K_(result_output), - K_(is_get)); + K_(is_get), + K_(is_external_table), + K_(external_files), + K_(external_file_format_str), + K_(external_file_location)); common::ObTableID ref_table_id_; UIntFixedArray access_column_ids_; int64_t schema_version_; @@ -77,6 +86,11 @@ public: //result_output_ indicate exprs that the storage layer will fill in the value sql::ExprFixedArray result_output_; bool is_get_; + bool is_external_table_; + ObExternalFileFormat::StringData external_file_access_info_; + ObExternalFileFormat::StringData external_file_location_; + ExternalFileNameArray external_files_; //for external table scan TODO jim.wjh remove + ObExternalFileFormat::StringData external_file_format_str_; }; struct ObDASScanRtDef : ObDASBaseRtDef diff --git a/src/sql/engine/basic/ob_pushdown_filter.cpp b/src/sql/engine/basic/ob_pushdown_filter.cpp index cb6592676..653912281 100644 --- a/src/sql/engine/basic/ob_pushdown_filter.cpp +++ b/src/sql/engine/basic/ob_pushdown_filter.cpp @@ -1433,7 +1433,9 @@ ObPushdownExprSpec::ObPushdownExprSpec(ObIAllocator &alloc) pushdown_filters_(alloc), pd_storage_flag_(0), pd_storage_filters_(alloc), - pd_storage_aggregate_output_(alloc) + pd_storage_aggregate_output_(alloc), + ext_file_column_exprs_(alloc), + ext_column_convert_exprs_(alloc) { } @@ -1451,7 +1453,9 @@ OB_DEF_SERIALIZE(ObPushdownExprSpec) pd_storage_flag_, pd_storage_filters_, fake_pd_storage_index_back_filters, //mock a fake filters to compatible with 4.0 - pd_storage_aggregate_output_); + pd_storage_aggregate_output_, + ext_file_column_exprs_, + ext_column_convert_exprs_); return ret; } @@ -1469,7 +1473,9 @@ OB_DEF_DESERIALIZE(ObPushdownExprSpec) pd_storage_flag_, pd_storage_filters_, fake_pd_storage_index_back_filters, //mock a fake filters to compatible with 4.0 - pd_storage_aggregate_output_); + pd_storage_aggregate_output_, + ext_file_column_exprs_, + ext_column_convert_exprs_); return ret; } @@ -1487,7 +1493,9 @@ OB_DEF_SERIALIZE_SIZE(ObPushdownExprSpec) pd_storage_flag_, pd_storage_filters_, fake_pd_storage_index_back_filters, //mock a fake filters to compatible with 4.0 - pd_storage_aggregate_output_); + pd_storage_aggregate_output_, + ext_file_column_exprs_, + ext_column_convert_exprs_); return len; } diff --git a/src/sql/engine/basic/ob_pushdown_filter.h b/src/sql/engine/basic/ob_pushdown_filter.h index e4dddf3ca..b4e5b04db 100644 --- a/src/sql/engine/basic/ob_pushdown_filter.h +++ b/src/sql/engine/basic/ob_pushdown_filter.h @@ -528,6 +528,8 @@ public: ~ObPushdownExprSpec() = default; TO_STRING_KV(K_(calc_exprs), K_(access_exprs), + K_(ext_file_column_exprs), + K_(ext_column_convert_exprs), K_(max_batch_size), K_(pushdown_filters), K_(pd_storage_flag)); @@ -549,6 +551,9 @@ public: ObPushdownFilter pd_storage_filters_; // used to pushdown aggregate expression now. ExprFixedArray pd_storage_aggregate_output_; + // used by external table + ExprFixedArray ext_file_column_exprs_; + ExprFixedArray ext_column_convert_exprs_; }; //下压到存储层的表达式执行依赖的op ctx diff --git a/src/sql/engine/cmd/ob_load_data_parser.cpp b/src/sql/engine/cmd/ob_load_data_parser.cpp index 24cf363f4..16d21cf9f 100644 --- a/src/sql/engine/cmd/ob_load_data_parser.cpp +++ b/src/sql/engine/cmd/ob_load_data_parser.cpp @@ -15,6 +15,9 @@ #include "sql/engine/cmd/ob_load_data_parser.h" #include "sql/resolver/cmd/ob_load_data_stmt.h" #include "lib/oblog/ob_log_module.h" +#include "lib/utility/ob_print_utils.h" +#include "lib/string/ob_hex_utils_base.h" +#include "deps/oblib/src/lib/list/ob_dlist.h" using namespace oceanbase::sql; using namespace oceanbase::common; @@ -23,30 +26,69 @@ namespace oceanbase { namespace sql { +const char INVALID_TERM_CHAR = '\xff'; + +const char * FORMAT_TYPE_STR[] = { + "CSV", +}; +static_assert(array_elements(FORMAT_TYPE_STR) == ObExternalFileFormat::MAX_FORMAT, "Not enough initializer for ObExternalFileFormat"); + +int ObCSVGeneralFormat::init_format(const ObDataInFileStruct &format, + int64_t file_column_nums, + ObCollationType file_cs_type) +{ + int ret = OB_SUCCESS; + + if (!ObCharset::is_valid_collation(file_cs_type)) { + ret = OB_ERR_UNKNOWN_CHARSET; + LOG_WARN("invalid charset", K(ret), K(file_cs_type)); + } else { + cs_type_ = ObCharset::charset_type_by_coll(file_cs_type); + file_column_nums_ = file_column_nums; + field_enclosed_char_ = format.field_enclosed_char_; + field_escaped_char_ = format.field_escaped_char_; + field_term_str_ = format.field_term_str_; + line_term_str_ = format.line_term_str_; + line_start_str_ = format.line_start_str_; + if (line_term_str_.empty() && !field_term_str_.empty()) { + line_term_str_ = field_term_str_; + } + } + return ret; +} + int ObCSVGeneralParser::init(const ObDataInFileStruct &format, int64_t file_column_nums, ObCollationType file_cs_type) { int ret = OB_SUCCESS; - const char INVALID_TERM_CHAR = '\xff'; - if (!ObCharset::is_valid_collation(file_cs_type)) { - ret = OB_ERR_UNKNOWN_CHARSET; - LOG_WARN("invalid charset", K(ret), K(file_cs_type)); - } else { - format_.cs_type_ = ObCharset::charset_type_by_coll(file_cs_type); - format_.file_column_nums_ = file_column_nums; - format_.field_enclosed_char_ = format.field_enclosed_char_; - format_.field_escaped_char_ = format.field_escaped_char_; - format_.field_term_str_ = format.field_term_str_; - format_.line_term_str_ = format.line_term_str_; - format_.line_start_str_ = format.line_start_str_; - if (format_.line_term_str_.empty() && !format_.field_term_str_.empty()) { - format_.line_term_str_ = format_.field_term_str_; - } + if (OB_FAIL(format_.init_format(format, file_column_nums, file_cs_type))) { + LOG_WARN("fail to init format", K(ret)); + } else if (OB_FAIL(init_opt_variables())) { + LOG_WARN("fail to init opt values", K(ret)); } + return ret; +} + +int ObCSVGeneralParser::init(const ObCSVGeneralFormat &format) +{ + int ret = OB_SUCCESS; + + format_ = format; + + if (OB_FAIL(init_opt_variables())) { + LOG_WARN("fail to init opt values", K(ret)); + } + + return ret; +} + +int ObCSVGeneralParser::init_opt_variables() +{ + int ret = OB_SUCCESS; if (OB_SUCC(ret)) { opt_param_.line_term_c_ = format_.line_term_str_.empty() ? INVALID_TERM_CHAR : format_.line_term_str_[0]; opt_param_.field_term_c_ = format_.field_term_str_.empty() ? INVALID_TERM_CHAR : format_.field_term_str_[0]; @@ -65,10 +107,9 @@ int ObCSVGeneralParser::init(const ObDataInFileStruct &format, } - if (OB_SUCC(ret) && OB_FAIL(fields_per_line_.prepare_allocate(file_column_nums))) { - LOG_WARN("fail to allocate memory", K(ret), K(file_column_nums)); + if (OB_SUCC(ret) && OB_FAIL(fields_per_line_.prepare_allocate(format_.file_column_nums_))) { + LOG_WARN("fail to allocate memory", K(ret), K(format_.file_column_nums_)); } - return ret; } @@ -81,7 +122,7 @@ int ObCSVGeneralParser::handle_irregular_line(int field_idx, int line_no, OB_WARN_TOO_MANY_RECORDS : OB_WARN_TOO_FEW_RECORDS; rec.line_no = line_no; OX (errors.push_back(rec)); - for (int i = field_idx; i < format_.file_column_nums_; ++i) { + for (int i = field_idx; OB_SUCC(ret) && i < format_.file_column_nums_; ++i) { FieldValue &new_field = fields_per_line_.at(i); new_field = FieldValue(); new_field.is_null_ = 1; @@ -89,5 +130,304 @@ int ObCSVGeneralParser::handle_irregular_line(int field_idx, int line_no, return ret; } +int64_t ObCSVGeneralFormat::to_json_kv_string(char *buf, const int64_t buf_len) const +{ + int64_t pos = 0; + int64_t idx = 0; + J_COMMA(); + databuff_printf(buf, buf_len, pos, "\"%s\":\"%s\"", OPTION_NAMES[idx++], to_cstring(ObHexStringWrap(line_term_str_))); + J_COMMA(); + databuff_printf(buf, buf_len, pos, "\"%s\":\"%s\"", OPTION_NAMES[idx++], to_cstring(ObHexStringWrap(field_term_str_))); + J_COMMA(); + databuff_printf(buf, buf_len, pos, "\"%s\":%ld", OPTION_NAMES[idx++], field_escaped_char_); + J_COMMA(); + databuff_printf(buf, buf_len, pos, "\"%s\":%ld", OPTION_NAMES[idx++], field_enclosed_char_); + J_COMMA(); + databuff_printf(buf, buf_len, pos, "\"%s\":\"%s\"", OPTION_NAMES[idx++], ObCharset::charset_name(cs_type_)); + J_COMMA(); + databuff_printf(buf, buf_len, pos, "\"%s\":%ld", OPTION_NAMES[idx++], skip_header_lines_); + J_COMMA(); + databuff_printf(buf, buf_len, pos, "\"%s\":%s", OPTION_NAMES[idx++], STR_BOOL(skip_blank_lines_)); + J_COMMA(); + databuff_printf(buf, buf_len, pos, "\"%s\":%s", OPTION_NAMES[idx++], STR_BOOL(trim_space_)); + J_COMMA(); + databuff_printf(buf, buf_len, pos, "\"%s\":", OPTION_NAMES[idx++]); + J_ARRAY_START(); + for (int64_t i = 0; i < null_if_.count(); i++) { + if (i != 0) { + J_COMMA(); + } + databuff_printf(buf, buf_len, pos, "\"%s\"", to_cstring(ObHexStringWrap(null_if_.at(i)))); + } + J_ARRAY_END(); + J_COMMA(); + databuff_printf(buf, buf_len, pos, "\"%s\":%s", OPTION_NAMES[idx++], STR_BOOL(empty_field_as_null_)); + return pos; +} + +int ObCSVGeneralFormat::load_from_json_data(json::Pair *&node, ObIAllocator &allocator) +{ + int ret = OB_SUCCESS; + int64_t idx = 0; + if (OB_SUCC(ret) && OB_NOT_NULL(node) && 0 == node->name_.case_compare(OPTION_NAMES[idx++]) + && json::JT_STRING == node->value_->get_type()) { + ObObj obj; + OZ (ObHexUtilsBase::unhex(node->value_->get_string(), allocator, obj)); + if (OB_SUCC(ret) && !obj.is_null()) { + line_term_str_ = obj.get_string(); + } + node = node->get_next(); + } + if (OB_NOT_NULL(node) && 0 == node->name_.case_compare(OPTION_NAMES[idx++]) + && json::JT_STRING == node->value_->get_type()) { + ObObj obj; + OZ (ObHexUtilsBase::unhex(node->value_->get_string(), allocator, obj)); + if (OB_SUCC(ret) && !obj.is_null()) { + field_term_str_ = obj.get_string(); + } + node = node->get_next(); + } + if (OB_NOT_NULL(node) && 0 == node->name_.case_compare(OPTION_NAMES[idx++]) + && json::JT_NUMBER == node->value_->get_type()) { + field_escaped_char_ = node->value_->get_number(); + node = node->get_next(); + } + if (OB_NOT_NULL(node) && 0 == node->name_.case_compare(OPTION_NAMES[idx++]) + && json::JT_NUMBER == node->value_->get_type()) { + field_enclosed_char_ = node->value_->get_number(); + node = node->get_next(); + } + if (OB_NOT_NULL(node) && 0 == node->name_.case_compare(OPTION_NAMES[idx++]) + && json::JT_STRING == node->value_->get_type()) { + cs_type_ = ObCharset::charset_type(node->value_->get_string()); + node = node->get_next(); + } + if (OB_NOT_NULL(node) && 0 == node->name_.case_compare(OPTION_NAMES[idx++]) + && json::JT_NUMBER == node->value_->get_type()) { + skip_header_lines_ = node->value_->get_number(); + node = node->get_next(); + } + if (OB_NOT_NULL(node) && 0 == node->name_.case_compare(OPTION_NAMES[idx++])) { + if (json::JT_TRUE == node->value_->get_type()) { + skip_blank_lines_ = true; + } else { + skip_blank_lines_ = false; + } + node = node->get_next(); + } + if (OB_NOT_NULL(node) && 0 == node->name_.case_compare(OPTION_NAMES[idx++])) { + if (json::JT_TRUE == node->value_->get_type()) { + trim_space_ = true; + } else { + trim_space_ = false; + } + node = node->get_next(); + } + if (OB_SUCC(ret) && OB_NOT_NULL(node) && 0 == node->name_.case_compare(OPTION_NAMES[idx++]) + && json::JT_ARRAY == node->value_->get_type()) { + const json::Array &it_array = node->value_->get_array(); + int64_t idx = 0; + if (it_array.get_size() > 0 + && OB_FAIL(null_if_.allocate_array(allocator, it_array.get_size()))) { + LOG_WARN("allocate array failed", K(ret)); + } + for (auto it_tmp = it_array.get_first(); + OB_SUCC(ret) && it_tmp != it_array.get_header() && it_tmp != NULL; + it_tmp = it_tmp->get_next()) { + if (OB_UNLIKELY(json::JT_STRING != it_tmp->get_type())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("null_if_ child is not string", K(ret), "type", it_tmp->get_type()); + } else { + ObObj obj; + OZ (ObHexUtilsBase::unhex(it_tmp->get_string(), allocator, obj)); + if (OB_SUCC(ret) && !obj.is_null()) { + null_if_.at(idx++) = obj.get_string(); + } + } + } + node = node->get_next(); + } + if (OB_NOT_NULL(node) && 0 == node->name_.case_compare(OPTION_NAMES[idx++])) { + if (json::JT_TRUE == node->value_->get_type()) { + empty_field_as_null_ = true; + } else { + empty_field_as_null_ = false; + } + node = node->get_next(); + } + return ret; +} + +int64_t ObOriginFileFormat::to_json_kv_string(char *buf, const int64_t buf_len) const +{ + int64_t pos = 0; + int64_t idx = 0; + J_COMMA(); + databuff_printf(buf, buf_len, pos, "\"%s\":\"%s\"", ORIGIN_FORMAT_STRING[idx++], to_cstring(ObHexStringWrap(origin_line_term_str_))); + J_COMMA(); + databuff_printf(buf, buf_len, pos, "\"%s\":\"%s\"", ORIGIN_FORMAT_STRING[idx++], to_cstring(ObHexStringWrap(origin_field_term_str_))); + J_COMMA(); + databuff_printf(buf, buf_len, pos, "\"%s\":\"%s\"", ORIGIN_FORMAT_STRING[idx++], to_cstring(ObHexStringWrap(origin_field_escaped_str_))); + J_COMMA(); + databuff_printf(buf, buf_len, pos, "\"%s\":\"%s\"", ORIGIN_FORMAT_STRING[idx++], to_cstring(ObHexStringWrap(origin_field_enclosed_str_))); + J_COMMA(); + databuff_printf(buf, buf_len, pos, "\"%s\":\"%s\"", ORIGIN_FORMAT_STRING[idx++], to_cstring(ObHexStringWrap(origin_null_if_str_))); + return pos; +} + +int ObOriginFileFormat::load_from_json_data(json::Pair *&node, ObIAllocator &allocator) +{ + int ret = OB_SUCCESS; + int64_t idx = 0; + if (OB_SUCC(ret) && OB_NOT_NULL(node) + && 0 == node->name_.case_compare(ORIGIN_FORMAT_STRING[idx++]) + && json::JT_STRING == node->value_->get_type()) { + ObObj obj; + OZ (ObHexUtilsBase::unhex(node->value_->get_string(), allocator, obj)); + if (OB_SUCC(ret) && !obj.is_null()) { + origin_line_term_str_ = obj.get_string(); + } + node = node->get_next(); + } + if (OB_SUCC(ret) && OB_NOT_NULL(node) + && 0 == node->name_.case_compare(ORIGIN_FORMAT_STRING[idx++]) + && json::JT_STRING == node->value_->get_type()) { + ObObj obj; + OZ (ObHexUtilsBase::unhex(node->value_->get_string(), allocator, obj)); + if (OB_SUCC(ret) && !obj.is_null()) { + origin_field_term_str_ = obj.get_string(); + } + node = node->get_next(); + } + if (OB_SUCC(ret) && OB_NOT_NULL(node) + && 0 == node->name_.case_compare(ORIGIN_FORMAT_STRING[idx++]) + && json::JT_STRING == node->value_->get_type()) { + ObObj obj; + OZ (ObHexUtilsBase::unhex(node->value_->get_string(), allocator, obj)); + if (OB_SUCC(ret) && !obj.is_null()) { + origin_field_escaped_str_ = obj.get_string(); + } + node = node->get_next(); + } + if (OB_SUCC(ret) && OB_NOT_NULL(node) + && 0 == node->name_.case_compare(ORIGIN_FORMAT_STRING[idx++]) + && json::JT_STRING == node->value_->get_type()) { + ObObj obj; + OZ (ObHexUtilsBase::unhex(node->value_->get_string(), allocator, obj)); + if (OB_SUCC(ret) && !obj.is_null()) { + origin_field_enclosed_str_ = obj.get_string(); + } + node = node->get_next(); + } + if (OB_SUCC(ret) && OB_NOT_NULL(node) + && 0 == node->name_.case_compare(ORIGIN_FORMAT_STRING[idx++]) + && json::JT_STRING == node->value_->get_type()) { + ObObj obj; + OZ (ObHexUtilsBase::unhex(node->value_->get_string(), allocator, obj)); + if (OB_SUCC(ret) && !obj.is_null()) { + origin_null_if_str_ = obj.get_string(); + } + node = node->get_next(); + } + return ret; +} + +int64_t ObExternalFileFormat::to_string(char *buf, const int64_t buf_len) const +{ + int64_t pos = 0; + bool is_valid_format = format_type_ > INVALID_FORMAT && format_type_ < MAX_FORMAT; + + J_OBJ_START(); + + databuff_print_kv(buf, buf_len, pos, "\"TYPE\"", is_valid_format ? FORMAT_TYPE_STR[format_type_] : "INVALID"); + + switch (format_type_) { + case CSV_FORMAT: + pos += csv_format_.to_json_kv_string(buf + pos, buf_len - pos); + pos += origin_file_format_str_.to_json_kv_string(buf + pos, buf_len - pos); + break; + default: + pos = 0; + } + + J_OBJ_END(); + return pos; +} + +int ObExternalFileFormat::load_from_string(const ObString &str, ObIAllocator &allocator) +{ + int ret = OB_SUCCESS; + json::Value *data = NULL; + json::Parser parser; + ObArenaAllocator temp_allocator; + if (OB_UNLIKELY(str.empty())) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("format string is empty", K(ret), K(str)); + } else if (OB_FAIL(parser.init(&temp_allocator))) { + LOG_WARN("parser init failed", K(ret)); + } else if (OB_FAIL(parser.parse(str.ptr(), str.length(), data))) { + LOG_WARN("parse json failed", K(ret), K(str)); + } else if (NULL == data || json::JT_OBJECT != data->get_type()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("error json value", K(ret), KPC(data)); + } else { + auto format_type_node = data->get_object().get_first(); + if (format_type_node->value_->get_type() != json::JT_STRING) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected json format", K(ret), K(str)); + } else { + ObString format_type_str = format_type_node->value_->get_string(); + for (int i = 0; i < array_elements(FORMAT_TYPE_STR); ++i) { + if (format_type_str.case_compare(FORMAT_TYPE_STR[i]) == 0) { + format_type_ = static_cast(i); + break; + } + } + format_type_node = format_type_node->get_next(); + switch (format_type_) { + case CSV_FORMAT: + OZ (csv_format_.load_from_json_data(format_type_node, allocator)); + OZ (origin_file_format_str_.load_from_json_data(format_type_node, allocator)); + break; + default: + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid format type", K(ret), K(format_type_str)); + break; + } + } + } + return ret; +} + +int ObExternalFileFormat::StringData::store_str(const ObString &str) +{ + return ob_write_string(allocator_, str, str_); +} + +OB_DEF_SERIALIZE(ObExternalFileFormat::StringData) +{ + int ret = OB_SUCCESS; + LST_DO_CODE(OB_UNIS_ENCODE, str_); + return ret; +} + +OB_DEF_DESERIALIZE(ObExternalFileFormat::StringData) +{ + int ret = OB_SUCCESS; + ObString temp_str; + LST_DO_CODE(OB_UNIS_DECODE, temp_str); + if (OB_SUCC(ret)) { + ret = store_str(temp_str); + } + return ret; +} + +OB_DEF_SERIALIZE_SIZE(ObExternalFileFormat::StringData) +{ + int64_t len = 0; + LST_DO_CODE(OB_UNIS_ADD_LEN, str_); + return len; +} + } } diff --git a/src/sql/engine/cmd/ob_load_data_parser.h b/src/sql/engine/cmd/ob_load_data_parser.h index f379470a2..a5b6a5340 100644 --- a/src/sql/engine/cmd/ob_load_data_parser.h +++ b/src/sql/engine/cmd/ob_load_data_parser.h @@ -14,6 +14,7 @@ #include "common/object/ob_object.h" #include "lib/container/ob_se_array.h" #include "lib/string/ob_string.h" +#include "lib/json/ob_json.h" #ifndef _OB_LOAD_DATA_PARSER_H_ #define _OB_LOAD_DATA_PARSER_H_ @@ -26,18 +27,54 @@ class ObDataInFileStruct; struct ObCSVGeneralFormat { ObCSVGeneralFormat () : + line_start_str_(), + line_term_str_(), + field_term_str_(), field_escaped_char_(INT64_MAX), field_enclosed_char_(INT64_MAX), cs_type_(common::CHARSET_INVALID), + skip_header_lines_(0), + skip_blank_lines_(false), + trim_space_(false), + null_if_(), + empty_field_as_null_(false), file_column_nums_(0) {} + static constexpr const char *OPTION_NAMES[] = { + "LINE_DELIMITER", + "FIELD_DELIMITER", + "ESCAPE", + "FIELD_OPTIONALLY_ENCLOSED_BY", + "ENCODING", + "SKIP_HEADER", + "SKIP_BLANK_LINES", + "TRIM_SPACE", + "NULL_IF_EXETERNAL", + "EMPTY_FIELD_AS_NULL", + }; common::ObString line_start_str_; common::ObString line_term_str_; common::ObString field_term_str_; int64_t field_escaped_char_; // valid escaped char after stmt validation int64_t field_enclosed_char_; // valid enclosed char after stmt validation - common::ObCharsetType cs_type_; + common::ObCharsetType cs_type_; // charset type of format strings + int64_t skip_header_lines_; + bool skip_blank_lines_; + bool trim_space_; + common::ObArrayWrap null_if_; + bool empty_field_as_null_; + int64_t file_column_nums_; + + int init_format(const ObDataInFileStruct &format, + int64_t file_column_nums, + ObCollationType file_cs_type); + int64_t to_json_kv_string(char* buf, const int64_t buf_len) const; + int load_from_json_data(json::Pair *&node, common::ObIAllocator &allocator); + + TO_STRING_KV(K(cs_type_), K(file_column_nums_), K(line_start_str_), K(field_enclosed_char_), + K(field_escaped_char_), K(field_term_str_), K(line_term_str_)); + OB_UNIS_VERSION(1); }; /** @@ -84,20 +121,22 @@ public: }; public: ObCSVGeneralParser() {} + int init(const ObCSVGeneralFormat &format); + int init(const ObDataInFileStruct &format, int64_t file_column_nums, common::ObCollationType file_cs_type); const ObCSVGeneralFormat &get_format() { return format_; } const OptParams &get_opt_params() { return opt_param_; } - template + template int scan_proto(const char *&str, const char *end, int64_t &nrows, char *escape_buf, char *escaped_buf_end, handle_func &handle_one_line, common::ObIArray &errors, bool is_end_file); - template + template int scan(const char *&str, const char *end, int64_t &nrows, char *escape_buf, char *escaped_buf_end, handle_func &handle_one_line, @@ -106,20 +145,20 @@ public: int ret = common::OB_SUCCESS; switch (format_.cs_type_) { case common::CHARSET_UTF8MB4: - ret = scan_proto( + ret = scan_proto( str, end, nrows, escape_buf, escaped_buf_end, handle_one_line, errors, is_end_file); break; case common::CHARSET_GBK: - ret = scan_proto( + ret = scan_proto( str, end, nrows, escape_buf, escaped_buf_end, handle_one_line, errors, is_end_file); break; case common::CHARSET_GB18030: case common::CHARSET_GB18030_2022: - ret = scan_proto( + ret = scan_proto( str, end, nrows, escape_buf, escaped_buf_end, handle_one_line, errors, is_end_file); break; default: - ret = scan_proto( + ret = scan_proto( str, end, nrows, escape_buf, escaped_buf_end, handle_one_line, errors, is_end_file); break; } @@ -128,6 +167,7 @@ public: common::ObIArray& get_fields_per_line() { return fields_per_line_; } private: + int init_opt_variables(); template inline int mbcharlen(const char *ptr, const char *end) { UNUSED(ptr); @@ -157,29 +197,52 @@ private: return c; } + inline - bool is_null_field(bool is_escaped, const char* field_begin, const char* field_end) { - return (is_escaped && field_end - field_begin == 1 && 'N' == *field_begin) - || (format_.field_enclosed_char_ != INT64_MAX - && field_end - field_begin == 4 - && 0 == strncasecmp(field_begin, "NULL", 4) - && !is_escaped); + bool is_null_field(const char* ori_field_begin, int64_t ori_field_len, + const char* final_field_begin, int64_t final_field_len) { + bool ret = false; + + if ((2 == ori_field_len && format_.field_escaped_char_ == ori_field_begin[0] && 'N' == ori_field_begin[1]) + || (format_.field_enclosed_char_ != INT64_MAX && 4 == ori_field_len && 0 == MEMCMP(ori_field_begin, "NULL", 4)) + || (format_.empty_field_as_null_ && 0 == final_field_len)) { + ret = true; + } else { + for (int i = 0; i < format_.null_if_.count(); i++) { + if (format_.null_if_.at(i).length() == final_field_len + && 0 == MEMCMP(final_field_begin, format_.null_if_.at(i).ptr(), final_field_len)) { + ret = true; + break; + } + } + } + return ret; } inline - void gen_new_field(bool is_enclosed, bool is_escaped, - const char *field_begin, const char *field_end, int field_idx) { - int32_t str_len = static_cast(field_end - field_begin); + void gen_new_field(const bool is_enclosed, const char *ori_field_begin, const char *ori_field_end, + const char *field_begin, const char *field_end, const int field_idx) { FieldValue &new_field = fields_per_line_[field_idx - 1]; new_field = FieldValue(); - if (!is_enclosed && is_null_field(is_escaped, field_begin, field_end)) { + if (format_.trim_space_) { + while (field_begin < field_end && ' ' == *field_begin) field_begin++; + while (field_begin < field_end && ' ' == *(field_end - 1)) field_end--; + } + if (is_null_field(ori_field_begin, ori_field_end - ori_field_begin, field_begin, field_end - field_begin)) { new_field.is_null_ = 1; } else { new_field.ptr_ = const_cast(field_begin); - new_field.len_ = str_len; + new_field.len_ = static_cast(field_end - field_begin); } } + inline bool is_escape_next(const bool is_enclosed, const char cur, const char next) { + // 1. the next char escaped by escape_char "A\tB" => A B + // 2. enclosed char escaped by another enclosed char in enclosed field. E.g. "A""B" => A"B + return (format_.field_escaped_char_ == cur && !opt_param_.is_same_escape_enclosed_) + || (is_enclosed && format_.field_enclosed_char_ == cur && format_.field_enclosed_char_ == next); + } + protected: ObCSVGeneralFormat format_; common::ObSEArray fields_per_line_; @@ -230,7 +293,7 @@ inline int ObCSVGeneralParser::mbcharlen(const char *pt return mb_len; } -template +template int ObCSVGeneralParser::scan_proto(const char *&str, const char *end, int64_t &nrows, @@ -241,18 +304,18 @@ int ObCSVGeneralParser::scan_proto(const char *&str, bool is_end_file) { int ret = common::OB_SUCCESS; - int line_no = 0; + int blank_line_cnt = 0; const char *line_begin = str; + char *escape_buf_pos = escape_buf; - if (DO_ESCAPE) { + if (NEED_ESCAPED_RESULT) { if (escape_buf_end - escape_buf < end - str) { ret = common::OB_BUF_NOT_ENOUGH; } } - while (OB_SUCC(ret) && str < end && line_no < nrows) { - char *escape_buf_pos = escape_buf; + while (OB_SUCC(ret) && str < end && line_no - blank_line_cnt < nrows) { bool find_new_line = false; int field_idx = 0; @@ -276,6 +339,7 @@ int ObCSVGeneralParser::scan_proto(const char *&str, } while (str < end && !find_new_line) { + const char *ori_field_begin = str; const char *field_begin = str; bool is_enclosed = false; const char *last_end_enclosed = nullptr; @@ -290,29 +354,23 @@ int ObCSVGeneralParser::scan_proto(const char *&str, } while (str < end && !is_term) { const char *next = str + 1; - if (next < end && ((format_.field_escaped_char_ == *str && !opt_param_.is_same_escape_enclosed_) - || (is_enclosed && format_.field_enclosed_char_ == *str && format_.field_enclosed_char_ == *next))) { - bool is_valid_escape = (1 == mbcharlen(next, end)); - if (DO_ESCAPE) { + if (next < end && is_escape_next(is_enclosed, *str, *next)) { + if (NEED_ESCAPED_RESULT) { if (last_escaped_str == nullptr) { last_escaped_str = field_begin; field_begin = escape_buf_pos; } - int copy_len = str - last_escaped_str; + int64_t copy_len = str - last_escaped_str; //if (OB_UNLIKELY(escape_buf_pos + copy_len + 1 > escape_buf_end)) { // ret = common::OB_SIZE_OVERFLOW; break; //} else { MEMCPY(escape_buf_pos, last_escaped_str, copy_len); escape_buf_pos+=copy_len; - if (is_valid_escape) { - *(escape_buf_pos++) = escape(*next); - last_escaped_str = next + 1; - } else { - last_escaped_str = next; - } + *(escape_buf_pos++) = escape(*next); + last_escaped_str = next + 1; //} } - str += (OB_LIKELY(is_valid_escape) ? 2 : 1); + str += 2; } else if (format_.field_enclosed_char_ == *str) { last_end_enclosed = str; str++; @@ -337,6 +395,7 @@ int ObCSVGeneralParser::scan_proto(const char *&str, } if (OB_LIKELY(is_term) || is_end_file) { + const char *ori_field_end = str; const char *field_end = str; if (is_enclosed && field_end - 1 == last_end_enclosed) { field_begin++; @@ -348,9 +407,9 @@ int ObCSVGeneralParser::scan_proto(const char *&str, str = end; } - if (DO_ESCAPE) { + if (NEED_ESCAPED_RESULT) { if (last_escaped_str != nullptr) { - int copy_len = field_end - last_escaped_str; + int64_t copy_len = field_end - last_escaped_str; //if (OB_UNLIKELY(escape_buf_pos + copy_len > escape_buf_end)) { // ret = common::OB_SIZE_OVERFLOW; //} else { @@ -363,9 +422,10 @@ int ObCSVGeneralParser::scan_proto(const char *&str, } } - if (is_field_term || field_end > field_begin || field_idx < format_.file_column_nums_) { + if (is_field_term || ori_field_end > ori_field_begin + || (field_idx < format_.file_column_nums_ && !format_.skip_blank_lines_)) { if (field_idx++ < format_.file_column_nums_) { - gen_new_field(is_enclosed, last_escaped_str != nullptr, field_begin, field_end, field_idx); + gen_new_field(is_enclosed, ori_field_begin, ori_field_end, field_begin, field_end, field_idx); } } @@ -376,11 +436,17 @@ int ObCSVGeneralParser::scan_proto(const char *&str, } } if (OB_LIKELY(find_new_line) || is_end_file) { - if (field_idx != format_.file_column_nums_) { - ret = handle_irregular_line(field_idx, line_no, errors); - } - if (OB_SUCC(ret)) { - ret = handle_one_line(fields_per_line_); + if (!format_.skip_blank_lines_ || field_idx > 0) { + if (field_idx != format_.file_column_nums_) { + ret = handle_irregular_line(field_idx, line_no, errors); + } + if (OB_SUCC(ret)) { + ret = handle_one_line(fields_per_line_); + } + } else { + if (format_.skip_blank_lines_) { + blank_line_cnt++; + } } line_no++; line_begin = str; @@ -389,10 +455,61 @@ int ObCSVGeneralParser::scan_proto(const char *&str, str = line_begin; nrows = line_no; - return ret; } +// user using to define create external table format +struct ObOriginFileFormat +{ + int64_t to_json_kv_string(char *buf, const int64_t buf_len) const; + int load_from_json_data(json::Pair *&node, common::ObIAllocator &allocator); + TO_STRING_KV(K(origin_line_term_str_), K(origin_field_term_str_), K(origin_field_escaped_str_), + K(origin_field_enclosed_str_), K(origin_null_if_str_)); + + static constexpr const char *ORIGIN_FORMAT_STRING[] = { + "ORIGIN_LINE_DELIMITER", + "ORIGIN_FIELD_DELIMITER", + "ORIGIN_ESCAPE", + "ORIGIN_FIELD_OPTIONALLY_ENCLOSED_BY", + "ORIGIN_NULL_IF_EXETERNAL", + }; + + common::ObString origin_line_term_str_; + common::ObString origin_field_term_str_; + common::ObString origin_field_escaped_str_; + common::ObString origin_field_enclosed_str_; + common::ObString origin_null_if_str_; +}; + +struct ObExternalFileFormat +{ + struct StringData { + StringData(common::ObIAllocator &alloc) : allocator_(alloc) {} + int store_str(const ObString &str); + common::ObString str_; + common::ObIAllocator &allocator_; + TO_STRING_KV(K_(str)); + OB_UNIS_VERSION(1); + }; + + enum FormatType { + INVALID_FORMAT = -1, + CSV_FORMAT, + MAX_FORMAT + }; + + + ObExternalFileFormat() : format_type_(INVALID_FORMAT) {} + + int64_t to_string(char* buf, const int64_t buf_len) const; + int load_from_string(const common::ObString &str, ObIAllocator &allocator); + + ObOriginFileFormat origin_file_format_str_; + FormatType format_type_; + sql::ObCSVGeneralFormat csv_format_; +}; + + } } diff --git a/src/sql/engine/cmd/ob_table_executor.cpp b/src/sql/engine/cmd/ob_table_executor.cpp index 101295466..ab824fff8 100644 --- a/src/sql/engine/cmd/ob_table_executor.cpp +++ b/src/sql/engine/cmd/ob_table_executor.cpp @@ -44,6 +44,15 @@ #include "observer/ob_server_struct.h" #include "observer/ob_server.h" #include "lib/worker.h" +#include "share/external_table/ob_external_table_file_mgr.h" +#include "share/external_table/ob_external_table_file_task.h" +#include "share/external_table/ob_external_table_file_rpc_proxy.h" +#include "observer/ob_srv_network_frame.h" +#include "observer/dbms_job/ob_dbms_job_master.h" +#include "observer/ob_inner_sql_connection_pool.h" +#include "share/backup/ob_backup_io_adapter.h" +#include "share/external_table/ob_external_table_file_rpc_processor.h" +#include "share/external_table/ob_external_table_utils.h" namespace oceanbase { using namespace common; @@ -469,7 +478,8 @@ int ObCreateTableExecutor::execute(ObExecContext &ctx, ObCreateTableStmt &stmt) if (OB_ISNULL(task_exec_ctx = GET_TASK_EXECUTOR_CTX(ctx))) { ret = OB_NOT_INIT; LOG_WARN("get task executor context failed", K(ret)); - } else if (OB_FAIL(ObPartitionExecutorUtils::calc_values_exprs(ctx, stmt))) { + } else if (!table_schema.is_external_table() //external table can not define partitions by create table stmt + && OB_FAIL(ObPartitionExecutorUtils::calc_values_exprs(ctx, stmt))) { LOG_WARN("compare range parition expr fail", K(ret)); } else if (OB_FAIL(set_index_arg_list(ctx, stmt))) { LOG_WARN("fail to set index_arg_list", K(ret)); @@ -483,9 +493,24 @@ int ObCreateTableExecutor::execute(ObExecContext &ctx, ObCreateTableStmt &stmt) LOG_WARN("schema_guard reset failed", K(ret)); } else if (OB_FAIL(common_rpc_proxy->create_table(create_table_arg, res))) { LOG_WARN("rpc proxy create table failed", K(ret), "dst", common_rpc_proxy->get_server()); - } else { /* do nothing */ } - } else if (OB_FAIL(execute_ctas(ctx, stmt, common_rpc_proxy))){ // 查询建表的处理 - LOG_WARN("execute create table as select failed", K(ret)); + } else { + if (table_schema.is_external_table()) { + //auto refresh after create external table + OZ (ObAlterTableExecutor::update_external_file_list( + table_schema.get_tenant_id(), res.table_id_, + table_schema.get_external_file_location(), + table_schema.get_external_file_location_access_info(), + table_schema.get_external_file_pattern(), + ctx)); + } + } + } else { + if (table_schema.is_external_table()) { + ret = OB_NOT_SUPPORTED; + LOG_USER_ERROR(OB_NOT_SUPPORTED, "create external table as select"); + } else if (OB_FAIL(execute_ctas(ctx, stmt, common_rpc_proxy))){ // 查询建表的处理 + LOG_WARN("execute create table as select failed", K(ret)); + } } // only CTAS or create temperary table will make session_id != 0. If such table detected, set @@ -743,6 +768,311 @@ int ObAlterTableExecutor::alter_table_rpc_v2( return ret; } +int ObAlterTableExecutor::get_external_file_list(const ObString &location, + ObIArray &file_urls, + ObIArray &file_sizes, + const ObString &access_info, + ObIAllocator &allocator, + common::ObStorageType &storage_type) +{ + int ret = OB_SUCCESS; + ObExternalDataAccessDriver driver; + if (OB_FAIL(driver.init(location, access_info))) { + LOG_WARN("init external data access driver failed", K(ret)); + } else if (OB_FAIL(driver.get_file_list(location, file_urls, allocator))) { + LOG_WARN("get file urls failed", K(ret)); + } else if (OB_FAIL(driver.get_file_sizes(location, file_urls, file_sizes))) { + LOG_WARN("get file sizes failed", K(ret)); + } + if (driver.is_opened()) { + storage_type = driver.get_storage_type(); + driver.close(); + } + + LOG_DEBUG("show external table files", K(file_urls), K(storage_type), K(access_info)); + return ret; +} + +int ObAlterTableExecutor::filter_and_sort_external_files(const ObString &pattern, + ObExecContext &exec_ctx, + ObIArray &file_urls, + ObIArray &file_sizes) { + int ret = OB_SUCCESS; + const int64_t count = file_urls.count(); + ObSEArray tmp_file_sizes; + hash::ObHashMap file_map; + if (0 == count) { + /* do nothing */ + } else if (OB_UNLIKELY(count != file_sizes.count())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("array size error", K(ret)); + } else if (OB_FAIL(file_map.create(count, "ExtFileMap", "ExtFileMap"))) { + LOG_WARN("fail to init hashmap", K(ret)); + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < count; ++i) { + if (OB_FAIL(file_map.set_refactored(file_urls.at(i), file_sizes.at(i)))) { + LOG_WARN("failed to set refactored to file_map", K(ret)); + } + } + if (OB_SUCC(ret)) { + if (OB_FAIL(ObExternalTableUtils::filter_external_table_files(pattern, exec_ctx, file_urls))) { + LOG_WARN("failed to filter external table files"); + } + } + if (OB_SUCC(ret)) { + std::sort(file_urls.get_data(), file_urls.get_data() + file_urls.count()); + for (int64_t i = 0; OB_SUCC(ret) && i < file_urls.count(); ++i) { + int64_t file_size = 0; + if (OB_FAIL(file_map.get_refactored(file_urls.at(i), file_size))) { + if (OB_UNLIKELY(OB_HASH_NOT_EXIST == ret)) { + ret = OB_ERR_UNEXPECTED; + } + LOG_WARN("failed to get key meta", K(ret)); + } else if (OB_FAIL(tmp_file_sizes.push_back(file_size))) { + LOG_WARN("failed to push back into tmp_file_sizes", K(ret)); + } + } + } + if (OB_SUCC(ret)) { + if (OB_FAIL(file_sizes.assign(tmp_file_sizes))) { + LOG_WARN("failed to assign file_sizes", K(ret)); + } else if (OB_FAIL(file_map.destroy())) { + LOG_WARN("failed to destory file_map"); + } + } + } + LOG_TRACE("after filter external table files", K(ret), K(file_urls)); + return ret; +} + +int ObAlterTableExecutor::flush_external_file_cache( + const uint64_t tenant_id, + const uint64_t table_id, + const ObIArray &all_servers) +{ + int ret = OB_SUCCESS; + ObArenaAllocator allocator; + ObAsyncRpcTaskWaitContext context; + int64_t send_task_count = 0; + OZ (context.init()); + OZ (context.get_cb_list().reserve(all_servers.count())); + for (int64_t i = 0; OB_SUCC(ret) && i < all_servers.count(); i++) { + ObFlushExternalTableFileCacheReq req; + int64_t timeout = ObExternalTableFileManager::CACHE_EXPIRE_TIME; + req.tenant_id_ = tenant_id; + req.table_id_ = table_id; + req.partition_id_ = 0; + ObRpcAsyncFlushExternalTableKVCacheCallBack* async_cb = nullptr; + if (OB_ISNULL(async_cb = OB_NEWx(ObRpcAsyncFlushExternalTableKVCacheCallBack, (&allocator), (&context)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to allocate async cb memory", K(ret)); + } + OZ (context.get_cb_list().push_back(async_cb)); + OZ (GCTX.external_table_proxy_->to(all_servers.at(i)) + .by(tenant_id) + .timeout(timeout) + .flush_file_kvcahce(req, async_cb)); + if (OB_SUCC(ret)) { + send_task_count++; + } + } + + context.set_task_count(send_task_count); + + do { + int temp_ret = context.wait_executing_tasks(); + if (OB_SUCCESS != temp_ret) { + LOG_WARN("fail to wait executing task", K(temp_ret)); + if (OB_SUCC(ret)) { + ret = temp_ret; + } + } + } while(0); + + for (int64_t i = 0; OB_SUCC(ret) && i < context.get_cb_list().count(); i++) { + ret = context.get_cb_list().at(i)->get_task_resp().rcode_.rcode_; + if (OB_FAIL(ret)) { + if (OB_TIMEOUT == ret) { + // flush timeout is OK, because the file cache has already expire + ret = OB_SUCCESS; + } else { + LOG_WARN("async flush kvcache process failed", K(ret)); + } + } + } + for (int64_t i = 0; i < context.get_cb_list().count(); i++) { + context.get_cb_list().at(i)->~ObRpcAsyncFlushExternalTableKVCacheCallBack(); + } + return ret; +} + +int ObAlterTableExecutor::collect_local_files_on_servers( + const uint64_t tenant_id, + const ObString &location, + ObIArray &all_servers, + ObIArray &file_urls, + ObIArray &file_sizes, + ObIAllocator &allocator) +{ + int ret = OB_SUCCESS; + ObSEArray target_servers; + ObArray server_ip_port; + + bool is_absolute_path = false; + const int64_t PREFIX_LEN = STRLEN(OB_FILE_PREFIX); + if (location.length() <= PREFIX_LEN) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid location", K(ret), K(location)); + } else { + is_absolute_path = ('/' == location.ptr()[PREFIX_LEN]); + } + + if (OB_SUCC(ret)) { + if (is_absolute_path) { + std::sort(all_servers.get_data(), all_servers.get_data() + all_servers.count(), + [](const ObAddr &l, const ObAddr &r) -> bool { return l < r; }); + ObAddr pre_addr; + for (int64_t i = 0; OB_SUCC(ret) && i < all_servers.count(); i++) { + ObAddr &cur_addr = all_servers.at(i); + if (!cur_addr.is_equal_except_port(pre_addr)) { + pre_addr = cur_addr; + OZ(target_servers.push_back(cur_addr)); + } + } + } else { + OZ (target_servers.assign(all_servers)); + } + } + + if (OB_SUCC(ret)) { + ObAsyncRpcTaskWaitContext context; + int64_t send_task_count = 0; + for (int64_t i = 0; OB_SUCC(ret) && i < target_servers.count(); i++) { + const int64_t ip_len = 64; + char *ip_port_buffer = nullptr; + if (OB_ISNULL(ip_port_buffer = (char*)(allocator.alloc(ip_len)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to allocate ip memory", K(ret)); + } + OZ (target_servers.at(i).ip_port_to_string(ip_port_buffer, ip_len)); + OZ (server_ip_port.push_back(ObString(ip_port_buffer))); + } + OZ (context.init()); + OZ (context.get_cb_list().reserve(target_servers.count())); + for (int64_t i = 0; OB_SUCC(ret) && i < target_servers.count(); i++) { + const int64_t timeout = 10 * 1000000L; //10s + ObRpcAsyncLoadExternalTableFileCallBack* async_cb = nullptr; + ObLoadExternalFileListReq req; + req.location_ = location; + + if (OB_ISNULL(async_cb = OB_NEWx(ObRpcAsyncLoadExternalTableFileCallBack, (&allocator), (&context)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to allocate async cb memory", K(ret)); + } + OZ (context.get_cb_list().push_back(async_cb)); + OZ (GCTX.external_table_proxy_->to(target_servers.at(i)) + .by(tenant_id) + .timeout(timeout) + .load_external_file_list(req, async_cb)); + if (OB_SUCC(ret)) { + send_task_count++; + } + } + + context.set_task_count(send_task_count); + + do { + int temp_ret = context.wait_executing_tasks(); + if (OB_SUCCESS != temp_ret) { + LOG_WARN("fail to wait executing task", K(temp_ret)); + if (OB_SUCC(ret)) { + ret = temp_ret; + } + } + } while(0); + + for (int64_t i = 0; OB_SUCC(ret) && i < context.get_cb_list().count(); i++) { + if (OB_FAIL(context.get_cb_list().at(i)->get_task_resp().rcode_.rcode_)) { + LOG_WARN("async load files process failed", K(ret)); + } else { + const ObIArray &resp_array = context.get_cb_list().at(i)->get_task_resp().file_urls_; + OZ (append(file_sizes, context.get_cb_list().at(i)->get_task_resp().file_sizes_)); + for (int64_t j = 0; OB_SUCC(ret) && j < resp_array.count(); j++) { + ObSqlString tmp_file_url; + ObString file_url; + OZ (tmp_file_url.append(server_ip_port.at(i))); + OZ (tmp_file_url.append("%")); + OZ (tmp_file_url.append(resp_array.at(j))); + OZ (ob_write_string(allocator, tmp_file_url.string(), file_url)); + OZ (file_urls.push_back(file_url)); + } + } + LOG_DEBUG("get external table file", K(context.get_cb_list().at(i)->get_task_resp().file_urls_)); + } + + for (int64_t i = 0; i < context.get_cb_list().count(); i++) { + context.get_cb_list().at(i)->~ObRpcAsyncLoadExternalTableFileCallBack(); + } + } + LOG_DEBUG("update external table file list", K(ret), K(file_urls)); + return ret; +} + +int ObAlterTableExecutor::update_external_file_list( + const uint64_t tenant_id, + const uint64_t table_id, + const ObString &location, + const ObString &access_info, + const ObString &pattern, + ObExecContext &exec_ctx) +{ + int ret = OB_SUCCESS; + ObSEArray file_urls; + ObSEArray file_sizes; + ObArenaAllocator allocator; + ObSEArray all_servers; + OZ (GCTX.location_service_->external_table_get(tenant_id, table_id, all_servers)); + + if (ObSQLUtils::is_external_files_on_local_disk(location)) { + OZ (collect_local_files_on_servers(tenant_id, location, all_servers, file_urls, file_sizes, allocator)); + } else { + OZ (ObExternalTableFileManager::get_instance().get_external_file_list_on_device( + location, file_urls, file_sizes, access_info, allocator)); + } + + OZ (filter_and_sort_external_files(pattern, exec_ctx, file_urls, file_sizes)); + + //TODO [External Table] opt performance + OZ (ObExternalTableFileManager::get_instance().update_inner_table_file_list(tenant_id, table_id, file_urls, file_sizes)); + + OZ (flush_external_file_cache(tenant_id, table_id, all_servers)); + return ret; +} + +int ObAlterTableExecutor::execute_alter_external_table(ObExecContext &ctx, ObAlterTableStmt &stmt) +{ + int ret = OB_SUCCESS; + obrpc::ObAlterTableArg &arg = stmt.get_alter_table_arg(); + int64_t option = stmt.get_alter_external_table_type(); + switch (option) { + case T_ALTER_REFRESH_EXTERNAL_TABLE: { + OZ (update_external_file_list(stmt.get_tenant_id(), + arg.alter_table_schema_.get_table_id(), + arg.alter_table_schema_.get_external_file_location(), + arg.alter_table_schema_.get_external_file_location_access_info(), + arg.alter_table_schema_.get_external_file_pattern(), + ctx)); + break; + } + default: { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected option", K(ret), K(option)); + } + + } + return ret; +} + int ObAlterTableExecutor::execute(ObExecContext &ctx, ObAlterTableStmt &stmt) { int ret = OB_SUCCESS; @@ -764,6 +1094,8 @@ int ObAlterTableExecutor::execute(ObExecContext &ctx, ObAlterTableStmt &stmt) stmt.get_tg_arg().ddl_stmt_str_ = first_stmt; OZ (common_rpc_proxy->alter_trigger(stmt.get_tg_arg()), common_rpc_proxy->get_server()); } + } else if (alter_table_arg.alter_table_schema_.is_external_table()) { + OZ (execute_alter_external_table(ctx, stmt)); } else { ObSQLSessionInfo *my_session = NULL; obrpc::ObAlterTableRes res; @@ -1626,6 +1958,8 @@ int ObDropTableExecutor::execute(ObExecContext &ctx, ObDropTableStmt &stmt) LOG_WARN("rpc proxy drop table failed", K(ret), "dst", common_rpc_proxy->get_server()); } else if (res.is_valid() && OB_FAIL(ObDDLExecutorUtil::wait_ddl_retry_task_finish(res.tenant_id_, res.task_id_, *my_session, common_rpc_proxy, affected_rows))) { LOG_WARN("wait ddl finish failed", K(ret), K(res.tenant_id_), K(res.task_id_)); + } else { + //do nothing } } return ret; diff --git a/src/sql/engine/cmd/ob_table_executor.h b/src/sql/engine/cmd/ob_table_executor.h index 2741bd3ac..e026be885 100644 --- a/src/sql/engine/cmd/ob_table_executor.h +++ b/src/sql/engine/cmd/ob_table_executor.h @@ -77,13 +77,31 @@ public: ObAlterTableExecutor(); virtual ~ObAlterTableExecutor(); int execute(ObExecContext &ctx, ObAlterTableStmt &stmt); + + static int update_external_file_list( + const uint64_t tenant_id, + const uint64_t table_id, + const common::ObString &location, + const common::ObString &access_info, + const common::ObString &pattern, + ObExecContext &ctx); + static int collect_local_files_on_servers( + const uint64_t tenant_id, + const common::ObString &location, + common::ObIArray &all_servers, + common::ObIArray &file_urls, + common::ObIArray &file_sizes, + common::ObIAllocator &allocator); + static int flush_external_file_cache( + const uint64_t tenant_id, + const uint64_t table_id, + const common::ObIArray &all_servers); private: static const int64_t TIME_INTERVAL_PER_PART_US = 50 * 1000; // 50ms static const int64_t MAX_WAIT_CHECK_SCHEMA_VERSION_INTERVAL_US = 120LL * 1000000LL; // 120s static const int64_t MIN_WAIT_CHECK_SCHEMA_VERSION_INTERVAL_US = 20LL * 1000000LL; // 20s static const int64_t WAIT_US = 500 * 1000; // 500ms static const int64_t GET_ASSOCIATED_SNAPSHOT_TIMEOUT = 9000000LL; // 9s - int check_constraint_validity(ObExecContext &ctx, obrpc::ObAlterTableArg &alter_table_arg, common::ObIAllocator &allocator, @@ -158,6 +176,18 @@ private: int set_index_arg_list(ObExecContext &ctx, ObAlterTableStmt &stmt); int refresh_schema_for_table(const uint64_t tenant_id); + int execute_alter_external_table(ObExecContext &ctx, ObAlterTableStmt &stmt); + static int get_external_file_list( + const ObString &location, + common::ObIArray &file_urls, + common::ObIArray &file_sizes, + const common::ObString &access_info, + common::ObIAllocator &allocator, + common::ObStorageType &storage_type); + static int filter_and_sort_external_files(const ObString &pattern, + ObExecContext &exec_ctx, + ObIArray &file_urls, + ObIArray &file_sizes); private: //DISALLOW_COPY_AND_ASSIGN(ObAlterTableExecutor); }; diff --git a/src/sql/engine/px/ob_dfo.cpp b/src/sql/engine/px/ob_dfo.cpp index 8c7c810ed..b519db7eb 100644 --- a/src/sql/engine/px/ob_dfo.cpp +++ b/src/sql/engine/px/ob_dfo.cpp @@ -15,6 +15,7 @@ #include "sql/engine/px/ob_px_sqc_handler.h" #include "sql/engine/px/ob_px_util.h" #include "sql/engine/px/ob_px_sqc_handler.h" +#include "share/external_table/ob_external_table_file_mgr.h" using namespace oceanbase::common; using namespace oceanbase::sql; @@ -50,7 +51,8 @@ OB_SERIALIZE_MEMBER(ObPxSqcMeta, temp_table_ctx_, access_table_location_keys_, adjoining_root_dfo_, - is_single_tsc_leaf_dfo_); + is_single_tsc_leaf_dfo_, + access_external_table_files_); OB_SERIALIZE_MEMBER(ObPxTask, qc_id_, dfo_id_, @@ -137,6 +139,18 @@ int ObPxSqcMeta::assign(const ObPxSqcMeta &other) adjoining_root_dfo_ = other.adjoining_root_dfo_; is_single_tsc_leaf_dfo_ = other.is_single_tsc_leaf_dfo_; } + access_external_table_files_.reuse(); + for (int i = 0; OB_SUCC(ret) && i < other.access_external_table_files_.count(); i++) { + const ObExternalFileInfo &other_file = other.access_external_table_files_.at(i); + ObExternalFileInfo temp_file; + temp_file.file_id_ = other_file.file_id_; + temp_file.file_addr_ = other_file.file_addr_; + if (OB_FAIL(ob_write_string(allocator_, other_file.file_url_, temp_file.file_url_))) { + LOG_WARN("fail to write string", K(ret)); + } else if (OB_FAIL(access_external_table_files_.push_back(temp_file))) { + LOG_WARN("fail to push back", K(ret)); + } + } return ret; } diff --git a/src/sql/engine/px/ob_dfo.h b/src/sql/engine/px/ob_dfo.h index fbdb1299a..73a653c44 100644 --- a/src/sql/engine/px/ob_dfo.h +++ b/src/sql/engine/px/ob_dfo.h @@ -32,6 +32,8 @@ #include "sql/engine/px/ob_px_bloom_filter.h" #include "sql/engine/ob_exec_feedback_info.h" #include "sql/das/ob_das_define.h" +#include "lib/string/ob_strings.h" +#include "share/external_table/ob_external_table_file_mgr.h" namespace oceanbase { namespace sql @@ -161,7 +163,9 @@ public: access_table_location_indexes_(), server_not_alive_(false), adjoining_root_dfo_(false), - is_single_tsc_leaf_dfo_(false) + is_single_tsc_leaf_dfo_(false), + allocator_("PxSqcMetaInner"), + access_external_table_files_() {} ~ObPxSqcMeta() = default; int assign(const ObPxSqcMeta &other); @@ -175,6 +179,7 @@ public: const dtl::ObDtlChannelInfo &get_sqc_channel_info_const() const { return sqc_ch_info_; } ObIArray &get_access_table_location_keys() { return access_table_location_keys_; } ObIArray &get_access_table_location_indexes() { return access_table_location_indexes_; } + ObIArray &get_access_external_table_files() { return access_external_table_files_; } DASTabletLocIArray &get_access_table_locations_for_update() { return access_table_locations_; } const DASTabletLocIArray &get_access_table_locations() const { return access_table_locations_; } void set_execution_id(uint64_t execution_id) { execution_id_ = execution_id; } @@ -242,6 +247,8 @@ public: serial_receive_channels_.reset(); rescan_batch_params_.reset(); partition_pruning_table_locations_.reset(); + access_external_table_files_.reset(); + allocator_.reset(); } // SQC 端收到 InitSQC 消息后通过 data_channel 信息是否为空 // 来判断 data channel 是否已经预分配好,是否要走轻量调度 @@ -333,6 +340,8 @@ private: bool adjoining_root_dfo_; //for auto scale bool is_single_tsc_leaf_dfo_; + ObArenaAllocator allocator_; + ObSEArray access_external_table_files_; }; class ObDfo @@ -386,7 +395,8 @@ public: use_filter_ch_map_(), total_task_cnt_(0), pkey_table_loc_id_(0), - tsc_op_cnt_(0) + tsc_op_cnt_(0), + external_table_files_() { } @@ -555,6 +565,7 @@ public: void inc_tsc_op_cnt() { tsc_op_cnt_++; } bool is_leaf_dfo() { return child_dfos_.empty(); } bool is_single_tsc_leaf_dfo() { return is_leaf_dfo() && 1 == tsc_op_cnt_; } + common::ObIArray &get_external_table_files() { return external_table_files_; } TO_STRING_KV(K_(execution_id), K_(dfo_id), K_(is_active), @@ -648,6 +659,7 @@ private: int64_t total_task_cnt_; // the task total count of dfo start worker int64_t pkey_table_loc_id_; // record pkey table loc id for child dfo int64_t tsc_op_cnt_; + common::ObArray external_table_files_; }; diff --git a/src/sql/engine/px/ob_granule_pump.cpp b/src/sql/engine/px/ob_granule_pump.cpp index 273508a8d..597c41324 100644 --- a/src/sql/engine/px/ob_granule_pump.cpp +++ b/src/sql/engine/px/ob_granule_pump.cpp @@ -739,28 +739,44 @@ int ObGranuleSplitter::split_gi_task(ObGranulePumpArgs &args, } else if (ranges.count() <= 0) { ret = OB_ERR_UNEXPECTED; LOG_WARN("the task has an empty range", K(ret), K(ranges)); - } else if (OB_FAIL(ObGranuleUtil::split_block_ranges(args.ctx_->get_allocator(), - tsc, - ranges, - tablets, - args.parallelism_, - args.tablet_size_, - partition_granule, - taskset_tablets, - taskset_ranges, - taskset_idxs, - range_independent))) { - LOG_WARN("failed to get graunle task", K(ret), K(ranges), K(tablets)); - } else if (OB_FAIL(task_set.construct_taskset(taskset_tablets, - taskset_ranges, - ss_ranges, - taskset_idxs, - random_type))) { - LOG_WARN("construct taskset failed", K(ret), K(taskset_tablets), - K(taskset_ranges), - K(ss_ranges), - K(taskset_idxs), - K(random_type)); + } else { + bool is_external_table = tsc->tsc_ctdef_.scan_ctdef_.is_external_table_; + if (is_external_table) { + ret = ObGranuleUtil::split_granule_for_external_table(args.ctx_->get_allocator(), + tsc, + ranges, + tablets, + args.external_table_files_, + args.parallelism_, + taskset_tablets, + taskset_ranges, + taskset_idxs); + } else { + ret = ObGranuleUtil::split_block_ranges(args.ctx_->get_allocator(), + tsc, + ranges, + tablets, + args.parallelism_, + args.tablet_size_, + partition_granule, + taskset_tablets, + taskset_ranges, + taskset_idxs, + range_independent); + } + if (OB_FAIL(ret)) { + LOG_WARN("failed to get graunle task", K(ret), K(ranges), K(tablets), K(is_external_table)); + } else if (OB_FAIL(task_set.construct_taskset(taskset_tablets, + taskset_ranges, + ss_ranges, + taskset_idxs, + random_type))) { + LOG_WARN("construct taskset failed", K(ret), K(taskset_tablets), + K(taskset_ranges), + K(ss_ranges), + K(taskset_idxs), + K(random_type)); + } } return ret; } @@ -1444,6 +1460,7 @@ int ObGranulePump::init_pump_args_inner(ObExecContext *ctx, ObIArray &scan_ops, const common::ObIArray &tablet_arrays, common::ObIArray &partitions_info, + common::ObIArray &external_table_files, const ObTableModifySpec* modify_op, int64_t parallelism, int64_t tablet_size, @@ -1463,14 +1480,14 @@ int ObGranulePump::init_pump_args_inner(ObExecContext *ctx, LOG_WARN("args is unexpected", K(ret)); } else { if (OB_FAIL(init_arg(pump_args_.at(0), ctx, scan_ops, tablet_arrays, partitions_info, - modify_op, parallelism, tablet_size, gi_attri_flag))) { + external_table_files, modify_op, parallelism, tablet_size, gi_attri_flag))) { LOG_WARN("fail to init arg", K(ret)); } else if (OB_FAIL(add_new_gi_task(pump_args_.at(0)))) { LOG_WARN("fail to add new gi task", K(ret)); } } } else if (OB_FAIL(init_arg(new_arg, ctx, scan_ops, tablet_arrays, partitions_info, - modify_op, parallelism, tablet_size, gi_attri_flag))) { + external_table_files, modify_op, parallelism, tablet_size, gi_attri_flag))) { LOG_WARN("fail to init arg", K(ret)); } else if (OB_FAIL(pump_args_.push_back(new_arg))) { LOG_WARN("fail to push back new arg", K(ret)); @@ -1485,13 +1502,14 @@ int ObGranulePump::init_pump_args(ObExecContext *ctx, ObIArray &scan_ops, const common::ObIArray &tablet_arrays, common::ObIArray &partitions_info, + common::ObIArray &external_table_files, const ObTableModifySpec* modify_op, int64_t parallelism, int64_t tablet_size, uint64_t gi_attri_flag) { return init_pump_args_inner(ctx, scan_ops, tablet_arrays, partitions_info, - modify_op, parallelism, + external_table_files, modify_op, parallelism, tablet_size, gi_attri_flag); } @@ -1501,6 +1519,7 @@ int ObGranulePump::init_arg( ObIArray &scan_ops, const common::ObIArray &tablet_arrays, common::ObIArray &partitions_info, + const common::ObIArray &external_table_files, const ObTableModifySpec* modify_op, int64_t parallelism, int64_t tablet_size, @@ -1518,6 +1537,9 @@ int ObGranulePump::init_arg( for (int i = 0; OB_SUCC(ret) && i < partitions_info.count(); ++i) { OZ(arg.partitions_info_.push_back(partitions_info.at(i))); } + + OZ(arg.external_table_files_.assign(external_table_files)); + if (OB_SUCC(ret)) { arg.ctx_ = ctx; arg.op_info_.init_modify_op(modify_op); diff --git a/src/sql/engine/px/ob_granule_pump.h b/src/sql/engine/px/ob_granule_pump.h index 5fe942687..8ffca98f0 100644 --- a/src/sql/engine/px/ob_granule_pump.h +++ b/src/sql/engine/px/ob_granule_pump.h @@ -25,6 +25,9 @@ namespace oceanbase { +namespace share { + struct ObExternalFileInfo; +} namespace sql { @@ -79,6 +82,7 @@ public : op_info_.reset(); tablet_arrays_.reset(); run_time_pruning_flags_.reset(); + external_table_files_.reset(); } @@ -93,6 +97,7 @@ public : PruningStatus pruning_status_; //-----end common::ObArray partitions_info_; + common::ObArray external_table_files_; int64_t parallelism_; int64_t tablet_size_; uint64_t gi_attri_flag_; @@ -484,6 +489,7 @@ public: ObIArray &scan_ops, const common::ObIArray &tablet_arrays, common::ObIArray &partitions_info, + common::ObIArray &external_table_files, const ObTableModifySpec* modify_op, int64_t parallelism, int64_t tablet_size, @@ -493,6 +499,7 @@ public: ObIArray &scan_ops, const common::ObIArray &tablet_arrays, common::ObIArray &partitions_info, + common::ObIArray &external_table_files, const ObTableModifySpec* modify_op, int64_t parallelism, int64_t tablet_size, @@ -556,6 +563,7 @@ private: ObIArray &scan_ops, const common::ObIArray &tablet_arrays, common::ObIArray &partitions_info, + const common::ObIArray &external_table_files, const ObTableModifySpec* modify_op, int64_t parallelism, int64_t tablet_size, diff --git a/src/sql/engine/px/ob_granule_util.cpp b/src/sql/engine/px/ob_granule_util.cpp index 7f3662dc8..20a31c892 100644 --- a/src/sql/engine/px/ob_granule_util.cpp +++ b/src/sql/engine/px/ob_granule_util.cpp @@ -24,8 +24,12 @@ #include "storage/tx_storage/ob_access_service.h" #include "share/schema/ob_table_param.h" #include "sql/engine/ob_engine_op_traits.h" +#include "share/external_table/ob_external_table_file_mgr.h" +#include "share/external_table/ob_external_table_utils.h" +#include "sql/engine/table/ob_external_table_access_service.h" using namespace oceanbase::common; +using namespace oceanbase::share; namespace oceanbase { namespace sql @@ -70,6 +74,64 @@ bool ObGranuleUtil::is_partition_granule(int64_t partition_count, return partition_granule; } +int ObGranuleUtil::split_granule_for_external_table(ObIAllocator &allocator, + const ObTableScanSpec *tsc, + const ObIArray &ranges, + const ObIArray &tablets, + const ObIArray &external_table_files, + int64_t parallelism, + ObIArray &granule_tablets, + ObIArray &granule_ranges, + ObIArray &granule_idx) +{ + UNUSED(parallelism); + UNUSED(tsc); + int ret = OB_SUCCESS; + if (ranges.count() < 1 || tablets.count() < 1 || OB_ISNULL(tsc)) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("the invalid argument", K(ret), K(ranges.count()), K(tablets.count())); + } else if (external_table_files.count() == 1 && + external_table_files.at(0).file_id_ == INT64_MAX) { + // dealing dummy file + ObNewRange new_range; + if (OB_FAIL(ObExternalTableUtils::convert_external_table_empty_range( + external_table_files.at(0).file_url_, + external_table_files.at(0).file_id_, + tsc->get_ref_table_id(), + allocator, + new_range))) { + LOG_WARN("failed to convert external table empty range", K(ret)); + } else if (OB_FAIL(granule_ranges.push_back(new_range)) || + OB_FAIL(granule_idx.push_back(external_table_files.at(0).file_id_)) || + OB_FAIL(granule_tablets.push_back(tablets.at(0)))) { + LOG_WARN("fail to push back", K(ret)); + } + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < ranges.count(); ++i) { + for (int64_t j = 0; OB_SUCC(ret) && j < external_table_files.count(); ++j) { + ObNewRange new_range; + bool is_valid = false; + if (OB_FAIL(ObExternalTableUtils::convert_external_table_new_range( + external_table_files.at(j).file_url_, + external_table_files.at(j).file_id_, + tsc->get_ref_table_id(), + ranges.at(i), + allocator, + new_range, + is_valid))) { + LOG_WARN("failed to convert external table new range", K(ret)); + } else if (is_valid && (OB_FAIL(granule_ranges.push_back(new_range)) || + OB_FAIL(granule_idx.push_back(external_table_files.at(j).file_id_)) || + OB_FAIL(granule_tablets.push_back(tablets.at(0))))) { + LOG_WARN("fail to push back", K(ret)); + } + } + } + } + LOG_DEBUG("check external split ranges", K(ranges), K(granule_ranges), K(external_table_files)); + return ret; +} + int ObGranuleUtil::split_block_ranges(ObIAllocator &allocator, const ObTableScanSpec *tsc,//may be is null, attention use const ObIArray &in_ranges, @@ -167,13 +229,13 @@ int ObGranuleUtil::remove_empty_range(const common::ObIArray int ObGranuleUtil::split_block_granule(ObIAllocator &allocator, const ObTableScanSpec *tsc,//may be is null, attention use! - const ObIArray &input_ranges, + const ObIArray &input_ranges, const ObIArray &tablets, int64_t parallelism, int64_t tablet_size, - common::ObIArray &granule_tablets, - common::ObIArray &granule_ranges, - common::ObIArray &granule_idx, + ObIArray &granule_tablets, + ObIArray &granule_ranges, + ObIArray &granule_idx, bool range_independent) { // the step for split task by block granule method: diff --git a/src/sql/engine/px/ob_granule_util.h b/src/sql/engine/px/ob_granule_util.h index d0a006e10..469f8448d 100644 --- a/src/sql/engine/px/ob_granule_util.h +++ b/src/sql/engine/px/ob_granule_util.h @@ -22,6 +22,9 @@ namespace oceanbase { +namespace share { +struct ObExternalFileInfo; +} namespace common { class ObStoreRange; @@ -266,6 +269,18 @@ public: common::ObIArray &granule_ranges, common::ObIArray &granule_idx, bool range_independent); + + + static int split_granule_for_external_table(common::ObIAllocator &allocator, + const ObTableScanSpec *tsc, + const common::ObIArray &input_ranges, + const common::ObIArray &tablet_array, + const common::ObIArray &external_table_files, + int64_t parallelism, + common::ObIArray &granule_tablets, + common::ObIArray &granule_ranges, + common::ObIArray &granule_idx); + /** * get the total task count for all partitions * params IN the parameters for splitting diff --git a/src/sql/engine/px/ob_px_sub_coord.cpp b/src/sql/engine/px/ob_px_sub_coord.cpp index 4fa742ba4..650e9f59a 100644 --- a/src/sql/engine/px/ob_px_sub_coord.cpp +++ b/src/sql/engine/px/ob_px_sub_coord.cpp @@ -240,7 +240,8 @@ int ObPxSubCoord::setup_gi_op_input(ObExecContext &ctx, } else { ObGIOpInput *gi_input = static_cast(kit->input_); if (OB_FAIL(sqc_ctx.gi_pump_.init_pump_args(&ctx, scan_ops, tablets_array, - sqc_ctx.partitions_info_, dml_op, sqc.get_task_count(), + sqc_ctx.partitions_info_, sqc.get_access_external_table_files(), + dml_op, sqc.get_task_count(), gi_op->get_tablet_size(), gi_op->get_gi_flags()))) { LOG_WARN("fail to init pump args", K(ret)); } else { diff --git a/src/sql/engine/px/ob_px_util.cpp b/src/sql/engine/px/ob_px_util.cpp index 624d12812..9521d4611 100644 --- a/src/sql/engine/px/ob_px_util.cpp +++ b/src/sql/engine/px/ob_px_util.cpp @@ -30,7 +30,9 @@ #include "sql/session/ob_sql_session_info.h" #include "common/ob_smart_call.h" #include "storage/ob_locality_manager.h" +#include "share/external_table/ob_external_table_file_mgr.h" #include "rpc/obrpc/ob_net_keepalive.h" +#include "share/external_table/ob_external_table_utils.h" using namespace oceanbase::common; using namespace oceanbase::sql; @@ -90,6 +92,164 @@ int ObPXServerAddrUtil::build_dynamic_partition_table_location(common::ObIArray< return ret; } +int ObPXServerAddrUtil::sort_and_collect_local_file_distribution( + ObIArray &files, + ObIArray &dst_addrs) +{ + int ret = OB_SUCCESS; + ObAddr pre_addr; + if (OB_SUCC(ret)) { + auto addrcmp = [](const ObExternalFileInfo &l, const ObExternalFileInfo &r) -> bool { + return l.file_addr_ < r.file_addr_; + }; + std::sort(files.get_data(), files.get_data() + files.count(), addrcmp); + } + for (int64_t i = 0; OB_SUCC(ret) && i < files.count(); i++) { + ObAddr &cur_addr = files.at(i).file_addr_; + if (!cur_addr.is_equal_except_port(pre_addr)) { + pre_addr = cur_addr; + OZ (dst_addrs.push_back(files.at(i).file_addr_)); + } + } + return ret; +} + +int ObPXServerAddrUtil::get_external_table_loc( + ObExecContext &ctx, + uint64_t table_id, + uint64_t ref_table_id, + const ObQueryRange &pre_query_range, + ObDfo &dfo, + ObDASTableLoc *&table_loc) +{ + int ret = OB_SUCCESS; + ObDASTableLoc *local_loc = NULL; + uint64_t tenant_id = OB_INVALID_ID; + bool is_external_files_on_disk = false; + ObIArray &ext_file_urls = dfo.get_external_table_files(); + ObQueryRangeArray ranges; + if (OB_ISNULL(local_loc = DAS_CTX(ctx).get_table_loc_by_id(table_id, ref_table_id))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get table loc", K(ret), K(table_id), K(ref_table_id)); + } else if (OB_ISNULL(ctx.get_my_session())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("session is null", K(ret)); + } else { + tenant_id = ctx.get_my_session()->get_effective_tenant_id(); + is_external_files_on_disk = local_loc->loc_meta_->is_external_files_on_disk_; + } + if (OB_SUCC(ret) && ext_file_urls.empty()) { + // TODO EXTARNAL TABLE + // if (pre_query_range.has_exec_param() || 0 == pre_query_range.get_column_count()) { + // ret = OB_NOT_SUPPORTED; + // LOG_WARN("Has dynamic params in external table or empty range is not supported", K(ret), + // K(pre_query_range.has_exec_param()), K(pre_query_range.get_column_count())); + if (OB_FAIL(ObSQLUtils::extract_pre_query_range( + pre_query_range, ctx.get_allocator(), ctx, ranges, + ObBasicSessionInfo::create_dtc_params(ctx.get_my_session())))) { + LOG_WARN("failed to extract external file fiter", K(ret)); + } else if (OB_FAIL(ObExternalTableFileManager::get_instance().get_external_files( + tenant_id, ref_table_id, is_external_files_on_disk, + ctx.get_allocator(), ext_file_urls, ranges.empty() ? NULL : &ranges))) { + LOG_WARN("fail to get external files", K(ret)); + } else if (ext_file_urls.empty()) { + const char* dummy_file_name = "#######DUMMY_FILE#######"; + ObExternalFileInfo dummy_file; + dummy_file.file_url_ = dummy_file_name; + dummy_file.file_id_ = INT64_MAX; + if (is_external_files_on_disk) { + dummy_file.file_addr_ = GCTX.self_addr(); + } + OZ (dfo.get_external_table_files().push_back(dummy_file)); + } + } + + if (OB_SUCC(ret) + && NULL == (table_loc = DAS_CTX(ctx).get_external_table_loc_by_id(table_id, ref_table_id))) { + //generate locations + ObSEArray target_locations; + if (is_external_files_on_disk) { + // locations are the collection of file's ip + if (OB_FAIL(sort_and_collect_local_file_distribution(dfo.get_external_table_files(), + target_locations))) { + LOG_WARN("fail to collect local file distribution", K(ret)); + } + for (int i = 0; OB_SUCC(ret) && i < target_locations.count(); ++i) { + if (OB_UNLIKELY(ObPxCheckAlive::is_in_blacklist( + target_locations.at(i), ctx.get_my_session()->get_process_query_time()))) { + ret = OB_SERVER_NOT_ALIVE; + LOG_WARN("observer is not alive", K(target_locations.at(i))); + } + } + } else { + ObSEArray all_locations; + int64_t expected_location_cnt = std::min(dfo.get_dop(), dfo.get_external_table_files().count()); + if (OB_FAIL(GCTX.location_service_->external_table_get(tenant_id, ref_table_id, all_locations))) { + LOG_WARN("fail to get external table location", K(ret)); + } else if (expected_location_cnt >= all_locations.count() ? + OB_FAIL(target_locations.assign(all_locations)) + : OB_FAIL(ObPXServerAddrUtil::do_random_dfo_distribution(all_locations, + expected_location_cnt, + target_locations))) + LOG_WARN("fail to calc random dfo distribution", K(ret), K(all_locations), K(expected_location_cnt)); + } + LOG_TRACE("calc external table location", K(target_locations)); + if (OB_SUCC(ret)) { + if (OB_FAIL(DAS_CTX(ctx).build_external_table_location(table_id, ref_table_id, target_locations))) { + LOG_WARN("fail to build external table locations", K(ret)); + } else if (OB_ISNULL(table_loc = DAS_CTX(ctx).get_external_table_loc_by_id(table_id, ref_table_id))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected location", K(ret)); + } + } + } + return ret; +} + +int ObPXServerAddrUtil::assign_external_files_to_sqc( + const ObIArray &files, + bool is_file_on_disk, + ObIArray &sqcs) +{ + int ret = OB_SUCCESS; + if (is_file_on_disk) { + ObAddr pre_addr; + ObPxSqcMeta *target_sqc = NULL; + for (int i = 0; OB_SUCC(ret) && i < files.count(); ++i) { + if (pre_addr != files.at(i).file_addr_) { + // TODO [External Table] OPT this + for (int j = 0; j < sqcs.count(); j++) { + if (sqcs.at(j)->get_exec_addr() == files.at(i).file_addr_) { + target_sqc = sqcs.at(j); + break; + } + } + pre_addr = files.at(i).file_addr_; + } + if (OB_ISNULL(target_sqc)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to find sqc", K(files.at(i).file_addr_)); + } else if (OB_FAIL(target_sqc->get_access_external_table_files().push_back(files.at(i)))) { + LOG_WARN("fail to push back", K(ret)); + } + } + } else { + const int64_t file_count = files.count(); + int64_t files_per_sqc = (file_count - 1) / sqcs.count() + 1; + + for (int64_t i = 0; OB_SUCC(ret) && i < sqcs.count(); ++i) { + for (int j = i * files_per_sqc; OB_SUCC(ret) && j < std::min((i + 1) * files_per_sqc, file_count); j++) { + OZ (sqcs.at(i)->get_access_external_table_files().push_back(files.at(j))); + } + } + } + LOG_TRACE("check dfo external files", K(files)); + for (int64_t i = 0; i < sqcs.count(); ++i) { + LOG_TRACE("check sqc external files", K(sqcs.at(i)->get_access_external_table_files())); + } + return ret; +} + int ObPXServerAddrUtil::alloc_by_data_distribution_inner( const ObIArray *table_locations, ObExecContext &ctx, @@ -153,6 +313,10 @@ int ObPXServerAddrUtil::alloc_by_data_distribution_inner( ref_table_id, table_loc)); } else { + if (OB_NOT_NULL(scan_op) && scan_op->is_external_table_) { + // create new table loc for a random dfo distribution for external table + OZ (get_external_table_loc(ctx, table_location_key, ref_table_id, scan_op->get_query_range(), dfo, table_loc)); + } else // 通过TSC或者DML获得当前的DFO的partition对应的location信息 // 后续利用location信息构建对应的SQC meta if (OB_ISNULL(table_loc = DAS_CTX(ctx).get_table_loc_by_id(table_location_key, ref_table_id))) { @@ -326,6 +490,13 @@ int ObPXServerAddrUtil::build_dfo_sqc(ObExecContext &ctx, sqcs.at(i)->set_total_task_count(total_task_count); sqcs.at(i)->set_total_part_count(total_part_cnt); } + if (OB_SUCC(ret) && !locations.empty() + && (*locations.begin())->loc_meta_->is_external_table_) { + if (OB_FAIL(assign_external_files_to_sqc(dfo.get_external_table_files(), + (*locations.begin())->loc_meta_->is_external_files_on_disk_, sqcs))) { + LOG_WARN("fail to assign external files to sqc", K(ret)); + } + } } return ret; } @@ -733,7 +904,7 @@ int ObPXServerAddrUtil::set_dfo_accessed_location(ObExecContext &ctx, // 处理tsc对应的partition location信息 for (int64_t i = 0; OB_SUCC(ret) && i < scan_ops.count(); ++i) { - const ObDASTableLoc *table_loc = nullptr; + ObDASTableLoc *table_loc = nullptr; const ObTableScanSpec *scan_op = nullptr; uint64_t table_location_key = common::OB_INVALID_ID; uint64_t ref_table_id = common::OB_INVALID_ID; @@ -746,6 +917,9 @@ int ObPXServerAddrUtil::set_dfo_accessed_location(ObExecContext &ctx, } else if (OB_ISNULL(table_loc = DAS_CTX(ctx).get_table_loc_by_id(table_location_key, ref_table_id))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("failed to get phy table location", K(ret)); + } else if (scan_op->is_external_table_ + && OB_FAIL(get_external_table_loc(ctx, table_location_key, ref_table_id, scan_op->get_query_range(), dfo, table_loc))) { + LOG_WARN("fail to get external table loc", K(ret)); } else if (OB_FAIL(set_sqcs_accessed_location(ctx, // dml op has already set sqc.get_location information, // table scan does not need to be set again @@ -775,6 +949,12 @@ int ObPXServerAddrUtil::set_sqcs_accessed_location(ObExecContext &ctx, LOG_WARN("unexpected null table_loc or phy_op", K(phy_op), K(table_loc)); } else if (OB_FAIL(dfo.get_sqcs(sqcs))) { LOG_WARN("fail to get sqcs", K(ret)); + } else if (table_loc->loc_meta_->is_external_table_) { + //just copy locations, do not need reorder + OZ (temp_locations.reserve(locations.size())); + for (auto iter = locations.begin(); iter != locations.end() && OB_SUCC(ret); ++iter) { + OZ (temp_locations.push_back(*iter)); + } } else { int64_t table_location_key = table_loc->get_table_location_key(); bool asc_order = true; @@ -3551,4 +3731,4 @@ bool ObPxCheckAlive::is_in_blacklist(const common::ObAddr &addr, int64_t server_ LOG_WARN("server in blacklist", K(addr), K(server_start_time), K(alive_data.start_service_time_)); } return in_blacklist; -} \ No newline at end of file +} diff --git a/src/sql/engine/px/ob_px_util.h b/src/sql/engine/px/ob_px_util.h index 224f85e44..f3ec5fa08 100644 --- a/src/sql/engine/px/ob_px_util.h +++ b/src/sql/engine/px/ob_px_util.h @@ -156,6 +156,14 @@ public: ObTabletIdxMap &idx_map); static int find_dml_ops(common::ObIArray &insert_ops, const ObOpSpec &op); + static int get_external_table_loc( + ObExecContext &ctx, + uint64_t table_id, + uint64_t ref_table_id, + const ObQueryRange &pre_query_range, + ObDfo &dfo, + ObDASTableLoc *&table_loc); + private: static int find_dml_ops_inner(common::ObIArray &insert_ops, const ObOpSpec &op); @@ -234,6 +242,11 @@ private: static int do_random_dfo_distribution(const common::ObIArray &src_addrs, int64_t dst_addrs_count, common::ObIArray &dst_addrs); + static int sort_and_collect_local_file_distribution(common::ObIArray &files, + common::ObIArray &dst_addrs); + static int assign_external_files_to_sqc(const common::ObIArray &files, + bool is_file_on_disk, + common::ObIArray &sqcs); DISALLOW_COPY_AND_ASSIGN(ObPXServerAddrUtil); }; diff --git a/src/sql/engine/table/ob_external_table_access_service.cpp b/src/sql/engine/table/ob_external_table_access_service.cpp new file mode 100644 index 000000000..da72b69dc --- /dev/null +++ b/src/sql/engine/table/ob_external_table_access_service.cpp @@ -0,0 +1,765 @@ +// Copyright 2014 Alibaba Inc. All Rights Reserved. +// Author: +// + +#define USING_LOG_PREFIX SQL +#include "ob_external_table_access_service.h" + +#include "sql/resolver/ob_resolver_utils.h" +#include "sql/engine/expr/ob_expr.h" +#include "sql/engine/expr/ob_expr_column_conv.h" +#include "sql/engine/basic/ob_pushdown_filter.h" +#include "share/backup/ob_backup_io_adapter.h" +#include "share/external_table/ob_external_table_utils.h" +#include "share/ob_device_manager.h" +#include "lib/utility/ob_macro_utils.h" + +namespace oceanbase +{ +using namespace share::schema; +using namespace common; +using namespace share; +namespace sql +{ + +ObExternalDataAccessDriver::~ObExternalDataAccessDriver() { + close(); + if (OB_NOT_NULL(device_handle_)) { + ObDeviceManager::get_instance().release_device(device_handle_); + } +} + +void ObExternalDataAccessDriver::close() +{ + if (OB_NOT_NULL(device_handle_) && fd_.is_valid()) { + device_handle_->close(fd_); + fd_.reset(); + } +} + +bool ObExternalDataAccessDriver::is_opened() +{ + return fd_.is_valid(); +} + +int ObExternalDataAccessDriver::get_file_sizes(const ObString &location, + const ObIArray &urls, + ObIArray &file_sizes) +{ + int ret = OB_SUCCESS; + file_sizes.reuse(); + ObString tmp_location(location.length(), location.ptr()); + for (int64_t i = 0; OB_SUCC(ret) && i < urls.count(); i++) { + int64_t len = 0; + ObSqlString path; + if (OB_FAIL(path.append(tmp_location.trim())) || + (*(path.ptr() + path.length() - 1) != '/' && OB_FAIL(path.append("/"))) || + OB_FAIL(path.append(urls.at(i)))) { + LOG_WARN("append string failed", K(ret)); + } else if (OB_FAIL(get_file_size(path.string(), len))) { + LOG_WARN("get file size failed", K(ret)); + } else if (OB_FAIL(file_sizes.push_back(len))) { + LOG_WARN("push back failed", K(ret)); + } + } + return ret; +} +int ObExternalDataAccessDriver::get_file_size(const ObString &url, int64_t &file_size) +{ + int ret = OB_SUCCESS; + + ObBackupIoAdapter util; + + if (OB_ISNULL(device_handle_)) { + ret = OB_NOT_INIT; + } else { + ObIODFileStat statbuf; + int temp_ret = device_handle_->stat(to_cstring(url), statbuf); + if (OB_SUCCESS != temp_ret) { + file_size = -1; + if (OB_BACKUP_FILE_NOT_EXIST == temp_ret) { + file_size = -1; + } else { + ret = temp_ret; + } + LOG_WARN("fail to get file length", K(temp_ret), K(url)); + } else { + file_size = statbuf.size_; + } + } + return ret; +} + +int ObExternalDataAccessDriver::open(const ObString &url) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(device_handle_)) { + ret = OB_NOT_INIT; + } else { + ret = device_handle_->open(url.ptr(), -1, 0, fd_, &iod_opts_); + } + return ret; +} + +int ObExternalDataAccessDriver::pread(void *buf, const int64_t count, const int64_t offset, int64_t &read_size) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(device_handle_)) { + ret = OB_NOT_INIT; + } else { + ret = device_handle_->pread(fd_, offset, count, buf, read_size); + } + return ret; +} + +int ObExternalDataAccessDriver::get_file_list(const ObString &path, + ObIArray &file_urls, + ObIAllocator &allocator) +{ + int ret = OB_SUCCESS; + const int64_t MAX_VISIT_COUNT = 100000; + ObArray file_dirs; + if (OB_ISNULL(device_handle_)) { + ret = OB_NOT_INIT; + LOG_WARN("ObExternalDataAccessDriver not init", K(ret)); + } else if (get_storage_type() == OB_STORAGE_OSS + || get_storage_type() == OB_STORAGE_COS) { + ObSEArray temp_file_urls; + ObFileListArrayOp file_op(temp_file_urls, allocator); + if (OB_FAIL(device_handle_->scan_dir(to_cstring(path), file_op))) { + LOG_WARN("scan dir failed", K(ret)); + } + for (int64_t i = 0; OB_SUCC(ret) && i < temp_file_urls.count(); i++) { + if (temp_file_urls.at(i).length() <= 0) { + //do nothing + } else if ( '/' == *(temp_file_urls.at(i).ptr() + temp_file_urls.at(i).length() - 1)) { + //is direcotry + } else { + OZ (file_urls.push_back(temp_file_urls.at(i))); + } + } + LOG_DEBUG("show oss files", K(file_urls), K(file_dirs)); + } else if (get_storage_type() == OB_STORAGE_FILE) { + OZ (file_dirs.push_back(path)); + for (int64_t i = 0; OB_SUCC(ret) && i < file_dirs.count(); i++) { + ObFullPathArrayOp dir_op(file_dirs, file_dirs.at(i), allocator); + ObFullPathArrayOp file_op(file_urls, file_dirs.at(i), allocator); + dir_op.set_dir_flag(); + if (file_dirs.at(i).case_compare(".") == 0 + || file_dirs.at(i).case_compare("..") == 0) { + //do nothing + } else if (OB_FAIL(device_handle_->scan_dir(to_cstring(file_dirs.at(i)), file_op))) { + LOG_WARN("scan dir failed", K(ret)); + } else if (OB_FAIL(device_handle_->scan_dir(to_cstring(file_dirs.at(i)), dir_op))) { + LOG_WARN("scan dir failed", K(ret)); + } else if (file_dirs.count() + file_urls.count() > MAX_VISIT_COUNT) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("too many files and dirs to visit", K(ret)); + } + } + for (int64_t i = 0; OB_SUCC(ret) && i < file_urls.count(); i++) { + if (file_urls.at(i).length() <= path.length()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid file url", K(ret), K(path), K(file_urls.at(i))); + } else { + file_urls.at(i) += path.length(); + if (OB_LIKELY(file_urls.at(i).length() > 0)) { + if (OB_NOT_NULL(file_urls.at(i).ptr()) && *file_urls.at(i).ptr() == '/') { + file_urls.at(i) += 1; + } + } else { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("file name length is invalid", K(ret)); + } + } + } + } + return ret; +} + +int ObExternalDataAccessDriver::resolve_storage_type(const ObString &location, ObStorageType &device_type) +{ + int ret = OB_SUCCESS; + + if (location.prefix_match_ci(OB_OSS_PREFIX)) { + device_type = OB_STORAGE_OSS; + } else if (location.prefix_match_ci(OB_COS_PREFIX)) { + device_type = OB_STORAGE_COS; + } else if (location.prefix_match_ci(OB_FILE_PREFIX)) { + device_type = OB_STORAGE_FILE; + } else { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Not supported location type", K(ret), K(location)); + } + return ret; +} + +int ObExternalDataAccessDriver::init(const ObString &location, const ObString &access_info) +{ + int ret = OB_SUCCESS; + ObStorageType device_type = OB_STORAGE_MAX_TYPE; + ObArenaAllocator temp_allocator; + ObString location_cstr; + ObString access_info_cstr; + ObBackupIoAdapter util; + + iod_opts_.opts_ = opts_; + iod_opts_.opt_cnt_ = 0; + + if (OB_FAIL(resolve_storage_type(location, device_type))) { + LOG_WARN("fail to resove storage type", K(ret)); + } else { + storage_type_ = device_type; + if (device_type == OB_STORAGE_FILE) { + OZ (ob_write_string(temp_allocator, location, location_cstr, true)); + access_info_cstr.assign_ptr(&dummy_empty_char, strlen(&dummy_empty_char)); + } else { + OZ (ob_write_string(temp_allocator, location, location_cstr, true)); + OZ (ob_write_string(temp_allocator, access_info, access_info_cstr, true)); + } + } + + OZ (access_info_.set(device_type, access_info_cstr.ptr())); + OZ (util.get_and_init_device(device_handle_, &access_info_, location_cstr)); + OZ (util.set_access_type(&iod_opts_, false, 1)); + + return ret; +} + + +int ObExternalTableAccessService::table_scan( + ObVTableScanParam ¶m, + ObNewRowIterator *&result) +{ + int ret = OB_SUCCESS; + ObExternalTableRowIterator* row_iter = NULL; + + auto &scan_param = static_cast(param); + + switch (param.external_file_format_.format_type_) { + case ObExternalFileFormat::CSV_FORMAT: + if (OB_ISNULL(row_iter = OB_NEWx(ObCSVTableRowIterator, (scan_param.allocator_)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("alloc memory failed", K(ret)); + } + break; + default: + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected format", K(ret), "format", param.external_file_format_.format_type_); + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(row_iter->init(&scan_param))) { + LOG_WARN("fail to open iter", K(ret)); + } else { + result = row_iter; + } + } + + LOG_DEBUG("external table access service iter init", K(ret), "type", param.external_file_format_.format_type_); + + return ret; +} + +int ObExternalTableAccessService::table_rescan(ObVTableScanParam ¶m, ObNewRowIterator *result) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(result)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected iter", K(ret)); + } else { + switch (param.external_file_format_.format_type_) { + case ObExternalFileFormat::CSV_FORMAT: + result->reset(); + break; + default: + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected format", K(ret), "format", param.external_file_format_.format_type_); + } + } + LOG_DEBUG("external table rescan", K(param.key_ranges_), K(param.range_array_pos_)); + return ret; +} + +int ObExternalTableAccessService::reuse_scan_iter(const bool switch_param, ObNewRowIterator *iter) +{ + UNUSED(switch_param); + iter->reset(); + return OB_SUCCESS; +} + +int ObExternalTableAccessService::revert_scan_iter(ObNewRowIterator *iter) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(iter)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected iter", K(ret)); + } else { + iter->~ObNewRowIterator(); + } + return ret; +} + +ObCSVTableRowIterator::~ObCSVTableRowIterator() +{ + release_buf(); +} + +void ObCSVTableRowIterator::release_buf() +{ + if (nullptr != state_.buf_) { + allocator_.free(state_.buf_); + } + + if (nullptr != state_.escape_buf_) { + allocator_.free(state_.escape_buf_); + } +} + +int ObCSVTableRowIterator::expand_buf() +{ + int ret = OB_SUCCESS; + const int64_t MAX_BUFFER_SIZE = (1 << 30); //MEMORY LIMIT 1G + int64_t new_buf_len = 0; + char *old_buf = state_.buf_; + char *new_buf = nullptr; + char *new_escape_buf = nullptr; + + if (nullptr != old_buf) { + new_buf_len = state_.buf_len_ * 2; + } else { + if (data_access_driver_.get_storage_type() != OB_STORAGE_FILE) { + //for better performance + new_buf_len = OB_MALLOC_BIG_BLOCK_SIZE; + } else { + new_buf_len = OB_MALLOC_NORMAL_BLOCK_SIZE; + } + } + + if (OB_UNLIKELY(new_buf_len > MAX_BUFFER_SIZE)) { + ret = OB_SIZE_OVERFLOW; + LOG_WARN("buffer size overflow", K(ret), K(new_buf_len)); + } else if (OB_ISNULL(new_buf = static_cast(allocator_.alloc(new_buf_len)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("fail to alloc memory", K(ret)); + } else if (OB_ISNULL(new_escape_buf = static_cast(allocator_.alloc(new_buf_len)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("fail to alloc memory", K(ret)); + } else { + int64_t remain_len = (nullptr != old_buf) ? (state_.data_end_ - state_.pos_) : 0; + if (remain_len > 0) { + MEMCPY(new_buf, state_.pos_, remain_len); + } + + release_buf(); + + state_.buf_ = new_buf; + state_.escape_buf_ = new_escape_buf; + state_.escape_buf_end_ = new_escape_buf + new_buf_len; + state_.buf_len_ = new_buf_len; + state_.pos_ = new_buf; + state_.data_end_ = new_buf + remain_len; + + + LOG_DEBUG("extend buf", K(new_buf_len)); + } + + return ret; +} + +int ObCSVTableRowIterator::init_exprs(const storage::ObTableScanParam *scan_param) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(scan_param)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("scan param is null", K(ret)); + } else { + if (scan_param->column_ids_.count() != scan_param->output_exprs_->count()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("column ids not equal to access expr", K(ret)); + } + for (int i = 0; OB_SUCC(ret) && i < scan_param->column_ids_.count(); i++) { + ObExpr *cur_expr = scan_param->output_exprs_->at(i); + switch (scan_param->column_ids_.at(i)) { + case OB_HIDDEN_LINE_NUMBER_COLUMN_ID: + line_number_expr_ = cur_expr; + break; + case OB_HIDDEN_FILE_ID_COLUMN_ID: + file_id_expr_ = cur_expr; + break; + default: + OZ (column_exprs_.push_back(cur_expr)); + break; + } + } + if (OB_SUCC(ret) && column_exprs_.count() != scan_param->ext_column_convert_exprs_->count()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("column expr not equal to convert convert expr", K(ret), + K(column_exprs_), KPC(scan_param->ext_column_convert_exprs_)); + } + } + return ret; +} + +int ObCSVTableRowIterator::init(const storage::ObTableScanParam *scan_param) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(scan_param)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("scan param is null", K(ret)); + } else { + allocator_.set_attr(lib::ObMemAttr(scan_param->tenant_id_, "CSVRowIter")); + OZ (ObExternalTableRowIterator::init(scan_param)); + OZ (parser_.init(scan_param->external_file_format_.csv_format_)); + OZ (init_exprs(scan_param)); + OZ (data_access_driver_.init(scan_param_->external_file_location_, scan_param->external_file_access_info_)); + OZ (expand_buf()); + } + return ret; +} + +int ObCSVTableRowIterator::get_next_file_and_line_number(const int64_t task_idx, + ObString &file_url, + int64_t &file_id, + int64_t &start_line, + int64_t &end_line) +{ + int ret = OB_SUCCESS; + if (task_idx >= scan_param_->key_ranges_.count()) { + ret = OB_ITER_END; + } else if (OB_FAIL(ObExternalTableUtils::resolve_line_number_range( + scan_param_->key_ranges_.at(task_idx), + ObExternalTableUtils::LINE_NUMBER, + start_line, + end_line))) { + LOG_WARN("failed to resolve range in external table", K(ret)); + } else { + file_url = scan_param_->key_ranges_.at(task_idx).get_start_key().get_obj_ptr()[ObExternalTableUtils::FILE_URL].get_string(); + file_id = scan_param_->key_ranges_.at(task_idx).get_start_key().get_obj_ptr()[ObExternalTableUtils::FILE_ID].get_int(); + } + return ret; +} + +int ObCSVTableRowIterator::open_next_file() +{ + int ret = OB_SUCCESS; + ObString location = scan_param_->external_file_location_; + + if (data_access_driver_.is_opened()) { + data_access_driver_.close(); + } + + do { + ObString file_url; + int64_t file_id = 0; + int64_t start_line = 0; + int64_t end_line = 0; + int64_t task_idx = state_.file_idx_++; + url_.reuse(); + ret = get_next_file_and_line_number(task_idx, file_url, file_id, start_line, end_line); + if (OB_SUCC(ret)) { + if (start_line == MIN_EXTERNAL_TABLE_LINE_NUMBER && end_line == INT64_MAX) { + state_.cur_file_name_ = file_url; + state_.cur_file_id_ = file_id; + state_.cur_line_number_ = MIN_EXTERNAL_TABLE_LINE_NUMBER; + state_.skip_lines_ = parser_.get_format().skip_header_lines_; + state_.line_count_limit_ = INT64_MAX; + } else { + // [3, 7] --> skip = 2, cnt = 5 + state_.cur_file_name_ = file_url; + state_.cur_file_id_ = file_id; + state_.cur_line_number_ = start_line; + state_.skip_lines_ = parser_.get_format().skip_header_lines_ + start_line - 1; + state_.line_count_limit_ = end_line - start_line + 1; + } + const char *split_char = "/"; + OZ (url_.append_fmt("%.*s%s%.*s", location.length(), location.ptr(), + (location.empty() || location[location.length() - 1] == '/') ? "" : split_char, + file_url.length(), file_url.ptr())); + OZ (data_access_driver_.get_file_size(url_.string(), state_.file_size_)); + } + LOG_DEBUG("try next file", K(ret), K(url_), K(file_url), K(state_)); + } while (OB_SUCC(ret) && 0 >= state_.file_size_); //skip empty file + OZ (data_access_driver_.open(url_.string()), url_); + + LOG_DEBUG("open external file", K(ret), K(url_), K(state_.file_size_), K(location)); + + return ret; +} + +int ObCSVTableRowIterator::load_next_buf() +{ + int ret = OB_SUCCESS; + do { + char *next_load_pos = NULL; + int64_t next_buf_len = 0; + if (state_.is_end_file_) { + if (OB_FAIL(open_next_file())) { + //do not print log + } else { + state_.is_end_file_ = false; + state_.file_offset_ = 0; + next_load_pos = state_.buf_; + next_buf_len = state_.buf_len_; + } + } else { + //move unfinish tail in old buf to the front + int64_t remain_bytes = state_.data_end_ - state_.pos_; + if (remain_bytes > 0) { + if (state_.pos_ > state_.buf_) { + MEMMOVE(state_.buf_, state_.pos_, remain_bytes); + } else { + // buffer is not big enough to store data line + OZ (expand_buf()); + } + } + next_load_pos = state_.buf_ + remain_bytes; + next_buf_len = state_.buf_len_ - remain_bytes; + } + + if (OB_SUCC(ret)) { + int64_t read_size = 0; + OZ (data_access_driver_.pread(next_load_pos, next_buf_len, state_.file_offset_, read_size)); + if (OB_SUCC(ret)) { + state_.file_offset_ += read_size; + state_.pos_ = state_.buf_; + state_.data_end_ = next_load_pos + read_size; + state_.is_end_file_ = (state_.file_offset_ >= state_.file_size_); + } + } + + } while (false); + return ret; +} + +int ObCSVTableRowIterator::skip_lines() +{ + int ret = OB_SUCCESS; + ObSEArray error_msgs; + int64_t nrows = 0; + auto temp_handle = [](ObIArray &arr) -> int { + UNUSED(arr); + return OB_SUCCESS; + }; + do { + nrows = state_.skip_lines_; + OZ (parser_.scan(state_.pos_, state_.data_end_, nrows, nullptr, nullptr, + temp_handle, error_msgs, state_.is_end_file_)); + error_msgs.reuse(); + state_.skip_lines_ -= nrows; + } while (OB_SUCC(ret) && state_.skip_lines_ > 0 && OB_SUCC(load_next_buf())); + return ret; +} + +void ObCSVTableRowIterator::dump_error_log(ObIArray &error_msgs) +{ + int ret = OB_SUCCESS; + for (int i = 0; i < error_msgs.count(); ++i) { + LOG_WARN("parse row warning", + "file_name", state_.cur_file_name_, + "file_id", state_.cur_file_id_, + "rownum", error_msgs.at(i).line_no + parser_.get_format().skip_header_lines_, + "ret", common::ob_error_name(error_msgs.at(i).err_code)); + } +} + +int ObCSVTableRowIterator::get_next_row() +{ + int ret = OB_SUCCESS; + ObSEArray error_msgs; + const ExprFixedArray &file_column_exprs = *(scan_param_->ext_file_column_exprs_); + ObEvalCtx &eval_ctx = scan_param_->op_->get_eval_ctx(); + bool is_oracle_mode = lib::is_oracle_mode(); + int64_t returned_row_cnt = 0; // rows count for scan output, exclude blank lines or skip header + auto handle_one_line = [&file_column_exprs, &eval_ctx, &is_oracle_mode, &returned_row_cnt] + (ObIArray &arr) -> int { + int ret = OB_SUCCESS; + for (int i = 0; OB_SUCC(ret) && i < file_column_exprs.count(); ++i) { + ObDatum &datum = file_column_exprs.at(i)->locate_datum_for_write(eval_ctx); + int64_t loc_idx = file_column_exprs.at(i)->extra_ - 1; + if (OB_UNLIKELY(loc_idx < 0 || loc_idx > arr.count())) { + ret = OB_ERR_UNEXPECTED; + } else { + if (arr.at(loc_idx).is_null_|| (0 == arr.at(loc_idx).len_ && is_oracle_mode)) { + datum.set_null(); + } else { + datum.set_string(arr.at(loc_idx).ptr_, arr.at(loc_idx).len_); + } + } + } + + returned_row_cnt++; + return ret; + }; + + int64_t nrows = 0; + do { + if (state_.skip_lines_ > 0) { + OZ (skip_lines()); + } + if (OB_SUCC(ret)) { + nrows = MIN(1, state_.line_count_limit_); + if (OB_UNLIKELY(0 == nrows)) { + // if line_count_limit = 0, get next file. + state_.is_end_file_ = true; + } else { + ret = parser_.scan(state_.pos_, state_.data_end_, nrows, + state_.escape_buf_, state_.escape_buf_end_, + handle_one_line, error_msgs, state_.is_end_file_); + if (OB_FAIL(ret)) { + LOG_WARN("fail to scan csv", K(ret)); + } else if (OB_UNLIKELY(error_msgs.count() > 0)) { + dump_error_log(error_msgs); + } + } + } + } while (OB_SUCC(ret) && returned_row_cnt < 1 && OB_SUCC(load_next_buf())); + if (OB_SUCC(ret) && returned_row_cnt > 0) { + if (OB_NOT_NULL(file_id_expr_)) { + ObDatum &datum = file_id_expr_->locate_datum_for_write(eval_ctx); + datum.set_int(state_.cur_file_id_); + } + if (OB_NOT_NULL(line_number_expr_)) { + ObDatum &datum = line_number_expr_->locate_datum_for_write(eval_ctx); + datum.set_int(state_.cur_line_number_); + } + state_.line_count_limit_ -= returned_row_cnt; + state_.cur_line_number_ += returned_row_cnt; + } + + for (int i = 0; OB_SUCC(ret) && i < file_column_exprs.count(); i++) { + file_column_exprs.at(i)->set_evaluated_flag(eval_ctx); + } + + for (int i = 0; OB_SUCC(ret) && i < column_exprs_.count(); i++) { + ObExpr *column_expr = column_exprs_.at(i); + ObExpr *column_convert_expr = scan_param_->ext_column_convert_exprs_->at(i); + ObDatum *convert_datum = NULL; + OZ (column_convert_expr->eval(eval_ctx, convert_datum)); + if (OB_SUCC(ret)) { + column_expr->locate_datum_for_write(eval_ctx) = *convert_datum; + column_expr->set_evaluated_flag(eval_ctx); + } + } + + return ret; +} + +int ObCSVTableRowIterator::get_next_rows(int64_t &count, int64_t capacity) +{ + int ret = OB_SUCCESS; + + ObSEArray error_msgs; + const ExprFixedArray &file_column_exprs = *(scan_param_->ext_file_column_exprs_); + ObEvalCtx &eval_ctx = scan_param_->op_->get_eval_ctx(); + int64_t batch_size = capacity; + int64_t returned_row_cnt = 0; // rows count for scan output, exclude blank lines or skip header + bool is_oracle_mode = lib::is_oracle_mode(); + + if (OB_ISNULL(bit_vector_cache_)) { + void *mem = nullptr; + if (OB_ISNULL(mem = allocator_.alloc(ObBitVector::memory_size(eval_ctx.max_batch_size_)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to alloc memory for skip", K(ret), K(eval_ctx.max_batch_size_)); + } else { + bit_vector_cache_ = to_bit_vector(mem); + bit_vector_cache_->reset(eval_ctx.max_batch_size_); + } + } + auto handle_one_line = [&file_column_exprs, &eval_ctx, &is_oracle_mode, &returned_row_cnt] + (ObIArray &arr) -> int { + int ret = OB_SUCCESS; + for (int i = 0; OB_SUCC(ret) && i < file_column_exprs.count(); ++i) { + ObDatum *datums = file_column_exprs.at(i)->locate_batch_datums(eval_ctx); + int64_t loc_idx = file_column_exprs.at(i)->extra_ - 1; + if (OB_UNLIKELY(loc_idx < 0 || loc_idx > arr.count())) { + ret = OB_ERR_UNEXPECTED; + } else { + if (arr.at(loc_idx).is_null_ || (0 == arr.at(loc_idx).len_ && is_oracle_mode)) { + datums[returned_row_cnt].set_null(); + } else { + datums[returned_row_cnt].set_string(arr.at(loc_idx).ptr_, arr.at(loc_idx).len_); + } + } + } + returned_row_cnt++; + return ret; + }; + + int64_t nrows = 0; + do { + if (state_.skip_lines_ > 0) { + OZ (skip_lines()); + } + if (OB_SUCC(ret)) { + nrows = MIN(batch_size, state_.line_count_limit_); + if (OB_UNLIKELY(0 == nrows)) { + // if line_count_limit = 0, get next file. + state_.is_end_file_ = true; + } else { + ret = parser_.scan(state_.pos_, state_.data_end_, nrows, + state_.escape_buf_, state_.escape_buf_end_, handle_one_line, + error_msgs, state_.is_end_file_); + if (OB_FAIL(ret)) { + LOG_WARN("fail to scan csv", K(ret)); + } else if (OB_UNLIKELY(error_msgs.count() > 0)) { + dump_error_log(error_msgs); + } + } + } + } while (OB_SUCC(ret) && returned_row_cnt < 1 && OB_SUCC(load_next_buf())); + + if (OB_ITER_END == ret && returned_row_cnt > 0) { + ret = OB_SUCCESS; + } + if (OB_SUCC(ret) && returned_row_cnt > 0) { + if (OB_NOT_NULL(file_id_expr_)) { + ObDatum *datums = file_id_expr_->locate_batch_datums(eval_ctx); + for (int64_t i = 0; i < returned_row_cnt; i++) { + datums[i].set_int(state_.cur_file_id_); + } + file_id_expr_->set_evaluated_flag(eval_ctx); + } + if (OB_NOT_NULL(line_number_expr_)) { + ObDatum *datums = line_number_expr_->locate_batch_datums(eval_ctx); + for (int64_t i = 0; i < returned_row_cnt; i++) { + datums[i].set_int(state_.cur_line_number_ + i); + } + line_number_expr_->set_evaluated_flag(eval_ctx); + } + state_.line_count_limit_ -= returned_row_cnt; + state_.cur_line_number_ += returned_row_cnt; + } + + for (int i = 0; OB_SUCC(ret) && i < file_column_exprs.count(); i++) { + file_column_exprs.at(i)->set_evaluated_flag(eval_ctx); + } + + for (int i = 0; OB_SUCC(ret) && i < column_exprs_.count(); i++) { + ObExpr *column_expr = column_exprs_.at(i); + ObExpr *column_convert_expr = scan_param_->ext_column_convert_exprs_->at(i); + OZ (column_convert_expr->eval_batch(eval_ctx, *bit_vector_cache_, returned_row_cnt)); + if (OB_SUCC(ret)) { + MEMCPY(column_expr->locate_batch_datums(eval_ctx), + column_convert_expr->locate_batch_datums(eval_ctx), sizeof(ObDatum) * returned_row_cnt); + column_expr->set_evaluated_flag(eval_ctx); + } + } + + count = returned_row_cnt; + + return ret; +} + +void ObCSVTableRowIterator::reset() +{ + // reset state_ to initial values for rescan + state_.reuse(); +} + + + + + +} +} diff --git a/src/sql/engine/table/ob_external_table_access_service.h b/src/sql/engine/table/ob_external_table_access_service.h new file mode 100644 index 000000000..f6e4548e7 --- /dev/null +++ b/src/sql/engine/table/ob_external_table_access_service.h @@ -0,0 +1,170 @@ +// Copyright 2014 Alibaba Inc. All Rights Reserved. +// Author: +// + + +#ifndef OB_EXTERNAL_TABLE_ACCESS_SERVICE_H_ +#define OB_EXTERNAL_TABLE_ACCESS_SERVICE_H_ + + +#include "share/ob_i_tablet_scan.h" +#include "lib/file/ob_file.h" +#include "common/row/ob_row_iterator.h" +#include "storage/access/ob_dml_param.h" +#include "common/storage/ob_io_device.h" +#include "share/backup/ob_backup_struct.h" + + +namespace oceanbase +{ +namespace common +{ +} + +namespace sql { + +class ObExternalDataAccessDriver +{ +public: + ObExternalDataAccessDriver() : storage_type_(common::OB_STORAGE_MAX_TYPE), device_handle_(nullptr) {} + ~ObExternalDataAccessDriver(); + int init(const common::ObString &location, const ObString &access_info); + int open(const common::ObString &url); + bool is_opened(); + int get_file_size(const common::ObString &url, int64_t &file_size); + + int get_file_sizes(const ObString &location, const ObIArray &urls, ObIArray &file_sizes); + int pread(void *buf, const int64_t count, const int64_t offset, int64_t &read_size); + int get_file_list(const ObString &path, + ObIArray &file_urls, + ObIAllocator &allocator); + static int resolve_storage_type(const ObString &location, common::ObStorageType &device_type); + common::ObStorageType get_storage_type() { return storage_type_; } + void close(); + + const char dummy_empty_char = '\0'; +private: + common::ObStorageType storage_type_; + ObIODOpt opts_[1]; + ObIODOpts iod_opts_; + share::ObBackupStorageInfo access_info_; + ObIODevice* device_handle_; + ObIOFd fd_; +}; + + +class ObExternalTableRowIterator : public common::ObNewRowIterator { +public: + ObExternalTableRowIterator() : scan_param_(nullptr) {} + virtual int init(const storage::ObTableScanParam *scan_param) { + scan_param_ = scan_param; + return common::OB_SUCCESS; + } +protected: + const storage::ObTableScanParam *scan_param_; +}; + +class ObExternalTableAccessService : public common::ObITabletScan +{ +public: + ObExternalTableAccessService() {} + virtual int table_scan(common::ObVTableScanParam ¶m, ObNewRowIterator *&result) override; + virtual int table_rescan(ObVTableScanParam ¶m, ObNewRowIterator *result) override; + virtual int reuse_scan_iter(const bool switch_param, ObNewRowIterator *iter) override; + virtual int revert_scan_iter(ObNewRowIterator *iter) override; + +private: + + DISALLOW_COPY_AND_ASSIGN(ObExternalTableAccessService); +}; + +class ObCSVTableRowIterator : public ObExternalTableRowIterator { +public: + static const int64_t MIN_EXTERNAL_TABLE_FILE_ID = 1; + static const int64_t MIN_EXTERNAL_TABLE_LINE_NUMBER = 1; + +public: + struct StateValues { + StateValues() : + buf_(nullptr), buf_len_(OB_MALLOC_NORMAL_BLOCK_SIZE), + pos_(nullptr), data_end_(nullptr), escape_buf_(nullptr), escape_buf_end_(nullptr), + is_end_file_(true), file_idx_(0), file_offset_(0), file_size_(0), skip_lines_(0), + cur_file_id_(MIN_EXTERNAL_TABLE_FILE_ID), cur_line_number_(MIN_EXTERNAL_TABLE_LINE_NUMBER), + line_count_limit_(INT64_MAX) {} + char *buf_; + int64_t buf_len_; + const char *pos_; + const char *data_end_; + char *escape_buf_; + char *escape_buf_end_; + bool is_end_file_; + int64_t file_idx_; + int64_t file_offset_; + int64_t file_size_; + int64_t skip_lines_; + common::ObString cur_file_name_; + int64_t cur_file_id_; + int64_t cur_line_number_; + int64_t line_count_limit_; + void reuse() { + pos_ = buf_; + data_end_ = buf_; + is_end_file_ = true; + file_idx_ = 0; + file_offset_ = 0; + file_size_ = 0; + skip_lines_ = 0; + cur_file_name_.reset(); + cur_file_id_ = MIN_EXTERNAL_TABLE_FILE_ID; + cur_line_number_ = MIN_EXTERNAL_TABLE_LINE_NUMBER; + line_count_limit_ = INT64_MAX; + } + TO_STRING_KV(KP(buf_), K(buf_len_), KP(pos_), KP(data_end_), K(is_end_file_), K(file_idx_), + K(file_offset_), K(file_size_), K(skip_lines_), K(line_count_limit_), + K(cur_file_name_), K(cur_file_id_), K(cur_line_number_), K(line_count_limit_)); + }; + + ObCSVTableRowIterator() : bit_vector_cache_(NULL), line_number_expr_(NULL), file_id_expr_(NULL) {} + virtual ~ObCSVTableRowIterator(); + int init(const storage::ObTableScanParam *scan_param) override; + int get_next_row() override; + int get_next_rows(int64_t &count, int64_t capacity) override; + + virtual int get_next_row(ObNewRow *&row) override { + UNUSED(row); + return common::OB_ERR_UNEXPECTED; + } + + virtual void reset() override; + +private: + int expand_buf(); + int load_next_buf(); + int open_next_file(); + int get_next_file_and_line_number(const int64_t task_idx, + common::ObString &file_url, + int64_t &file_id, + int64_t &start_line, + int64_t &end_line); + int skip_lines(); + void release_buf(); + void dump_error_log(common::ObIArray &error_msgs); + int init_exprs(const storage::ObTableScanParam *scan_param); +private: + ObBitVector *bit_vector_cache_; + StateValues state_; + common::ObMalloc allocator_; + ObCSVGeneralParser parser_; + ObExternalDataAccessDriver data_access_driver_; + ObSqlString url_; + ObSEArray column_exprs_; + ObExpr *line_number_expr_; + ObExpr *file_id_expr_; +}; + +} + + +} + +#endif // OB_EXTERNAL_TABLE_ACCESS_SERVICE_H_ diff --git a/src/sql/engine/table/ob_table_scan_op.cpp b/src/sql/engine/table/ob_table_scan_op.cpp index 927dd9e8e..20789ac61 100644 --- a/src/sql/engine/table/ob_table_scan_op.cpp +++ b/src/sql/engine/table/ob_table_scan_op.cpp @@ -28,6 +28,9 @@ #include "observer/virtual_table/ob_virtual_data_access_service.h" #include "sql/engine/expr/ob_expr_lob_utils.h" #include "observer/omt/ob_tenant_srs_mgr.h" +#include "share/external_table/ob_external_table_file_mgr.h" +#include "share/external_table/ob_external_table_utils.h" +#include "lib/container/ob_array_wrap.h" namespace oceanbase { @@ -1089,6 +1092,21 @@ int ObTableScanOp::prepare_single_scan_range(int64_t group_idx) key_ranges, ObBasicSessionInfo::create_dtc_params(ctx_.get_my_session())))) { LOG_WARN("failed to extract pre query ranges", K(ret)); + } else if (MY_CTDEF.scan_ctdef_.is_external_table_) { + uint64_t table_loc_id = MY_SPEC.get_table_loc_id(); + ObDASTableLoc *tab_loc = DAS_CTX(ctx_).get_table_loc_by_id(table_loc_id, MY_CTDEF.scan_ctdef_.ref_table_id_); + if (OB_ISNULL(tab_loc)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("table lock is null", K(ret)); + } else if (OB_FAIL(ObExternalTableUtils::prepare_single_scan_range( + ctx_.get_my_session()->get_effective_tenant_id(), + MY_CTDEF.scan_ctdef_.ref_table_id_, + key_ranges, + range_allocator, + key_ranges, + tab_loc->loc_meta_->is_external_files_on_disk_))) { + LOG_WARN("failed to prepare single scan range for external table", K(ret)); + } } else if (OB_FAIL(MY_CTDEF.pre_query_range_.get_ss_tablet_ranges(range_allocator, ctx_, ss_key_ranges, diff --git a/src/sql/engine/table/ob_table_scan_op.h b/src/sql/engine/table/ob_table_scan_op.h index 49467e9d9..c96e65a22 100644 --- a/src/sql/engine/table/ob_table_scan_op.h +++ b/src/sql/engine/table/ob_table_scan_op.h @@ -350,7 +350,8 @@ public: uint64_t report_col_checksum_ : 1; uint64_t has_tenant_id_col_ : 1; uint64_t is_spatial_ddl_ : 1; - uint64_t reserved_ : 54; + uint64_t is_external_table_ : 1; + uint64_t reserved_ : 53; }; }; int64_t tenant_id_col_idx_; @@ -470,7 +471,7 @@ protected: common::ObNewRange &new_range, bool &is_transform_end); inline void access_expr_sanity_check() { - if (OB_UNLIKELY(spec_.need_check_output_datum_)) { + if (OB_UNLIKELY(spec_.need_check_output_datum_ && !MY_SPEC.is_external_table_)) { const ObPushdownExprSpec &pd_expr_spec = MY_SPEC.tsc_ctdef_.scan_ctdef_.pd_expr_spec_; ObSQLUtils::access_expr_sanity_check(pd_expr_spec.access_exprs_, eval_ctx_, pd_expr_spec.max_batch_size_); diff --git a/src/sql/ob_sql_utils.cpp b/src/sql/ob_sql_utils.cpp index c2cf1321c..59f7c4432 100644 --- a/src/sql/ob_sql_utils.cpp +++ b/src/sql/ob_sql_utils.cpp @@ -4762,6 +4762,79 @@ void ObSQLUtils::adjust_time_by_ntp_offset(int64_t &dst_timeout_ts) dst_timeout_ts += THIS_WORKER.get_ntp_offset(); } +bool ObSQLUtils::is_external_files_on_local_disk(const ObString &url) +{ + return url.prefix_match_ci(OB_FILE_PREFIX) || + (!url.prefix_match_ci(OB_OSS_PREFIX) && !url.prefix_match_ci(OB_COS_PREFIX)); +} + +int ObSQLUtils::split_remote_object_storage_url(ObString &url, ObBackupStorageInfo &storage_info) +{ + int ret = OB_SUCCESS; + ObString access_id; + ObString access_key; + ObString host_name; + ObString access_info = url.split_on('/').trim_space_only(); + if (access_info.empty()) { + ret = OB_URI_ERROR; + LOG_WARN("incorrect uri", K(ret)); + } else { + access_id = access_info.split_on(':').trim_space_only(); + access_key = access_info.split_on('@').trim_space_only(); + host_name = access_info.trim_space_only(); + } + + //fill storage_info + if (OB_SUCC(ret)) { + int64_t pos = 0; + OZ (databuff_printf(storage_info.access_id_, OB_MAX_BACKUP_ACCESSID_LENGTH, pos, + "%s%.*s", ACCESS_ID, access_id.length(), access_id.ptr())); + pos = 0; + OZ (databuff_printf(storage_info.access_key_, OB_MAX_BACKUP_ACCESSKEY_LENGTH, pos, + "%s%.*s", ACCESS_KEY, access_key.length(), access_key.ptr())); + pos = 0; + OZ (databuff_printf(storage_info.endpoint_, OB_MAX_BACKUP_ENDPOINT_LENGTH, pos, + "%s%.*s", "host=", host_name.length(), host_name.ptr())); + if (OB_FAIL(ret)) { + ret = OB_URI_ERROR; + LOG_WARN("incorrect uri", K(ret)); + } + } + return ret; +} + +int ObSQLUtils::check_location_access_priv(const ObString &location, ObSQLSessionInfo *session) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(session)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid session", K(ret)); + } else if (is_external_files_on_local_disk(location) && !session->is_inner()) { + ObArenaAllocator allocator; + ObString real_location = location; + real_location += strlen(OB_FILE_PREFIX); + if (!real_location.empty() && '.' == real_location[0]) { + //Relative path + ObArrayWrap buffer; + OZ (buffer.allocate_array(allocator, PATH_MAX)); + if (OB_SUCC(ret)) { + real_location = ObString(realpath(to_cstring(real_location), buffer.get_data())); + } + } + + if (OB_SUCC(ret) && !real_location.empty()) { + ObString secure_file_priv; + OZ (session->get_secure_file_priv(secure_file_priv)); + OZ (ObResolverUtils::check_secure_path(secure_file_priv, real_location)); + if (OB_ERR_NO_PRIVILEGE == ret) { + ret = OB_ERR_NO_PRIV_DIRECT_PATH_ACCESS; + LOG_WARN("fail to check secure path", K(ret), K(secure_file_priv), K(real_location)); + } + } + } + return ret; +} + int ObSQLUtils::async_recompile_view(const share::schema::ObTableSchema &old_view_schema, ObSelectStmt *select_stmt, diff --git a/src/sql/ob_sql_utils.h b/src/sql/ob_sql_utils.h index ed03ef2a7..77d6537ab 100644 --- a/src/sql/ob_sql_utils.h +++ b/src/sql/ob_sql_utils.h @@ -32,6 +32,9 @@ #include "sql/monitor/flt/ob_flt_span_mgr.h" namespace oceanbase { +namespace share { +class ObBackupStorageInfo; +} namespace sql { class RowDesc; @@ -565,6 +568,11 @@ public: * That is the time correctly set by the processor of the RPC ------------------------*/ static void adjust_time_by_ntp_offset(int64_t &dst_timeout_ts); + + static int split_remote_object_storage_url(common::ObString &url, share::ObBackupStorageInfo &storage_info); + static bool is_external_files_on_local_disk(const common::ObString &url); + static int check_location_access_priv(const common::ObString &location, ObSQLSessionInfo *session); + static int async_recompile_view(const share::schema::ObTableSchema &old_view_schema, ObSelectStmt *select_stmt, bool reset_column_infos, diff --git a/src/sql/optimizer/ob_access_path_estimation.cpp b/src/sql/optimizer/ob_access_path_estimation.cpp index 143ce4753..f604bd553 100644 --- a/src/sql/optimizer/ob_access_path_estimation.cpp +++ b/src/sql/optimizer/ob_access_path_estimation.cpp @@ -74,6 +74,10 @@ int ObAccessPathEstimation::process_common_estimate_rowcount(ObOptimizerContext if (OB_FAIL(process_vtable_default_estimation(paths.at(i)))) { LOG_WARN("failed to process process vtable default estimation", K(ret)); } + } else if (EXTERNAL_TABLE == paths.at(i)->est_cost_info_.table_meta_info_->table_type_) { + if (OB_FAIL(process_external_table_estimation(paths.at(i)))) { + LOG_WARN("failed to process external table estimation", K(ret)); + } } else if (OB_FAIL(process_statistics_estimation(paths.at(i)))) { LOG_WARN("failed to process statistics estimation", K(ret)); } else if (!use_storage_stat) { @@ -141,6 +145,32 @@ int ObAccessPathEstimation::check_path_can_use_stroage_estimate(const AccessPath return ret; } +int ObAccessPathEstimation::process_external_table_estimation(AccessPath *path) +{ + //TODO [ExternalTable] need refine + int ret = OB_SUCCESS; + double output_row_count = 0.0; + if (OB_ISNULL(path)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("path is null", K(ret), K(path)); + } else { + ObCostTableScanInfo &est_cost_info = path->est_cost_info_; + est_cost_info.batch_type_ = ObSimpleBatch::T_SCAN; + if (est_cost_info.table_meta_info_->has_opt_stat_) { + if (OB_FAIL(process_statistics_estimation(path))) { + LOG_WARN("failed to process statistics estimation", K(ret)); + } + } else { + output_row_count = static_cast(OB_EST_DEFAULT_VIRTUAL_TABLE_ROW_COUNT); + path->query_range_row_count_ = output_row_count; + path->phy_query_range_row_count_ = output_row_count; + path->index_back_row_count_ = 0; + path->output_row_count_ = output_row_count; + } + } + return ret; +} + int ObAccessPathEstimation::process_vtable_default_estimation(AccessPath *path) { int ret = OB_SUCCESS; @@ -1041,8 +1071,9 @@ int ObAccessPathEstimation::storage_estimate_full_table_rowcount(ObOptimizerCont if (OB_ISNULL(ctx.get_session_info())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null", K(ret)); - } else if (is_virtual_table(meta.ref_table_id_) && - !share::is_oracle_mapping_real_virtual_table(meta.ref_table_id_)) { + } else if ((is_virtual_table(meta.ref_table_id_) && + !share::is_oracle_mapping_real_virtual_table(meta.ref_table_id_)) + || EXTERNAL_TABLE == meta.table_type_) { // do nothing } else if (OB_FAIL(ObSQLUtils::choose_best_replica_for_estimation( part_loc_info, diff --git a/src/sql/optimizer/ob_access_path_estimation.h b/src/sql/optimizer/ob_access_path_estimation.h index b0e14363a..01e254c03 100644 --- a/src/sql/optimizer/ob_access_path_estimation.h +++ b/src/sql/optimizer/ob_access_path_estimation.h @@ -68,6 +68,7 @@ private: const ObAddr &local_addr, EstimatedPartition &best_partition); + static int process_external_table_estimation(AccessPath *path); static int process_vtable_default_estimation(AccessPath *path); static int process_table_default_estimation(AccessPath *path); diff --git a/src/sql/optimizer/ob_join_order.cpp b/src/sql/optimizer/ob_join_order.cpp index b525fa762..d10b0c237 100644 --- a/src/sql/optimizer/ob_join_order.cpp +++ b/src/sql/optimizer/ob_join_order.cpp @@ -359,17 +359,34 @@ int ObJoinOrder::compute_sharding_info_for_base_path(ObIArray &acc AccessPath *path = NULL; ObShardingInfo *sharding_info = NULL; ObTablePartitionInfo *table_partition_info = NULL; + ObSqlSchemaGuard *schema_guard = NULL; + const ObTableSchema *table_schema = NULL; if (OB_UNLIKELY(access_paths.count() <= cur_idx) || OB_ISNULL(path = access_paths.at(cur_idx)) || OB_ISNULL(table_partition_info = path->table_partition_info_) || OB_ISNULL(get_plan()) || OB_ISNULL(stmt = get_plan()->get_stmt()) || OB_ISNULL(opt_ctx = &get_plan()->get_optimizer_context()) || - OB_ISNULL(session_info = opt_ctx->get_session_info())) { + OB_ISNULL(session_info = opt_ctx->get_session_info()) || + OB_ISNULL(schema_guard = opt_ctx->get_sql_schema_guard())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null", K(ret), K(access_paths.count()), K(path), K(table_partition_info), K(cur_idx), K(get_plan()), K(stmt), K(opt_ctx), K(session_info)); } else if (path->use_das_) { sharding_info = opt_ctx->get_match_all_sharding(); + } else if (OB_FAIL(schema_guard->get_table_schema(table_partition_info->get_ref_table_id(), + table_schema))) { + LOG_WARN("failed to get table schema", K(ret)); + } else if (OB_ISNULL(table_schema)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get unexpected null", K(ret)); + } else if (table_schema->is_external_table()) { + int64_t parallel = opt_ctx->is_use_table_dop() ? table_schema->get_dop() :opt_ctx->get_parallel(); + if (parallel > 1 + || ObSQLUtils::is_external_files_on_local_disk(table_schema->get_external_file_location())) { + sharding_info = opt_ctx->get_distributed_sharding(); + } else { + sharding_info = opt_ctx->get_local_sharding(); + } } else if (OB_FAIL(table_partition_info->get_location_type(opt_ctx->get_local_server_addr(), location_type))) { LOG_WARN("failed to get location type", K(ret)); @@ -1475,11 +1492,11 @@ int ObJoinOrder::will_use_das(const uint64_t table_id, } else if (OB_ISNULL(index_info_entry)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("index info entry should not be null", K(ret)); + } else if (OB_ISNULL(table_item = get_plan()->get_stmt()->get_table_item_by_id(table_id))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("table_item is null", K(ret), K(table_id)); } else if (get_plan()->get_optimizer_context().is_batched_multi_stmt()) { - if (OB_ISNULL(table_item = get_plan()->get_stmt()->get_table_item_by_id(table_id))) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("table_item is null", K(ret), K(table_id)); - } else if (table_item->is_basic_table()) { + if (table_item->is_basic_table()) { is_batch_update_table = true; } } @@ -1493,6 +1510,10 @@ int ObJoinOrder::will_use_das(const uint64_t table_id, get_plan()->get_optimizer_context().has_dblink() || get_plan()->get_optimizer_context().has_subquery_in_function_table() || is_batch_update_table; + if (EXTERNAL_TABLE == table_item->table_type_) { + create_das_path = false; + create_basic_path = true; + } else //this sql force to use DAS TSC: //batch update table(multi queries or arraybinding) //contain nested sql(pl udf or in nested sql) @@ -5587,6 +5608,7 @@ int JoinPath::can_use_batch_nlj(ObLogPlan *plan, || access_path->is_json_table_path() || table_item->for_update_ || !access_path->subquery_exprs_.empty() + || EXTERNAL_TABLE == table_item->table_type_ ); if (use_batch_nlj) { @@ -6518,6 +6540,7 @@ int ObJoinOrder::init_base_join_order(const TableItem *table_item) } else { table_id_ = table_item->table_id_; table_meta_info_.ref_table_id_ = table_item->ref_id_; + table_meta_info_.table_type_ = table_item->table_type_; table_bit_index = stmt->get_table_bit_index(table_item->table_id_); if (OB_FAIL(get_tables().add_member(table_bit_index)) || OB_FAIL(get_output_tables().add_member(table_bit_index))) { @@ -6828,8 +6851,9 @@ int ObJoinOrder::generate_base_table_paths(PathHelper &helper) LOG_WARN("failed to calc table location", K(ret)); } else if (OB_FAIL(estimate_size_and_width_for_base_table(helper, access_paths))) { LOG_WARN("failed to estimate_size", K(ret)); - } else if (!helper.is_inner_path_ && !is_virtual_table(ref_table_id) && - OB_FAIL(compute_one_row_info_for_table_scan(access_paths))) { + } else if (!helper.is_inner_path_ && !is_virtual_table(ref_table_id) + && EXTERNAL_TABLE != table_meta_info_.table_type_ + && OB_FAIL(compute_one_row_info_for_table_scan(access_paths))) { LOG_WARN("failed to compute one row info", K(ret)); } else if (OB_FAIL(pruning_unstable_access_path(helper.table_opt_info_, access_paths))) { LOG_WARN("failed to pruning unstable access path", K(ret)); @@ -10992,6 +11016,7 @@ int ObJoinOrder::compute_table_meta_info(const uint64_t table_id, LOG_WARN("null table schema", K(ret)); } else { table_meta_info_.ref_table_id_ = ref_table_id; + table_meta_info_.table_type_ = table_schema->get_table_type(); table_meta_info_.table_rowkey_count_ = table_schema->get_rowkey_info().get_size(); table_meta_info_.table_column_count_ = table_schema->get_column_count(); table_meta_info_.micro_block_size_ = table_schema->get_block_size(); @@ -11342,7 +11367,8 @@ int ObJoinOrder::init_est_sel_info_for_access_path(const uint64_t table_id, //3. fallback with default stats temporary if (OB_SUCC(ret) && table_meta_info_.table_row_count_ <= 0) { - table_meta_info_.table_row_count_ = ObOptStatManager::get_default_table_row_count(); + table_meta_info_.table_row_count_ = + table_schema.is_external_table() ? 100000.0 : ObOptStatManager::get_default_table_row_count(); table_meta_info_.average_row_size_ = ObOptStatManager::get_default_avg_row_size(); table_meta_info_.part_size_ = ObOptStatManager::get_default_data_size(); LOG_TRACE("total rowcount, empty table", K(table_meta_info_.table_row_count_)); diff --git a/src/sql/optimizer/ob_log_granule_iterator.cpp b/src/sql/optimizer/ob_log_granule_iterator.cpp index 1938ca458..bf697b75d 100644 --- a/src/sql/optimizer/ob_log_granule_iterator.cpp +++ b/src/sql/optimizer/ob_log_granule_iterator.cpp @@ -195,6 +195,9 @@ int ObLogGranuleIterator::is_partition_gi(bool &partition_granule) const LOG_WARN("failed to get sys variable px partition scan threshold", K(ret)); } else if (OB_FAIL(session_info->get_sys_variable(share::SYS_VAR__PX_MIN_GRANULES_PER_SLAVE, hash_partition_scan_hold))) { LOG_WARN("failed to get sys variable px min granule per slave", K(ret)); + } else if (is_used_by_external_table()) { + //external table only support block iter + partition_granule = false; } else { partition_granule = ObGranuleUtil::is_partition_granule_flag(gi_attri_flag_) || ObGranuleUtil::is_partition_granule(partition_count_, parallel_, partition_scan_hold, hash_partition_scan_hold, hash_part_); diff --git a/src/sql/optimizer/ob_log_granule_iterator.h b/src/sql/optimizer/ob_log_granule_iterator.h index 0668f9af7..6269c0622 100644 --- a/src/sql/optimizer/ob_log_granule_iterator.h +++ b/src/sql/optimizer/ob_log_granule_iterator.h @@ -33,7 +33,8 @@ public: hash_part_(false), bf_info_(), tablet_id_expr_(NULL), - repartition_ref_table_id_(OB_INVALID_ID) + repartition_ref_table_id_(OB_INVALID_ID), + used_by_external_table_(false) { } virtual ~ObLogGranuleIterator() { } @@ -79,6 +80,9 @@ public: int64_t get_repartition_ref_table_id() { return repartition_ref_table_id_; } virtual int get_plan_item_info(PlanText &plan_text, ObSqlPlanItem &plan_item) override; + + void set_used_by_external_table() { used_by_external_table_ = true; } + bool is_used_by_external_table() const { return used_by_external_table_; } private: DISALLOW_COPY_AND_ASSIGN(ObLogGranuleIterator); int64_t tablet_size_; @@ -88,6 +92,7 @@ private: ObPxBFStaticInfo bf_info_; // for join partition filter ObOpPseudoColumnRawExpr *tablet_id_expr_; int64_t repartition_ref_table_id_; + bool used_by_external_table_; }; } diff --git a/src/sql/optimizer/ob_log_plan.cpp b/src/sql/optimizer/ob_log_plan.cpp index 339a767ca..941125451 100644 --- a/src/sql/optimizer/ob_log_plan.cpp +++ b/src/sql/optimizer/ob_log_plan.cpp @@ -4187,6 +4187,7 @@ int ObLogPlan::allocate_access_path(AccessPath *ap, scan->set_estimate_method(ap->est_cost_info_.row_est_method_); scan->set_pre_query_range(ap->pre_query_range_); scan->set_skip_scan(OptSkipScanState::SS_DISABLE != ap->use_skip_scan_); + scan->set_table_type(table_schema->get_table_type()); if (!ap->is_inner_path_ && OB_FAIL(scan->set_query_ranges(ap->get_cost_table_scan_info().ranges_, ap->get_cost_table_scan_info().ss_ranges_))) { @@ -6922,7 +6923,8 @@ int ObLogPlan::check_scalar_groupby_pushdown(const ObIArray & } else if (!table_item->is_basic_table() || table_item->is_link_table() || is_sys_table(table_item->ref_id_) || - is_virtual_table(table_item->ref_id_)) { + is_virtual_table(table_item->ref_id_) || + EXTERNAL_TABLE == table_item->table_type_) { /*do nothing*/ } else if (OB_FAIL(stmt->has_virtual_generated_column(table_item->table_id_, has_virtual_col))) { LOG_WARN("failed to check has virtual generated column", K(ret), K(*table_item)); @@ -8423,6 +8425,7 @@ int ObLogPlan::try_push_limit_into_table_scan(ObLogicalOperator *top, } if (OB_SUCC(ret) && !contain_udf && !is_virtual_table(table_scan->get_ref_table_id()) && + table_scan->get_table_type() != schema::EXTERNAL_TABLE && !(OB_INVALID_ID != table_scan->get_dblink_id() && NULL != offset_expr) && !get_stmt()->is_calc_found_rows() && !table_scan->is_sample_scan() && !(table_scan->get_is_index_global() && table_scan->get_index_back() && table_scan->has_index_lookup_filter()) && @@ -11213,6 +11216,21 @@ int ObLogPlan::replace_generate_column_exprs(ObLogicalOperator *op) } else if (OB_FAIL(scan_op->replace_gen_col_op_exprs(gen_col_replaced_exprs_))) { LOG_WARN("failed to replace generated tsc expr", K(ret)); } + if (OB_SUCC(ret) && EXTERNAL_TABLE == scan_op->get_table_type()) { + for (int i = 0; OB_SUCC(ret) && i < scan_op->get_access_exprs().count(); ++i) { + ObColumnRefRawExpr *col_expr = NULL; + if (scan_op->get_access_exprs().at(i)->is_column_ref_expr() + && (col_expr = static_cast( + scan_op->get_access_exprs().at(i)))->is_stored_generated_column()) { + ObRawExpr *dep_expr = col_expr->get_dependant_expr(); + if (OB_FAIL(scan_op->extract_file_column_exprs_recursively(dep_expr))) { + LOG_WARN("fail to extract file column expr", K(ret)); + } else if (OB_FAIL(scan_op->get_ext_column_convert_exprs().push_back(dep_expr))) { + LOG_WARN("fail to push back expr", K(ret)); + } + } + } + } } else if ((op->get_type() == log_op_def::LOG_INSERT) || ((op->get_type() == log_op_def::LOG_INSERT_ALL))) { ObLogDelUpd *insert_op = static_cast(op); @@ -11283,6 +11301,31 @@ int ObLogPlan::generate_old_column_values_exprs(ObLogicalOperator *root) return ret; } +int ObLogPlan::adjust_expr_properties_for_external_table(ObRawExpr *col_expr, ObRawExpr *&expr) const +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(col_expr) || OB_ISNULL(expr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected expr", K(ret)); + } else if (expr->get_expr_type() == T_PSEUDO_EXTERNAL_FILE_COL) { + // The file column PSEUDO expr does not have relation_ids. + // Using relation_ids in column expr to act as a column from the table. + // Relation_ids are required when cg join conditions. + if (OB_FAIL(expr->add_relation_ids(col_expr->get_relation_ids()))) { + LOG_WARN("fail to add relation ids", K(ret)); + } else { + static_cast(expr)->set_table_name( + static_cast(col_expr)->get_table_name()); + } + } + for (int i = 0; OB_SUCC(ret) && i < expr->get_children_count(); i++) { + if (OB_FAIL(adjust_expr_properties_for_external_table(col_expr, expr->get_param_expr(i)))) { + LOG_WARN("fail to adjust expr properties for external table", K(ret)); + } + } + return ret; +} + int ObLogPlan::generate_tsc_replace_exprs_pair(ObLogTableScan *op) { int ret = OB_SUCCESS; diff --git a/src/sql/optimizer/ob_log_plan.h b/src/sql/optimizer/ob_log_plan.h index dc7d7b463..015aa4970 100644 --- a/src/sql/optimizer/ob_log_plan.h +++ b/src/sql/optimizer/ob_log_plan.h @@ -1718,6 +1718,7 @@ private: // member functions ObOptColumnStatHandle &handle, common::ObIArray &popular_values) const; bool has_depend_json_table(const ObRelIds& table_ids); + int adjust_expr_properties_for_external_table(ObRawExpr *col_expr, ObRawExpr *&expr) const; public: const ObLogPlanHint &get_log_plan_hint() const { return log_plan_hint_; } bool has_join_order_hint() { return !log_plan_hint_.join_order_.leading_tables_.is_empty(); } diff --git a/src/sql/optimizer/ob_log_table_scan.cpp b/src/sql/optimizer/ob_log_table_scan.cpp index a25ccea4f..b45df004b 100644 --- a/src/sql/optimizer/ob_log_table_scan.cpp +++ b/src/sql/optimizer/ob_log_table_scan.cpp @@ -53,6 +53,8 @@ const char *ObLogTableScan::get_name() const name = (sample_method == SampleInfo::ROW_SAMPLE) ? "TABLE ROW SAMPLE SCAN" : "TABLE BLOCK SAMPLE SCAN"; } else if (is_skip_scan()) { name = use_das() ? "DISTRIBUTED TABLE SKIP SCAN" : "TABLE SKIP SCAN"; + } else if (EXTERNAL_TABLE == get_table_type()) { + name = "EXTERNAL TABLE SCAN"; } else if (use_das()) { if (is_get) { name = "DISTRIBUTED TABLE GET"; @@ -252,6 +254,31 @@ int ObLogTableScan::check_output_dependance(common::ObIArray &child return ret; } +int ObLogTableScan::extract_file_column_exprs_recursively(ObRawExpr *expr) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(expr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("expr is null", K(ret)); + } else if (T_PSEUDO_EXTERNAL_FILE_COL == expr->get_expr_type()) { + auto pseudo_col_expr = static_cast(expr); + if (pseudo_col_expr->get_table_id() != table_id_) { + //table id may be changed because of rewrite + pseudo_col_expr->set_table_id(table_id_); + } + if (OB_FAIL(add_var_to_array_no_dup(ext_file_column_exprs_, expr))) { + LOG_WARN("failed to add var to array", K(ret)); + } + } else { + for (int i = 0; OB_SUCC(ret) && i < expr->get_children_count(); ++i) { + if (OB_FAIL(extract_file_column_exprs_recursively(expr->get_param_expr(i)))) { + LOG_WARN("fail to extract file column expr", K(ret)); + } + } + } + return ret; +} + int ObLogTableScan::generate_access_exprs() { int ret = OB_SUCCESS; @@ -302,16 +329,18 @@ int ObLogTableScan::generate_access_exprs() LOG_WARN("failed to append exprs", K(ret)); } else { /*do nothing*/ } + 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); if (OB_ISNULL(expr)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null", K(ret)); - } else if (T_ORA_ROWSCN == expr->get_expr_type() && - static_cast(expr)->get_table_id() == table_id_ && - OB_FAIL(access_exprs_.push_back(expr))) { - LOG_WARN("failed to get next row", K(ret)); - } else { /*do nothing*/} + } else if ((T_ORA_ROWSCN == expr->get_expr_type()) + && static_cast(expr)->get_table_id() == table_id_) { + if (OB_FAIL(access_exprs_.push_back(expr))) { + LOG_WARN("fail to push back expr", K(ret)); + } + } } if (OB_SUCC(ret)) { @@ -430,7 +459,7 @@ int ObLogTableScan::extract_pushdown_filters(ObIArray &nonpushdown_f int ret = OB_SUCCESS; const ObIArray &filters = get_filter_exprs(); const auto &flags = get_filter_before_index_flags(); - if (get_contains_fake_cte() || is_virtual_table(get_ref_table_id())) { + if (get_contains_fake_cte() || is_virtual_table(get_ref_table_id()) || EXTERNAL_TABLE == get_table_type()) { //all filters can not push down to storage if (OB_FAIL(nonpushdown_filters.assign(filters))) { LOG_WARN("store non-pushdown filters failed", K(ret)); @@ -1104,9 +1133,19 @@ int ObLogTableScan::get_plan_item_info(PlanText &plan_text, LOG_WARN("failed to adjust print access info", K(ret)); } else { EXPLAIN_PRINT_EXPRS(access, type); - END_BUF_PRINT(plan_item.access_predicates_, - plan_item.access_predicates_len_); } + if (OB_SUCC(ret) && EXTERNAL_TABLE == get_table_type() && EXPLAIN_EXTENDED == type) { + if(OB_FAIL(BUF_PRINTF(NEW_LINE))) { + LOG_WARN("BUG_PRINTF fails", K(ret)); + } else if (OB_FAIL(BUF_PRINTF(OUTPUT_PREFIX))) { + LOG_WARN("BUG_PRINTF fails", K(ret)); + } else { + ObIArray &column_values = get_ext_column_convert_exprs(); + EXPLAIN_PRINT_EXPRS(column_values, type); + } + } + END_BUF_PRINT(plan_item.access_predicates_, + plan_item.access_predicates_len_); } if (OB_SUCC(ret)) { //print index selection and stats version diff --git a/src/sql/optimizer/ob_log_table_scan.h b/src/sql/optimizer/ob_log_table_scan.h index 773ba1252..2ad319b98 100644 --- a/src/sql/optimizer/ob_log_table_scan.h +++ b/src/sql/optimizer/ob_log_table_scan.h @@ -78,7 +78,8 @@ public: calc_part_id_expr_(NULL), global_index_back_table_partition_info_(NULL), has_index_scan_filter_(false), - has_index_lookup_filter_(false) + has_index_lookup_filter_(false), + table_type_(share::schema::MAX_TABLE_TYPE) { } @@ -248,6 +249,12 @@ public: inline const common::ObIArray &get_ddl_output_column_ids() const { return ddl_output_column_ids_; } + inline common::ObIArray &get_ext_file_column_exprs() + { return ext_file_column_exprs_; } + + inline common::ObIArray &get_ext_column_convert_exprs() + { return ext_column_convert_exprs_; } + ObRawExpr* get_real_expr(const ObRawExpr *col) const; /** * Get pushdown aggr expressions @@ -419,6 +426,8 @@ public: const common::ObIArray &get_part_exprs() const { return part_exprs_; } inline const ObRawExpr *get_calc_part_id_expr() const { return calc_part_id_expr_; } int init_calc_part_id_expr(); + void set_table_type(share::schema::ObTableType table_type) { table_type_ = table_type; } + share::schema::ObTableType get_table_type() const { return table_type_; } virtual int get_plan_item_info(PlanText &plan_text, ObSqlPlanItem &plan_item) override; int get_plan_object_info(PlanText &plan_text, @@ -442,6 +451,7 @@ public: uint64_t scan_table_id); int adjust_print_access_info(ObIArray &access_exprs); static int replace_gen_column(ObLogPlan *plan, ObRawExpr *part_expr, ObRawExpr *&new_part_expr); + int extract_file_column_exprs_recursively(ObRawExpr *expr); private: // member functions //called when index_back_ set int pick_out_query_range_exprs(); @@ -492,6 +502,9 @@ protected: // memeber variables common::ObSEArray rowkey_exprs_; common::ObSEArray part_exprs_; common::ObSEArray spatial_exprs_; + //for external table + common::ObSEArray ext_file_column_exprs_; + common::ObSEArray ext_column_convert_exprs_; // for oracle-mapping, map access expr to a real column expr common::ObArray, common::ModulePageAllocator, true> real_expr_map_; // aggr func pushdwon to table scan @@ -558,6 +571,7 @@ protected: // memeber variables bool has_index_lookup_filter_; // end for global index lookup + share::schema::ObTableType table_type_; // disallow copy and assign DISALLOW_COPY_AND_ASSIGN(ObLogTableScan); }; diff --git a/src/sql/optimizer/ob_logical_operator.cpp b/src/sql/optimizer/ob_logical_operator.cpp index bcbe73cbd..194c7f8ca 100644 --- a/src/sql/optimizer/ob_logical_operator.cpp +++ b/src/sql/optimizer/ob_logical_operator.cpp @@ -4004,6 +4004,16 @@ int ObLogicalOperator::allocate_granule_nodes_above(AllocGIContext &ctx) gi_op->add_flag(GI_SLAVE_MAPPING); } + if (OB_SUCC(ret) && LOG_TABLE_SCAN == get_type() + && EXTERNAL_TABLE == static_cast(this)->get_table_type()) { + if (ctx.force_partition()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("external table do not support partition GI", K(ret)); + } else { + gi_op->set_used_by_external_table(); + } + } + if (OB_SUCC(ret)) { if (OB_FAIL(gi_op->is_partition_gi(partition_granule))) { LOG_WARN("failed judge partition granule", K(ret)); diff --git a/src/sql/optimizer/ob_opt_est_cost_model.cpp b/src/sql/optimizer/ob_opt_est_cost_model.cpp index 48a9b701b..73333b558 100644 --- a/src/sql/optimizer/ob_opt_est_cost_model.cpp +++ b/src/sql/optimizer/ob_opt_est_cost_model.cpp @@ -79,6 +79,7 @@ void ObTableMetaInfo::assign(const ObTableMetaInfo &table_meta_info) row_count_ = table_meta_info.row_count_; has_opt_stat_ = table_meta_info.has_opt_stat_; micro_block_count_ = table_meta_info.micro_block_count_; + table_type_ = table_meta_info.table_type_; } double ObTableMetaInfo::get_micro_block_numbers() const @@ -1248,6 +1249,11 @@ int ObOptEstCostModel::cost_normal_table(const ObCostTableScanInfo &est_cost_inf if (OB_UNLIKELY(parallel < 1 || part_cnt < 1)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("get unexpected error", K(parallel), K(part_cnt), K(ret)); + } else if (OB_NOT_NULL(est_cost_info.table_meta_info_) + && EXTERNAL_TABLE == est_cost_info.table_meta_info_->table_type_) { + //TODO [ExternalTable] need refine + index_back_cost = 0; + cost = 4.0 * phy_query_range_row_count; } else if (OB_FAIL(ObOptEstCostModel::cost_table_one_batch(est_cost_info, part_cnt / parallel, est_cost_info.batch_type_, @@ -1256,7 +1262,8 @@ int ObOptEstCostModel::cost_normal_table(const ObCostTableScanInfo &est_cost_inf cost, index_back_cost))) { LOG_WARN("Failed to estimate cost", K(ret), K(est_cost_info)); - } else { + } + if (OB_SUCC(ret)) { LOG_TRACE("OPT:[ESTIMATE FINISH]", K(cost), K(index_back_cost), K(phy_query_range_row_count), K(query_range_row_count), K(est_cost_info)); diff --git a/src/sql/optimizer/ob_opt_est_cost_model.h b/src/sql/optimizer/ob_opt_est_cost_model.h index 0eeaf6245..0b2e2a610 100644 --- a/src/sql/optimizer/ob_opt_est_cost_model.h +++ b/src/sql/optimizer/ob_opt_est_cost_model.h @@ -55,7 +55,8 @@ struct ObTableMetaInfo average_row_size_(0), row_count_(0), has_opt_stat_(false), - micro_block_count_(-1) + micro_block_count_(-1), + table_type_(share::schema::MAX_TABLE_TYPE) { } virtual ~ObTableMetaInfo() { } @@ -65,7 +66,7 @@ struct ObTableMetaInfo TO_STRING_KV(K_(ref_table_id), K_(part_count), K_(micro_block_size), K_(part_size), K_(average_row_size), K_(table_column_count), K_(table_rowkey_count), K_(table_row_count), K_(row_count), - K_(micro_block_count)); + K_(micro_block_count), K_(table_type)); /// the following fields come from schema info uint64_t ref_table_id_; //ref table id @@ -83,6 +84,7 @@ struct ObTableMetaInfo double row_count_; // row count after filters, estimated by stat manager bool has_opt_stat_; int64_t micro_block_count_; // main table micro block count + share::schema::ObTableType table_type_; private: DISALLOW_COPY_AND_ASSIGN(ObTableMetaInfo); }; diff --git a/src/sql/optimizer/ob_select_log_plan.cpp b/src/sql/optimizer/ob_select_log_plan.cpp index 23bcf9353..46cc300cc 100644 --- a/src/sql/optimizer/ob_select_log_plan.cpp +++ b/src/sql/optimizer/ob_select_log_plan.cpp @@ -2287,13 +2287,22 @@ int ObSelectLogPlan::check_if_union_all_match_set_partition_wise(const ObIArray< for (int64_t i = 0; OB_SUCC(ret) && is_union_all_set_pw && i < child_ops.count(); i++) { ObLogicalOperator *child_op = NULL; ObShardingInfo *child_sharding = NULL; - if (OB_ISNULL(child_op = child_ops.at(i)) || - OB_ISNULL(child_sharding = child_op->get_sharding())) { + const ObSelectStmt *child_stmt = NULL; + bool has_external_table_scan = false; + if (OB_ISNULL(child_op = child_ops.at(i)) + || OB_ISNULL(child_sharding = child_op->get_sharding()) + || !child_ops.at(i)->get_plan()->get_stmt()->is_select_stmt() + || OB_ISNULL(child_stmt = static_cast(child_ops.at(i)->get_plan()->get_stmt()))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("invalid input", K(ret), K(child_op), K(child_sharding)); } else if (!child_sharding->is_distributed()) { is_union_all_set_pw = false; OPT_TRACE("not distributed sharding, can not use set partition wise"); + } else if (OB_FAIL(check_external_table_scan(const_cast(child_stmt), has_external_table_scan))) { + LOG_WARN("fail to check has external table scan", K(ret)); + } else if (has_external_table_scan) { + is_union_all_set_pw = false; + OPT_TRACE("has external table scan, can not use set partition wise"); } else if (i == 0) { if (OB_FAIL(check_sharding_inherit_from_access_all(child_op, is_inherit_from_access_all))) { @@ -6536,6 +6545,7 @@ int ObSelectLogPlan::generate_late_materialization_table_item(ObSelectStmt *stmt temp_item->is_view_table_ = old_table_item->is_view_table_; temp_item->table_id_ = new_table_id; temp_item->ref_id_ = old_table_item->ref_id_; + temp_item->table_type_ = old_table_item->table_type_; const char *str = "_alias"; char *buf = static_cast(get_allocator().alloc( @@ -6887,5 +6897,26 @@ int ObSelectLogPlan::init_selectivity_metas_for_set(ObSelectLogPlan *sub_plan, return ret; } + +int ObSelectLogPlan::check_external_table_scan(ObSelectStmt *stmt, bool &has_external_table) +{ + int ret = OB_SUCCESS; + ObArray child_stmts; + if (OB_ISNULL(stmt)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("stmt is null", K(ret)); + } else if (stmt->has_external_table()) { + has_external_table = true; + } else { + if (OB_FAIL(stmt->get_child_stmts(child_stmts))) { + LOG_WARN("fail to get child stmt", K(ret)); + } + for (int i = 0; OB_SUCC(ret) && !has_external_table && i < child_stmts.count(); i++) { + ret = SMART_CALL(check_external_table_scan(child_stmts.at(i), has_external_table)); + } + } + return ret; +} + }//sql }//oceanbase diff --git a/src/sql/optimizer/ob_select_log_plan.h b/src/sql/optimizer/ob_select_log_plan.h index d47fd9342..d61a6507d 100644 --- a/src/sql/optimizer/ob_select_log_plan.h +++ b/src/sql/optimizer/ob_select_log_plan.h @@ -695,6 +695,8 @@ private: bool use_part_sort, bool can_ignore_merge = false); + int check_external_table_scan(ObSelectStmt *stmt, bool &has_external_table); + DISALLOW_COPY_AND_ASSIGN(ObSelectLogPlan); }; }//end of namespace sql diff --git a/src/sql/optimizer/ob_table_location.cpp b/src/sql/optimizer/ob_table_location.cpp index 2a09a4249..d8d720ce9 100644 --- a/src/sql/optimizer/ob_table_location.cpp +++ b/src/sql/optimizer/ob_table_location.cpp @@ -708,6 +708,7 @@ int ObTableLocation::assign(const ObTableLocation &other) is_col_part_expr_ = other.is_col_part_expr_; is_col_subpart_expr_ = other.is_col_subpart_expr_; is_oracle_temp_table_ = other.is_oracle_temp_table_; + table_type_ = other.table_type_; part_col_type_ = other.part_col_type_; part_collation_type_ = other.part_collation_type_; subpart_col_type_ = other.subpart_col_type_; @@ -815,6 +816,7 @@ void ObTableLocation::reset() is_col_part_expr_ = false; is_col_subpart_expr_ = false; is_oracle_temp_table_ = false; + table_type_ = MAX_TABLE_TYPE; calc_node_ = NULL; gen_col_node_ = NULL; @@ -944,6 +946,14 @@ int ObTableLocation::init_table_location(ObExecContext &exec_ctx, } else if (OB_ISNULL(table_schema)) { ret = OB_TABLE_NOT_EXIST; LOG_WARN("table not exist", K(loc_meta_.ref_table_id_)); + } else { + table_type_ = table_schema->get_table_type(); + loc_meta_.is_external_table_ = table_schema->is_external_table(); + loc_meta_.is_external_files_on_disk_ = + ObSQLUtils::is_external_files_on_local_disk(table_schema->get_external_file_location()); + } + + if (OB_FAIL(ret)) { } else if (PARTITION_LEVEL_ZERO == (part_level_ = table_schema->get_part_level())) { is_partitioned_ = false; //Non-partitioned table, do not need to calc partition id } else if (PARTITION_LEVEL_ONE != part_level_ && PARTITION_LEVEL_TWO != part_level_) { @@ -1251,6 +1261,14 @@ int ObTableLocation::init( || OB_ISNULL(session_info = exec_ctx->get_my_session())) { ret = OB_INVALID_ARGUMENT; LOG_WARN("Input arguments error", K(table_id), K(ref_table_id), K(session_info), K(ret)); + } else { + table_type_ = table_schema->get_table_type(); + loc_meta_.is_external_table_ = table_schema->is_external_table(); + loc_meta_.is_external_files_on_disk_ = + ObSQLUtils::is_external_files_on_local_disk(table_schema->get_external_file_location()); + } + + if (OB_FAIL(ret)) { } else if (PARTITION_LEVEL_ZERO == (part_level_ = table_schema->get_part_level())) { is_partitioned_ = false; //Non-partitioned table, do not need to calc partition id } else if (PARTITION_LEVEL_ONE != part_level_ && PARTITION_LEVEL_TWO != part_level_) { @@ -1738,7 +1756,7 @@ int ObTableLocation::get_tablet_locations(ObDASCtx &das_ctx, if (OB_FAIL(ret)) { //TODO shengle set partition key for location cache renew LOG_WARN("Get partition error, then set partition key for location cache renew later", - K(ret), K(ref_table_id), "tablet_id", tablet_ids.at(i), K(candi_tablet_loc)); + K(ret), K(ref_table_id), "tablet_id", tablet_ids.at(i), K(candi_tablet_loc), K(table_type_)); } else { if (OB_ISNULL(session)) { ret = OB_INVALID_ARGUMENT; @@ -4688,6 +4706,7 @@ OB_DEF_SERIALIZE(ObTableLocation) OB_UNIS_ENCODE(tablet_id_); OB_UNIS_ENCODE(object_id_); OB_UNIS_ENCODE(related_list_); + OB_UNIS_ENCODE(table_type_); return ret; } @@ -4764,6 +4783,7 @@ OB_DEF_SERIALIZE_SIZE(ObTableLocation) OB_UNIS_ADD_LEN(tablet_id_); OB_UNIS_ADD_LEN(object_id_); OB_UNIS_ADD_LEN(related_list_); + OB_UNIS_ADD_LEN(table_type_); return len; } @@ -4918,6 +4938,7 @@ OB_DEF_DESERIALIZE(ObTableLocation) OB_UNIS_DECODE(tablet_id_); OB_UNIS_DECODE(object_id_); OB_UNIS_DECODE(related_list_); + OB_UNIS_DECODE(table_type_); return ret; } diff --git a/src/sql/optimizer/ob_table_location.h b/src/sql/optimizer/ob_table_location.h index c27d8e84b..51734cfdb 100644 --- a/src/sql/optimizer/ob_table_location.h +++ b/src/sql/optimizer/ob_table_location.h @@ -467,6 +467,7 @@ public: is_col_part_expr_(false), is_col_subpart_expr_(false), is_oracle_temp_table_(false), + table_type_(share::schema::MAX_TABLE_TYPE), inner_allocator_(common::ObModIds::OB_SQL_TABLE_LOCATION), allocator_(inner_allocator_), loc_meta_(inner_allocator_), @@ -512,6 +513,7 @@ public: is_col_part_expr_(false), is_col_subpart_expr_(false), is_oracle_temp_table_(false), + table_type_(share::schema::MAX_TABLE_TYPE), allocator_(allocator), loc_meta_(allocator), calc_node_(NULL), @@ -1117,6 +1119,7 @@ private: bool is_col_subpart_expr_; bool is_oracle_temp_table_;//是否为oracle模式下的临时表, 根据此调用不同的hash计算函数, 因为内部sql时 //is_oracle_mode()不可靠 + share::schema::ObTableType table_type_; common::ObArenaAllocator inner_allocator_; common::ObIAllocator &allocator_; //used for deep copy other table location ObDASTableLocMeta loc_meta_; diff --git a/src/sql/parser/non_reserved_keywords_mysql_mode.c b/src/sql/parser/non_reserved_keywords_mysql_mode.c index e8754aa4a..3fc91e116 100644 --- a/src/sql/parser/non_reserved_keywords_mysql_mode.c +++ b/src/sql/parser/non_reserved_keywords_mysql_mode.c @@ -236,6 +236,7 @@ static const NonReservedKeyword Mysql_none_reserved_keywords[] = {"enable_arbitration_service", ENABLE_ARBITRATION_SERVICE}, {"enable_extended_rowid", ENABLE_EXTENDED_ROWID}, {"enclosed", ENCLOSED}, + {"encoding", ENCODING}, {"encrypted", ENCRYPTED}, {"encryption", ENCRYPTION}, {"end", END}, @@ -244,6 +245,7 @@ static const NonReservedKeyword Mysql_none_reserved_keywords[] = {"engine", ENGINE_}, {"engines", ENGINES}, {"enum", ENUM}, + {"empty_field_as_null", EMPTY_FIELD_AS_NULL}, {"entity", ENTITY}, {"error", ERROR_P}, {"error_code", ERROR_CODE}, @@ -268,12 +270,15 @@ static const NonReservedKeyword Mysql_none_reserved_keywords[] = {"extended", EXTENDED}, {"extended_noaddr", EXTENDED_NOADDR}, {"extent_size", EXTENT_SIZE}, + {"external", EXTERNAL}, {"extract", EXTRACT}, {"failover", FAILOVER}, {"fast", FAST}, {"faults", FAULTS}, {"fetch", FETCH}, {"fields", FIELDS}, + {"field_optionally_enclosed_by", FIELD_OPTIONALLY_ENCLOSED_BY}, + {"field_delimiter", FIELD_DELIMITER}, {"file", FILEX}, {"file_id", FILE_ID}, {"final_count", FINAL_COUNT}, @@ -414,6 +419,7 @@ static const NonReservedKeyword Mysql_none_reserved_keywords[] = {"linear", LINEAR}, {"lines", LINES}, {"linestring", LINESTRING}, + {"line_delimiter", LINE_DELIMITER}, {"list", BISON_LIST}, {"listagg", LISTAGG}, {"load", LOAD}, @@ -541,6 +547,7 @@ static const NonReservedKeyword Mysql_none_reserved_keywords[] = {"now", NOW}, {"nowait", NOWAIT}, {"nulls", NULLS}, + {"null_if", NULL_IF_EXETERNAL}, {"numeric", DECIMAL}, {"number", NUMBER}, {"nvarchar", NVARCHAR}, @@ -584,6 +591,7 @@ static const NonReservedKeyword Mysql_none_reserved_keywords[] = {"partitioning", PARTITIONING}, {"partitions", PARTITIONS}, {"password", PASSWORD}, + {"pattern", PATTERN}, {"pause", PAUSE}, {"percentage", PERCENTAGE}, {"percent_rank", PERCENT_RANK}, @@ -728,6 +736,8 @@ static const NonReservedKeyword Mysql_none_reserved_keywords[] = {"set", SET}, {"session", SESSION}, {"session_user", SESSION_USER}, + {"skip_header", SKIP_HEADER}, + {"skip_blank_lines", SKIP_BLANK_LINES}, {"statements", STATEMENTS}, {"statistics", STATISTICS}, {"binding", BINDING}, @@ -867,6 +877,7 @@ static const NonReservedKeyword Mysql_none_reserved_keywords[] = {"trigger", TRIGGER}, {"triggers", TRIGGERS}, {"trim", TRIM}, + {"trim_space", TRIM_SPACE}, {"truncate", TRUNCATE}, {"type", TYPE}, {"types", TYPES}, diff --git a/src/sql/parser/non_reserved_keywords_oracle_mode.c b/src/sql/parser/non_reserved_keywords_oracle_mode.c index 3a7a594bf..5542b01f9 100644 --- a/src/sql/parser/non_reserved_keywords_oracle_mode.c +++ b/src/sql/parser/non_reserved_keywords_oracle_mode.c @@ -525,6 +525,7 @@ static const NonReservedKeyword Oracle_non_reserved_keywords[] = {"expire", EXPIRE}, {"expire_info", EXPIRE_INFO}, {"export", EXPORT}, + {"external", EXTERNAL}, {"extended", EXTENDED}, {"extended_noaddr", EXTENDED_NOADDR}, {"extent_size", EXTENT_SIZE}, @@ -535,6 +536,8 @@ static const NonReservedKeyword Oracle_non_reserved_keywords[] = {"failed_login_attempts", FAILED_LOGIN_ATTEMPTS}, {"faults", FAULTS}, {"fields", FIELDS}, + {"field_delimiter", FIELD_DELIMITER}, + {"field_optionally_enclosed_by", FIELD_OPTIONALLY_ENCLOSED_BY}, {"file_id", FILE_ID}, {"final_count", FINAL_COUNT}, {"first", FIRST}, @@ -664,6 +667,7 @@ static const NonReservedKeyword Oracle_non_reserved_keywords[] = {"linear", LINEAR}, {"lines", LINES}, {"linestring", LINESTRING}, + {"line_delimiter", LINE_DELIMITER}, {"list", LIST}, {"listagg", LISTAGG}, {"lnnvl", LNNVL}, @@ -782,6 +786,7 @@ static const NonReservedKeyword Oracle_non_reserved_keywords[] = {"now", NOW}, {"nowait", NOWAIT}, {"nulls", NULLS}, + {"null_if", NULL_IF_EXETERNAL }, {"nvarchar2", NVARCHAR2}, {"ntile", NTILE}, {"nth_value", NTH_VALUE}, @@ -822,6 +827,7 @@ static const NonReservedKeyword Oracle_non_reserved_keywords[] = {"password_lock_time", PASSWORD_LOCK_TIME}, {"password_verify_function", PASSWORD_VERIFY_FUNCTION}, {"path", PATH}, + {"pattern", PATTERN}, {"pause", PAUSE}, {"percent", PERCENT}, {"percentage", PERCENTAGE}, @@ -967,6 +973,8 @@ static const NonReservedKeyword Oracle_non_reserved_keywords[] = {"slave", SLAVE}, {"size", SIZE}, {"skip", SKIP}, + {"skip_blank_lines", SKIP_BLANK_LINES}, + {"skip_header", SKIP_HEADER}, {"slow", SLOW}, {"skewonly", SKEWONLY}, {"socket", SOCKET}, @@ -1072,6 +1080,7 @@ static const NonReservedKeyword Oracle_non_reserved_keywords[] = {"translate", TRANSLATE}, {"trigger", TRIGGER}, {"trim", TRIM}, + {"trim_space", TRIM_SPACE}, {"treat", TREAT}, {"type", TYPE}, {"typename", TYPENAME}, @@ -1158,6 +1167,7 @@ static const NonReservedKeyword Oracle_non_reserved_keywords[] = {"member", MEMBER}, {"submultiset", SUBMULTISET}, {"empty", EMPTY}, + {"empty_field_as_null", EMPTY_FIELD_AS_NULL}, {"a", A}, {"throttle", THROTTLE}, {"priority", PRIORITY}, diff --git a/src/sql/parser/sql_parser_mysql_mode.y b/src/sql/parser/sql_parser_mysql_mode.y index e2f5aadf0..82fed2f78 100755 --- a/src/sql/parser/sql_parser_mysql_mode.y +++ b/src/sql/parser/sql_parser_mysql_mode.y @@ -1,4 +1,4 @@ -/** +/** * 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. @@ -268,10 +268,11 @@ END_P SET_VAR DELIMITER EFFECTIVE EMPTY ENABLE ENABLE_ARBITRATION_SERVICE ENABLE_EXTENDED_ROWID ENCRYPTED ENCRYPTION END ENDS ENFORCED ENGINE_ ENGINES ENUM ENTITY ERROR_CODE ERROR_P ERRORS ESTIMATE ESCAPE EVENT EVENTS EVERY EXCHANGE EXECUTE EXPANSION EXPIRE EXPIRE_INFO EXPORT OUTLINE EXTENDED - EXTENDED_NOADDR EXTENT_SIZE EXTRACT EXCEPT EXPIRED + EXTENDED_NOADDR EXTENT_SIZE EXTRACT EXCEPT EXPIRED ENCODING EMPTY_FIELD_AS_NULL EXTERNAL FAILOVER FAST FAULTS FIELDS FILEX FINAL_COUNT FIRST FIRST_VALUE FIXED FLUSH FOLLOWER FORMAT FOUND FREEZE FREQUENCY FUNCTION FOLLOWING FLASHBACK FULL FRAGMENTATION FROZEN FILE_ID + FIELD_OPTIONALLY_ENCLOSED_BY FIELD_DELIMITER GENERAL GEOMETRY GEOMCOLLECTION GEOMETRYCOLLECTION GET_FORMAT GLOBAL GRANTS GROUP_CONCAT GROUPING GTS GLOBAL_NAME GLOBAL_ALIAS @@ -288,7 +289,7 @@ END_P SET_VAR DELIMITER LAG LANGUAGE LAST LAST_VALUE LEAD LEADER LEAVES LESS LEAK LEAK_MOD LEAK_RATE LIB LINESTRING LIST_ LISTAGG LOCAL LOCALITY LOCATION LOCKED LOCKS LOGFILE LOGONLY_REPLICA_NUM LOGS LOCK_ LOGICAL_READS - LEVEL LN LOG LS + LEVEL LN LOG LS LINE_DELIMITER MAJOR MANUAL MASTER MASTER_AUTO_POSITION MASTER_CONNECT_RETRY MASTER_DELAY MASTER_HEARTBEAT_PERIOD MASTER_HOST MASTER_LOG_FILE MASTER_LOG_POS MASTER_PASSWORD MASTER_PORT MASTER_RETRY_COUNT @@ -302,6 +303,7 @@ END_P SET_VAR DELIMITER NAME NAMES NAMESPACE NATIONAL NCHAR NDB NDBCLUSTER NEW NEXT NO NOAUDIT NODEGROUP NONE NORMAL NOW NOWAIT NOMINVALUE NOMAXVALUE NOORDER NOCYCLE NOCACHE NO_WAIT NULLS NUMBER NVARCHAR NTILE NTH_VALUE NOARCHIVELOG NETWORK NOPARALLEL + NULL_IF_EXETERNAL OBSOLETE OCCUR OF OFF OFFSET OLD OLD_PASSWORD ONE ONE_SHOT ONLY OPEN OPTIONS ORIG_DEFAULT OWNER OLD_KEY OVER OBCONFIG_URL OJ @@ -310,7 +312,7 @@ END_P SET_VAR DELIMITER PERCENT_RANK PHASE PLAN PHYSICAL PLANREGRESS PLUGIN PLUGIN_DIR PLUGINS POINT POLYGON PERFORMANCE PROTECTION PRIORITY PL POLICY POOL PORT POSITION PREPARE PRESERVE PRETTY PRETTY_COLOR PREV PRIMARY_ZONE PRIVILEGES PROCESS PROCESSLIST PROFILE PROFILES PROXY PRECEDING PCTFREE P_ENTITY P_CHUNK - PUBLIC PROGRESSIVE_MERGE_NUM PREVIEW PS PLUS + PUBLIC PROGRESSIVE_MERGE_NUM PREVIEW PS PLUS PATTERN QUARTER QUERY QUERY_RESPONSE_TIME QUEUE_TIME QUICK @@ -332,12 +334,12 @@ END_P SET_VAR DELIMITER SYNCHRONIZATION STOP STORAGE STORAGE_FORMAT_VERSION STORING STRING SUBCLASS_ORIGIN SUBDATE SUBJECT SUBPARTITION SUBPARTITIONS SUBSTR SUBSTRING SUCCESSFUL SUM SUPER SUSPEND SWAPS SWITCH SWITCHES SWITCHOVER SYSTEM SYSTEM_USER SYSDATE SESSION_ALIAS - SIZE SKEWONLY SEQUENCE SLOG STATEMENT_ID + SIZE SKEWONLY SEQUENCE SLOG STATEMENT_ID SKIP_HEADER SKIP_BLANK_LINES TABLE_CHECKSUM TABLE_MODE TABLE_ID TABLE_NAME TABLEGROUPS TABLES TABLESPACE TABLET TABLET_ID TABLET_MAX_SIZE TEMPLATE TEMPORARY TEMPTABLE TENANT TEXT THAN TIME TIMESTAMP TIMESTAMPADD TIMESTAMPDIFF TP_NO TP_NAME TRACE TRADITIONAL TRANSACTION TRIGGERS TRIM TRUNCATE TYPE TYPES TASK TABLET_SIZE - TABLEGROUP_ID TENANT_ID THROTTLE TIME_ZONE_INFO TOP_K_FRE_HIST TIMES + TABLEGROUP_ID TENANT_ID THROTTLE TIME_ZONE_INFO TOP_K_FRE_HIST TIMES TRIM_SPACE UNCOMMITTED UNDEFINED UNDO_BUFFER_SIZE UNDOFILE UNICODE UNINSTALL UNIT UNIT_GROUP UNIT_NUM UNLOCKED UNTIL UNUSUAL UPGRADE USE_BLOOM_FILTER UNKNOWN USE_FRM USER USER_RESOURCES UNBOUNDED UP UNLIMITED @@ -383,7 +385,7 @@ END_P SET_VAR DELIMITER %type update_basic_stmt delete_basic_stmt %type table_element_list table_element column_definition column_definition_ref column_definition_list column_name_list %type opt_generated_keyname opt_generated_option_list opt_generated_column_attribute_list generated_column_attribute opt_storage_type -%type data_type temporary_option opt_if_not_exists opt_if_exists opt_charset collation opt_collation cast_data_type +%type data_type special_table_type opt_if_not_exists opt_if_exists opt_charset collation opt_collation cast_data_type %type replace_with_opt_hint insert_with_opt_hint column_list opt_on_duplicate_key_clause opt_into opt_replace opt_temporary opt_algorithm opt_sql_security opt_definer view_algorithm no_param_column_ref %type insert_vals_list insert_vals value_or_values %type select_with_parens select_no_parens select_clause select_into no_table_select_with_order_and_limit simple_select_with_order_and_limit select_with_parens_with_order_and_limit select_clause_set select_clause_set_left select_clause_set_right select_clause_set_with_order_and_limit @@ -498,6 +500,7 @@ END_P SET_VAR DELIMITER %type opt_storage_name opt_calibration_list calibration_info_list %type switchover_tenant_stmt switchover_clause %type recover_tenant_stmt recover_point_clause +%type external_file_format_list external_file_format external_table_partition_option %type dynamic_sampling_hint %start sql_stmt @@ -4242,10 +4245,15 @@ FORCE { $$ = NULL; } ; -temporary_option: +special_table_type: TEMPORARY { - malloc_terminal_node($$, result->malloc_pool_, T_TEMPORARY); } + malloc_terminal_node($$, result->malloc_pool_, T_TEMPORARY); +} +| EXTERNAL +{ + malloc_terminal_node($$, result->malloc_pool_, T_EXTERNAL); +} | /* EMPTY */ { $$ = NULL; } ; @@ -4257,12 +4265,12 @@ TEMPORARY *****************************************************************************/ create_table_like_stmt: -create_with_opt_hint temporary_option TABLE opt_if_not_exists relation_factor LIKE relation_factor +create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor LIKE relation_factor { (void)($1); malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE_LIKE, 4, $2, $4, $5, $7); } -| create_with_opt_hint temporary_option TABLE opt_if_not_exists relation_factor '(' LIKE relation_factor ')' +| create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor '(' LIKE relation_factor ')' { (void)($1); malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE_LIKE, 4, $2, $4, $5, $8); @@ -4276,7 +4284,7 @@ create_with_opt_hint temporary_option TABLE opt_if_not_exists relation_factor LI *****************************************************************************/ create_table_stmt: -create_with_opt_hint temporary_option TABLE opt_if_not_exists relation_factor '(' table_element_list ')' +create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor '(' table_element_list ')' opt_table_option_list opt_partition_option { ParseNode *table_elements = NULL; @@ -4294,7 +4302,7 @@ opt_table_option_list opt_partition_option NULL); /* oracle兼容模式下存放临时表的 on commit 选项 */ $$->reserved_ = 0; } -| create_with_opt_hint temporary_option TABLE opt_if_not_exists relation_factor '(' table_element_list ')' +| create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor '(' table_element_list ')' opt_table_option_list opt_partition_option opt_as select_stmt { (void)($1); @@ -4314,7 +4322,7 @@ opt_table_option_list opt_partition_option $12); /* select_stmt */ $$->reserved_ = 0; } -| create_with_opt_hint temporary_option TABLE opt_if_not_exists relation_factor table_option_list opt_partition_option opt_as select_stmt +| create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor table_option_list opt_partition_option opt_as select_stmt { (void)($1); (void)$8; @@ -4331,7 +4339,7 @@ opt_table_option_list opt_partition_option $9); /* select_stmt */ $$->reserved_ = 0; } -| create_with_opt_hint temporary_option TABLE opt_if_not_exists relation_factor partition_option opt_as select_stmt +| create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor partition_option opt_as select_stmt { (void)($1); (void)$7; @@ -4346,7 +4354,7 @@ opt_table_option_list opt_partition_option $8); /* select_stmt */ $$->reserved_ = 1; /* mean partition optition is partition_option, not opt_partition_option*/ } -| create_with_opt_hint temporary_option TABLE opt_if_not_exists relation_factor select_stmt +| create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor select_stmt { (void)($1); malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 8, @@ -4360,7 +4368,7 @@ opt_table_option_list opt_partition_option $6); /* select_stmt */ $$->reserved_ = 0; } -| create_with_opt_hint temporary_option TABLE opt_if_not_exists relation_factor AS select_stmt +| create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor AS select_stmt { (void)($1); malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 8, @@ -6002,6 +6010,21 @@ TABLE_MODE opt_equal_mark STRING_VALUE (void)($2); malloc_non_terminal_node($$, result->malloc_pool_, T_ENABLE_EXTENDED_ROWID, 1, $3); } +| LOCATION opt_equal_mark STRING_VALUE +{ + (void)($2) ; /* make bison mute */ + malloc_non_terminal_node($$, result->malloc_pool_, T_EXTERNAL_FILE_LOCATION, 1, $3); +} +| FORMAT opt_equal_mark '(' external_file_format_list ')' +{ + (void)($2) ; /* make bison mute */ + merge_nodes($$, result, T_EXTERNAL_FILE_FORMAT, $4); +} +| PATTERN opt_equal_mark STRING_VALUE +{ + (void)($2) ; /* make bison mute */ + malloc_non_terminal_node($$, result->malloc_pool_, T_EXTERNAL_FILE_PATTERN, 1, $3); +} ; parallel_option: @@ -6061,6 +6084,22 @@ hash_partition_option { $$ = $1; } +| external_table_partition_option +{ + $$ = $1; +} +; + +external_table_partition_option: /* list partition without partition defines*/ +PARTITION BY '(' column_name_list ')' +{ + ParseNode *column_names = NULL; + ParseNode *partition_defs = NULL; + merge_nodes(column_names, result, T_EXPR_LIST, $4); + malloc_terminal_node(partition_defs, result->malloc_pool_, T_PARTITION_LIST); + malloc_non_terminal_node($$, result->malloc_pool_, T_LIST_COLUMNS_PARTITION, 5, column_names, partition_defs, NULL, NULL, NULL); + dup_expr_string($$, result, @4.first_column, @4.last_column); +} ; opt_partition_option: @@ -6775,6 +6814,73 @@ REDUNDANT $$->is_hidden_const_ = 1; } ; + +external_file_format_list: +external_file_format +{ + $$ = $1; +} +| external_file_format_list opt_comma external_file_format +{ + (void) ($2); + malloc_non_terminal_node($$, result->malloc_pool_, T_LINK_NODE, 2, $1, $3); +} +; + +external_file_format: +TYPE COMP_EQ STRING_VALUE +{ + malloc_non_terminal_node($$, result->malloc_pool_, T_EXTERNAL_FILE_FORMAT_TYPE, 1, $3); +} +| FIELD_DELIMITER COMP_EQ expr +{ + malloc_non_terminal_node($$, result->malloc_pool_, T_FIELD_TERMINATED_STR, 1, $3); + dup_expr_string($$, result, @3.first_column, @3.last_column); +} +| LINE_DELIMITER COMP_EQ expr +{ + malloc_non_terminal_node($$, result->malloc_pool_, T_LINE_TERMINATED_STR, 1, $3); + dup_expr_string($$, result, @3.first_column, @3.last_column); +} +| ESCAPE COMP_EQ expr +{ + malloc_non_terminal_node($$, result->malloc_pool_, T_ESCAPED_STR, 1, $3); + dup_expr_string($$, result, @3.first_column, @3.last_column); +} +| FIELD_OPTIONALLY_ENCLOSED_BY COMP_EQ expr +{ + malloc_non_terminal_node($$, result->malloc_pool_, T_CLOSED_STR, 1, $3); + dup_expr_string($$, result, @3.first_column, @3.last_column); +} +| ENCODING COMP_EQ STRING_VALUE +{ + malloc_non_terminal_node($$, result->malloc_pool_, T_CHARSET, 1, $3); +} +| SKIP_HEADER COMP_EQ INTNUM +{ + malloc_non_terminal_node($$, result->malloc_pool_, T_SKIP_HEADER, 1, $3); +} +| SKIP_BLANK_LINES COMP_EQ BOOL_VALUE +{ + malloc_non_terminal_node($$, result->malloc_pool_, T_SKIP_BLANK_LINE, 1, $3); +} +| TRIM_SPACE COMP_EQ BOOL_VALUE +{ + malloc_non_terminal_node($$, result->malloc_pool_, T_TRIM_SPACE, 1, $3); +} +| NULL_IF_EXETERNAL COMP_EQ '(' expr_list ')' +{ + ParseNode *expr_list_node = NULL; + merge_nodes(expr_list_node, result, T_EXPR_LIST, $4); + malloc_non_terminal_node($$, result->malloc_pool_, T_NULL_IF_EXETERNAL, 1, expr_list_node); + dup_expr_string($$, result, @4.first_column, @4.last_column); +} +| EMPTY_FIELD_AS_NULL COMP_EQ BOOL_VALUE +{ + malloc_non_terminal_node($$, result->malloc_pool_, T_EMPTY_FIELD_AS_NULL, 1, $3); +} +; + /***************************************************************************** * * create tablegroup @@ -13485,7 +13591,17 @@ ALTER TABLE relation_factor alter_table_actions { ParseNode *table_actions = NULL; merge_nodes(table_actions, result, T_ALTER_TABLE_ACTION_LIST, $4); - malloc_non_terminal_node($$, result->malloc_pool_, T_ALTER_TABLE, 2, $3, table_actions); + malloc_non_terminal_node($$, result->malloc_pool_, T_ALTER_TABLE, 3, $3, table_actions, NULL); + $$->value_ = 0; +} +| +ALTER EXTERNAL TABLE relation_factor alter_table_actions +{ + ParseNode *table_actions = NULL; + merge_nodes(table_actions, result, T_ALTER_TABLE_ACTION_LIST, $5); + ParseNode *external_node = NULL; + malloc_terminal_node(external_node, result->malloc_pool_, T_EXTERNAL); + malloc_non_terminal_node($$, result->malloc_pool_, T_ALTER_TABLE, 3, $4, table_actions, external_node); $$->value_ = 0; } ; @@ -13549,6 +13665,10 @@ DROP CONSTRAINT constraint_name { malloc_non_terminal_node($$, result->malloc_pool_, T_DROP_CONSTRAINT, 1, $3); // drop foreign key or check constraint, to be compatible with mysql } +| REFRESH +{ + malloc_terminal_node($$, result->malloc_pool_, T_ALTER_REFRESH_EXTERNAL_TABLE); +} /* | ORDER BY column_list // { // ParseNode *col_list = NULL; @@ -17020,9 +17140,11 @@ ACCOUNT | DEFAULT_TABLEGROUP | EFFECTIVE | EMPTY +| EMPTY_FIELD_AS_NULL | ENABLE | ENABLE_ARBITRATION_SERVICE | ENABLE_EXTENDED_ROWID +| ENCODING | ENCRYPTED | ENCRYPTION | END @@ -17051,12 +17173,15 @@ ACCOUNT | EXTENDED | EXTENDED_NOADDR | EXTENT_SIZE +| EXTERNAL | FAILOVER | EXTRACT | FAST | FAULTS | FLASHBACK | FIELDS +| FIELD_DELIMITER +| FIELD_OPTIONALLY_ENCLOSED_BY | FILEX | FILE_ID | FINAL_COUNT @@ -17139,6 +17264,7 @@ ACCOUNT | LEAVES | LESS | LEVEL +| LINE_DELIMITER | LINESTRING | LIST_ | LISTAGG @@ -17240,6 +17366,7 @@ ACCOUNT | NTILE | NTH_VALUE | NUMBER +| NULL_IF_EXETERNAL | NULLS | NVARCHAR | OCCUR @@ -17271,6 +17398,7 @@ ACCOUNT | LS | PARTITIONING | PARTITIONS +| PATTERN | PERCENT_RANK | PAUSE | PERCENTAGE @@ -17398,6 +17526,8 @@ ACCOUNT | SIGNED | SIZE %prec LOWER_PARENS | SIMPLE +| SKIP_BLANK_LINES +| SKIP_HEADER | SLAVE | SLOW | SNAPSHOT @@ -17496,6 +17626,7 @@ ACCOUNT | TRADITIONAL | TRIGGERS | TRIM +| TRIM_SPACE | TRUNCATE | TYPE | TYPES diff --git a/src/sql/resolver/ddl/ob_alter_table_resolver.cpp b/src/sql/resolver/ddl/ob_alter_table_resolver.cpp index 8c507c6b5..28e5f1c77 100644 --- a/src/sql/resolver/ddl/ob_alter_table_resolver.cpp +++ b/src/sql/resolver/ddl/ob_alter_table_resolver.cpp @@ -176,6 +176,12 @@ int ObAlterTableResolver::resolve(const ParseNode &parse_tree) } else if (1 == parse_tree.value_ && OB_ISNULL(index_schema_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("table schema is NULL", K(ret)); + } else if (table_schema_->is_external_table() != + (OB_NOT_NULL(parse_tree.children_[SPECIAL_TABLE_TYPE]) + && T_EXTERNAL == parse_tree.children_[SPECIAL_TABLE_TYPE]->type_)) { + ret = OB_NOT_SUPPORTED; + LOG_USER_ERROR(OB_NOT_SUPPORTED, "alter table type"); + SQL_RESV_LOG(WARN, "assign external table failed", K(ret)); } else if (ObSchemaChecker::is_ora_priv_check()) { OZ (schema_checker_->check_ora_ddl_priv(session_info_->get_effective_tenant_id(), session_info_->get_priv_user_id(), @@ -528,6 +534,9 @@ int ObAlterTableResolver::resolve_action_list(const ParseNode &node) ret = OB_ERR_MODIFY_COL_VISIBILITY_COMBINED_WITH_OTHER_OPTION; SQL_RESV_LOG(WARN, "Column visibility modifications can not be combined with any other modified column DDL option.", K(ret)); } else if (FALSE_IT(alter_table_stmt->inc_alter_table_action_count())) { + } else if (table_schema_->is_external_table()) { + alter_table_stmt->set_alter_external_table_type(action_node->type_); + OZ (alter_table_stmt->get_alter_table_arg().alter_table_schema_.assign(*table_schema_)); } else { switch (action_node->type_) { //deal with alter table option diff --git a/src/sql/resolver/ddl/ob_alter_table_resolver.h b/src/sql/resolver/ddl/ob_alter_table_resolver.h index 855b985f6..0d35b8ef3 100644 --- a/src/sql/resolver/ddl/ob_alter_table_resolver.h +++ b/src/sql/resolver/ddl/ob_alter_table_resolver.h @@ -36,9 +36,10 @@ typedef common::hash::ObPlacementHashSet subpart_ids_; common::ObSEArray all_partition_infos_; common::ObSEArray all_subpartition_infos_; + share::schema::ObTableType ref_table_type_; DISALLOW_COPY_AND_ASSIGN(ObAnalyzeStmt); }; diff --git a/src/sql/resolver/ddl/ob_analyze_stmt_resolver.cpp b/src/sql/resolver/ddl/ob_analyze_stmt_resolver.cpp index 46a71daed..22b5560ab 100644 --- a/src/sql/resolver/ddl/ob_analyze_stmt_resolver.cpp +++ b/src/sql/resolver/ddl/ob_analyze_stmt_resolver.cpp @@ -231,7 +231,8 @@ int ObAnalyzeStmtResolver::resolve_table_info(const ParseNode *table_node, analyze_stmt.get_column_params()))) { LOG_WARN("failed to init column stat param", K(ret)); } else { - analyze_stmt.set_table(database_name, database_id, table_name, table_schema->get_table_id()); + analyze_stmt.set_table(database_name, database_id, table_name, table_schema->get_table_id(), + table_schema->get_table_type()); } return ret; } diff --git a/src/sql/resolver/ddl/ob_create_index_resolver.cpp b/src/sql/resolver/ddl/ob_create_index_resolver.cpp index 4538cc41c..7fdf4b76b 100644 --- a/src/sql/resolver/ddl/ob_create_index_resolver.cpp +++ b/src/sql/resolver/ddl/ob_create_index_resolver.cpp @@ -496,6 +496,9 @@ int ObCreateIndexResolver::resolve(const ParseNode &parse_tree) } else if (OB_ISNULL(tbl_schema)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("table schema is NULL", K(ret)); + } else if (tbl_schema->is_external_table()) { + ret = OB_NOT_SUPPORTED; + LOG_USER_ERROR(OB_NOT_SUPPORTED, "operation on external table"); } else { is_oracle_temp_table_ = (tbl_schema->is_oracle_tmp_table()); ObTableSchema &index_schema = crt_idx_stmt->get_create_index_arg().index_schema_; diff --git a/src/sql/resolver/ddl/ob_create_table_resolver.cpp b/src/sql/resolver/ddl/ob_create_table_resolver.cpp index 3331a8c88..0bd131b89 100644 --- a/src/sql/resolver/ddl/ob_create_table_resolver.cpp +++ b/src/sql/resolver/ddl/ob_create_table_resolver.cpp @@ -37,6 +37,7 @@ #include "observer/ob_server.h" #include "observer/omt/ob_tenant_config_mgr.h" #include "sql/resolver/cmd/ob_help_resolver.h" +#include "lib/charset/ob_template_helper.h" namespace oceanbase @@ -195,6 +196,41 @@ int ObCreateTableResolver::add_hidden_tablet_seq_col() return ret; } +int ObCreateTableResolver::add_hidden_external_table_pk_col() +{ + int ret = OB_SUCCESS; + uint64_t COL_IDS[2] = {OB_HIDDEN_FILE_ID_COLUMN_ID, OB_HIDDEN_LINE_NUMBER_COLUMN_ID}; + const char* COL_NAMES[2] = {OB_HIDDEN_FILE_ID_COLUMN_NAME, OB_HIDDEN_LINE_NUMBER_COLUMN_NAME}; + if (OB_ISNULL(stmt_)) { + ret = OB_INVALID_ARGUMENT; + SQL_RESV_LOG(WARN, "stmt is NULL", K(stmt_), K(ret)); + } else { + ObCreateTableStmt *create_table_stmt = static_cast(stmt_); + ObTableSchema &table_schema = create_table_stmt->get_create_table_arg().schema_; + for (int i = 0; OB_SUCC(ret) && i < array_elements(COL_IDS); i++) { + ObColumnSchemaV2 hidden_pk; + hidden_pk.reset(); + hidden_pk.set_column_id(COL_IDS[i]); + hidden_pk.set_data_type(ObIntType); + hidden_pk.set_nullable(false); + hidden_pk.set_is_hidden(true); + hidden_pk.set_charset_type(CHARSET_BINARY); + hidden_pk.set_collation_type(CS_TYPE_BINARY); + if (OB_FAIL(hidden_pk.set_column_name(COL_NAMES[i]))) { + SQL_RESV_LOG(WARN, "failed to set column name", K(ret)); + } else if (OB_FAIL(primary_keys_.push_back(COL_IDS[i]))) { + SQL_RESV_LOG(WARN, "failed to push_back column_id", K(ret)); + } else { + hidden_pk.set_rowkey_position(primary_keys_.count()); + if (OB_FAIL(table_schema.add_column(hidden_pk))) { + SQL_RESV_LOG(WARN, "add column to table_schema failed", K(ret), K(hidden_pk)); + } + } + } + } + return ret; +} + int ObCreateTableResolver::add_generated_hidden_column_for_udt(ObTableSchema &table_schema, ObSEArray &resolved_cols, ObColumnSchemaV2 &udt_column) @@ -439,23 +475,36 @@ int ObCreateTableResolver::resolve(const ParseNode &parse_tree) create_table_stmt->set_allocator(*allocator_); stmt_ = create_table_stmt; } - //resolve temporary option + //resolve temporary option or external table option if (OB_SUCC(ret)) { if (NULL != create_table_node->children_[0]) { - if (T_TEMPORARY != create_table_node->children_[0]->type_) { - ret = OB_INVALID_ARGUMENT; - SQL_RESV_LOG(WARN, "invalid argument.", - K(ret), K(create_table_node->children_[0]->type_)); - } else if (create_table_node->children_[5] != NULL) { //临时表不支持分区 - ret = OB_ERR_TEMPORARY_TABLE_WITH_PARTITION; - -// } else if (is_create_as_sel && is_mysql_mode) { //暂时不支持查询建mysql临时表 -// ret = OB_NOT_SUPPORTED; -// LOG_USER_ERROR(OB_NOT_SUPPORTED, "View/Table's column refers to a temporary table"); - } else { - is_temporary_table = true; - is_oracle_temp_table_ = (is_mysql_mode == false); - } + switch (create_table_node->children_[0]->type_) { + case T_TEMPORARY: + if (create_table_node->children_[5] != NULL) { //临时表不支持分区 + ret = OB_ERR_TEMPORARY_TABLE_WITH_PARTITION; + } else { + is_temporary_table = true; + is_oracle_temp_table_ = (is_mysql_mode == false); + } + break; + case T_EXTERNAL: { + uint64_t tenant_version = 0; + if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, tenant_version))) { + LOG_WARN("failed to get data version", K(ret)); + } else if (tenant_version < DATA_VERSION_4_2_0_0) { + ret = OB_NOT_SUPPORTED; + LOG_USER_ERROR(OB_NOT_SUPPORTED, "tenant data version is less than 4.2, external table"); + } else { + create_table_stmt->get_create_table_arg().schema_.set_table_type(EXTERNAL_TABLE); + is_external_table_ = true; + } + break; + } + default: + ret = OB_INVALID_ARGUMENT; + SQL_RESV_LOG(WARN, "invalid argument.", + K(ret), K(create_table_node->children_[0]->type_)); + } } } //resolve if_not_exists @@ -631,6 +680,19 @@ int ObCreateTableResolver::resolve(const ParseNode &parse_tree) } } + if (OB_SUCC(ret) && is_external_table_) { + //external table support check + ObTableSchema &table_schema = create_table_stmt->get_create_table_arg().schema_; + if (index_node_position_list.count() > 0 + || foreign_key_node_position_list.count() > 0 + || table_level_constraint_list.count() > 0 + || table_schema.get_constraint_count() > 0 + || is_create_as_sel) { + ret = OB_NOT_SUPPORTED; + LOG_USER_ERROR(OB_NOT_SUPPORTED, "operation on external table"); + } + } + // !!Attention!! resolve_partition_option should always call after resolve_table_options if (OB_SUCC(ret)) { ObTableSchema &table_schema = create_table_stmt->get_create_table_arg().schema_; @@ -641,6 +703,12 @@ int ObCreateTableResolver::resolve(const ParseNode &parse_tree) } } + if (OB_SUCC(ret) && create_table_stmt->get_create_table_arg().schema_.is_external_table()) { + if (OB_FAIL(add_hidden_external_table_pk_col())) { + LOG_WARN("fail to add hidden pk col for external table", K(ret)); + } + } + // 4.0 new heap table has hidden primary key (tablet seq) if (OB_SUCC(ret) && 0 == get_primary_key_size() && TOM_HEAP_ORGANIZED == table_mode_.organization_mode_) { @@ -1011,6 +1079,9 @@ int ObCreateTableResolver::resolve_primary_key_node(const ParseNode &pk_node, ret = OB_ERR_UNEXPECTED; SQL_RESV_LOG(WARN, "the num_child of primary_node is wrong.", K(ret), K(pk_node.num_child_), K(pk_node.children_)); + } else if (is_external_table_) { + ret = OB_NOT_SUPPORTED; + LOG_USER_ERROR(OB_NOT_SUPPORTED, "Primary key constraint on external table"); } else { ParseNode *column_list_node = pk_node.children_[0]; if (OB_ISNULL(column_list_node)) { @@ -1158,12 +1229,9 @@ int ObCreateTableResolver::resolve_table_elements(const ParseNode *node, ParseNode *element = node->children_[i]; CK (OB_NOT_NULL(element)); if (OB_FAIL(ret)) { - } else if (RESOLVE_NON_COL == resolve_rule && T_COLUMN_DEFINITION == element->type_) { - continue; - } else if (RESOLVE_COL_ONLY == resolve_rule && T_COLUMN_DEFINITION != element->type_) { - continue; - } - if (OB_FAIL(ret)) { + } else if ((RESOLVE_NON_COL == resolve_rule && T_COLUMN_DEFINITION == element->type_) + || (RESOLVE_COL_ONLY == resolve_rule && T_COLUMN_DEFINITION != element->type_)) { + //continue } else if (OB_LIKELY(T_COLUMN_DEFINITION == element->type_)) { ObColumnSchemaV2 column; column.set_tenant_id(tenant_id); @@ -1190,12 +1258,9 @@ int ObCreateTableResolver::resolve_table_elements(const ParseNode *node, ParseNode *element = node->children_[i]; CK (OB_NOT_NULL(element)); if (OB_FAIL(ret)) { - } else if (RESOLVE_NON_COL == resolve_rule && T_COLUMN_DEFINITION == element->type_) { + } else if ((RESOLVE_NON_COL == resolve_rule && T_COLUMN_DEFINITION == element->type_) + || (RESOLVE_COL_ONLY == resolve_rule && T_COLUMN_DEFINITION != element->type_)) { continue; - } else if (RESOLVE_COL_ONLY == resolve_rule && T_COLUMN_DEFINITION != element->type_) { - continue; - } - if (OB_FAIL(ret)) { } else if (OB_LIKELY(T_COLUMN_DEFINITION == element->type_)) { bool is_modify_column_visibility = false; const bool is_create_table_as = (RESOLVE_COL_ONLY == resolve_rule); @@ -1214,7 +1279,8 @@ int ObCreateTableResolver::resolve_table_elements(const ParseNode *node, is_modify_column_visibility, pk_name, is_oracle_temp_table_, - is_create_table_as))) { + is_create_table_as, + table_schema.is_external_table()))) { SQL_RESV_LOG(WARN, "resolve column definition failed", K(ret)); } else if (!column.is_xmltype() && // xmltype will check after hidden column generated OB_FAIL(check_default_value(column.get_cur_default_value(), @@ -1467,7 +1533,7 @@ int ObCreateTableResolver::resolve_table_elements(const ParseNode *node, } // Oracle 模式下,一个表至少有一个列为非 generated 列 - if (OB_SUCC(ret) && lib::is_oracle_mode()) { + if (OB_SUCC(ret) && lib::is_oracle_mode() && !table_schema.is_external_table()) { bool has_non_virtual_column = false; for (int64_t i = 0; OB_SUCC(ret) && !has_non_virtual_column && i < table_schema.get_column_count(); @@ -1484,6 +1550,22 @@ int ObCreateTableResolver::resolve_table_elements(const ParseNode *node, } } + if (OB_SUCC(ret) && table_schema.is_external_table()) { + bool all_virtual_column = true; + for (int64_t i = 0; OB_SUCC(ret) && i < table_schema.get_column_count(); ++i) { + const ObColumnSchemaV2 *column = table_schema.get_column_schema_by_idx(i); + CK (OB_NOT_NULL(column)); + if (OB_SUCC(ret) && !column->is_generated_column()) { + all_virtual_column = false; + break; + } + } + if (OB_SUCC(ret) && !all_virtual_column) { + ret = OB_NOT_SUPPORTED; //[TODO EXTERNAL-TABLE] + LOG_USER_ERROR(OB_NOT_SUPPORTED, "normal columns"); + } + } + // MySQL 模式下,一个表至少有一个非 hidden 列 if (OB_SUCC(ret) && lib::is_mysql_mode()) { bool has_non_hidden_column = false; @@ -2255,6 +2337,13 @@ int ObCreateTableResolver::set_table_option_to_schema(ObTableSchema &table_schem SQL_RESV_LOG(WARN, "set table_options failed", K(ret)); } } + + if (OB_SUCC(ret) && table_schema.is_external_table()) { + if (table_schema.get_external_file_format().empty() + || table_schema.get_external_file_location().empty()) + ret = OB_NOT_SUPPORTED; + LOG_USER_ERROR(OB_NOT_SUPPORTED, "Default format or location option for external table"); + } } return ret; } diff --git a/src/sql/resolver/ddl/ob_create_table_resolver.h b/src/sql/resolver/ddl/ob_create_table_resolver.h index eba07cb28..5c8db4860 100644 --- a/src/sql/resolver/ddl/ob_create_table_resolver.h +++ b/src/sql/resolver/ddl/ob_create_table_resolver.h @@ -71,6 +71,8 @@ private: int64_t get_primary_key_size() const; int add_primary_key_part(const common::ObString &column_name, common::ObArray &stats, int64_t &pk_data_length); int add_hidden_tablet_seq_col(); + int add_hidden_external_table_pk_col(); + int add_generated_hidden_column_for_udt(ObTableSchema &table_schema, ObSEArray &resolved_cols, ObColumnSchemaV2 &udt_column); diff --git a/src/sql/resolver/ddl/ob_ddl_resolver.cpp b/src/sql/resolver/ddl/ob_ddl_resolver.cpp index 28b64c507..630a68a86 100644 --- a/src/sql/resolver/ddl/ob_ddl_resolver.cpp +++ b/src/sql/resolver/ddl/ob_ddl_resolver.cpp @@ -37,6 +37,9 @@ #include "sql/resolver/ddl/ob_column_sequence_resolver.h" #include "share/ob_get_compat_mode.h" #include "sql/optimizer/ob_optimizer_util.h" +#include "sql/engine/cmd/ob_load_data_parser.h" +#include "sql/resolver/cmd/ob_load_data_stmt.h" + #include "sql/engine/expr/ob_expr_lob_utils.h" namespace oceanbase { @@ -104,7 +107,8 @@ ObDDLResolver::ObDDLResolver(ObResolverParams ¶ms) encryption_(), tablespace_id_(OB_INVALID_ID), table_dop_(DEFAULT_TABLE_DOP), - hash_subpart_num_(-1) + hash_subpart_num_(-1), + is_external_table_(false) { table_mode_.reset(); } @@ -1307,6 +1311,10 @@ int ObDDLResolver::resolve_table_option(const ParseNode *option_node, const bool tablegroup_name_.assign_ptr((char *)(option_node->children_[0]->str_value_), static_cast(option_node->children_[0]->str_len_)); tablegroup_id_ = OB_INVALID_ID; + if (is_external_table_ && !tablegroup_name_.trim().empty()) { + ret = OB_NOT_SUPPORTED; + LOG_USER_ERROR(OB_NOT_SUPPORTED, "Specifying tablegroup on external table"); + } } if (OB_SUCCESS == ret && stmt::T_ALTER_TABLE ==stmt_->get_stmt_type()) { if (OB_FAIL(alter_table_bitset_.add_member(ObAlterTableArg::TABLEGROUP_NAME))) { @@ -1884,6 +1892,9 @@ int ObDDLResolver::resolve_table_option(const ParseNode *option_node, const bool ret = OB_NOT_SUPPORTED; LOG_WARN("set tablespace for index is not supported", K(ret)); LOG_USER_ERROR(OB_NOT_SUPPORTED, "specify tablespace in index option"); + } else if (is_external_table_) { + ret = OB_NOT_SUPPORTED; + LOG_USER_ERROR(OB_NOT_SUPPORTED, "Specifying tablegroup on external table"); } else { ParseNode *tablespace_node = option_node->children_[0]; const ObTablespaceSchema *tablespace_schema = NULL; @@ -1933,6 +1944,167 @@ int ObDDLResolver::resolve_table_option(const ParseNode *option_node, const bool case T_AVG_ROW_LENGTH: { break; } + case T_EXTERNAL_FILE_LOCATION: { + ParseNode *string_node = NULL; + ObTableSchema *schema = NULL; + if (stmt::T_CREATE_TABLE != stmt_->get_stmt_type()) { + ret = OB_ERR_UNEXPECTED; //TODO-EXTERNAL-TABLE add new error code + LOG_WARN("invalid file format option", K(ret)); + } else { + ObCreateTableArg &arg = static_cast(stmt_)->get_create_table_arg(); + if (!arg.schema_.is_external_table()) { + ret = OB_NOT_SUPPORTED; + LOG_USER_ERROR(OB_NOT_SUPPORTED, "location option"); + } else if (option_node->num_child_ != 1 || OB_ISNULL(string_node = option_node->children_[0])) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected child num", K(option_node->num_child_)); + } else { + ObString url = ObString(string_node->str_len_, string_node->str_value_).trim_space_only(); + ObSqlString tmp_location; + ObBackupStorageInfo storage_info; + char storage_info_buf[OB_MAX_BACKUP_STORAGE_INFO_LENGTH] = { 0 }; + + if (url.prefix_match_ci(OB_OSS_PREFIX)) { + url += strlen(OB_OSS_PREFIX); + storage_info.device_type_ = OB_STORAGE_OSS; + OZ (tmp_location.append(OB_OSS_PREFIX)); + } else if (url.prefix_match_ci(OB_COS_PREFIX)) { + url += strlen(OB_COS_PREFIX); + storage_info.device_type_ = OB_STORAGE_COS; + OZ (tmp_location.append(OB_COS_PREFIX)); + } else if (url.prefix_match_ci(OB_FILE_PREFIX)) { + url += strlen(OB_FILE_PREFIX); + storage_info.device_type_ = OB_STORAGE_FILE; + OZ (tmp_location.append(OB_FILE_PREFIX)); + } else { + storage_info.device_type_ = OB_STORAGE_FILE; + if (url.empty()) { + ret = OB_DIR_NOT_EXIST; + LOG_USER_ERROR(OB_DIR_NOT_EXIST); + } + OZ (tmp_location.append(OB_FILE_PREFIX)); + } + + url = url.trim_space_only(); + + if (OB_STORAGE_FILE != storage_info.device_type_) { + OZ (ObSQLUtils::split_remote_object_storage_url(url, storage_info)); + } + OZ (tmp_location.append(url)); + OZ (storage_info.get_storage_info_str(storage_info_buf, sizeof(storage_info_buf), true)); + OZ (arg.schema_.set_external_file_location(tmp_location.string())); + OZ (arg.schema_.set_external_file_location_access_info(storage_info_buf)); + } + } + break; + } + case T_EXTERNAL_FILE_FORMAT: { + if (stmt::T_CREATE_TABLE != stmt_->get_stmt_type()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid file format option", K(ret)); + } else { + ObCreateTableArg &arg = static_cast(stmt_)->get_create_table_arg(); + if (!arg.schema_.is_external_table()) { + ret = OB_NOT_SUPPORTED; + LOG_USER_ERROR(OB_NOT_SUPPORTED, "format option"); + } else { + bool has_file_format = false; + ObExternalFileFormat format; + format.csv_format_.init_format(ObDataInFileStruct(), 10, CS_TYPE_UTF8MB4_BIN); + // 1. resolve file type and encoding type + for (int i = 0; OB_SUCC(ret) && i < option_node->num_child_; ++i) { + if (OB_ISNULL(option_node->children_[i])) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed. get unexpected NULL ptr", K(ret), K(option_node->num_child_)); + } else if (T_EXTERNAL_FILE_FORMAT_TYPE == option_node->children_[i]->type_ + || T_CHARSET == option_node->children_[i]->type_) { + if (OB_FAIL(resolve_file_format(option_node->children_[i], format))) { + LOG_WARN("fail to resolve file format", K(ret)); + } + has_file_format |= (T_EXTERNAL_FILE_FORMAT_TYPE == option_node->children_[i]->type_); + } + } + if (OB_SUCC(ret) && !has_file_format) { + ret = OB_NOT_SUPPORTED; + LOG_USER_ERROR(OB_NOT_SUPPORTED, "format"); + } + // 2. resolve other format value + for (int i = 0; OB_SUCC(ret) && i < option_node->num_child_; ++i) { + if (OB_ISNULL(option_node->children_[i])) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed. get unexpected NULL ptr", K(ret), K(option_node->num_child_)); + } else if (T_EXTERNAL_FILE_FORMAT_TYPE == option_node->children_[i]->type_ || + T_CHARSET == option_node->children_[i]->type_) { + } else if (OB_FAIL(resolve_file_format(option_node->children_[i], format))) { + LOG_WARN("fail to resolve file format", K(ret)); + } + } + if (OB_SUCC(ret)) { + bool is_valid = true; + if (OB_FAIL(check_format_valid(format, is_valid))) { + LOG_WARN("check format valid failed", K(ret)); + } else if (!is_valid) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("file format is not valid", K(ret)); + } else { + char *buf = NULL; + int64_t buf_len = DEFAULT_BUF_LENGTH / 2; + int64_t pos = 0; + do { + buf_len *= 2; + if (OB_ISNULL(buf = static_cast(allocator_->alloc(buf_len)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("fail to alloc buf", K(ret), K(buf_len)); + } else { + pos = format.to_string(buf, buf_len); + } + } while (OB_SUCC(ret) && pos >= buf_len); + if (OB_SUCC(ret)) { + arg.schema_.set_external_file_format(ObString(pos, buf)); + LOG_DEBUG("debug external file format", + K(arg.schema_.get_external_file_format())); + } + } + } + } + } + break; + } + case T_EXTERNAL_FILE_PATTERN: { + if (stmt::T_CREATE_TABLE != stmt_->get_stmt_type()) { + ret = OB_ERR_UNEXPECTED; //TODO-EXTERNAL-TABLE add new error code + LOG_WARN("invalid file format option", K(ret)); + } else { + ObCreateTableArg &arg = static_cast(stmt_)->get_create_table_arg(); + if (!arg.schema_.is_external_table()) { + ret = OB_NOT_SUPPORTED; + ObSqlString err_msg; + err_msg.append_fmt("Using PATTERN as a CREATE TABLE option"); + LOG_USER_ERROR(OB_NOT_SUPPORTED, err_msg.ptr()); + LOG_WARN("using PATTERN as a table option is support in external table only", K(ret)); + } else if (option_node->num_child_ != 1 || OB_ISNULL(option_node->children_[0])) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected child num", K(option_node->num_child_)); + } else if (0 == option_node->children_[0]->str_len_) { + ObSqlString err_msg; + err_msg.append_fmt("empty regular expression"); + ret = OB_ERR_REGEXP_ERROR; + LOG_USER_ERROR(OB_ERR_REGEXP_ERROR, err_msg.ptr()); + LOG_WARN("empty regular expression", K(ret)); + } else { + ObString pattern(option_node->children_[0]->str_len_, + option_node->children_[0]->str_value_); + if (OB_FAIL(ObSQLUtils::convert_sql_text_to_schema_for_storing(*allocator_, + session_info_->get_dtc_params(), + pattern))) { + LOG_WARN("failed to convert pattern to utf8", K(ret)); + } else if (OB_FAIL(arg.schema_.set_external_file_pattern(pattern))) { + LOG_WARN("failed to set external file pattern", K(ret), K(pattern)); + } + } + } + break; + } default: { /* won't be here */ ret = OB_ERR_UNEXPECTED; @@ -1945,6 +2117,154 @@ int ObDDLResolver::resolve_table_option(const ParseNode *option_node, const bool return ret; } +int ObDDLResolver::resolve_file_format(const ParseNode *node, ObExternalFileFormat &format) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(node) || node->num_child_ != 1 || OB_ISNULL(node->children_[0]) || + OB_ISNULL(params_.session_info_) || OB_ISNULL(params_.expr_factory_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid parse node", K(ret)); + } else { + switch (node->type_) { + case T_EXTERNAL_FILE_FORMAT_TYPE: { + ObString string_v = ObString(node->children_[0]->str_len_, node->children_[0]->str_value_).trim_space_only(); + if (0 == string_v.case_compare("CSV")) { + format.format_type_ = ObExternalFileFormat::CSV_FORMAT; + } else { + ObSqlString err_msg; + err_msg.append_fmt("format '%.*s'", string_v.length(), string_v.ptr()); + ret = OB_NOT_SUPPORTED; + LOG_USER_ERROR(OB_NOT_SUPPORTED, err_msg.ptr()); + LOG_WARN("failed. external file format type is not supported yet", K(ret), + KPHEX(string_v.ptr(), string_v.length())); + } + break; + } + case T_FIELD_TERMINATED_STR: { + if (OB_FAIL(ObResolverUtils::resolve_file_format_string_value(node->children_[0], + format.csv_format_.cs_type_, + params_, + format.csv_format_.field_term_str_))) { + LOG_WARN("failed to resolve file format field terminated str", K(ret)); + } else { + format.origin_file_format_str_.origin_field_term_str_.assign_ptr(node->str_value_, node->str_len_); + } + break; + } + case T_LINE_TERMINATED_STR: { + if (OB_FAIL(ObResolverUtils::resolve_file_format_string_value(node->children_[0], + format.csv_format_.cs_type_, + params_, + format.csv_format_.line_term_str_))) { + LOG_WARN("failed to resolve file format line terminated str", K(ret)); + } else { + format.origin_file_format_str_.origin_line_term_str_.assign_ptr(node->str_value_, node->str_len_); + } + break; + } + case T_ESCAPED_STR: { + ObString string_v; + if (OB_FAIL(ObResolverUtils::resolve_file_format_string_value(node->children_[0], + format.csv_format_.cs_type_, + params_, + string_v))) { + LOG_WARN("failed to resolve file format escape str", K(ret)); + } else if (string_v.length() > 1) { + ret = OB_ERR_INVALID_ESCAPE_CHAR_LENGTH; + LOG_USER_ERROR(OB_ERR_INVALID_ESCAPE_CHAR_LENGTH); + LOG_WARN("failed. ESCAPE CHAR length is wrong", K(ret), KPHEX(string_v.ptr(), + string_v.length())); + } else if (string_v.length() == 1) { + format.csv_format_.field_escaped_char_ = string_v.ptr()[0]; + } else { + format.csv_format_.field_escaped_char_ = INT64_MAX; // default value + } + if (OB_SUCC(ret)) { + format.origin_file_format_str_.origin_field_escaped_str_.assign_ptr(node->str_value_, node->str_len_); + } + break; + } + case T_CLOSED_STR: { + ObString string_v; + if (OB_FAIL(ObResolverUtils::resolve_file_format_string_value(node->children_[0], + format.csv_format_.cs_type_, + params_, + string_v))) { + LOG_WARN("failed to resolve file format close str", K(ret)); + } else if (string_v.length() > 1) { + ret = OB_WRONG_FIELD_TERMINATORS; + LOG_USER_ERROR(OB_WRONG_FIELD_TERMINATORS); + LOG_WARN("failed. ENCLOSED CHAR length is wrong", K(ret), KPHEX(string_v.ptr(), + string_v.length())); + } else if (string_v.length() == 1) { + format.csv_format_.field_enclosed_char_ = string_v.ptr()[0]; + } else { + format.csv_format_.field_enclosed_char_ = INT64_MAX; // default value + } + if (OB_SUCC(ret)) { + format.origin_file_format_str_.origin_field_enclosed_str_.assign_ptr(node->str_value_, + node->str_len_); + } + break; + } + case T_CHARSET: { + ObString string_v = ObString(node->children_[0]->str_len_, node->children_[0]->str_value_).trim_space_only(); + ObCharsetType cs_type = CHARSET_INVALID; + if (CHARSET_INVALID == (cs_type = ObCharset::charset_type(string_v))) { + ret = OB_ERR_UNSUPPORTED_CHARACTER_SET; + LOG_USER_ERROR(OB_ERR_UNSUPPORTED_CHARACTER_SET); + LOG_WARN("failed. Encoding type is unsupported", K(ret), KPHEX(string_v.ptr(), + string_v.length())); + } else { + format.csv_format_.cs_type_ = cs_type; + } + break; + } + case T_SKIP_HEADER: { + format.csv_format_.skip_header_lines_ = node->children_[0]->value_; + break; + } + case T_SKIP_BLANK_LINE: { + format.csv_format_.skip_blank_lines_ = node->children_[0]->value_; + break; + } + case T_TRIM_SPACE: { + format.csv_format_.trim_space_ = node->children_[0]->value_; + break; + } + case T_NULL_IF_EXETERNAL: { + if (OB_FAIL(format.csv_format_.null_if_.allocate_array(*allocator_, + node->children_[0]->num_child_))) { + LOG_WARN("allocate array failed", K(ret)); + } + for (int64_t i = 0; OB_SUCC(ret) && i < node->children_[0]->num_child_; i++) { + if (OB_FAIL(ObResolverUtils::resolve_file_format_string_value( + node->children_[0]->children_[i], + format.csv_format_.cs_type_, + params_, + format.csv_format_.null_if_.at(i)))) { + LOG_WARN("failed to resolve file format line terminated str", K(ret)); + } + } + if (OB_SUCC(ret)) { + format.origin_file_format_str_.origin_null_if_str_.assign_ptr(node->str_value_, node->str_len_); + } + break; + } + case T_EMPTY_FIELD_AS_NULL: { + format.csv_format_.empty_field_as_null_ = node->children_[0]->value_; + break; + } + default: { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid file format option", K(ret), K(node->type_)); + } + } + } + return ret; +} + + int ObDDLResolver::resolve_column_definition_ref(ObColumnSchemaV2 &column, ParseNode *node /* column_definition_def */, bool is_resolve_for_alter_table) @@ -1999,6 +2319,24 @@ int ObDDLResolver::resolve_column_definition_ref(ObColumnSchemaV2 &column, return ret; } +int ObDDLResolver::check_format_valid(const ObExternalFileFormat &format, bool &is_valid) +{ + int ret = OB_SUCCESS; + if (!format.csv_format_.line_term_str_.empty() && !format.csv_format_.field_term_str_.empty()) { + if (0 == MEMCMP(format.csv_format_.field_term_str_.ptr(), + format.csv_format_.line_term_str_.ptr(), + std::min(format.csv_format_.field_term_str_.length(), + format.csv_format_.line_term_str_.length()))) { + is_valid = false; + LOG_USER_WARN(OB_NOT_SUPPORTED, + "LINE_DELIMITER or FIELD_DELIMITER cannot be a substring of the delimiter for the other"); + LOG_WARN("LINE_DELIMITER or FIELD_DELIMITER cann't be a substring of the other's", K(ret), + K(format.csv_format_.line_term_str_), K(format.csv_format_.field_term_str_)); + } + } + return ret; +} + int ObDDLResolver::resolve_column_name(common::ObString &col_name, ParseNode *node/* column_name */) { int ret = OB_SUCCESS; @@ -2138,7 +2476,8 @@ int ObDDLResolver::resolve_column_definition(ObColumnSchemaV2 &column, bool &is_modify_column_visibility, common::ObString &pk_name, const bool is_oracle_temp_table, - const bool is_create_table_as) + const bool is_create_table_as, + const bool is_external_table) { int ret = OB_SUCCESS; bool is_modify_column = stmt::T_ALTER_TABLE == stmt_->get_stmt_type() @@ -2175,11 +2514,11 @@ int ObDDLResolver::resolve_column_definition(ObColumnSchemaV2 &column, if (OB_ISNULL(type_node)) { if (lib::is_oracle_mode() && (is_modify_column - || GEN_COLUMN_DEFINITION_NUM_CHILD == node->num_child_ + || (GEN_COLUMN_DEFINITION_NUM_CHILD == node->num_child_ && !is_external_table) //external table need an explicit defination || is_create_table_as)) { //在Oracle模式下,以下情况允许data_type node为空 // 1. 在alter table column中 - // 2. 在生成列的定义中 + // 2. 在生成列的定义中,但是外表的生成列不允许为空 // 3. 在create table as中 if (is_create_table_as) { // create table as 的 data_type 为空,但是为了能够add_column,先mock一个date type, @@ -2321,67 +2660,100 @@ int ObDDLResolver::resolve_column_definition(ObColumnSchemaV2 &column, } } } - if (is_modify_column && column.is_identity_column() && COLUMN_DEFINITION_NUM_CHILD == node->num_child_) { - // modify column from identity to normal, do nothing - if (!column.get_meta_type().is_numeric_type()) { - ret = OB_ERR_IDENTITY_COLUMN_MUST_BE_NUMERIC_TYPE; - LOG_USER_ERROR(OB_ERR_IDENTITY_COLUMN_MUST_BE_NUMERIC_TYPE); - } - } else if (OB_SUCC(ret) && GEN_COLUMN_DEFINITION_NUM_CHILD == node->num_child_) { - //处理identity column的定义 - if (OB_NOT_NULL(node->children_[4]) && node->children_[4]->type_ == T_IDENTITY_COLUMN) { + if (OB_SUCC(ret)) { + if (is_modify_column && column.is_identity_column() && COLUMN_DEFINITION_NUM_CHILD == node->num_child_) { + // modify column from identity to normal, do nothing if (!column.get_meta_type().is_numeric_type()) { ret = OB_ERR_IDENTITY_COLUMN_MUST_BE_NUMERIC_TYPE; LOG_USER_ERROR(OB_ERR_IDENTITY_COLUMN_MUST_BE_NUMERIC_TYPE); - } else if (OB_FAIL(resolve_identity_column_definition(column, node))) { - LOG_WARN("resolve identity column failed", K(ret)); } - } else if (lib::is_oracle_mode() //处理生成列的定义 - && (column.get_meta_type().is_blob() || column.get_meta_type().is_clob())) { - ret = OB_ERR_INVALID_VIRTUAL_COLUMN_TYPE; - LOG_WARN("invalid use of blob/clob type with generate defnition", - K(ret), K(column.get_meta_type())); - LOG_USER_ERROR(OB_NOT_SUPPORTED, "generate column with blob type"); - } else if (lib::is_oracle_mode() && is_create_table_as) { - ret = OB_NOT_SUPPORTED; - LOG_WARN("generate column in create table as not support", K(ret)); - LOG_USER_ERROR(OB_NOT_SUPPORTED, "specify generate column in create table as"); - } else { - ParseNode *expr_node = NULL; - if (node->children_[6] != NULL && node->children_[6]->num_child_ == IDEN_OPTION_DEFINITION_NUM_CHILD && - node->children_[6]->children_ != NULL && node->children_[6]->children_[0]->type_ != T_CONSTR_ALWAYS) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("generate column can only start with generated always.", K(ret)); - } else if (OB_ISNULL(expr_node = node->children_[3])) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("expr_node is null"); + } else if (GEN_COLUMN_DEFINITION_NUM_CHILD == node->num_child_) { + //处理identity column的定义 + if (OB_NOT_NULL(node->children_[4]) && node->children_[4]->type_ == T_IDENTITY_COLUMN) { + if (!column.get_meta_type().is_numeric_type()) { + ret = OB_ERR_IDENTITY_COLUMN_MUST_BE_NUMERIC_TYPE; + LOG_USER_ERROR(OB_ERR_IDENTITY_COLUMN_MUST_BE_NUMERIC_TYPE); + } else if (OB_FAIL(resolve_identity_column_definition(column, node))) { + LOG_WARN("resolve identity column failed", K(ret)); + } } else { - ObString expr_str(expr_node->str_len_, expr_node->str_value_); - ObObj default_value; - /* bugfix: - * in NO_BACKSLAH_ESCAPES sql_mode, mysql will convert '\\' to '\\\\'; - */ - bool is_no_backslash_escapes = false; - IS_NO_BACKSLASH_ESCAPES(session_info_->get_sql_mode(), is_no_backslash_escapes); - if (is_no_backslash_escapes && - OB_FAIL(ObSQLUtils::convert_escape_char(*allocator_, expr_str, expr_str))) { - LOG_WARN("convert escape char fail", K(ret)); - } else if (OB_FAIL(ObSQLUtils::convert_sql_text_to_schema_for_storing(*allocator_, - session_info_->get_dtc_params(), expr_str))) { - LOG_WARN("fail to convert sql text", K(ret), K(expr_str)); + //处理生成列的定义 + if (lib::is_oracle_mode() + && (column.get_meta_type().is_blob() || column.get_meta_type().is_clob()) + && !is_external_table) { + ret = OB_ERR_INVALID_VIRTUAL_COLUMN_TYPE; + LOG_WARN("invalid use of blob/clob type with generate defnition", + K(ret), K(column.get_meta_type())); + LOG_USER_ERROR(OB_NOT_SUPPORTED, "generate column with blob type"); + } else if (lib::is_oracle_mode() && is_create_table_as) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("generate column in create table as not support", K(ret)); + LOG_USER_ERROR(OB_NOT_SUPPORTED, "specify generate column in create table as"); } else { - default_value.set_varchar(expr_str); - default_value.set_collation_type(ObCharset::get_system_collation()); - if (OB_FAIL(column.set_cur_default_value(default_value))) { - LOG_WARN("set current default value failed", K(ret)); - } else if (node->children_[4] != NULL && node->children_[4]->type_ == T_STORED_COLUMN) { - column.add_column_flag(STORED_GENERATED_COLUMN_FLAG); + ParseNode *expr_node = NULL; + if (node->children_[6] != NULL && node->children_[6]->num_child_ == IDEN_OPTION_DEFINITION_NUM_CHILD && + node->children_[6]->children_ != NULL && node->children_[6]->children_[0]->type_ != T_CONSTR_ALWAYS) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("generate column can only start with generated always.", K(ret)); + } else if (OB_ISNULL(expr_node = node->children_[3])) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("expr_node is null"); } else { - column.add_column_flag(VIRTUAL_GENERATED_COLUMN_FLAG); + ObString expr_str(expr_node->str_len_, expr_node->str_value_); + ObObj default_value; + /* bugfix: + * in NO_BACKSLAH_ESCAPES sql_mode, mysql will convert '\\' to '\\\\'; + */ + bool is_no_backslash_escapes = false; + IS_NO_BACKSLASH_ESCAPES(session_info_->get_sql_mode(), is_no_backslash_escapes); + if (is_no_backslash_escapes && + OB_FAIL(ObSQLUtils::convert_escape_char(*allocator_, expr_str, expr_str))) { + LOG_WARN("convert escape char fail", K(ret)); + } else if (OB_FAIL(ObSQLUtils::convert_sql_text_to_schema_for_storing(*allocator_, + session_info_->get_dtc_params(), expr_str))) { + LOG_WARN("fail to convert sql text", K(ret), K(expr_str)); + } else { + default_value.set_varchar(expr_str); + default_value.set_collation_type(ObCharset::get_system_collation()); + if (OB_FAIL(column.set_cur_default_value(default_value))) { + LOG_WARN("set current default value failed", K(ret)); + } else if ((node->children_[4] != NULL && node->children_[4]->type_ == T_STORED_COLUMN) + || (node->children_[4] == NULL && is_external_table)) { + column.add_column_flag(STORED_GENERATED_COLUMN_FLAG); + } else { + if (is_external_table) { + ret = OB_NOT_SUPPORTED; + LOG_USER_ERROR(OB_NOT_SUPPORTED, "virtual column"); + } + column.add_column_flag(VIRTUAL_GENERATED_COLUMN_FLAG); + } + } + if (OB_SUCC(ret) && is_pad_char_to_full_length(session_info_->get_sql_mode())) { + column.add_column_flag(PAD_WHEN_CALC_GENERATED_COLUMN_FLAG); + } } } - if (OB_SUCC(ret) && is_pad_char_to_full_length(session_info_->get_sql_mode())) { - column.add_column_flag(PAD_WHEN_CALC_GENERATED_COLUMN_FLAG); + } + } else if (is_external_table) { + //mock generated column + uint64_t file_column_idx = column.get_column_id() - OB_APP_MIN_COLUMN_ID + 1; + ObSqlString temp_str; + ObString mock_gen_column_str; + ObObj default_value; + if (OB_FAIL(temp_str.append_fmt("%s%lu", N_EXTERNAL_FILE_COLUMN_PREFIX, file_column_idx))) { + LOG_WARN("fail to append sql str", K(ret)); + } else if (OB_FAIL(ob_write_string(*allocator_, temp_str.string(), mock_gen_column_str))) { + LOG_WARN("fail to write string", K(ret)); + } else { + default_value.set_varchar(mock_gen_column_str); + default_value.set_collation_type(ObCharset::get_system_collation()); + if (OB_FAIL(column.set_cur_default_value(default_value))) { + LOG_WARN("set current default value failed", K(ret)); + } else { + column.add_column_flag(STORED_GENERATED_COLUMN_FLAG); + if (is_pad_char_to_full_length(session_info_->get_sql_mode())) { + column.add_column_flag(PAD_WHEN_CALC_GENERATED_COLUMN_FLAG); + } } } } @@ -2390,7 +2762,7 @@ int ObDDLResolver::resolve_column_definition(ObColumnSchemaV2 &column, ParseNode *attrs_node = node->children_[2]; if (attrs_node != NULL) { if (column.is_generated_column()) { - if (OB_FAIL(resolve_generated_column_attribute(column, attrs_node, resolve_stat))) { + if (OB_FAIL(resolve_generated_column_attribute(column, attrs_node, resolve_stat, is_external_table))) { LOG_WARN("resolve generated column attribute failed", K(ret)); } } else if (column.is_identity_column()) { @@ -2989,7 +3361,8 @@ int ObDDLResolver::resolve_normal_column_attribute_foreign_key(ObColumnSchemaV2 int ObDDLResolver::resolve_generated_column_attribute(ObColumnSchemaV2 &column, ParseNode *attrs_node, - ObColumnResolveStat &resolve_stat) + ObColumnResolveStat &resolve_stat, + const bool is_external_table) { int ret = OB_SUCCESS; bool is_add_column = false; @@ -3002,7 +3375,10 @@ int ObDDLResolver::resolve_generated_column_attribute(ObColumnSchemaV2 &column, LOG_DEBUG("resolve generated column attr", K(attr_node->type_), K(resolve_stat)); switch (attr_node->type_) { case T_CONSTR_NOT_NULL: - if (is_oracle_mode()) { + if (is_external_table) { + ret = OB_NOT_SUPPORTED; + LOG_USER_ERROR(OB_NOT_SUPPORTED, "Null constraint on external table columns"); + } else if (lib::is_oracle_mode()) { if (resolve_stat.is_set_not_null_ || resolve_stat.is_set_null_) { ret = OB_ERR_DUPLICATE_NULL_SPECIFICATION; LOG_WARN("duplicate NULL specifications", K(ret)); @@ -3048,6 +3424,10 @@ int ObDDLResolver::resolve_generated_column_attribute(ObColumnSchemaV2 &column, resolve_stat.is_set_null_ = true; break; case T_CONSTR_PRIMARY_KEY: { + if (is_external_table) { + ret = OB_NOT_SUPPORTED; + LOG_USER_ERROR(OB_NOT_SUPPORTED, "Primary key constraint on external table columns"); + } else { // if (column.is_stored_generated_column()) { // resolve_stat.is_primary_key_ = true; // primary key should not be nullable @@ -3057,10 +3437,16 @@ int ObDDLResolver::resolve_generated_column_attribute(ObColumnSchemaV2 &column, LOG_USER_ERROR(OB_ERR_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN, "Defining a generated column as primary key"); // } + } break; } case T_CONSTR_UNIQUE_KEY: { - resolve_stat.is_unique_key_ = true; + if (is_external_table) { + ret = OB_NOT_SUPPORTED; + LOG_USER_ERROR(OB_NOT_SUPPORTED, "Unique constraint on external table columns"); + } else { + resolve_stat.is_unique_key_ = true; + } break; } case T_COMMENT:{ @@ -3117,6 +3503,9 @@ int ObDDLResolver::resolve_generated_column_attribute(ObColumnSchemaV2 &column, "Adding column-level check cst while altering table not supported", K(ret), K(stmt_->stmt_type_)); LOG_USER_ERROR(OB_NOT_SUPPORTED, "Add column-level check constraint while altering table"); + } else if (is_external_table) { + ret = OB_NOT_SUPPORTED; + LOG_USER_ERROR(OB_NOT_SUPPORTED, "Check constraint on external table columns"); } else { ObCreateTableStmt *create_table_stmt = static_cast(stmt_); if (OB_FAIL(resolve_normal_column_attribute_check_cons(column, @@ -3139,6 +3528,16 @@ int ObDDLResolver::resolve_generated_column_attribute(ObColumnSchemaV2 &column, } break; } + case T_CONSTR_DEFAULT: { + if (is_external_table) { + ret = OB_NOT_SUPPORTED; + LOG_USER_ERROR(OB_NOT_SUPPORTED, "DEFAULT constraint on external table columns"); + } else { + ret = OB_ERR_PARSER_SYNTAX; + SQL_RESV_LOG(WARN, "Wrong column attribute", K(ret), K(attr_node->type_)); + } + break; + } default: // won't be here ret = OB_ERR_PARSER_SYNTAX; SQL_RESV_LOG(WARN, "Wrong column attribute", K(ret), K(attr_node->type_)); @@ -4881,6 +5280,7 @@ int ObDDLResolver::check_default_value(ObObj &default_value, } } if (OB_SUCC(ret) && column.get_meta_type().is_null()) { + //column type not defined, use the deduced type from generated column expr if (expr->get_result_type().is_null()) { ObAccuracy varchar_accuracy(0); column.set_data_type(ObVarcharType); @@ -8550,7 +8950,7 @@ int ObDDLResolver::resolve_partition_node(ObPartitionedStmt *stmt, } } - if (OB_SUCC(ret)) { + if (OB_SUCC(ret) && !table_schema.is_external_table()) { if (OB_FAIL(check_and_set_partition_names(stmt, table_schema))) { LOG_WARN("failed to check and set partition names", K(ret)); } diff --git a/src/sql/resolver/ddl/ob_ddl_resolver.h b/src/sql/resolver/ddl/ob_ddl_resolver.h index f3d904590..97a02de63 100644 --- a/src/sql/resolver/ddl/ob_ddl_resolver.h +++ b/src/sql/resolver/ddl/ob_ddl_resolver.h @@ -34,6 +34,7 @@ struct ObObjCastParams; } namespace sql { +struct ObExternalFileFormat; struct PartitionInfo { share::schema::ObPartitionLevel part_level_; @@ -467,7 +468,8 @@ protected: bool &is_modify_column_visibility, common::ObString &pk_name, const bool is_oracle_temp_table = false, - const bool is_create_table_as = false); + const bool is_create_table_as = false, + const bool is_external_table = false); int resolve_uk_name_from_column_attribute( ParseNode *attrs_node, common::ObString &uk_name); @@ -495,7 +497,8 @@ protected: ObCreateTableStmt *create_table_stmt); int resolve_generated_column_attribute(share::schema::ObColumnSchemaV2 &column, ParseNode *attrs_node, - ObColumnResolveStat &reslove_stat); + ObColumnResolveStat &reslove_stat, + const bool is_external_table); int resolve_identity_column_attribute(share::schema::ObColumnSchemaV2 &column, ParseNode *attrs_node, ObColumnResolveStat &reslove_stat, @@ -838,6 +841,10 @@ protected: int check_and_set_individual_subpartition_names(ObPartitionedStmt *stmt, share::schema::ObTableSchema &table_schema); + int resolve_file_format(const ParseNode *node, ObExternalFileFormat &format); + + int check_format_valid(const ObExternalFileFormat &format, bool &is_valid); + void reset(); int64_t block_size_; int64_t consistency_level_; @@ -894,6 +901,7 @@ protected: int64_t tablespace_id_; int64_t table_dop_; // default value is 1 int64_t hash_subpart_num_; + bool is_external_table_; private: template DISALLOW_COPY_AND_ASSIGN(ObDDLResolver); diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index d45a21bae..f95a81ebc 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -4739,6 +4739,7 @@ int ObDMLResolver::resolve_base_or_alias_table_item_normal(uint64_t tenant_id, item->alias_name_ = tschema->get_table_name_str(); item->ddl_schema_version_ = tschema->get_schema_version(); item->ddl_table_id_ = tschema->get_table_id(); + item->table_type_ = tschema->get_table_type(); } else { const ObTableSchema *tab_schema = nullptr; if (OB_FAIL(schema_checker_->get_table_schema(session_info_->get_effective_tenant_id(), tschema->get_data_table_id(), tab_schema))) { @@ -4753,6 +4754,7 @@ int ObDMLResolver::resolve_base_or_alias_table_item_normal(uint64_t tenant_id, item->alias_name_ = tab_schema->get_table_name_str(); item->ddl_schema_version_ = tschema->get_schema_version(); item->ddl_table_id_ = tschema->get_table_id(); + item->table_type_ = tschema->get_table_type(); } } if (OB_SUCC(ret)) { @@ -4821,6 +4823,7 @@ int ObDMLResolver::resolve_base_or_alias_table_item_normal(uint64_t tenant_id, item->is_system_table_ = tschema->is_sys_table(); item->is_view_table_ = tschema->is_view_table(); item->ddl_schema_version_ = tschema->get_schema_version(); + item->table_type_ = tschema->get_table_type(); if (item->ref_id_ == OB_INVALID_ID) { ret = OB_TABLE_NOT_EXIST; LOG_USER_ERROR(OB_TABLE_NOT_EXIST, to_cstring(db_name), to_cstring(tbl_name)); @@ -4917,6 +4920,7 @@ int ObDMLResolver::resolve_base_or_alias_table_item_dblink(uint64_t dblink_id, item->is_index_table_ = false; item->is_system_table_ = false; item->is_view_table_ = false; + item->table_type_ = MAX_TABLE_TYPE; item->synonym_name_ = synonym_name; item->synonym_db_name_ = synonym_db_name; // dblink info. @@ -7122,6 +7126,29 @@ int ObDMLResolver::resolve_generated_column_expr(const ObString &expr_str, ret = OB_ERR_UNEXPECTED; LOG_WARN("invalid exor", K(*real_ref_expr), K(ret)); } + } else if (table_schema->is_external_table() + && ObResolverUtils::is_external_file_column_name(columns.at(i).col_name_)) { + uint64_t file_column_idx = UINT64_MAX; + if (OB_ISNULL(stmt)) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid argument", K(ret)); + } else if (OB_FAIL(ObResolverUtils::calc_file_column_idx(columns.at(i).col_name_, file_column_idx))) { + LOG_WARN("fail to calc file column idx", K(ret)); + } else if (nullptr == (real_ref_expr = ObResolverUtils::find_file_column_expr( + pseudo_external_file_col_exprs_, table_item.table_id_, file_column_idx))) { + ObExternalFileFormat format; + if (OB_FAIL(format.load_from_string(table_schema->get_external_file_format(), *params_.allocator_))) { + LOG_WARN("load from string failed", K(ret)); + } else if (OB_FAIL(ObResolverUtils::build_file_column_expr(*params_.expr_factory_, *params_.session_info_, + table_item.table_id_, table_item.table_name_, + columns.at(i).col_name_, file_column_idx, real_ref_expr, + format.csv_format_.cs_type_))) { + LOG_WARN("fail to build external table file column expr", K(ret)); + } else if (OB_FAIL(pseudo_external_file_col_exprs_.push_back(real_ref_expr))) { + LOG_WARN("fail to push back to array", K(ret)); + } + LOG_DEBUG("add external file column", KPC(real_ref_expr), K(columns.at(i).col_name_)); + } } else { if (OB_FAIL(resolve_basic_column_item(table_item, columns.at(i).col_name_, false, col_item, stmt))) { diff --git a/src/sql/resolver/dml/ob_dml_resolver.h b/src/sql/resolver/dml/ob_dml_resolver.h index eb8302e08..d4cf8cbf8 100644 --- a/src/sql/resolver/dml/ob_dml_resolver.h +++ b/src/sql/resolver/dml/ob_dml_resolver.h @@ -952,6 +952,7 @@ protected: //store json table column info common::ObSEArray json_table_infos_; + common::ObSEArray pseudo_external_file_col_exprs_; protected: DISALLOW_COPY_AND_ASSIGN(ObDMLResolver); }; diff --git a/src/sql/resolver/dml/ob_dml_stmt.cpp b/src/sql/resolver/dml/ob_dml_stmt.cpp index 621dc7d2b..211fa5ded 100644 --- a/src/sql/resolver/dml/ob_dml_stmt.cpp +++ b/src/sql/resolver/dml/ob_dml_stmt.cpp @@ -249,6 +249,7 @@ int TableItem::deep_copy(ObIRawExprCopier &expr_copier, is_system_table_ = other.is_system_table_; is_index_table_ = other.is_index_table_; is_view_table_ = other.is_view_table_; + table_type_ = other.table_type_; is_recursive_union_fake_table_ = other.is_recursive_union_fake_table_; cte_type_ = other.cte_type_; database_name_ = other.database_name_; @@ -4334,6 +4335,53 @@ bool ObDMLStmt::is_set_stmt() const return is_select_stmt() ? (static_cast(this)->is_set_stmt()) : false; } +int ObDMLStmt::disable_writing_external_table() +{ + int ret = OB_SUCCESS; + bool disable_write_table = false; + const TableItem *table_item = NULL; + if (stmt::T_SELECT == get_stmt_type()) { + for (int64_t i = 0; OB_SUCC(ret) && !disable_write_table && i < table_items_.count(); ++i) { + if (OB_ISNULL(table_item = table_items_.at(i))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get unexpected NULL ptr", K(ret)); + } else if (table_item->for_update_ && schema::EXTERNAL_TABLE == table_item->table_type_) { + disable_write_table = true; + } + } + } else if (is_dml_write_stmt()) { + ObSEArray dml_table_infos; + if (OB_FAIL(static_cast(this)->get_dml_table_infos(dml_table_infos))) { + LOG_WARN("failed to get dml table infos"); + } + for (int64_t i = 0; OB_SUCC(ret) && !disable_write_table && i < dml_table_infos.count(); ++i) { + if (OB_ISNULL(dml_table_infos.at(i))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get unexpected NULL ptr", K(ret)); + } else if (OB_ISNULL(table_item = get_table_item_by_id(dml_table_infos.at(i)->table_id_))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get unexpected NULL ptr", K(ret)); + } else if (schema::EXTERNAL_TABLE == table_item->table_type_) { + disable_write_table = true; + } + } + } + if (OB_SUCC(ret)) { + ObSEArray child_stmts; + if (disable_write_table) { + ret = OB_NOT_SUPPORTED; + LOG_USER_ERROR(OB_NOT_SUPPORTED, "DML operation on External Table"); + } else if (OB_FAIL(get_child_stmts(child_stmts))) { + LOG_WARN("failed to get stmt's child_stmts", K(ret)); + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < child_stmts.count(); ++i) { + OZ( child_stmts.at(i)->disable_writing_external_table() ); + } + } + } + return ret; +} + int ObDMLStmt::formalize_query_ref_exprs() { int ret = OB_SUCCESS; diff --git a/src/sql/resolver/dml/ob_dml_stmt.h b/src/sql/resolver/dml/ob_dml_stmt.h index d9c274499..90294aed6 100644 --- a/src/sql/resolver/dml/ob_dml_stmt.h +++ b/src/sql/resolver/dml/ob_dml_stmt.h @@ -181,6 +181,7 @@ struct TableItem ddl_schema_version_ = 0; ddl_table_id_ = common::OB_INVALID_ID; json_table_def_ = nullptr; + table_type_ = MAX_TABLE_TYPE; } virtual TO_STRING_KV(N_TID, table_id_, @@ -202,7 +203,7 @@ struct TableItem K_(dblink_id), K_(dblink_name), K_(link_database_name), K_(is_reverse_link), K_(ddl_schema_version), K_(ddl_table_id), K_(is_view_table), K_(part_ids), K_(part_names), K_(cte_type), - KPC_(function_table_expr)); + KPC_(function_table_expr), K_(table_type)); enum TableType { @@ -216,6 +217,7 @@ struct TableItem TEMP_TABLE, LINK_TABLE, JSON_TABLE, + EXTERNAL_TABLE, }; /** @@ -308,6 +310,7 @@ struct TableItem bool is_index_table_; //just for index table resolver bool is_view_table_; //for VIEW privilege check bool is_recursive_union_fake_table_; //mark whether this table is a tmp fake table for resolve the recursive cte table + share::schema::ObTableType table_type_; CTEType cte_type_; common::ObString database_name_; /* FOR UPDATE clause */ @@ -1118,6 +1121,7 @@ public: int check_has_subquery_in_function_table(bool &has_subquery_in_function_table) const; + int disable_writing_external_table(); int formalize_query_ref_exprs(); int formalize_query_ref_exec_params(ObStmtExecParamFormatter &formatter, diff --git a/src/sql/resolver/dml/ob_select_stmt.cpp b/src/sql/resolver/dml/ob_select_stmt.cpp index 76f76fb65..283e22bc2 100644 --- a/src/sql/resolver/dml/ob_select_stmt.cpp +++ b/src/sql/resolver/dml/ob_select_stmt.cpp @@ -1259,6 +1259,17 @@ bool ObSelectStmt::has_hidden_rowid() const { return res; } +bool ObSelectStmt::has_external_table() const { + bool res = false; + for (int i = 0; i < get_table_items().count(); i++) { + if (OB_NOT_NULL(get_table_items().at(i)) + && EXTERNAL_TABLE == get_table_items().at(i)->table_type_) { + res = true; + break; + } + } + return res; +} int ObSelectStmt::get_pure_set_exprs(ObIArray &pure_set_exprs) const { int ret = OB_SUCCESS; @@ -1293,4 +1304,4 @@ ObRawExpr* ObSelectStmt::get_pure_set_expr(ObRawExpr *expr) expr = expr->get_param_expr(0); } return expr; -} \ No newline at end of file +} diff --git a/src/sql/resolver/dml/ob_select_stmt.h b/src/sql/resolver/dml/ob_select_stmt.h index 9982113d3..b9099ea20 100644 --- a/src/sql/resolver/dml/ob_select_stmt.h +++ b/src/sql/resolver/dml/ob_select_stmt.h @@ -619,6 +619,7 @@ public: share::schema::ViewCheckOption get_check_option() const { return check_option_; } void set_check_option(share::schema::ViewCheckOption check_option) { check_option_ = check_option; } // this function will only be called while resolving with clause. + bool has_external_table() const; int get_pure_set_exprs(ObIArray &pure_set_exprs) const; static ObRawExpr* get_pure_set_expr(ObRawExpr *expr); diff --git a/src/sql/resolver/expr/ob_expr_relation_analyzer.cpp b/src/sql/resolver/expr/ob_expr_relation_analyzer.cpp index 3c48efbd3..5682938ed 100644 --- a/src/sql/resolver/expr/ob_expr_relation_analyzer.cpp +++ b/src/sql/resolver/expr/ob_expr_relation_analyzer.cpp @@ -49,6 +49,7 @@ int ObExprRelationAnalyzer::visit_expr(ObRawExpr &expr) int ret = OB_SUCCESS; int64_t param_count = expr.has_flag(IS_ONETIME) ? 1 : expr.get_param_count(); if (!expr.is_column_ref_expr() && + T_PSEUDO_EXTERNAL_FILE_COL != expr.get_expr_type() && T_ORA_ROWSCN != expr.get_expr_type()) { expr.get_relation_ids().reuse(); } diff --git a/src/sql/resolver/expr/ob_raw_expr.cpp b/src/sql/resolver/expr/ob_raw_expr.cpp index cfed50400..bf6876d60 100644 --- a/src/sql/resolver/expr/ob_raw_expr.cpp +++ b/src/sql/resolver/expr/ob_raw_expr.cpp @@ -5438,6 +5438,7 @@ int ObPseudoColumnRawExpr::assign(const ObRawExpr &other) cte_cycle_value_ = tmp.cte_cycle_value_; cte_cycle_default_value_ = tmp.cte_cycle_default_value_; table_id_ = tmp.table_id_; + table_name_ = tmp.table_name_; } } return ret; @@ -5514,6 +5515,13 @@ int ObPseudoColumnRawExpr::get_name_internal(char *buf, const int64_t buf_len, i LOG_WARN("failed to print expr name", K(ret)); } break; + case T_PSEUDO_EXTERNAL_FILE_COL: + if (!table_name_.empty() && OB_FAIL(BUF_PRINTF("%.*s.", table_name_.length(), table_name_.ptr()))) { + LOG_WARN("failed to print table name", K(ret)); + } else if (OB_FAIL(databuff_print_obj(buf, buf_len, pos, expr_name_))) { + LOG_WARN("failed to print expr name", K(ret)); + } + break; case T_TABLET_AUTOINC_NEXTVAL: if (OB_FAIL(BUF_PRINTF("T_HIDDEN_PK"))) { LOG_WARN("failed to print", K(ret)); diff --git a/src/sql/resolver/expr/ob_raw_expr.h b/src/sql/resolver/expr/ob_raw_expr.h index 2c1a7da87..c28262265 100644 --- a/src/sql/resolver/expr/ob_raw_expr.h +++ b/src/sql/resolver/expr/ob_raw_expr.h @@ -4485,16 +4485,20 @@ public: void get_cte_cycle_value(ObRawExpr *&v, ObRawExpr *&d_v) {v = cte_cycle_value_; d_v = cte_cycle_default_value_; }; void set_table_id(int64_t table_id) { table_id_ = table_id; } int64_t get_table_id() const { return table_id_; } + void set_table_name(const common::ObString &table_name) { table_name_ = table_name; } + const common::ObString & get_table_name() const { return table_name_; } VIRTUAL_TO_STRING_KV(N_ITEM_TYPE, type_, N_RESULT_TYPE, result_type_, N_EXPR_INFO, info_, N_REL_ID, rel_ids_, - N_TABLE_ID, table_id_); + N_TABLE_ID, table_id_, + N_TABLE_NAME, table_name_); private: ObRawExpr *cte_cycle_value_; ObRawExpr *cte_cycle_default_value_; int64_t table_id_; + common::ObString table_name_; DISALLOW_COPY_AND_ASSIGN(ObPseudoColumnRawExpr); }; diff --git a/src/sql/resolver/expr/ob_raw_expr_printer.cpp b/src/sql/resolver/expr/ob_raw_expr_printer.cpp index f70e6dd03..7005ca7ad 100644 --- a/src/sql/resolver/expr/ob_raw_expr_printer.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_printer.cpp @@ -3752,6 +3752,14 @@ int ObRawExprPrinter::print(ObPseudoColumnRawExpr *expr) } break; } + case T_PSEUDO_EXTERNAL_FILE_COL: { + if (!expr->get_table_name().empty()) { + PRINT_IDENT(expr->get_table_name()); + DATA_PRINTF("."); + } + PRINT_IDENT(expr->get_expr_name()); + break; + } default : { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected pseudo column type", K(type)); diff --git a/src/sql/resolver/expr/ob_raw_expr_util.cpp b/src/sql/resolver/expr/ob_raw_expr_util.cpp index 46633144a..c806e4e4f 100644 --- a/src/sql/resolver/expr/ob_raw_expr_util.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_util.cpp @@ -1936,25 +1936,31 @@ int ObRawExprUtils::build_generated_column_expr(const obrpc::ObCreateIndexArg *a real_exprs, NULL)); OZ (real_exprs.push_back(expr), q_name); - } else if (OB_UNLIKELY(!q_name.database_name_.empty())) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("invalid generated column name", K(q_name)); - } else if (!q_name.tbl_name_.empty() - && !ObCharset::case_insensitive_equal(q_name.tbl_name_, table_schema.get_table_name_str())) { - ret = OB_ERR_BAD_TABLE; - LOG_USER_ERROR(OB_ERR_BAD_TABLE, q_name.tbl_name_.length(), q_name.tbl_name_.ptr()); - } else if (OB_ISNULL(col_schema = table_schema.get_column_schema(q_name.col_name_))) { - ret = OB_ERR_KEY_COLUMN_DOES_NOT_EXITS; - LOG_USER_ERROR(OB_ERR_KEY_COLUMN_DOES_NOT_EXITS, q_name.col_name_.length(), q_name.col_name_.ptr()); - } else if (OB_UNLIKELY(col_schema->is_generated_column())) { - ret = OB_ERR_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN; - LOG_USER_ERROR(OB_ERR_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN, - "Generated column in column expression"); - } else if (OB_FAIL(ObRawExprUtils::init_column_expr(*col_schema, *q_name.ref_expr_))) { - LOG_WARN("init column expr failed", K(ret), K(q_name)); + } else if (table_schema.is_external_table()) { + if (OB_FAIL(ObResolverUtils::resolve_external_table_column_def(expr_factory, session_info, q_name, real_exprs, expr))) { + LOG_WARN("fail to resolve external table column def", K(ret)); + } } else { - q_name.ref_expr_->set_ref_id(table_schema.get_table_id(), col_schema->get_column_id()); - OZ (real_exprs.push_back(q_name.ref_expr_), q_name); + if (OB_UNLIKELY(!q_name.database_name_.empty())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid generated column name", K(q_name)); + } else if (!q_name.tbl_name_.empty() + && !ObCharset::case_insensitive_equal(q_name.tbl_name_, table_schema.get_table_name_str())) { + ret = OB_ERR_BAD_TABLE; + LOG_USER_ERROR(OB_ERR_BAD_TABLE, q_name.tbl_name_.length(), q_name.tbl_name_.ptr()); + } else if (OB_ISNULL(col_schema = table_schema.get_column_schema(q_name.col_name_))) { + ret = OB_ERR_KEY_COLUMN_DOES_NOT_EXITS; + LOG_USER_ERROR(OB_ERR_KEY_COLUMN_DOES_NOT_EXITS, q_name.col_name_.length(), q_name.col_name_.ptr()); + } else if (OB_UNLIKELY(col_schema->is_generated_column())) { + ret = OB_ERR_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN; + LOG_USER_ERROR(OB_ERR_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN, + "Generated column in column expression"); + } else if (OB_FAIL(ObRawExprUtils::init_column_expr(*col_schema, *q_name.ref_expr_))) { + LOG_WARN("init column expr failed", K(ret), K(q_name)); + } else { + q_name.ref_expr_->set_ref_id(table_schema.get_table_id(), col_schema->get_column_id()); + OZ (real_exprs.push_back(q_name.ref_expr_), q_name); + } } } if (OB_SUCC(ret)) { @@ -2176,7 +2182,9 @@ int ObRawExprUtils::build_generated_column_expr(ObRawExprFactory &expr_factory, // 比如 create table t1 (x int) partition by hash(x); if (OB_SUCC(ret) && true == need_check_simple_column - && T_REF_COLUMN == expr->get_expr_type()) { + && T_REF_COLUMN == expr->get_expr_type() + && !(columns.count() == 1 + && ObResolverUtils::is_external_file_column_name(columns.at(0).col_name_))) { ret = OB_ERR_INVALID_COLUMN_EXPRESSION; LOG_WARN("simple column is not allowed in Oracle mode", K(ret), K(*expr)); } @@ -2833,17 +2841,23 @@ int ObRawExprUtils::build_generated_column_expr(const ObString &expr_str, real_exprs, NULL)); OZ (real_exprs.push_back(expr), q_name); - } else if (OB_UNLIKELY(!q_name.database_name_.empty()) || OB_UNLIKELY(!q_name.tbl_name_.empty())) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("invalid generated column name", K(q_name)); - } else if (OB_ISNULL(col_schema = table_schema.get_column_schema(q_name.col_name_))) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("column schema is null"); - } else if (OB_FAIL(init_column_expr(*col_schema, *q_name.ref_expr_))) { - LOG_WARN("init column expr failed", K(ret)); + } else if (table_schema.is_external_table()) { + if (OB_FAIL(ObResolverUtils::resolve_external_table_column_def(expr_factory, session_info, q_name, real_exprs, expr))) { + LOG_WARN("fail to resolve external table column", K(ret)); + } } else { - q_name.ref_expr_->set_ref_id(table_id, col_schema->get_column_id()); - OZ (real_exprs.push_back(q_name.ref_expr_), q_name); + if (OB_UNLIKELY(!q_name.database_name_.empty()) || OB_UNLIKELY(!q_name.tbl_name_.empty())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid generated column name", K(q_name)); + } else if (OB_ISNULL(col_schema = table_schema.get_column_schema(q_name.col_name_))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("column schema is null"); + } else if (OB_FAIL(init_column_expr(*col_schema, *q_name.ref_expr_))) { + LOG_WARN("init column expr failed", K(ret)); + } else { + q_name.ref_expr_->set_ref_id(table_id, col_schema->get_column_id()); + OZ (real_exprs.push_back(q_name.ref_expr_), q_name); + } } } if (OB_SUCC(ret)) { @@ -7637,12 +7651,19 @@ int ObRawExprUtils::build_rowid_expr(const ObDMLStmt *dml_stmt, CK(OB_NOT_NULL(calc_urowid_expr)); calc_urowid_expr->set_func_name(ObString::make_string(N_CALC_UROWID)); OZ(calc_urowid_expr->add_param_expr(version_expr)); + if (table_schema.is_external_table()) { + OZ(add_calc_partition_id_on_calc_rowid_expr(dml_stmt, expr_factory, session_info, + table_schema, logical_table_id, + calc_urowid_expr)); + } for (int64_t i = 0; OB_SUCC(ret) && i < rowkey_exprs.count(); ++i) { OZ(calc_urowid_expr->add_param_expr(rowkey_exprs.at(i))); } - //set calc tablet id for heap table calc_urowid expr - OZ(add_calc_tablet_id_on_calc_rowid_expr(dml_stmt, expr_factory, session_info, - table_schema, logical_table_id, calc_urowid_expr)); + if (OB_SUCC(ret) && !table_schema.is_external_table()) { + //set calc tablet id for heap table calc_urowid expr + OZ(add_calc_tablet_id_on_calc_rowid_expr(dml_stmt, expr_factory, session_info, + table_schema, logical_table_id, calc_urowid_expr)); + } OZ(calc_urowid_expr->formalize(&session_info)); rowid_expr = calc_urowid_expr; LOG_TRACE("succeed to build rowid expr", KPC(rowid_expr)); @@ -8016,6 +8037,52 @@ int ObRawExprUtils::add_calc_tablet_id_on_calc_rowid_expr(const ObDMLStmt *dml_s return ret; } +int ObRawExprUtils::add_calc_partition_id_on_calc_rowid_expr(const ObDMLStmt *dml_stmt, + ObRawExprFactory &expr_factory, + const ObSQLSessionInfo &session_info, + const ObTableSchema &table_schema, + const uint64_t logical_table_id, + ObSysFunRawExpr *&calc_rowid_expr) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(dml_stmt) || OB_ISNULL(calc_rowid_expr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get unexpected null", K(ret), K(dml_stmt),K(calc_rowid_expr)); + } else if (table_schema.is_external_table()) { + ObRawExprCopier copier(expr_factory); + ObSEArray column_exprs; + const ObRawExpr *part_expr = dml_stmt->get_part_expr(logical_table_id, table_schema.get_table_id()); + const ObRawExpr *subpart_expr = dml_stmt->get_subpart_expr(logical_table_id, table_schema.get_table_id()); + ObRawExpr *calc_part_id_expr = nullptr; + schema::ObPartitionLevel part_level = table_schema.get_part_level(); + ObRawExpr *new_part_expr = NULL; + ObRawExpr *new_subpart_expr = NULL; + if (OB_FAIL(dml_stmt->get_column_exprs(logical_table_id, column_exprs))) { + LOG_WARN("failed to get column exprs", K(ret)); + } else if (OB_FAIL(copier.add_skipped_expr(column_exprs))) { + LOG_WARN("failed to add skipped expr", K(ret)); + } else if (OB_FAIL(copier.copy(part_expr, new_part_expr))) { + LOG_WARN("fail to copy part expr", K(ret)); + } else if (OB_FAIL(copier.copy(subpart_expr, new_subpart_expr))) { + LOG_WARN("fail to copy subpart expr", K(ret)); + } else if (OB_FAIL(build_calc_part_id_expr(expr_factory, + session_info, + table_schema.get_table_id(), + part_level, + new_part_expr, + new_subpart_expr, + calc_part_id_expr))) { + LOG_WARN("fail to build table location expr", K(ret)); + } else if (OB_ISNULL(calc_part_id_expr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected null expr", K(ret)); + } else if (OB_FAIL(calc_rowid_expr->add_param_expr(calc_part_id_expr))) { + LOG_WARN("failed to add param expr", K(ret)); + } + } + return ret; +} + int ObRawExprUtils::build_shadow_pk_expr(uint64_t table_id, uint64_t column_id, const ObDMLStmt &dml_stmt, diff --git a/src/sql/resolver/expr/ob_raw_expr_util.h b/src/sql/resolver/expr/ob_raw_expr_util.h index d0f7892e1..a51c304bd 100644 --- a/src/sql/resolver/expr/ob_raw_expr_util.h +++ b/src/sql/resolver/expr/ob_raw_expr_util.h @@ -1080,6 +1080,12 @@ public: const share::schema::ObTableSchema &table_schema, const uint64_t logical_table_id, ObSysFunRawExpr *&calc_rowid_expr); + static int add_calc_partition_id_on_calc_rowid_expr(const ObDMLStmt *dml_stmt, + ObRawExprFactory &expr_factory, + const ObSQLSessionInfo &session_info, + const share::schema::ObTableSchema &table_schema, + const uint64_t logical_table_id, + ObSysFunRawExpr *&calc_rowid_expr); static int get_col_ref_expr_recursively(ObRawExpr *expr, ObColumnRefRawExpr *&column_expr); diff --git a/src/sql/resolver/ob_resolver.cpp b/src/sql/resolver/ob_resolver.cpp index 68e365a10..ab4be95ca 100644 --- a/src/sql/resolver/ob_resolver.cpp +++ b/src/sql/resolver/ob_resolver.cpp @@ -1074,6 +1074,10 @@ int ObResolver::resolve(IsPrepared if_prepared, const ParseNode &parse_tree, ObS } } // end switch + if (OB_SUCC(ret) && stmt->is_dml_stmt()) { + OZ( (static_cast(stmt)->disable_writing_external_table()) ); + } + if (OB_SUCC(ret)) { if (ObStmt::is_write_stmt(stmt->get_stmt_type(), stmt->has_global_variable()) && !MTL_IS_PRIMARY_TENANT()) { diff --git a/src/sql/resolver/ob_resolver_utils.cpp b/src/sql/resolver/ob_resolver_utils.cpp index 3ef26c348..7c5a5438a 100644 --- a/src/sql/resolver/ob_resolver_utils.cpp +++ b/src/sql/resolver/ob_resolver_utils.cpp @@ -38,6 +38,8 @@ #include "sql/rewrite/ob_transform_utils.h" #include "sql/engine/expr/ob_expr_column_conv.h" #include "sql/engine/expr/ob_datum_cast.h" +#include "sql/parser/ob_parser_utils.h" +#include "lib/json/ob_json_print_utils.h" namespace oceanbase { @@ -4127,6 +4129,133 @@ int ObResolverUtils::resolve_generated_column_expr(ObResolverParams ¶ms, return ret; } +int ObResolverUtils::calc_file_column_idx(const ObString &column_name, uint64_t &file_column_idx) +{ + int ret = OB_SUCCESS; + constexpr int32_t PREFIX_LEN = str_length(N_EXTERNAL_FILE_COLUMN_PREFIX); + if (column_name.length() <= PREFIX_LEN) { + ret = OB_ERR_UNEXPECTED; + } else { + int err = 0; + file_column_idx = ObCharset::strntoull(column_name.ptr() + PREFIX_LEN, column_name.length() - PREFIX_LEN, 10, &err); + if (err != 0) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid file column name", K(column_name)); + } + } + return ret; +} + +ObRawExpr *ObResolverUtils::find_file_column_expr( + ObIArray &pseudo_exprs, + int64_t table_id, + int64_t column_idx + ) +{ + ObRawExpr *expr = nullptr; + for (int i = 0; i < pseudo_exprs.count(); ++i) { + ObPseudoColumnRawExpr *pseudo_expr = static_cast(pseudo_exprs.at(i)); + if (pseudo_expr->get_table_id() == table_id && pseudo_expr->get_extra() == column_idx) { + expr = pseudo_expr; + break; + } + } + return expr; +} + +int ObResolverUtils::resolve_external_table_column_def(ObRawExprFactory &expr_factory, + const ObSQLSessionInfo &session_info, + const ObQualifiedName &q_name, + ObIArray &real_exprs, + ObRawExpr *&expr) +{ + int ret = OB_SUCCESS; + ObRawExpr *file_column_expr = nullptr; + uint64_t file_column_idx = UINT64_MAX; + if (!ObResolverUtils::is_external_file_column_name(q_name.col_name_)) { + ret = OB_ERR_BAD_FIELD_ERROR; + ObString scope_name = "external file column"; + LOG_USER_ERROR(OB_ERR_BAD_FIELD_ERROR, q_name.col_name_.length(), q_name.col_name_.ptr(), + scope_name.length(), scope_name.ptr()); + } else if (OB_FAIL(ObResolverUtils::calc_file_column_idx(q_name.col_name_, file_column_idx))) { + LOG_WARN("fail to calc file column idx", K(ret)); + } else if (nullptr == (file_column_expr = ObResolverUtils::find_file_column_expr( + real_exprs, OB_INVALID_ID, file_column_idx))) { + ObString table_name; + if (OB_FAIL(ObResolverUtils::build_file_column_expr(expr_factory, session_info, OB_INVALID_ID, + table_name, q_name.col_name_, + file_column_idx, file_column_expr, CHARSET_UTF8MB4))) { + LOG_WARN("fail to build external table file column expr", K(ret)); + } else if (OB_FAIL(real_exprs.push_back(file_column_expr))) { + LOG_WARN("fail to push back expr", K(ret)); + } + } + if (OB_SUCC(ret)) { + if (OB_FAIL(ObTransformUtils::replace_expr(q_name.ref_expr_, file_column_expr, expr))) { + LOG_WARN("fail replace expr", K(ret)); + } + } + LOG_DEBUG("resolve external table column ref", K(q_name.col_name_), KPC(expr)); + return ret; +} + +bool ObResolverUtils::is_external_file_column_name(const ObString &name) +{ + return name.prefix_match_ci(N_EXTERNAL_FILE_COLUMN_PREFIX); +} + +int ObResolverUtils::build_file_column_expr(ObRawExprFactory &expr_factory, + const ObSQLSessionInfo &session_info, + const uint64_t table_id, + const ObString &table_name, + const ObString &column_name, + int64_t column_idx, + ObRawExpr *&expr, + ObCharsetType cs_type) +{ + int ret = OB_SUCCESS; + ObPseudoColumnRawExpr *file_column_expr = nullptr; + + if (OB_FAIL(expr_factory.create_raw_expr(T_PSEUDO_EXTERNAL_FILE_COL, file_column_expr))) { + LOG_WARN("create nextval failed", K(ret)); + } else if (OB_ISNULL(file_column_expr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("expr is null", K(ret)); + } else{ + file_column_expr->set_expr_name(column_name); + file_column_expr->set_table_name(table_name); + file_column_expr->set_data_type(ObVarcharType); + file_column_expr->set_collation_type(ObCharset::get_default_collation(cs_type)); + file_column_expr->set_length(OB_MAX_VARCHAR_LENGTH); + if (lib::is_oracle_mode()) { + file_column_expr->set_length_semantics(LS_BYTE); + } + file_column_expr->set_table_id(table_id); + file_column_expr->set_explicited_reference(); + file_column_expr->set_extra(column_idx); + + if (OB_FAIL(file_column_expr->formalize(&session_info))) { + LOG_WARN("failed to extract info", K(ret)); + } else { + expr = file_column_expr; + } + } + + return ret; +} + +ObRawExpr *find_file_column_expr(ObIArray &exprs, const ObString &file_column_name) +{ + ObRawExpr *res_expr = nullptr; + for (int i = 0; i < exprs.count(); ++i) { + if (0 == exprs.at(i)->get_expr_name().case_compare(file_column_name)) { + res_expr = exprs.at(i); + break; + } + } + return res_expr; +} + // 解析生成列表达式时,首先在table_schema中的column_schema中寻找依赖的列,如果找不到,再在 resolved_cols中找 int ObResolverUtils::resolve_generated_column_expr(ObResolverParams ¶ms, const ParseNode *node, @@ -4181,31 +4310,50 @@ int ObResolverUtils::resolve_generated_column_expr(ObResolverParams ¶ms, } else if (FALSE_IT(col_schema = tbl_schema.get_column_schema(q_name.col_name_) == NULL ? get_column_schema_from_array(resolved_cols, q_name.col_name_) : tbl_schema.get_column_schema(q_name.col_name_))) { - } else if (NULL == col_schema || (col_schema->is_hidden() && !col_schema->is_udt_hidden_column())) { - ret = OB_ERR_BAD_FIELD_ERROR; - ObString scope_name = "generated column function"; - LOG_USER_ERROR(OB_ERR_BAD_FIELD_ERROR, q_name.col_name_.length(), q_name.col_name_.ptr(), - scope_name.length(), scope_name.ptr()); - } else if (col_schema->is_generated_column()) { - ret = OB_ERR_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN; - LOG_USER_ERROR(OB_ERR_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN, - "Defining a generated column on generated column(s)"); - } else if (lib::is_oracle_mode() && col_schema->get_meta_type().is_blob() && - !col_schema->is_udt_hidden_column()) { // generated column depends on xml: gen_expr(sys_makexml(blob)) - ret = OB_NOT_SUPPORTED; - LOG_WARN("Define a blob column in generated column def is not supported", K(ret)); - LOG_USER_ERROR(OB_NOT_SUPPORTED, "blob column in generated column definition"); - } else if (lib::is_mysql_mode() && col_schema->is_autoincrement()) { - ret = OB_NOT_SUPPORTED; - LOG_WARN("generated column cannot refer to auto-increment column", K(ret), K(*expr)); - LOG_USER_ERROR(OB_NOT_SUPPORTED, "generated column refer to auto-increment column"); - } else if (OB_FAIL(ObRawExprUtils::init_column_expr(*col_schema, *q_name.ref_expr_))) { - LOG_WARN("init column expr failed", K(ret)); - } else if (OB_FAIL(generated_column.add_cascaded_column_id(col_schema->get_column_id()))) { - LOG_WARN("add cascaded column id to generated column failed", K(ret)); - } else { - col_schema->add_column_flag(GENERATED_DEPS_CASCADE_FLAG); - OZ (real_exprs.push_back(q_name.ref_expr_)); + } + + if (OB_SUCC(ret)) { + if (tbl_schema.is_external_table()) { + // c1 int as( concat(file$col1, file$col2) ) + // defination of external generated column can only contain file columns + if (NULL != col_schema) { + ret = OB_NOT_SUPPORTED; + LOG_USER_ERROR(OB_NOT_SUPPORTED, "Refering a normal external table column"); + } else if (OB_FAIL(ObResolverUtils::resolve_external_table_column_def(*params.expr_factory_, + *params.session_info_, + q_name, + real_exprs, + expr))) { + LOG_WARN("fail to resolve external table column def", K(ret)); + } + } else { + if (NULL == col_schema || (col_schema->is_hidden() && !col_schema->is_udt_hidden_column())) { + ret = OB_ERR_BAD_FIELD_ERROR; + ObString scope_name = "generated column function"; + LOG_USER_ERROR(OB_ERR_BAD_FIELD_ERROR, q_name.col_name_.length(), q_name.col_name_.ptr(), + scope_name.length(), scope_name.ptr()); + } else if (col_schema->is_generated_column()) { + ret = OB_ERR_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN; + LOG_USER_ERROR(OB_ERR_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN, + "Defining a generated column on generated column(s)"); + } else if (lib::is_oracle_mode() && col_schema->get_meta_type().is_blob() && + !col_schema->is_udt_hidden_column()) { // generated column depends on xml: gen_expr(sys_makexml(blob)) + ret = OB_NOT_SUPPORTED; + LOG_WARN("Define a blob column in generated column def is not supported", K(ret)); + LOG_USER_ERROR(OB_NOT_SUPPORTED, "blob column in generated column definition"); + } else if (lib::is_mysql_mode() && col_schema->is_autoincrement()) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("generated column cannot refer to auto-increment column", K(ret), K(*expr)); + LOG_USER_ERROR(OB_NOT_SUPPORTED, "generated column refer to auto-increment column"); + } else if (OB_FAIL(ObRawExprUtils::init_column_expr(*col_schema, *q_name.ref_expr_))) { + LOG_WARN("init column expr failed", K(ret)); + } else if (OB_FAIL(generated_column.add_cascaded_column_id(col_schema->get_column_id()))) { + LOG_WARN("add cascaded column id to generated column failed", K(ret)); + } else { + col_schema->add_column_flag(GENERATED_DEPS_CASCADE_FLAG); + OZ (real_exprs.push_back(q_name.ref_expr_)); + } + } } } @@ -4277,7 +4425,9 @@ int ObResolverUtils::resolve_generated_column_expr(ObResolverParams ¶ms, } } } - if OB_FAIL(ret) { + if (OB_FAIL(ret)) { + } else if (tbl_schema.is_external_table()) { + //skip length check } else if (lib::is_oracle_mode() && ob_is_string_type(dst_datatype)) { // generated_column是用户定义的生成列,其长度以及长度语义(按照字符计算长度还是字节计算长度)依赖于SQL语句的定义 // expr是用于生成generated_column数据的表达式。expr计算结果的长度不能大于generated_column定义的长度 @@ -7153,7 +7303,7 @@ int ObResolverUtils::check_secure_path(const common::ObString &secure_file_priv, ret = OB_ERR_NO_PRIVILEGE; LOG_WARN("no priv", K(ret), K(secure_file_priv), K(secure_file_priv_tmp), K(full_path)); } else if (full_path.length() > secure_file_priv_tmp.length() - && full_path[pos] != '/') { + && secure_file_priv_tmp != "/" && full_path[pos] != '/') { ret = OB_ERR_NO_PRIVILEGE; LOG_WARN("no priv", K(ret), K(secure_file_priv), K(secure_file_priv_tmp), K(full_path)); } @@ -7443,6 +7593,103 @@ bool ObResolverUtils::in_updatable_view_path(const TableItem &table_item, return in_path; } +int ObResolverUtils::resolve_file_format_string_value(const ParseNode *node, + const ObCharsetType &format_charset, + ObResolverParams ¶ms, + ObString &result_value) +{ + int ret = OB_SUCCESS; + // 1. resolve expr + ObRawExpr *expr = NULL; + ObRawExprFactory *expr_factory = params.expr_factory_; + ObSQLSessionInfo *session_info = params.session_info_; + if (OB_ISNULL(node) || OB_ISNULL(expr_factory) || OB_ISNULL(session_info)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed. get unexpect NULL ptr", K(ret), K(node), K(expr_factory), K(session_info)); + } else if (OB_FAIL(resolve_const_expr(params, *node, expr, NULL))) { + LOG_WARN("fail to resolve const expr", K(ret)); + } else if (OB_ISNULL(expr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed. invalid param", K(ret), K(node->type_)); + } else if (OB_FAIL(expr->formalize(session_info))) { + LOG_WARN("failed to formalize expr", K(ret), K(*expr)); + } else if (!expr->is_static_scalar_const_expr()) { + ret = OB_NOT_SUPPORTED; + ObSqlString err_msg; + err_msg.append_fmt("using '%s' as format value", get_type_name(expr->get_expr_type())); + LOG_USER_ERROR(OB_NOT_SUPPORTED, err_msg.ptr()); + LOG_WARN("failed. invalid params", K(ret), K(*expr)); + } + + // 2. try case convert + if (OB_SUCC(ret)) { + ObRawExpr *new_expr = NULL; + const int64_t max_len = 64; + ObCastMode cast_mode = CM_NONE; + ObExprResType expr_output_type = expr->get_result_type(); + ObCollationType result_collation_type = ObCharset::get_bin_collation(format_charset); + ObExprResType cast_dst_type; + cast_dst_type.set_type(ObVarcharType); + cast_dst_type.set_length(max_len); + cast_dst_type.set_calc_meta(ObObjMeta()); + cast_dst_type.set_collation_type(result_collation_type); + if (!(expr_output_type.is_varchar() || + expr_output_type.is_nvarchar2() || + expr_output_type.is_char() || + expr_output_type.is_nchar())) { + if (result_collation_type == CS_TYPE_INVALID) { + ret = OB_ERR_PARAM_INVALID; + LOG_WARN("failed. get invalid collaction", K(ret), K(format_charset)); + } else if (OB_FAIL(ObSQLUtils::get_default_cast_mode(session_info, cast_mode))) { + LOG_WARN("get default cast mode failed", K(ret)); + } else if (OB_FAIL(ObRawExprUtils::try_add_cast_expr_above(expr_factory, + session_info, + *expr, + cast_dst_type, + cast_mode, + new_expr))) { + LOG_WARN("try add cast expr above failed", K(ret), K(*expr)); + } else if (OB_ISNULL(new_expr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed. get unexpect NULL ptr", K(ret)); + } else if (OB_FAIL(new_expr->add_flag(IS_OP_OPERAND_IMPLICIT_CAST))) { + LOG_WARN("failed to add flag", K(ret)); + } else { + expr = new_expr; + } + } + } + + // 3. compute expr result + if (OB_SUCC(ret)) { + RowDesc row_desc; + ObNewRow tmp_row; + ObObj value_obj; + ObTempExpr *temp_expr = NULL; + ObExecContext *exec_ctx = session_info->get_cur_exec_ctx(); + if (OB_ISNULL(exec_ctx) || OB_ISNULL(exec_ctx->get_sql_ctx())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed. get unexpected NULL", K(ret)); + } else if (OB_FAIL(ObStaticEngineExprCG::gen_expr_with_row_desc(expr, + row_desc, + exec_ctx->get_allocator(), + exec_ctx->get_my_session(), + exec_ctx->get_sql_ctx()->schema_guard_, + temp_expr))) { + LOG_WARN("fail to fill sql expression", K(ret)); + } else if (OB_ISNULL(temp_expr)) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("fail to gen temp expr", K(ret)); + } else if (OB_FAIL(temp_expr->eval(*exec_ctx, tmp_row, value_obj))) { + LOG_WARN("fail to calc value", K(ret), K(*expr)); + } else if (value_obj.is_null()) { + result_value = ObString(); + } else { + result_value = value_obj.get_string(); + } + } + return ret; +} } // namespace sql } // namespace oceanbase diff --git a/src/sql/resolver/ob_resolver_utils.h b/src/sql/resolver/ob_resolver_utils.h index f6b3a048a..31640a450 100644 --- a/src/sql/resolver/ob_resolver_utils.h +++ b/src/sql/resolver/ob_resolver_utils.h @@ -707,6 +707,27 @@ public: const ObExprResType &column_type, const ObString &column_name, ObObj &part_value); + static ObRawExpr *find_file_column_expr(ObIArray &pseudo_exprs, int64_t table_id, int64_t column_idx); + static int calc_file_column_idx(const ObString &column_name, uint64_t &file_column_idx); + static int build_file_column_expr(ObRawExprFactory &expr_factory, + const ObSQLSessionInfo &session_info, + const uint64_t table_id, + const common::ObString &table_name, + const common::ObString &column_name, + int64_t column_idx, + ObRawExpr *&expr, + ObCharsetType cs_type); + static int resolve_external_table_column_def(ObRawExprFactory &expr_factory, + const ObSQLSessionInfo &session_info, + const ObQualifiedName &q_name, + common::ObIArray &real_exprs, + ObRawExpr *&expr); + static bool is_external_file_column_name(const common::ObString &name); + + static int resolve_file_format_string_value(const ParseNode *node, + const ObCharsetType &format_charset, + ObResolverParams ¶ms, + ObString &result_value); static int get_generated_column_expr_temp(TableItem *table_item, ObIArray &gen_col_depend, ObIArray &gen_col_names, ObIArray &gen_col_schema, diff --git a/src/sql/rewrite/ob_transform_utils.cpp b/src/sql/rewrite/ob_transform_utils.cpp index aef1a6e82..ccae8d800 100644 --- a/src/sql/rewrite/ob_transform_utils.cpp +++ b/src/sql/rewrite/ob_transform_utils.cpp @@ -6710,6 +6710,10 @@ int ObTransformUtils::check_need_pushdown_pseudo_column(const ObRawExpr &expr, } break; } + case T_PSEUDO_EXTERNAL_FILE_COL: { + need_pushdown = true; + break; + } default: break; } diff --git a/src/storage/access/ob_dml_param.cpp b/src/storage/access/ob_dml_param.cpp index 526a2a659..c6334e28b 100644 --- a/src/storage/access/ob_dml_param.cpp +++ b/src/storage/access/ob_dml_param.cpp @@ -290,7 +290,9 @@ DEF_TO_STRING(ObTableScanParam) KPC_(table_param), K_(sample_info), K_(need_scn), - K_(need_switch_param)); + K_(need_switch_param), + K_(external_file_format), + K_(external_file_location)); J_OBJ_END(); return pos; } diff --git a/src/storage/lob/ob_lob_manager.cpp b/src/storage/lob/ob_lob_manager.cpp index f2abed399..e0449628b 100644 --- a/src/storage/lob/ob_lob_manager.cpp +++ b/src/storage/lob/ob_lob_manager.cpp @@ -2209,147 +2209,148 @@ int ObLobManager::write_outrow_result(ObLobAccessParam& param, ObLobMetaWriteIte int ObLobManager::write_outrow_inner(ObLobAccessParam& param, ObLobQueryIter *iter, ObString& read_buf, ObString& old_data) { int ret = OB_SUCCESS; - ObLobMetaScanIter meta_iter; - uint64_t modified_len = param.len_; - int64_t mbmaxlen = 1; - if (param.coll_type_ != CS_TYPE_BINARY) { - if (OB_FAIL(ObCharset::get_mbmaxlen_by_coll(param.coll_type_, mbmaxlen))) { - LOG_WARN("fail to get mbmaxlen", K(ret), K(param.coll_type_)); - } else { - modified_len *= mbmaxlen; - } - } - - // consider offset is bigger than char len, add padding size modified len - int64_t least_char_len = param.byte_size_ / mbmaxlen; - if (lob_handle_has_char_len(param)) { - least_char_len = *get_char_len_ptr(param); - } - if (param.offset_ > least_char_len) { - modified_len += (param.offset_ - least_char_len); - } - - if (OB_FAIL(ret)) { - } else if (OB_FAIL(init_out_row_ctx(param, modified_len + old_data.length(), param.op_type_))) { - LOG_WARN("init lob data out row ctx failed", K(ret)); - } else { - bool found_begin = false; - bool found_end = false; - ObLobMetaInfo range_begin; - ObLobMetaInfo range_end; - ObString post_data; - ObString remain_buf; - ObString tmp_buf; // use for read piece data in replace_process_meta_info - uint64_t padding_size = 0; - uint64_t pos = 0; - if (old_data.length() == 0) { - if (param.scan_backward_) { - LOG_INFO("param scan_backward is true. Make it be false.", K(param)); - param.scan_backward_ = false; - } - if (OB_FAIL(prepare_write_buffers(param, remain_buf, tmp_buf))) { - LOG_WARN("fail to prepare buffers", K(ret)); - } else if (OB_FAIL(lob_ctx_.lob_meta_mngr_->scan(param, meta_iter))) { - LOG_WARN("do lob meta scan failed.", K(ret), K(param)); + SMART_VAR(ObLobMetaScanIter, meta_iter) { + uint64_t modified_len = param.len_; + int64_t mbmaxlen = 1; + if (param.coll_type_ != CS_TYPE_BINARY) { + if (OB_FAIL(ObCharset::get_mbmaxlen_by_coll(param.coll_type_, mbmaxlen))) { + LOG_WARN("fail to get mbmaxlen", K(ret), K(param.coll_type_)); } else { - // 1. do replace and get range begin and range end when old data out row - ObLobQueryResult result; - while (OB_SUCC(ret)) { - ret = meta_iter.get_next_row(result.meta_result_); - if (OB_FAIL(ret)) { - if (ret != OB_ITER_END) { - LOG_WARN("failed to get next row.", K(ret)); - } - } else if (ObTimeUtility::current_time() > param.timeout_) { - ret = OB_TIMEOUT; - int64_t cur_time = ObTimeUtility::current_time(); - LOG_WARN("query timeout", K(cur_time), K(param.timeout_), K(ret)); - } else { - if (meta_iter.is_range_begin(result.meta_result_.info_)) { - if (OB_FAIL(range_begin.deep_copy(*param.allocator_, result.meta_result_.info_))) { - LOG_WARN("deep copy meta info failed", K(ret), K(meta_iter)); - } else { - found_begin = true; + modified_len *= mbmaxlen; + } + } + + // consider offset is bigger than char len, add padding size modified len + int64_t least_char_len = param.byte_size_ / mbmaxlen; + if (lob_handle_has_char_len(param)) { + least_char_len = *get_char_len_ptr(param); + } + if (param.offset_ > least_char_len) { + modified_len += (param.offset_ - least_char_len); + } + + if (OB_FAIL(ret)) { + } else if (OB_FAIL(init_out_row_ctx(param, modified_len + old_data.length(), param.op_type_))) { + LOG_WARN("init lob data out row ctx failed", K(ret)); + } else { + bool found_begin = false; + bool found_end = false; + ObLobMetaInfo range_begin; + ObLobMetaInfo range_end; + ObString post_data; + ObString remain_buf; + ObString tmp_buf; // use for read piece data in replace_process_meta_info + uint64_t padding_size = 0; + uint64_t pos = 0; + if (old_data.length() == 0) { + if (param.scan_backward_) { + LOG_INFO("param scan_backward is true. Make it be false.", K(param)); + param.scan_backward_ = false; + } + if (OB_FAIL(prepare_write_buffers(param, remain_buf, tmp_buf))) { + LOG_WARN("fail to prepare buffers", K(ret)); + } else if (OB_FAIL(lob_ctx_.lob_meta_mngr_->scan(param, meta_iter))) { + LOG_WARN("do lob meta scan failed.", K(ret), K(param)); + } else { + // 1. do replace and get range begin and range end when old data out row + ObLobQueryResult result; + while (OB_SUCC(ret)) { + ret = meta_iter.get_next_row(result.meta_result_); + if (OB_FAIL(ret)) { + if (ret != OB_ITER_END) { + LOG_WARN("failed to get next row.", K(ret)); } - } - if (OB_SUCC(ret) && meta_iter.is_range_end(result.meta_result_.info_)) { - if (OB_FAIL(range_end.deep_copy(*param.allocator_, result.meta_result_.info_))) { - LOG_WARN("deep copy meta info failed", K(ret), K(meta_iter)); - } else { - found_end = true; + } else if (ObTimeUtility::current_time() > param.timeout_) { + ret = OB_TIMEOUT; + int64_t cur_time = ObTimeUtility::current_time(); + LOG_WARN("query timeout", K(cur_time), K(param.timeout_), K(ret)); + } else { + if (meta_iter.is_range_begin(result.meta_result_.info_)) { + if (OB_FAIL(range_begin.deep_copy(*param.allocator_, result.meta_result_.info_))) { + LOG_WARN("deep copy meta info failed", K(ret), K(meta_iter)); + } else { + found_begin = true; + } + } + if (OB_SUCC(ret) && meta_iter.is_range_end(result.meta_result_.info_)) { + if (OB_FAIL(range_end.deep_copy(*param.allocator_, result.meta_result_.info_))) { + LOG_WARN("deep copy meta info failed", K(ret), K(meta_iter)); + } else { + found_end = true; + } + } + if (OB_SUCC(ret) && OB_FAIL(replace_process_meta_info(param, meta_iter, result, iter, read_buf, remain_buf, tmp_buf))) { + LOG_WARN("process erase meta info failed.", K(ret), K(param), K(result)); } - } - if (OB_SUCC(ret) && OB_FAIL(replace_process_meta_info(param, meta_iter, result, iter, read_buf, remain_buf, tmp_buf))) { - LOG_WARN("process erase meta info failed.", K(ret), K(param), K(result)); } } + if (ret == OB_ITER_END) { + ret = OB_SUCCESS; + } } - if (ret == OB_ITER_END) { - ret = OB_SUCCESS; - } - } - } else { - // process inrow to outrow - int64_t old_char_len = ObCharset::strlen_char(param.coll_type_, old_data.ptr(), old_data.length()); - if (param.offset_ > old_char_len) { - // calc padding size - padding_size = param.offset_ - old_char_len; - // do append => [old_data][padding][data] - post_data = old_data; } else { - // combine data and old data - // [old_data][data] - int64_t offset_byte_len = ObCharset::charpos(param.coll_type_, - old_data.ptr(), - old_data.length(), - param.offset_); - post_data.assign_ptr(old_data.ptr(), offset_byte_len); + // process inrow to outrow + int64_t old_char_len = ObCharset::strlen_char(param.coll_type_, old_data.ptr(), old_data.length()); + if (param.offset_ > old_char_len) { + // calc padding size + padding_size = param.offset_ - old_char_len; + // do append => [old_data][padding][data] + post_data = old_data; + } else { + // combine data and old data + // [old_data][data] + int64_t offset_byte_len = ObCharset::charpos(param.coll_type_, + old_data.ptr(), + old_data.length(), + param.offset_); + post_data.assign_ptr(old_data.ptr(), offset_byte_len); + } } - } - // insert situation for range begin and end - // found_begin found end => result - // true true do range insert, seq_id in [end, next] - // false false do padding and append in [end, max] - // true false do range append, seq_id in [end, max] - // other situations are invalid - uint32_t inrow_st = 0; - ObString seq_id_st, seq_id_ed; - if (old_data.length() > 0) { - // inrow to outrow, set st 0, set ed null - seq_id_st.assign_ptr(reinterpret_cast(&inrow_st), sizeof(uint32_t)); - seq_id_ed.assign_ptr(nullptr, 0); - } else if (found_begin && found_end) { - seq_id_st = range_end.seq_id_; - seq_id_ed = meta_iter.get_cur_info().seq_id_; - if (seq_id_ed.compare(seq_id_st) == 0) { - // only found one and this is the last lob meta, just set end to max + // insert situation for range begin and end + // found_begin found end => result + // true true do range insert, seq_id in [end, next] + // false false do padding and append in [end, max] + // true false do range append, seq_id in [end, max] + // other situations are invalid + uint32_t inrow_st = 0; + ObString seq_id_st, seq_id_ed; + if (old_data.length() > 0) { + // inrow to outrow, set st 0, set ed null + seq_id_st.assign_ptr(reinterpret_cast(&inrow_st), sizeof(uint32_t)); seq_id_ed.assign_ptr(nullptr, 0); + } else if (found_begin && found_end) { + seq_id_st = range_end.seq_id_; + seq_id_ed = meta_iter.get_cur_info().seq_id_; + if (seq_id_ed.compare(seq_id_st) == 0) { + // only found one and this is the last lob meta, just set end to max + seq_id_ed.assign_ptr(nullptr, 0); + } + } else if (found_begin && !found_end) { + seq_id_st = meta_iter.get_cur_info().seq_id_; + seq_id_ed.assign_ptr(nullptr, 0); + } else if (!found_begin && !found_end) { + uint64_t total_char_len = meta_iter.get_cur_pos(); + padding_size = param.offset_ - total_char_len; + seq_id_st = meta_iter.get_cur_info().seq_id_; + seq_id_ed.assign_ptr(nullptr, 0); + } else { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unknown state for range.", K(ret), K(found_begin), K(found_end)); } - } else if (found_begin && !found_end) { - seq_id_st = meta_iter.get_cur_info().seq_id_; - seq_id_ed.assign_ptr(nullptr, 0); - } else if (!found_begin && !found_end) { - uint64_t total_char_len = meta_iter.get_cur_pos(); - padding_size = param.offset_ - total_char_len; - seq_id_st = meta_iter.get_cur_info().seq_id_; - seq_id_ed.assign_ptr(nullptr, 0); - } else { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unknown state for range.", K(ret), K(found_begin), K(found_end)); - } - if (OB_SUCC(ret)) { - // prepare write iter - ObLobMetaWriteIter write_iter(read_buf, param.allocator_, ObLobMetaUtil::LOB_OPER_PIECE_DATA_SIZE); - if (OB_FAIL(write_iter.open(param, iter, read_buf, padding_size, post_data, remain_buf, seq_id_st, seq_id_ed))) { - LOG_WARN("failed to open meta writer", K(ret), K(write_iter), K(meta_iter), K(found_begin), K(found_end), - K(range_begin), K(range_end)); - } else if (OB_FAIL(write_outrow_result(param, write_iter))) { - LOG_WARN("failed to write outrow result", K(ret), K(write_iter), K(meta_iter), K(found_begin), K(found_end), - K(range_begin), K(range_end)); + if (OB_SUCC(ret)) { + // prepare write iter + ObLobMetaWriteIter write_iter(read_buf, param.allocator_, ObLobMetaUtil::LOB_OPER_PIECE_DATA_SIZE); + if (OB_FAIL(write_iter.open(param, iter, read_buf, padding_size, post_data, remain_buf, seq_id_st, seq_id_ed))) { + LOG_WARN("failed to open meta writer", K(ret), K(write_iter), K(meta_iter), K(found_begin), K(found_end), + K(range_begin), K(range_end)); + } else if (OB_FAIL(write_outrow_result(param, write_iter))) { + LOG_WARN("failed to write outrow result", K(ret), K(write_iter), K(meta_iter), K(found_begin), K(found_end), + K(range_begin), K(range_end)); + } + write_iter.close(); } - write_iter.close(); } } return ret; diff --git a/src/storage/tablelock/ob_table_lock_common.h b/src/storage/tablelock/ob_table_lock_common.h index eeaecafc7..b4715d46d 100644 --- a/src/storage/tablelock/ob_table_lock_common.h +++ b/src/storage/tablelock/ob_table_lock_common.h @@ -218,6 +218,7 @@ enum class ObLockOBJType : char OBJ_TYPE_COMMON_OBJ = 3, // common_obj OBJ_TYPE_LS = 4, // for ls OBJ_TYPE_TENANT = 5, // for tenant + OBJ_TYPE_EXTERNAL_TABLE_REFRESH = 6, // for external table OBJ_TYPE_MAX }; diff --git a/src/storage/tablelock/ob_table_lock_rpc_struct.cpp b/src/storage/tablelock/ob_table_lock_rpc_struct.cpp index f2053caf4..fb1d91310 100644 --- a/src/storage/tablelock/ob_table_lock_rpc_struct.cpp +++ b/src/storage/tablelock/ob_table_lock_rpc_struct.cpp @@ -199,7 +199,8 @@ bool ObLockParam::is_valid() const (schema_version_ >= 0 || (ObLockOBJType::OBJ_TYPE_COMMON_OBJ == lock_id_.obj_type_ || ObLockOBJType::OBJ_TYPE_TENANT == lock_id_.obj_type_ - || ObLockOBJType::OBJ_TYPE_LS == lock_id_.obj_type_))); + || ObLockOBJType::OBJ_TYPE_LS == lock_id_.obj_type_ + || ObLockOBJType::OBJ_TYPE_EXTERNAL_TABLE_REFRESH == lock_id_.obj_type_))); } void ObLockRequest::reset() diff --git a/src/storage/tablelock/ob_table_lock_service.cpp b/src/storage/tablelock/ob_table_lock_service.cpp index 849d6b92b..c55602d27 100644 --- a/src/storage/tablelock/ob_table_lock_service.cpp +++ b/src/storage/tablelock/ob_table_lock_service.cpp @@ -1435,7 +1435,7 @@ int ObTableLockService::check_op_allowed_(const uint64_t table_id, if (is_inner_table(table_id)) { is_allowed = false; - } else if (!table_schema->is_user_table() && !table_schema->is_mysql_tmp_table()) { + } else if (!table_schema->is_user_table() && !table_schema->is_mysql_tmp_table() && !table_schema->is_external_table()) { // table lock not support virtual table/oracle tmp table /sys table etc. is_allowed = false; } else if (GCTX.is_standby_cluster() && OB_SYS_TENANT_ID != tenant_id) { 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 1129cefeb..51b41afbe 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 @@ -247,7 +247,7 @@ View Create View character_set_client collation_connection KEY_COLUMN_USAGE CREATE VIEW `KEY_COLUMN_USAGE` AS (select 'def' as CONSTRAINT_CATALOG, c.database_name as CONSTRAINT_SCHEMA, 'PRIMARY' as CONSTRAINT_NAME, 'def' as TABLE_CATALOG, c.database_name as TABLE_SCHEMA, a.table_name as TABLE_NAME, b.column_name as COLUMN_NAME, b.rowkey_position as ORDINAL_POSITION, NULL as POSITION_IN_UNIQUE_CONSTRAINT, NULL as REFERENCED_TABLE_SCHEMA, NULL as REFERENCED_TABLE_NAME, NULL as REFERENCED_COLUMN_NAME from oceanbase.__all_table a join oceanbase.__all_column b on a.tenant_id = b.tenant_id and a.table_id = b.table_id join oceanbase.__all_database c on a.tenant_id = c.tenant_id and a.database_id = c.database_id where a.tenant_id = 0 and c.in_recyclebin = 0 and c.database_name != '__recyclebin' and b.rowkey_position > 0 and b.column_id >= 16 and a.table_type != 5 and a.table_type != 12 and a.table_type != 13 and b.column_flags & (0x1 << 8) = 0) union all (select 'def' as CONSTRAINT_CATALOG, d.database_name as CONSTRAINT_SCHEMA, substr(a.table_name, 2 + length(substring_index(a.table_name,'_',4))) as CONSTRAINT_NAME, 'def' as TABLE_CATALOG, d.database_name as TABLE_SCHEMA, c.table_name as TABLE_NAME, b.column_name as COLUMN_NAME, b.index_position as ORDINAL_POSITION, NULL as POSITION_IN_UNIQUE_CONSTRAINT, NULL as REFERENCED_TABLE_SCHEMA, NULL as REFERENCED_TABLE_NAME, NULL as REFERENCED_COLUMN_NAME from oceanbase.__all_table a join oceanbase.__all_column b on a.tenant_id = b.tenant_id and a.table_id = b.table_id join oceanbase.__all_table c on a.tenant_id = c.tenant_id and a.data_table_id = c.table_id join oceanbase.__all_database d on a.tenant_id = d.tenant_id and c.database_id = d.database_id where a.tenant_id = 0 and d.in_recyclebin = 0 and d.database_name != '__recyclebin' and a.table_type = 5 and a.index_type in (2, 4, 8) and b.index_position > 0) union all (select 'def' as CONSTRAINT_CATALOG, d.database_name as CONSTRAINT_SCHEMA, f.foreign_key_name as CONSTRAINT_NAME, 'def' as TABLE_CATALOG, d.database_name as TABLE_SCHEMA, t.table_name as TABLE_NAME, c.column_name as COLUMN_NAME, fc.position as ORDINAL_POSITION, NULL as POSITION_IN_UNIQUE_CONSTRAINT, /* POSITION_IN_UNIQUE_CONSTRAINT is not supported now */ d2.database_name as REFERENCED_TABLE_SCHEMA, t2.table_name as REFERENCED_TABLE_NAME, c2.column_name as REFERENCED_COLUMN_NAME from oceanbase.__all_foreign_key f join oceanbase.__all_table t on f.tenant_id = t.tenant_id and f.child_table_id = t.table_id join oceanbase.__all_database d on f.tenant_id = d.tenant_id and t.database_id = d.database_id join oceanbase.__all_foreign_key_column fc on f.tenant_id = fc.tenant_id and f.foreign_key_id = fc.foreign_key_id join oceanbase.__all_column c on f.tenant_id = c.tenant_id and fc.child_column_id = c.column_id and t.table_id = c.table_id join oceanbase.__all_table t2 on f.tenant_id = t2.tenant_id and f.parent_table_id = t2.table_id join oceanbase.__all_database d2 on f.tenant_id = d2.tenant_id and t2.database_id = d2.database_id join oceanbase.__all_column c2 on f.tenant_id = c2.tenant_id and fc.parent_column_id = c2.column_id and t2.table_id = c2.table_id where f.tenant_id = 0) union all (select 'def' as CONSTRAINT_CATALOG, d.database_name as CONSTRAINT_SCHEMA, f.foreign_key_name as CONSTRAINT_NAME, 'def' as TABLE_CATALOG, d.database_name as TABLE_SCHEMA, t.table_name as TABLE_NAME, c.column_name as COLUMN_NAME, fc.position as ORDINAL_POSITION, NULL as POSITION_IN_UNIQUE_CONSTRAINT, /* POSITION_IN_UNIQUE_CONSTRAINT is not supported now */ d.database_name as REFERENCED_TABLE_SCHEMA, t2.mock_fk_parent_table_name as REFERENCED_TABLE_NAME, c2.parent_column_name as REFERENCED_COLUMN_NAME from oceanbase.__all_foreign_key f join oceanbase.__all_table t on f.tenant_id = t.tenant_id and f.child_table_id = t.table_id join oceanbase.__all_database d on f.tenant_id = d.tenant_id and t.database_id = d.database_id join oceanbase.__all_foreign_key_column fc on f.tenant_id = fc.tenant_id and f.foreign_key_id = fc.foreign_key_id join oceanbase.__all_column c on f.tenant_id = c.tenant_id and fc.child_column_id = c.column_id and t.table_id = c.table_id join oceanbase.__all_mock_fk_parent_table t2 on f.tenant_id = t2.tenant_id and f.parent_table_id = t2.mock_fk_parent_table_id join oceanbase.__all_mock_fk_parent_table_column c2 on f.tenant_id = c2.tenant_id and fc.parent_column_id = c2.parent_column_id and t2.mock_fk_parent_table_id = c2.mock_fk_parent_table_id where f.tenant_id = 0) utf8mb4 utf8mb4_general_ci show create table partitions; 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 AS TABLE_SCHEMA, T.TABLE_NAME 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 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) utf8mb4 utf8mb4_general_ci +PARTITIONS CREATE VIEW `PARTITIONS` AS SELECT CAST('def' as CHAR(4096)) AS TABLE_CATALOG, DB.DATABASE_NAME AS TABLE_SCHEMA, T.TABLE_NAME 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 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) 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, host 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 @@ -280,7 +280,7 @@ View Create View character_set_client collation_connection TABLE_PRIVILEGES CREATE VIEW `TABLE_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)) AS TABLE_SCHEMA , CAST(V.TABLE_NAME AS CHAR(64)) AS TABLE_NAME, CAST(V.PRIVILEGE_TYPE AS CHAR(64)) AS PRIVILEGE_TYPE , CAST(V.IS_GRANTABLE AS CHAR(3)) AS IS_GRANTABLE FROM (SELECT TP.DATABASE_NAME AS DATABASE_NAME, TP.TABLE_NAME AS TABLE_NAME, U.USER_NAME AS USER_NAME, U.HOST AS HOST, CASE WHEN V1.C1 = 1 AND TP.PRIV_ALTER = 1 THEN 'ALTER' WHEN V1.C1 = 2 AND TP.PRIV_CREATE = 1 THEN 'CREATE' WHEN V1.C1 = 4 AND TP.PRIV_DELETE = 1 THEN 'DELETE' WHEN V1.C1 = 5 AND TP.PRIV_DROP = 1 THEN 'DROP' WHEN V1.C1 = 7 AND TP.PRIV_INSERT = 1 THEN 'INSERT' WHEN V1.C1 = 8 AND TP.PRIV_UPDATE = 1 THEN 'UPDATE' WHEN V1.C1 = 9 AND TP.PRIV_SELECT = 1 THEN 'SELECT' WHEN V1.C1 = 10 AND TP.PRIV_INDEX = 1 THEN 'INDEX' WHEN V1.C1 = 11 AND TP.PRIV_CREATE_VIEW = 1 THEN 'CREATE VIEW' WHEN V1.C1 = 12 AND TP.PRIV_SHOW_VIEW = 1 THEN 'SHOW VIEW' ELSE NULL END PRIVILEGE_TYPE , CASE WHEN TP.PRIV_GRANT_OPTION = 1 THEN 'YES' WHEN TP.PRIV_GRANT_OPTION = 0 THEN 'NO' END IS_GRANTABLE FROM oceanbase.__all_table_privilege TP, 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) 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 TP.TENANT_ID = 0 AND TP.TENANT_ID = U.TENANT_ID AND TP.USER_ID = U.USER_ID AND (DB.USER_ID IS NOT NULL OR 512 & CURRENT_USER_PRIV() = 512 OR TP.USER_ID = CURR.USER_ID)) V WHERE V.PRIVILEGE_TYPE IS NOT NULL utf8mb4 utf8mb4_general_ci show create table tables; View Create View character_set_client collation_connection -TABLES CREATE VIEW `TABLES` AS select /*+ leading(a) no_use_nl(ts)*/ cast('def' as char(512)) as TABLE_CATALOG, cast(b.database_name as char(64)) as TABLE_SCHEMA, cast(a.table_name as char(64)) as TABLE_NAME, cast(case when (a.database_id = 201002 or a.table_type = 1) then 'SYSTEM VIEW' when a.table_type in (0, 2) then 'SYSTEM TABLE' when a.table_type = 4 then 'VIEW' else 'BASE TABLE' end as char(64)) as TABLE_TYPE, cast(NULL as char(64)) as ENGINE, cast(NULL as unsigned) as VERSION, cast(NULL as char(10)) as ROW_FORMAT, cast( coalesce(ts.row_cnt,0) as unsigned) as TABLE_ROWS, cast( coalesce(ts.avg_row_len,0) as unsigned) as AVG_ROW_LENGTH, cast( coalesce(ts.data_size,0) 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, cast(NULL as unsigned) as AUTO_INCREMENT, cast(a.gmt_create as datetime) as CREATE_TIME, cast(a.gmt_modified as datetime) as UPDATE_TIME, cast(NULL as datetime) as CHECK_TIME, cast(d.collation as char(32)) as TABLE_COLLATION, cast(NULL as unsigned) as CHECKSUM, cast(NULL as char(255)) as CREATE_OPTIONS, cast(case when a.table_type = 4 then 'VIEW' else a.comment end as char(2048)) as TABLE_COMMENT from ( select cast(0 as signed) as tenant_id, c.database_id, c.table_id, c.table_name, c.collation_type, c.table_type, usec_to_time(d.schema_version) as gmt_create, usec_to_time(c.schema_version) as gmt_modified, c.comment from oceanbase.__all_virtual_core_all_table c join oceanbase.__all_virtual_core_all_table d on c.tenant_id = d.tenant_id and d.table_name = '__all_core_table' where c.tenant_id = effective_tenant_id() union all select tenant_id, database_id, table_id, table_name, collation_type, table_type, gmt_create, gmt_modified, comment from oceanbase.__all_table) a join oceanbase.__all_database b on a.database_id = b.database_id and a.tenant_id = b.tenant_id join oceanbase.__tenant_virtual_collation d on a.collation_type = d.collation_type left join ( select tenant_id, table_id, sum(row_cnt) as row_cnt, sum(row_cnt * avg_row_len) / sum(row_cnt) as avg_row_len, sum(row_cnt * avg_row_len) as data_size from oceanbase.__all_table_stat group by tenant_id, table_id) ts on a.table_id = ts.table_id and a.tenant_id = ts.tenant_id where a.tenant_id = 0 and a.table_type in (0, 1, 2, 3, 4) and b.database_name != '__recyclebin' and b.in_recyclebin = 0 and 0 = sys_privilege_check('table_acc', effective_tenant_id(), b.database_name, a.table_name) utf8mb4 utf8mb4_general_ci +TABLES CREATE VIEW `TABLES` AS select /*+ leading(a) no_use_nl(ts)*/ cast('def' as char(512)) as TABLE_CATALOG, cast(b.database_name as char(64)) as TABLE_SCHEMA, cast(a.table_name as char(64)) as TABLE_NAME, cast(case when (a.database_id = 201002 or a.table_type = 1) then 'SYSTEM VIEW' when a.table_type in (0, 2) then 'SYSTEM TABLE' when a.table_type = 4 then 'VIEW' else 'BASE TABLE' end as char(64)) as TABLE_TYPE, cast(NULL as char(64)) as ENGINE, cast(NULL as unsigned) as VERSION, cast(NULL as char(10)) as ROW_FORMAT, cast( coalesce(ts.row_cnt,0) as unsigned) as TABLE_ROWS, cast( coalesce(ts.avg_row_len,0) as unsigned) as AVG_ROW_LENGTH, cast( coalesce(ts.data_size,0) 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, cast(NULL as unsigned) as AUTO_INCREMENT, cast(a.gmt_create as datetime) as CREATE_TIME, cast(a.gmt_modified as datetime) as UPDATE_TIME, cast(NULL as datetime) as CHECK_TIME, cast(d.collation as char(32)) as TABLE_COLLATION, cast(NULL as unsigned) as CHECKSUM, cast(NULL as char(255)) as CREATE_OPTIONS, cast(case when a.table_type = 4 then 'VIEW' else a.comment end as char(2048)) as TABLE_COMMENT from ( select cast(0 as signed) as tenant_id, c.database_id, c.table_id, c.table_name, c.collation_type, c.table_type, usec_to_time(d.schema_version) as gmt_create, usec_to_time(c.schema_version) as gmt_modified, c.comment from oceanbase.__all_virtual_core_all_table c join oceanbase.__all_virtual_core_all_table d on c.tenant_id = d.tenant_id and d.table_name = '__all_core_table' where c.tenant_id = effective_tenant_id() union all select tenant_id, database_id, table_id, table_name, collation_type, table_type, gmt_create, gmt_modified, comment from oceanbase.__all_table) a join oceanbase.__all_database b on a.database_id = b.database_id and a.tenant_id = b.tenant_id join oceanbase.__tenant_virtual_collation d on a.collation_type = d.collation_type left join ( select tenant_id, table_id, sum(row_cnt) as row_cnt, sum(row_cnt * avg_row_len) / sum(row_cnt) as avg_row_len, sum(row_cnt * avg_row_len) as data_size from oceanbase.__all_table_stat group by tenant_id, table_id) ts on a.table_id = ts.table_id and a.tenant_id = ts.tenant_id where a.tenant_id = 0 and a.table_type in (0, 1, 2, 3, 4, 14) and b.database_name != '__recyclebin' and b.in_recyclebin = 0 and 0 = sys_privilege_check('table_acc', effective_tenant_id(), b.database_name, a.table_name) utf8mb4 utf8mb4_general_ci show create table user_privileges; View Create View character_set_client collation_connection USER_PRIVILEGES CREATE VIEW `USER_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.PRIVILEGE_TYPE AS CHAR(64)) AS PRIVILEGE_TYPE , CAST(V.IS_GRANTABLE AS CHAR(3)) AS IS_GRANTABLE FROM (SELECT U.USER_NAME AS USER_NAME, U.HOST AS HOST, CASE WHEN V1.C1 = 1 AND U.PRIV_ALTER = 1 THEN 'ALTER' WHEN V1.C1 = 2 AND U.PRIV_CREATE = 1 THEN 'CREATE' WHEN V1.C1 = 3 AND U.PRIV_CREATE_USER = 1 THEN 'CREATE USER' WHEN V1.C1 = 4 AND U.PRIV_DELETE = 1 THEN 'DELETE' WHEN V1.C1 = 5 AND U.PRIV_DROP = 1 THEN 'DROP' WHEN V1.C1 = 7 AND U.PRIV_INSERT = 1 THEN 'INSERT' WHEN V1.C1 = 8 AND U.PRIV_UPDATE = 1 THEN 'UPDATE' WHEN V1.C1 = 9 AND U.PRIV_SELECT = 1 THEN 'SELECT' WHEN V1.C1 = 10 AND U.PRIV_INDEX = 1 THEN 'INDEX' WHEN V1.C1 = 11 AND U.PRIV_CREATE_VIEW = 1 THEN 'CREATE VIEW' WHEN V1.C1 = 12 AND U.PRIV_SHOW_VIEW = 1 THEN 'SHOW VIEW' WHEN V1.C1 = 13 AND U.PRIV_SHOW_DB = 1 THEN 'SHOW DB' WHEN V1.C1 = 14 AND U.PRIV_SUPER = 1 THEN 'SUPER' WHEN V1.C1 = 15 AND U.PRIV_PROCESS = 1 THEN 'PROCESS' WHEN V1.C1 = 17 AND U.PRIV_CREATE_SYNONYM = 1 THEN 'CREATE SYNONYM' WHEN V1.C1 = 27 AND U.PRIV_FILE = 1 THEN 'FILE' WHEN V1.C1 = 28 AND U.PRIV_ALTER_TENANT = 1 THEN 'ALTER TENANT' WHEN V1.C1 = 29 AND U.PRIV_ALTER_SYSTEM = 1 THEN 'ALTER SYSTEM' WHEN V1.C1 = 30 AND U.PRIV_CREATE_RESOURCE_POOL = 1 THEN 'CREATE RESOURCE POOL' WHEN V1.C1 = 31 AND U.PRIV_CREATE_RESOURCE_UNIT = 1 THEN 'CREATE RESOURCE UNIT' WHEN V1.C1 = 33 AND U.PRIV_REPL_SLAVE = 1 THEN 'REPLICATION SLAVE' WHEN V1.C1 = 34 AND U.PRIV_REPL_CLIENT = 1 THEN 'REPLICATION CLIENT' WHEN V1.C1 = 0 AND U.PRIV_ALTER = 0 AND U.PRIV_CREATE = 0 AND U.PRIV_CREATE_USER = 0 AND U.PRIV_DELETE = 0 AND U.PRIV_DROP = 0 AND U.PRIV_INSERT = 0 AND U.PRIV_UPDATE = 0 AND U.PRIV_SELECT = 0 AND U.PRIV_INDEX = 0 AND U.PRIV_CREATE_VIEW = 0 AND U.PRIV_SHOW_VIEW = 0 AND U.PRIV_SHOW_DB = 0 AND U.PRIV_SUPER = 0 AND U.PRIV_PROCESS = 0 AND U.PRIV_CREATE_SYNONYM = 0 AND U.PRIV_FILE = 0 AND U.PRIV_ALTER_TENANT = 0 AND U.PRIV_ALTER_SYSTEM = 0 AND U.PRIV_CREATE_RESOURCE_POOL = 0 AND U.PRIV_CREATE_RESOURCE_UNIT = 0 AND U.PRIV_REPL_SLAVE = 0 AND U.PRIV_REPL_CLIENT = 0 THEN 'USAGE' END PRIVILEGE_TYPE , CASE WHEN U.PRIV_GRANT_OPTION = 0 THEN 'NO' WHEN U.PRIV_ALTER = 0 AND U.PRIV_CREATE = 0 AND U.PRIV_CREATE_USER = 0 AND U.PRIV_DELETE = 0 AND U.PRIV_DROP = 0 AND U.PRIV_INSERT = 0 AND U.PRIV_UPDATE = 0 AND U.PRIV_SELECT = 0 AND U.PRIV_INDEX = 0 AND U.PRIV_CREATE_VIEW = 0 AND U.PRIV_SHOW_VIEW = 0 AND U.PRIV_SHOW_DB = 0 AND U.PRIV_SUPER = 0 AND U.PRIV_PROCESS = 0 AND U.PRIV_CREATE_SYNONYM = 0 AND U.PRIV_FILE = 0 AND U.PRIV_ALTER_TENANT = 0 AND U.PRIV_ALTER_SYSTEM = 0 AND U.PRIV_CREATE_RESOURCE_POOL = 0 AND U.PRIV_CREATE_RESOURCE_UNIT = 0 AND U.PRIV_REPL_SLAVE = 0 AND U.PRIV_REPL_CLIENT = 0 THEN 'NO' WHEN U.PRIV_GRANT_OPTION = 1 THEN 'YES' END IS_GRANTABLE FROM oceanbase.__all_user U, (SELECT 0 AS C1 UNION ALL SELECT 1 AS C1 UNION ALL SELECT 2 AS C1 UNION ALL SELECT 3 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 UNION ALL SELECT 17 AS C1 UNION ALL SELECT 27 AS C1 UNION ALL SELECT 28 AS C1 UNION ALL SELECT 29 AS C1 UNION ALL SELECT 30 AS C1 UNION ALL SELECT 31 AS C1 UNION ALL SELECT 33 AS C1 UNION ALL SELECT 34 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 U.TENANT_ID = 0 AND (DB.USER_ID IS NOT NULL OR 512 & CURRENT_USER_PRIV() = 512 OR U.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/inner_table_overall.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/inner_table_overall.result index 27e79406d..4c209bd75 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 @@ -233,6 +233,7 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 443 __all_tenant_rewrite_rules 0 201001 1 444 __all_reserved_snapshot 0 201001 1 445 __all_cluster_event_history 0 201001 1 +450 __all_external_table_file 0 201001 1 451 __all_task_opt_stat_gather_history 0 201001 1 452 __all_table_opt_stat_gather_history 0 201001 1 10001 __tenant_virtual_all_table 2 201001 1 @@ -587,6 +588,7 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 12365 __all_virtual_ls_arb_replica_task_history 2 201001 1 12366 __all_virtual_archive_dest_status 2 201001 1 12369 __all_virtual_io_scheduler 2 201001 1 +12371 __all_virtual_external_table_file 2 201001 1 12381 __all_virtual_task_opt_stat_gather_history 2 201001 1 12382 __all_virtual_table_opt_stat_gather_history 2 201001 1 12383 __all_virtual_opt_stat_gather_monitor 2 201001 1 @@ -889,7 +891,10 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 21380 GV$OB_THREAD 1 201001 1 21381 V$OB_THREAD 1 201001 1 21404 V$OB_TIMESTAMP_SERVICE 1 201001 1 +21417 DBA_OB_EXTERNAL_TABLE_FILES 1 201001 1 +21418 ALL_OB_EXTERNAL_TABLE_FILES 1 201001 1 21423 DBA_OB_TABLE_STAT_STALE_INFO 1 201001 1 +21425 CDB_OB_EXTERNAL_TABLE_FILES 1 201001 1 check sys table count and table_id range success check count and table_id range for virtual table success select * from information_schema.CHARACTER_SETS limit 1; diff --git a/unittest/sql/parser/test_parser.result b/unittest/sql/parser/test_parser.result index 2c2812074..f714888ab 100644 --- a/unittest/sql/parser/test_parser.result +++ b/unittest/sql/parser/test_parser.result @@ -5653,7 +5653,8 @@ question_mask_size: 0 ] } ] - } + }, + { } ] } ] @@ -5748,7 +5749,8 @@ question_mask_size: 0 ] } ] - } + }, + { } ] } ] @@ -5848,7 +5850,8 @@ question_mask_size: 0 ] } ] - } + }, + { } ] } ]