[FEAT MERGE] Support external table

Co-authored-by: jingtaoye35 <1255153887@qq.com>
This commit is contained in:
wjhh2008 2023-04-29 15:11:49 +00:00 committed by ob-robot
parent ecb74a122c
commit 09ed904b58
164 changed files with 8074 additions and 667 deletions

View File

@ -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;

View File

@ -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";

View File

@ -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"

View File

@ -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()) {

View File

@ -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
};

View File

@ -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)

View File

@ -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)

View File

@ -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,

View File

@ -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_;

View File

@ -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_;

View File

@ -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);

View File

@ -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);
}

View File

@ -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));

View File

@ -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;

View File

@ -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()) {

View File

@ -117,8 +117,8 @@ int ObDbmsStats::gather_table_stats(ObExecContext &ctx, ParamStore &params, 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 &params, 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 &param)
{
return !(is_virtual_table(param.table_id_) ||
share::schema::ObTableType::EXTERNAL_TABLE == param.ref_table_type_);
}
/**
* @brief ObDbmsStats::parse_granularity
* @param ctx

View File

@ -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 &param);
static void decide_modified_part(ObTableStatParam &param, const bool cascade_parts);

View File

@ -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,

View File

@ -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");

View File

@ -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

View File

@ -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)
{

View File

@ -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:

View 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_);
}
}

View 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_ */

View File

@ -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

View 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_ */

View 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_ */

View 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

View 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_ */

View 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

View 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_ */

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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));
}
}

View File

@ -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));
}
}

View File

@ -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

View File

@ -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));
}
}

View File

@ -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;

View File

@ -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));
}
}

View File

@ -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));
}
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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) {

View File

@ -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];

View File

@ -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";

View File

@ -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

View File

@ -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))) {

View File

@ -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)

View File

@ -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.

View File

@ -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;
}

View File

@ -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_

View File

@ -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

View File

@ -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)
{

View File

@ -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()));

View File

@ -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_;

View File

@ -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;

View File

@ -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
};

View File

@ -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;
}

View File

@ -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

View File

@ -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));
}

View File

@ -853,7 +853,7 @@ int ObBasicStatsEstimator::gen_tablet_list(const ObTableStatParam &param,
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_))) {

View File

@ -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*/}
}

View File

@ -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;
}

View File

@ -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_))) {

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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;
}

View File

@ -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;

View File

@ -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,

View File

@ -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_;

View File

@ -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

View File

@ -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

View File

@ -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,

View File

@ -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()

View File

@ -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

View File

@ -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;
}

View File

@ -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

View File

@ -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;
}
}
}

View File

@ -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_;
};
}
}

View File

@ -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;

View File

@ -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);
};

View File

@ -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;
}

View File

@ -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_;
};

View File

@ -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);

View File

@ -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,

View File

@ -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:

View File

@ -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