[FEAT MERGE] Support external table
Co-authored-by: jingtaoye35 <1255153887@qq.com>
This commit is contained in:
parent
ecb74a122c
commit
09ed904b58
@ -16,6 +16,12 @@
|
||||
#include <stddef.h>
|
||||
|
||||
|
||||
template< size_t N >
|
||||
constexpr size_t str_length( char const (&)[N] )
|
||||
{
|
||||
return N-1;
|
||||
}
|
||||
|
||||
template <class T, size_t N>
|
||||
constexpr size_t array_elements(T (&)[N]) noexcept {
|
||||
return N;
|
||||
|
4
deps/oblib/src/lib/ob_define.h
vendored
4
deps/oblib/src/lib/ob_define.h
vendored
@ -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";
|
||||
|
2
deps/oblib/src/lib/ob_name_def.h
vendored
2
deps/oblib/src/lib/ob_name_def.h
vendored
@ -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"
|
||||
|
36
deps/oblib/src/lib/rowid/ob_urowid.cpp
vendored
36
deps/oblib/src/lib/rowid/ob_urowid.cpp
vendored
@ -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<ObObj> &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()) {
|
||||
|
2
deps/oblib/src/lib/rowid/ob_urowid.h
vendored
2
deps/oblib/src/lib/rowid/ob_urowid.h
vendored
@ -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
|
||||
};
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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,
|
||||
|
@ -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_;
|
||||
|
@ -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_;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
|
@ -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()) {
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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<const ObSAuditSchema *> 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<const ObSAuditSchema *> audits;
|
||||
if (OB_FAIL(schema_guard.get_audit_schema_in_owner(tenant_id,
|
||||
AUDIT_TABLE,
|
||||
|
@ -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");
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -113,6 +113,20 @@ private:
|
||||
common::ObIAllocator& allocator_;
|
||||
};
|
||||
|
||||
class ObFullPathArrayOp : public ObBaseDirEntryOperator
|
||||
{
|
||||
public:
|
||||
ObFullPathArrayOp(common::ObIArray <common::ObString> &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 <common::ObString> &name_array_;
|
||||
common::ObString &path_;
|
||||
common::ObIAllocator &allocator_;
|
||||
};
|
||||
|
||||
class ObDirPrefixEntryNameFilter : public ObBaseDirEntryOperator
|
||||
{
|
||||
public:
|
||||
|
512
src/share/external_table/ob_external_table_file_mgr.cpp
Normal file
512
src/share/external_table/ob_external_table_file_mgr.cpp
Normal file
@ -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<ObExternalFileInfo> &external_files,
|
||||
ObIArray<ObNewRange *> *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<ObExternalFileInfo> &external_files,
|
||||
ObIArray<ObNewRange *> *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<ObString> &file_urls,
|
||||
ObIArray<int64_t> &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<ObString> &file_urls,
|
||||
ObIArray<int64_t> &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<ObString> &file_urls,
|
||||
ObIArray<int64_t> &file_sizes)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
int64_t cur_time = ObTimeUtil::current_time();
|
||||
ObSEArray<ObString, 16> old_file_urls;
|
||||
ObSEArray<int64_t, 16> old_file_ids;
|
||||
ObSEArray<ObString, 16> insert_file_urls;
|
||||
ObSEArray<int64_t, 16> insert_file_ids;
|
||||
ObSEArray<int64_t, 16> insert_file_sizes;
|
||||
ObSEArray<ObString, 16> update_file_urls;
|
||||
ObSEArray<int64_t, 16> update_file_sizes;
|
||||
ObSEArray<int64_t, 16> update_file_ids;
|
||||
ObSEArray<ObString, 16> delete_file_urls;
|
||||
ObSEArray<int64_t, 16> 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<ObString, int64_t> 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<ObString> &file_urls,
|
||||
ObIArray<int64_t> &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<ObString, 16> temp_file_urls;
|
||||
ObSEArray<int64_t, 16> 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<ObString>(temp_file_urls.get_data(), temp_file_urls.count());
|
||||
temp_ext_files.file_ids_ = ObArrayWrap<int64_t>(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<ObInnerSQLConnection *>(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_);
|
||||
|
||||
}
|
||||
}
|
161
src/share/external_table/ob_external_table_file_mgr.h
Normal file
161
src/share/external_table/ob_external_table_file_mgr.h
Normal file
@ -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<const ObExternalTableFilesKey&>(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<ObString> file_urls_;
|
||||
ObArrayWrap<int64_t> 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<ObExternalFileInfo> &external_files,
|
||||
common::ObIArray<ObNewRange *> *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<ObExternalFileInfo> &external_files,
|
||||
common::ObIArray<ObNewRange *> *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<common::ObString> &file_urls,
|
||||
common::ObIArray<int64_t> &file_sizes);
|
||||
|
||||
int get_all_records_from_inner_table(ObIAllocator &allocator,
|
||||
int64_t tenant_id,
|
||||
int64_t table_id,
|
||||
int64_t partition_id,
|
||||
ObIArray<ObString> &file_urls,
|
||||
ObIArray<int64_t> &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<ObString> &file_urls,
|
||||
ObIArray<int64_t> &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<common::ObString> &file_urls,
|
||||
common::ObIArray<int64_t> &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<ObExternalTableFilesKey, ObExternalTableFiles> kv_cache_;
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* _OB_EXTERNAL_TABLE_FILE_MANAGER_H_ */
|
@ -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<ObString, 16> 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<rpc::frame::ObReqTransport::AsyncCB *>(
|
||||
static_cast<const rpc::frame::ObReqTransport::AsyncCB * const>(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<rpc::frame::ObReqTransport::AsyncCB *>(
|
||||
static_cast<const rpc::frame::ObReqTransport::AsyncCB * const>(this));
|
||||
}
|
||||
|
||||
|
||||
} // namespace share
|
||||
} // namespace oceanbase
|
173
src/share/external_table/ob_external_table_file_rpc_processor.h
Normal file
173
src/share/external_table/ob_external_table_file_rpc_processor.h
Normal file
@ -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 T>
|
||||
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<T *, 4> 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<obrpc::OB_FLUSH_EXTERNAL_TABLE_FILE_CACHE>
|
||||
{
|
||||
public:
|
||||
ObRpcAsyncFlushExternalTableKVCacheCallBack(
|
||||
ObAsyncRpcTaskWaitContext<ObRpcAsyncFlushExternalTableKVCacheCallBack> *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<ObRpcAsyncFlushExternalTableKVCacheCallBack> *get_async_cb_context()
|
||||
{ return context_; }
|
||||
|
||||
TO_STRING_KV(K_(context));
|
||||
private:
|
||||
ObAsyncRpcTaskWaitContext<ObRpcAsyncFlushExternalTableKVCacheCallBack> *context_;
|
||||
};
|
||||
|
||||
class ObFlushExternalTableKVCacheP : public
|
||||
obrpc::ObRpcProcessor<obrpc::ObExtenralTableRpcProxy::ObRpc<obrpc::OB_FLUSH_EXTERNAL_TABLE_FILE_CACHE> >
|
||||
{
|
||||
public:
|
||||
ObFlushExternalTableKVCacheP() {}
|
||||
~ObFlushExternalTableKVCacheP() {}
|
||||
int process();
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(ObFlushExternalTableKVCacheP);
|
||||
};
|
||||
|
||||
class ObAsyncLoadExternalTableFileListP : public
|
||||
obrpc::ObRpcProcessor<obrpc::ObExtenralTableRpcProxy::ObRpc<obrpc::OB_LOAD_EXTERNAL_FILE_LIST> >
|
||||
{
|
||||
public:
|
||||
ObAsyncLoadExternalTableFileListP() {}
|
||||
~ObAsyncLoadExternalTableFileListP() {}
|
||||
int process();
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(ObAsyncLoadExternalTableFileListP);
|
||||
};
|
||||
|
||||
class ObRpcAsyncLoadExternalTableFileCallBack
|
||||
: public obrpc::ObExtenralTableRpcProxy::AsyncCB<obrpc::OB_LOAD_EXTERNAL_FILE_LIST>
|
||||
{
|
||||
public:
|
||||
ObRpcAsyncLoadExternalTableFileCallBack(
|
||||
ObAsyncRpcTaskWaitContext<ObRpcAsyncLoadExternalTableFileCallBack> *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<ObRpcAsyncLoadExternalTableFileCallBack> *get_async_cb_context() { return context_; }
|
||||
|
||||
TO_STRING_KV(K_(context));
|
||||
private:
|
||||
ObAsyncRpcTaskWaitContext<ObRpcAsyncLoadExternalTableFileCallBack> *context_;
|
||||
};
|
||||
} // namespace share
|
||||
} // namespace oceanbase
|
||||
#endif /* OB_EXTERNAL_TABLE_FILE_RPC_PROCESSOR_H_ */
|
36
src/share/external_table/ob_external_table_file_rpc_proxy.h
Normal file
36
src/share/external_table/ob_external_table_file_rpc_proxy.h
Normal file
@ -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_ */
|
70
src/share/external_table/ob_external_table_file_task.cpp
Normal file
70
src/share/external_table/ob_external_table_file_task.cpp
Normal file
@ -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
|
79
src/share/external_table/ob_external_table_file_task.h
Normal file
79
src/share/external_table/ob_external_table_file_task.h
Normal file
@ -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<ObString, 8> file_urls_;
|
||||
ObSEArray<int64_t, 8> file_sizes_;
|
||||
|
||||
private:
|
||||
ObArenaAllocator allocator_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
} // namespace share
|
||||
} // namespace oceanbase
|
||||
#endif /* OBDEV_SRC_EXTERNAL_TABLE_FILE_TASK_H_ */
|
369
src/share/external_table/ob_external_table_utils.cpp
Normal file
369
src/share/external_table/ob_external_table_utils.cpp
Normal file
@ -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<ObNewRange *> &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<ObObj*>(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<ObObj*>(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<ObNewRange *> &ranges,
|
||||
ObIAllocator &range_allocator,
|
||||
ObIArray<ObNewRange *> &new_range,
|
||||
bool is_file_on_disk) {
|
||||
int ret = OB_SUCCESS;
|
||||
ObSEArray<ObExternalFileInfo, 16> file_urls;
|
||||
ObSEArray<ObNewRange *, 4> 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<ObString> &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<ObString, 8> 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
|
98
src/share/external_table/ob_external_table_utils.h
Normal file
98
src/share/external_table/ob_external_table_utils.h
Normal file
@ -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<common::ObNewRange *> &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<common::ObNewRange *> &ranges,
|
||||
common::ObIAllocator &range_allocator,
|
||||
common::ObIArray<common::ObNewRange *> &new_range,
|
||||
bool is_file_on_disk);
|
||||
|
||||
static int filter_external_table_files(const common::ObString &pattern,
|
||||
sql::ObExecContext &exec_ctx,
|
||||
common::ObIArray<common::ObString> &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_ */
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
File diff suppressed because one or more lines are too long
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
@ -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];
|
||||
|
@ -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";
|
||||
|
@ -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
|
||||
|
||||
|
@ -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))) {
|
||||
|
@ -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<ObAddr> &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)
|
||||
|
@ -168,6 +168,10 @@ public:
|
||||
bool &is_cache_hit,
|
||||
ObIArray<common::ObAddr> &locations);
|
||||
|
||||
int external_table_get(const uint64_t tenant_id,
|
||||
const uint64_t table_id,
|
||||
ObIArray<common::ObAddr> &locations);
|
||||
|
||||
// Nonblock way to renew the virtual table location
|
||||
//
|
||||
// @param [in] tenant_id: Tenant for virtual table.
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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<common::ObSpatialMBR, OB_DEFAULT_MBR_FILTER_COUNT> 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_
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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<int64_t> (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()));
|
||||
|
@ -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_;
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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<typename ColumnType>
|
||||
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<uint64_t> rls_policy_ids_;
|
||||
common::ObSArray<uint64_t> rls_group_ids_;
|
||||
common::ObSArray<uint64_t> 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
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -853,7 +853,7 @@ int ObBasicStatsEstimator::gen_tablet_list(const ObTableStatParam ¶m,
|
||||
ObSEArray<uint64_t, 4> 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_))) {
|
||||
|
@ -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*/}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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_))) {
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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<ObColumnRefRawExpr *>(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;
|
||||
|
@ -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<ObAddr> &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,
|
||||
|
@ -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<ObAddr> &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_;
|
||||
|
@ -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<uint64_t, common::ObIAllocator> UIntFixedArray;
|
||||
typedef common::ObFixedArray<int64_t, common::ObIAllocator> IntFixedArray;
|
||||
typedef common::ObFixedArray<ObObjectID, common::ObIAllocator> ObjectIDFixedArray;
|
||||
typedef common::ObFixedArray<ObDASTableLoc*, common::ObIAllocator> DASTableLocFixedArray;
|
||||
typedef common::ObFixedArray<common::ObString, common::ObIAllocator> ExternalFileNameArray;
|
||||
|
||||
//DAS: data access service
|
||||
//CtDef: Compile time Definition
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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<int64_t>(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()
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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<FormatType>(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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -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<common::ObString> 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<common::ObCharsetType cs_type, typename handle_func, bool DO_ESCAPE = false>
|
||||
template<common::ObCharsetType cs_type, typename handle_func, bool NEED_ESCAPED_RESULT = false>
|
||||
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<LineErrRec> &errors,
|
||||
bool is_end_file);
|
||||
|
||||
template<typename handle_func, bool DO_ESCAPE = false>
|
||||
template<typename handle_func, bool NEED_ESCAPED_RESULT = false>
|
||||
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<common::CHARSET_UTF8MB4, handle_func, DO_ESCAPE>(
|
||||
ret = scan_proto<common::CHARSET_UTF8MB4, handle_func, NEED_ESCAPED_RESULT>(
|
||||
str, end, nrows, escape_buf, escaped_buf_end, handle_one_line, errors, is_end_file);
|
||||
break;
|
||||
case common::CHARSET_GBK:
|
||||
ret = scan_proto<common::CHARSET_GBK, handle_func, DO_ESCAPE>(
|
||||
ret = scan_proto<common::CHARSET_GBK, handle_func, NEED_ESCAPED_RESULT>(
|
||||
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<common::CHARSET_GB18030, handle_func, DO_ESCAPE>(
|
||||
ret = scan_proto<common::CHARSET_GB18030, handle_func, NEED_ESCAPED_RESULT>(
|
||||
str, end, nrows, escape_buf, escaped_buf_end, handle_one_line, errors, is_end_file);
|
||||
break;
|
||||
default:
|
||||
ret = scan_proto<common::CHARSET_BINARY, handle_func, DO_ESCAPE>(
|
||||
ret = scan_proto<common::CHARSET_BINARY, handle_func, NEED_ESCAPED_RESULT>(
|
||||
str, end, nrows, escape_buf, escaped_buf_end, handle_one_line, errors, is_end_file);
|
||||
break;
|
||||
}
|
||||
@ -128,6 +167,7 @@ public:
|
||||
common::ObIArray<FieldValue>& get_fields_per_line() { return fields_per_line_; }
|
||||
|
||||
private:
|
||||
int init_opt_variables();
|
||||
template<common::ObCharsetType cs_type>
|
||||
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<int32_t>(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<char*>(field_begin);
|
||||
new_field.len_ = str_len;
|
||||
new_field.len_ = static_cast<int32_t>(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<FieldValue, 1> fields_per_line_;
|
||||
@ -230,7 +293,7 @@ inline int ObCSVGeneralParser::mbcharlen<common::CHARSET_GB18030>(const char *pt
|
||||
return mb_len;
|
||||
}
|
||||
|
||||
template<common::ObCharsetType cs_type, typename handle_func, bool DO_ESCAPE>
|
||||
template<common::ObCharsetType cs_type, typename handle_func, bool NEED_ESCAPED_RESULT>
|
||||
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<cs_type>(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_;
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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<ObString> &file_urls,
|
||||
ObIArray<int64_t> &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<ObString> &file_urls,
|
||||
ObIArray<int64_t> &file_sizes) {
|
||||
int ret = OB_SUCCESS;
|
||||
const int64_t count = file_urls.count();
|
||||
ObSEArray<int64_t, 8> tmp_file_sizes;
|
||||
hash::ObHashMap<ObString, int64_t> 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<ObAddr> &all_servers)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObArenaAllocator allocator;
|
||||
ObAsyncRpcTaskWaitContext<ObRpcAsyncFlushExternalTableKVCacheCallBack> 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<ObAddr> &all_servers,
|
||||
ObIArray<ObString> &file_urls,
|
||||
ObIArray<int64_t> &file_sizes,
|
||||
ObIAllocator &allocator)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObSEArray<ObAddr, 8> target_servers;
|
||||
ObArray<ObString> 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<ObRpcAsyncLoadExternalTableFileCallBack> 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<ObString> &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<ObString, 8> file_urls;
|
||||
ObSEArray<int64_t, 8> file_sizes;
|
||||
ObArenaAllocator allocator;
|
||||
ObSEArray<ObAddr, 8> 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;
|
||||
|
@ -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<common::ObAddr> &all_servers,
|
||||
common::ObIArray<common::ObString> &file_urls,
|
||||
common::ObIArray<int64_t> &file_sizes,
|
||||
common::ObIAllocator &allocator);
|
||||
static int flush_external_file_cache(
|
||||
const uint64_t tenant_id,
|
||||
const uint64_t table_id,
|
||||
const common::ObIArray<common::ObAddr> &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<common::ObString> &file_urls,
|
||||
common::ObIArray<int64_t> &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<ObString> &file_urls,
|
||||
ObIArray<int64_t> &file_sizes);
|
||||
private:
|
||||
//DISALLOW_COPY_AND_ASSIGN(ObAlterTableExecutor);
|
||||
};
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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<ObSqcTableLocationKey> &get_access_table_location_keys() { return access_table_location_keys_; }
|
||||
ObIArray<ObSqcTableLocationIndex> &get_access_table_location_indexes() { return access_table_location_indexes_; }
|
||||
ObIArray<share::ObExternalFileInfo> &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<share::ObExternalFileInfo, 8> 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<share::ObExternalFileInfo> &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<share::ObExternalFileInfo> external_table_files_;
|
||||
};
|
||||
|
||||
|
||||
|
@ -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<const ObTableScanSpec*> &scan_ops,
|
||||
const common::ObIArray<DASTabletLocArray> &tablet_arrays,
|
||||
common::ObIArray<ObPxTabletInfo> &partitions_info,
|
||||
common::ObIArray<ObExternalFileInfo> &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<const ObTableScanSpec*> &scan_ops,
|
||||
const common::ObIArray<DASTabletLocArray> &tablet_arrays,
|
||||
common::ObIArray<ObPxTabletInfo> &partitions_info,
|
||||
common::ObIArray<share::ObExternalFileInfo> &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<const ObTableScanSpec*> &scan_ops,
|
||||
const common::ObIArray<DASTabletLocArray> &tablet_arrays,
|
||||
common::ObIArray<ObPxTabletInfo> &partitions_info,
|
||||
const common::ObIArray<ObExternalFileInfo> &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);
|
||||
|
@ -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<ObPxTabletInfo> partitions_info_;
|
||||
common::ObArray<share::ObExternalFileInfo> external_table_files_;
|
||||
int64_t parallelism_;
|
||||
int64_t tablet_size_;
|
||||
uint64_t gi_attri_flag_;
|
||||
@ -484,6 +489,7 @@ public:
|
||||
ObIArray<const ObTableScanSpec*> &scan_ops,
|
||||
const common::ObIArray<DASTabletLocArray> &tablet_arrays,
|
||||
common::ObIArray<ObPxTabletInfo> &partitions_info,
|
||||
common::ObIArray<share::ObExternalFileInfo> &external_table_files,
|
||||
const ObTableModifySpec* modify_op,
|
||||
int64_t parallelism,
|
||||
int64_t tablet_size,
|
||||
@ -493,6 +499,7 @@ public:
|
||||
ObIArray<const ObTableScanSpec*> &scan_ops,
|
||||
const common::ObIArray<DASTabletLocArray> &tablet_arrays,
|
||||
common::ObIArray<ObPxTabletInfo> &partitions_info,
|
||||
common::ObIArray<share::ObExternalFileInfo> &external_table_files,
|
||||
const ObTableModifySpec* modify_op,
|
||||
int64_t parallelism,
|
||||
int64_t tablet_size,
|
||||
@ -556,6 +563,7 @@ private:
|
||||
ObIArray<const ObTableScanSpec*> &scan_ops,
|
||||
const common::ObIArray<DASTabletLocArray> &tablet_arrays,
|
||||
common::ObIArray<ObPxTabletInfo> &partitions_info,
|
||||
const common::ObIArray<share::ObExternalFileInfo> &external_table_files,
|
||||
const ObTableModifySpec* modify_op,
|
||||
int64_t parallelism,
|
||||
int64_t tablet_size,
|
||||
|
@ -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<ObNewRange> &ranges,
|
||||
const ObIArray<ObDASTabletLoc *> &tablets,
|
||||
const ObIArray<ObExternalFileInfo> &external_table_files,
|
||||
int64_t parallelism,
|
||||
ObIArray<ObDASTabletLoc *> &granule_tablets,
|
||||
ObIArray<ObNewRange> &granule_ranges,
|
||||
ObIArray<int64_t> &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<common::ObNewRange> &in_ranges,
|
||||
@ -167,13 +229,13 @@ int ObGranuleUtil::remove_empty_range(const common::ObIArray<common::ObNewRange>
|
||||
|
||||
int ObGranuleUtil::split_block_granule(ObIAllocator &allocator,
|
||||
const ObTableScanSpec *tsc,//may be is null, attention use!
|
||||
const ObIArray<common::ObNewRange> &input_ranges,
|
||||
const ObIArray<ObNewRange> &input_ranges,
|
||||
const ObIArray<ObDASTabletLoc*> &tablets,
|
||||
int64_t parallelism,
|
||||
int64_t tablet_size,
|
||||
common::ObIArray<ObDASTabletLoc*> &granule_tablets,
|
||||
common::ObIArray<common::ObNewRange> &granule_ranges,
|
||||
common::ObIArray<int64_t> &granule_idx,
|
||||
ObIArray<ObDASTabletLoc*> &granule_tablets,
|
||||
ObIArray<ObNewRange> &granule_ranges,
|
||||
ObIArray<int64_t> &granule_idx,
|
||||
bool range_independent)
|
||||
{
|
||||
// the step for split task by block granule method:
|
||||
|
@ -22,6 +22,9 @@
|
||||
|
||||
namespace oceanbase
|
||||
{
|
||||
namespace share {
|
||||
struct ObExternalFileInfo;
|
||||
}
|
||||
namespace common
|
||||
{
|
||||
class ObStoreRange;
|
||||
@ -266,6 +269,18 @@ public:
|
||||
common::ObIArray<common::ObNewRange> &granule_ranges,
|
||||
common::ObIArray<int64_t> &granule_idx,
|
||||
bool range_independent);
|
||||
|
||||
|
||||
static int split_granule_for_external_table(common::ObIAllocator &allocator,
|
||||
const ObTableScanSpec *tsc,
|
||||
const common::ObIArray<common::ObNewRange> &input_ranges,
|
||||
const common::ObIArray<ObDASTabletLoc*> &tablet_array,
|
||||
const common::ObIArray<share::ObExternalFileInfo> &external_table_files,
|
||||
int64_t parallelism,
|
||||
common::ObIArray<ObDASTabletLoc*> &granule_tablets,
|
||||
common::ObIArray<common::ObNewRange> &granule_ranges,
|
||||
common::ObIArray<int64_t> &granule_idx);
|
||||
|
||||
/**
|
||||
* get the total task count for all partitions
|
||||
* params IN the parameters for splitting
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user