Merge branch 'column_store'
Co-authored-by: wangt1xiuyi <13547954130@163.com> Co-authored-by: yangqise7en <877793735@qq.com> Co-authored-by: Zach41 <zach_41@163.com>
This commit is contained in:
2
unittest/share/cache/ob_cache_test_utils.h
vendored
2
unittest/share/cache/ob_cache_test_utils.h
vendored
@ -701,7 +701,7 @@ private:
|
||||
int64_t start_key_;
|
||||
};
|
||||
|
||||
class TestNode : public KVCacheHazardNode{
|
||||
class TestNode : public ObKVCacheHazardNode{
|
||||
public:
|
||||
TestNode()
|
||||
: id_(0)
|
||||
|
||||
66
unittest/share/cache/test_kv_storecache.cpp
vendored
66
unittest/share/cache/test_kv_storecache.cpp
vendored
@ -153,9 +153,7 @@ TEST(ObKVGlobalCache, normal)
|
||||
ASSERT_NE(OB_SUCCESS, ret);
|
||||
uint64_t tenant_id_ = 900;
|
||||
int64_t washable_size = -1;
|
||||
ret = ObKVGlobalCache::get_instance().store_.get_washable_size(tenant_id_, washable_size, -10);
|
||||
ASSERT_NE(OB_SUCCESS, ret);
|
||||
ret = ObKVGlobalCache::get_instance().store_.get_washable_size(tenant_id_, washable_size, 110);
|
||||
ret = ObKVGlobalCache::get_instance().store_.get_washable_size(tenant_id_, washable_size);
|
||||
ASSERT_NE(OB_SUCCESS, ret);
|
||||
|
||||
//repeat init
|
||||
@ -249,30 +247,27 @@ TEST_F(TestKVCache, test_hazard_version)
|
||||
ObKVCacheInstKey inst_key(1, tenant_id_);
|
||||
ObKVCacheInstHandle inst_handle;
|
||||
ObKVGlobalCache::get_instance().insts_.get_cache_inst(inst_key, inst_handle);
|
||||
GlobalHazardVersion &hazard_version = ObKVGlobalCache::get_instance().map_.global_hazard_version_;
|
||||
ObKVCacheHazardStation &hazard_station = ObKVGlobalCache::get_instance().map_.global_hazard_station_;
|
||||
|
||||
ret = cache.init("test");
|
||||
ASSERT_EQ(ret, OB_SUCCESS);
|
||||
|
||||
COMMON_LOG(INFO, "********** test get hazard thread store **********");
|
||||
KVCacheHazardThreadStore *ts = nullptr;
|
||||
int64_t thread_id = get_itid();
|
||||
hazard_version.get_thread_store(ts);
|
||||
COMMON_LOG(INFO, "thread store:", KP(ts), K(ts->thread_id_), K(ts->inited_));
|
||||
|
||||
COMMON_LOG(INFO, "********** test hazard delete node **********");
|
||||
TestNode *node = nullptr;
|
||||
for (int64_t i = 0 ; i < 20 ; ++i) {
|
||||
ret = hazard_version.acquire();
|
||||
int64_t slot_id = -1;
|
||||
ret = hazard_station.acquire(slot_id);
|
||||
ASSERT_EQ(OB_SUCCESS, ret);
|
||||
ASSERT_LE(ts->acquired_version_, hazard_version.version_);
|
||||
hazard_version.print_current_status();
|
||||
ObKVCacheHazardSlot &slot = hazard_station.hazard_slots_[slot_id];
|
||||
COMMON_LOG(INFO, "hazard slot:", K(slot));
|
||||
ASSERT_LE(slot.acquired_version_, hazard_station.version_);
|
||||
hazard_station.print_current_status();
|
||||
node = new TestNode();
|
||||
node->id_ = i;
|
||||
hazard_version.delete_node(node);
|
||||
hazard_version.release();
|
||||
ASSERT_EQ(ts->acquired_version_, UINT64_MAX);
|
||||
hazard_version.print_current_status();
|
||||
hazard_station.delete_node(slot_id, node);
|
||||
hazard_station.release(slot_id);
|
||||
ASSERT_EQ(slot.acquired_version_, UINT64_MAX);
|
||||
hazard_station.print_current_status();
|
||||
COMMON_LOG(INFO, "-----");
|
||||
}
|
||||
}
|
||||
@ -296,7 +291,7 @@ TEST_F(TestKVCache, test_func)
|
||||
ObKVCacheInstKey inst_key(0, tenant_id_);
|
||||
ObKVCacheInstHandle inst_handle;
|
||||
ObKVGlobalCache::get_instance().insts_.get_cache_inst(inst_key, inst_handle);
|
||||
GlobalHazardVersion &hazard_version = ObKVGlobalCache::get_instance().map_.global_hazard_version_;
|
||||
ObKVCacheHazardStation &hazard_station = ObKVGlobalCache::get_instance().map_.global_hazard_station_;
|
||||
ObKVCacheStore &store = ObKVGlobalCache::get_instance().store_;
|
||||
|
||||
key.v_ = 900;
|
||||
@ -593,6 +588,7 @@ TEST_F(TestKVCache, test_washable_size)
|
||||
typedef TestKVCacheValue<V_SIZE> TestValue;
|
||||
|
||||
int ret = OB_SUCCESS;
|
||||
int64_t washable_size = -1;
|
||||
ObKVCache<TestKey, TestValue> cache;
|
||||
TestKey key;
|
||||
TestValue value;
|
||||
@ -610,23 +606,16 @@ TEST_F(TestKVCache, test_washable_size)
|
||||
ret = cache.init("test");
|
||||
ASSERT_EQ(OB_SUCCESS, ret);
|
||||
|
||||
// test calculate washable size before putting kv
|
||||
int64_t washable_size = -1;
|
||||
ret = ObKVGlobalCache::get_instance().get_washable_size(tenant_id_, washable_size);
|
||||
COMMON_LOG(INFO, "washable size before put,", K(ret), K(tenant_id_), K(washable_size));
|
||||
ASSERT_EQ(OB_SUCCESS, ret);
|
||||
|
||||
//test put and wash
|
||||
ObKVGlobalCache::get_instance().wash();
|
||||
for (int64_t i = 0; i < upper_mem_limit_ / V_SIZE * 10; ++i) {
|
||||
key.v_ = i;
|
||||
ret = cache.put(key, value);
|
||||
ASSERT_EQ(OB_SUCCESS, ret);
|
||||
ret = ObKVGlobalCache::get_instance().get_washable_size(tenant_id_, washable_size);
|
||||
COMMON_LOG(INFO, "washable size,",K(ret), K(tenant_id_), K(washable_size));
|
||||
ASSERT_EQ(OB_SUCCESS, ret);
|
||||
}
|
||||
|
||||
// test calculate wash size after putting kv
|
||||
ObKVGlobalCache::get_instance().wash();
|
||||
ret = ObKVGlobalCache::get_instance().get_washable_size(tenant_id_, washable_size);
|
||||
COMMON_LOG(INFO, "washable size after push,", K(ret), K(tenant_id_), K(washable_size));
|
||||
ASSERT_EQ(OB_SUCCESS, ret);
|
||||
@ -640,29 +629,6 @@ TEST_F(TestKVCache, test_washable_size)
|
||||
ASSERT_EQ(OB_SUCCESS, ret);
|
||||
}
|
||||
|
||||
COMMON_LOG(INFO, "start get washable size by 100% *********************************");
|
||||
start_time = ObTimeUtility::current_time();
|
||||
for (int i = 0 ; i < 3000 ; ++i) {
|
||||
ret = ObKVGlobalCache::get_instance().store_.get_washable_size(tenant_id_, washable_size);
|
||||
}
|
||||
cur_time = ObTimeUtility::current_time();
|
||||
get_wash_time = cur_time - start_time;
|
||||
COMMON_LOG(INFO, "get washable time,", K(washable_size), K(get_wash_time));
|
||||
|
||||
COMMON_LOG(INFO, "start get washable size by 1/8 *********************************");
|
||||
start_time = ObTimeUtility::current_time();
|
||||
for (int i = 0 ; i < 3000 ; ++i) {
|
||||
ret = ObKVGlobalCache::get_instance().store_.get_washable_size(tenant_id_, washable_size, 3);
|
||||
}
|
||||
cur_time = ObTimeUtility::current_time();
|
||||
get_wash_time = cur_time - start_time;
|
||||
COMMON_LOG(INFO, "get washable time by percentage 10,", K(washable_size), K(get_wash_time));
|
||||
|
||||
ret = ObKVGlobalCache::get_instance().store_.get_washable_size(tenant_id_, washable_size, 2);
|
||||
ret = ObKVGlobalCache::get_instance().store_.get_washable_size(tenant_id_, washable_size, 4);
|
||||
ret = ObKVGlobalCache::get_instance().store_.get_washable_size(tenant_id_, washable_size, 5);
|
||||
ret = ObKVGlobalCache::get_instance().store_.get_washable_size(tenant_id_, washable_size, 6);
|
||||
|
||||
sleep(1);
|
||||
// ASSERT_TRUE(cache.size(tenant_id_) < upper_mem_limit_);
|
||||
}
|
||||
|
||||
@ -16,7 +16,8 @@
|
||||
#include <gtest/gtest.h>
|
||||
#define protected public
|
||||
#define private public
|
||||
#include "share/scheduler/ob_dag_scheduler.h"
|
||||
#include "storage/compaction/ob_tenant_tablet_scheduler.h"
|
||||
#include "share/scheduler/ob_tenant_dag_scheduler.h"
|
||||
#include "lib/atomic/ob_atomic.h"
|
||||
#include "lib/alloc/ob_malloc_allocator.h"
|
||||
#include "observer/omt/ob_tenant_node_balancer.h"
|
||||
@ -68,6 +69,7 @@ class TestDagScheduler : public ::testing::Test
|
||||
public:
|
||||
TestDagScheduler()
|
||||
: tenant_id_(500),
|
||||
tablet_scheduler_(nullptr),
|
||||
scheduler_(nullptr),
|
||||
dag_history_mgr_(nullptr),
|
||||
tenant_base_(500)
|
||||
@ -84,12 +86,18 @@ public:
|
||||
ObTenantMetaMemMgr *t3m = OB_NEW(ObTenantMetaMemMgr, ObModIds::TEST, 500);
|
||||
tenant_base_.set(t3m);
|
||||
|
||||
tablet_scheduler_ = OB_NEW(compaction::ObTenantTabletScheduler, ObModIds::TEST);
|
||||
tenant_base_.set(tablet_scheduler_);
|
||||
|
||||
scheduler_ = OB_NEW(ObTenantDagScheduler, ObModIds::TEST);
|
||||
tenant_base_.set(scheduler_);
|
||||
|
||||
dag_history_mgr_ = OB_NEW(ObDagWarningHistoryManager, ObModIds::TEST);
|
||||
tenant_base_.set(dag_history_mgr_);
|
||||
|
||||
diagnose_mgr_ = OB_NEW(compaction::ObDiagnoseTabletMgr, ObModIds::TEST);
|
||||
tenant_base_.set(diagnose_mgr_);
|
||||
|
||||
ObTenantEnv::set_tenant(&tenant_base_);
|
||||
ASSERT_EQ(OB_SUCCESS, tenant_base_.init());
|
||||
|
||||
@ -99,21 +107,31 @@ public:
|
||||
|
||||
ASSERT_EQ(OB_SUCCESS, t3m->init());
|
||||
ASSERT_EQ(OB_SUCCESS, scheduler_->init(tenant_id_, time_slice, check_waiting_list_period, MAX_DAG_CNT));
|
||||
ObAddr addr(1683068975,9999);
|
||||
if (OB_SUCCESS != (ObSysTaskStatMgr::get_instance().set_self_addr(addr))) {
|
||||
COMMON_LOG_RET(WARN, OB_ERROR, "failed to add sys task", K(addr));
|
||||
}
|
||||
}
|
||||
void TearDown()
|
||||
{
|
||||
tablet_scheduler_->destroy();
|
||||
tablet_scheduler_ = nullptr;
|
||||
scheduler_->destroy();
|
||||
scheduler_ = nullptr;
|
||||
dag_history_mgr_->~ObDagWarningHistoryManager();
|
||||
dag_history_mgr_ = nullptr;
|
||||
diagnose_mgr_->destroy();
|
||||
diagnose_mgr_ = nullptr;
|
||||
tenant_base_.destroy();
|
||||
ObTenantEnv::set_tenant(nullptr);
|
||||
}
|
||||
private:
|
||||
const static int64_t MAX_DAG_CNT = 64;
|
||||
const uint64_t tenant_id_;
|
||||
compaction::ObTenantTabletScheduler *tablet_scheduler_;
|
||||
ObTenantDagScheduler *scheduler_;
|
||||
ObDagWarningHistoryManager *dag_history_mgr_;
|
||||
compaction::ObDiagnoseTabletMgr *diagnose_mgr_;
|
||||
ObTenantBase tenant_base_;
|
||||
DISALLOW_COPY_AND_ASSIGN(TestDagScheduler);
|
||||
};
|
||||
@ -180,16 +198,21 @@ public:
|
||||
virtual ~ObWaitTask() {}
|
||||
virtual int process()
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
if (cnt_ == 0) {
|
||||
start_time_ = ObTimeUtility::current_time();
|
||||
} else if (cnt_ < FINISH_CNT) {
|
||||
cnt_++;
|
||||
dag_yield();
|
||||
if (OB_FAIL(dag_yield())) {
|
||||
if (OB_CANCELED != ret) {
|
||||
COMMON_LOG(WARN, "Invalid return value for dag_yield", K(ret));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
finish_time_ = ObTimeUtility::current_time();
|
||||
COMMON_LOG(INFO, "finish process", K(start_time_), K_(finish_time));
|
||||
}
|
||||
return OB_SUCCESS;
|
||||
return ret;
|
||||
}
|
||||
private:
|
||||
const static int64_t FINISH_CNT = 5;
|
||||
@ -300,7 +323,6 @@ public:
|
||||
COMMON_LOG(WARN, "task is null", K(ret));
|
||||
} else {
|
||||
ntask->init(seq_ + 1);
|
||||
ntask->set_max_retry_times(3);
|
||||
next_task = ntask;
|
||||
}
|
||||
}
|
||||
@ -313,44 +335,6 @@ private:
|
||||
int64_t seq_;
|
||||
};
|
||||
|
||||
class ObTaskRetryDag : public ObBasicDag
|
||||
{
|
||||
public:
|
||||
ObTaskRetryDag() :
|
||||
ObBasicDag()
|
||||
{}
|
||||
virtual int create_first_task() override
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObRetryTask *task = NULL;
|
||||
if (OB_FAIL(alloc_task(task))) {
|
||||
COMMON_LOG(WARN, "Fail to alloc task", K(ret));
|
||||
} else if (OB_FAIL(add_task(*task))) {
|
||||
COMMON_LOG(WARN, "Fail to add task", K(ret));
|
||||
} else {
|
||||
task->init(0);
|
||||
task->set_max_retry_times(10);
|
||||
}
|
||||
return common::OB_SUCCESS;
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(TestDagScheduler, test_task_retry)
|
||||
{
|
||||
ObTenantDagScheduler *scheduler = MTL(ObTenantDagScheduler*);
|
||||
ASSERT_TRUE(nullptr != scheduler);
|
||||
ObDagWarningHistoryManager* manager = MTL(ObDagWarningHistoryManager *);
|
||||
ASSERT_TRUE(nullptr != manager);
|
||||
EXPECT_EQ(OB_SUCCESS, MTL(ObDagWarningHistoryManager *)->init(true, MTL_ID(), "DagWarnHis"));
|
||||
|
||||
for (int i = 0; i < 2; ++i) {
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->create_and_add_dag<ObTaskRetryDag>(nullptr));
|
||||
}
|
||||
|
||||
wait_scheduler();
|
||||
EXPECT_EQ(0, MTL(ObDagWarningHistoryManager *)->size());
|
||||
}
|
||||
|
||||
class ObDagRetryTask : public ObITask
|
||||
{
|
||||
public:
|
||||
@ -714,7 +698,7 @@ class ObFatherDagNet : public ObIDagNet
|
||||
{
|
||||
public:
|
||||
ObFatherDagNet() :
|
||||
ObIDagNet(ObDagNetType::DAG_NET_TYPE_MIGARTION),
|
||||
ObIDagNet(ObDagNetType::DAG_NET_TYPE_MIGRATION),
|
||||
id_(ObTimeUtility::current_time() + random()),
|
||||
op_()
|
||||
{}
|
||||
@ -766,6 +750,29 @@ public:
|
||||
{ UNUSEDx(buf, buf_len); return OB_SUCCESS; }
|
||||
virtual bool is_ha_dag_net() const override { return false; }
|
||||
INHERIT_TO_STRING_KV("ObIDagNet", ObIDagNet, K_(type), K_(id));
|
||||
virtual int clear_dag_net_ctx() override
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
int tmp_ret = OB_SUCCESS;
|
||||
ObTenantDagWorker *worker = ObTenantDagWorker::self();
|
||||
|
||||
if (worker != nullptr) {
|
||||
ObITask * task = worker->get_task();
|
||||
ObTenantDagWorker::DagWorkerStatus status = worker->get_status();
|
||||
EXPECT_EQ(status, ObTenantDagWorker::DWS_FREE);
|
||||
EXPECT_EQ(task, nullptr);
|
||||
if(OB_TMP_FAIL(worker->yield())) {
|
||||
if (tmp_ret == OB_CANCELED) {
|
||||
ret = OB_SUCCESS;
|
||||
}
|
||||
}
|
||||
COMMON_LOG(WARN, "call worker->yiled() after task is destoryed", K(ret), K(tmp_ret));
|
||||
} else {
|
||||
COMMON_LOG(WARN, "worker in this thread is nullptr");
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
private:
|
||||
|
||||
int64_t id_;
|
||||
@ -892,7 +899,7 @@ public:
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
} else {
|
||||
ObIDag *dag = get_dag();
|
||||
ObRetryTask *ntask = NULL;
|
||||
ObDagRetryTask *ntask = NULL;
|
||||
if (NULL == dag) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
COMMON_LOG(WARN, "dag is null", K(ret));
|
||||
@ -902,7 +909,6 @@ public:
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
COMMON_LOG(WARN, "task is null", K(ret));
|
||||
} else {
|
||||
ntask->init(seq_ + 1);
|
||||
next_task = ntask;
|
||||
}
|
||||
}
|
||||
@ -1327,7 +1333,7 @@ public:
|
||||
}
|
||||
if (OB_FAIL(ret)) {
|
||||
if (OB_NOT_NULL(new_dag)) {
|
||||
new_dag->reset_children();
|
||||
new_dag->reset_node();
|
||||
if (OB_SUCCESS != (tmp_ret = dag_net->erase_dag_from_dag_net(*new_dag))) {
|
||||
COMMON_LOG(WARN, "failed to erase dag from dag net", K(tmp_ret), KPC(new_dag));
|
||||
}
|
||||
@ -1337,7 +1343,7 @@ public:
|
||||
|
||||
for (int64_t i = 0; i < new_dag_array.count(); ++i) {
|
||||
ObIDag *dag = new_dag_array.at(i);
|
||||
dag->reset_children();
|
||||
dag->reset_node();
|
||||
if (OB_SUCCESS != (tmp_ret = dag_net->erase_dag_from_dag_net(*dag))) {
|
||||
COMMON_LOG(WARN, "failed to erase dag from dag net", K(tmp_ret), KPC(dag));
|
||||
}
|
||||
@ -1350,7 +1356,7 @@ public:
|
||||
}
|
||||
}
|
||||
new_dag_array.reset();
|
||||
this->get_dag()->reset_children();
|
||||
this->get_dag()->reset_node();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@ -1460,7 +1466,7 @@ public:
|
||||
COMMON_LOG(WARN, "Fail to add child", K(ret), KPC(prepare_dag), KPC(finish_dag));
|
||||
}
|
||||
EXPECT_EQ(OB_SUCCESS, ret);
|
||||
MTL(ObTenantDagScheduler*)->free_dag(*finish_dag, prepare_dag);
|
||||
MTL(ObTenantDagScheduler*)->free_dag(*finish_dag);
|
||||
COMMON_LOG(INFO, "free dag", K(ret), KPC(prepare_dag), KPC(this));
|
||||
EXPECT_EQ(dag_record_map_.size(), 1);
|
||||
EXPECT_EQ(0, prepare_dag->children_.count());
|
||||
|
||||
@ -16,7 +16,8 @@
|
||||
#include <gtest/gtest.h>
|
||||
#define protected public
|
||||
#define private public
|
||||
#include "share/scheduler/ob_dag_scheduler.h"
|
||||
#include "storage/compaction/ob_tenant_tablet_scheduler.h"
|
||||
#include "share/scheduler/ob_tenant_dag_scheduler.h"
|
||||
#include "share/scheduler/ob_sys_task_stat.h"
|
||||
#include "lib/atomic/ob_atomic.h"
|
||||
#include "observer/omt/ob_tenant_node_balancer.h"
|
||||
@ -28,7 +29,7 @@ int64_t stress_time= 1; // 100ms
|
||||
char log_level[20] = "INFO";
|
||||
uint32_t time_slice = 1000;
|
||||
uint32_t sleep_slice = 2 * time_slice;
|
||||
const int64_t CHECK_TIMEOUT = 1 * 1000 * 1000;
|
||||
const int64_t CHECK_TIMEOUT = 2 * 1000 * 1000; // larger than SCHEDULER_WAIT_TIME_MS
|
||||
|
||||
#define CHECK_EQ_UTIL_TIMEOUT(expected, expr) \
|
||||
{ \
|
||||
@ -216,7 +217,14 @@ public:
|
||||
int ret = OB_SUCCESS;
|
||||
int64_t cnt = sleep_us_ / SLEEP_SLICE;
|
||||
for (int64_t i = 0; i < cnt; ++i) {
|
||||
dag_yield();
|
||||
if (OB_FAIL(dag_yield())) {
|
||||
if (OB_CANCELED == ret) {
|
||||
COMMON_LOG(INFO, "Cancel this task since the whole dag is canceled", K(ret));
|
||||
break;
|
||||
} else {
|
||||
COMMON_LOG(WARN, "Invalid return value for dag_yield", K(ret));
|
||||
}
|
||||
}
|
||||
::usleep(SLEEP_SLICE);
|
||||
}
|
||||
if (seq_ == error_seq_) {
|
||||
@ -230,6 +238,7 @@ public:
|
||||
private:
|
||||
int64_t seq_;
|
||||
int64_t cnt_;
|
||||
// The seq triger process return OB_ERR_UNEXPECTED to test error handing
|
||||
int64_t error_seq_;
|
||||
AtomicOperator *op_;
|
||||
int sleep_us_;
|
||||
@ -277,7 +286,14 @@ public:
|
||||
int ret = OB_SUCCESS;
|
||||
int64_t cnt = sleep_us_ / SLEEP_SLICE;
|
||||
for (int64_t i = 0; i < cnt; ++i) {
|
||||
dag_yield();
|
||||
if (OB_FAIL(dag_yield())) {
|
||||
if (OB_CANCELED == ret) {
|
||||
COMMON_LOG(INFO, "Cancel this task since the whole dag is canceled", K(ret));
|
||||
break;
|
||||
} else {
|
||||
COMMON_LOG(WARN, "Invalid return value for dag_yield", K(ret));
|
||||
}
|
||||
}
|
||||
::usleep(SLEEP_SLICE);
|
||||
}
|
||||
if (seq_ == error_seq_) {
|
||||
@ -335,7 +351,14 @@ public:
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
while (true) {
|
||||
dag_yield();
|
||||
if (OB_FAIL(dag_yield())) {
|
||||
if (OB_CANCELED == ret) {
|
||||
COMMON_LOG(INFO, "Cancel this task since the whole dag is canceled", K(ret));
|
||||
break;
|
||||
} else {
|
||||
COMMON_LOG(WARN, "Invalid return value for dag_yield", K(ret));
|
||||
}
|
||||
}
|
||||
if (nullptr != finish_flag_) {
|
||||
if (ATOMIC_LOAD(finish_flag_) == true) {
|
||||
break;
|
||||
@ -352,6 +375,88 @@ private:
|
||||
bool *finish_flag_;
|
||||
};
|
||||
|
||||
class MaybeCanceledLoopWaitTask : public ObITask
|
||||
{
|
||||
public:
|
||||
MaybeCanceledLoopWaitTask() :
|
||||
ObITask(ObITask::TASK_TYPE_UT), seq_(0), cnt_(0), cancel_seq_(0)
|
||||
{}
|
||||
int init(int64_t seq, int64_t cnt, int64_t cancel_seq, bool &finish_flag)
|
||||
{
|
||||
seq_ = seq;
|
||||
cnt_ = cnt;
|
||||
cancel_seq_ = cancel_seq;
|
||||
finish_flag_ = &finish_flag;
|
||||
return OB_SUCCESS;
|
||||
}
|
||||
virtual int generate_next_task(ObITask *&task)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObIDag *dag = NULL;
|
||||
MaybeCanceledLoopWaitTask *ntask = NULL;
|
||||
if (seq_ >= cnt_) {
|
||||
return OB_ITER_END;
|
||||
} else if (OB_ISNULL(dag = get_dag())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
COMMON_LOG(WARN, "dag is NULL", K(ret));
|
||||
} else if (OB_FAIL(dag->alloc_task(ntask))){
|
||||
COMMON_LOG(WARN, "failed to alloc task", K(ret));
|
||||
} else if (OB_ISNULL(ntask)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
COMMON_LOG(WARN, "ntask is NULL", K(ret));
|
||||
} else {
|
||||
COMMON_LOG(INFO, "a task is generated", K(seq_));
|
||||
ntask->init(seq_ + 1, cnt_, cancel_seq_, *finish_flag_);
|
||||
task = ntask;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
virtual int process()
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObTenantDagScheduler *scheduler = nullptr;
|
||||
|
||||
if (seq_ == cancel_seq_) {
|
||||
if (OB_FAIL(dag_yield())) {
|
||||
if (OB_CANCELED != ret) {
|
||||
COMMON_LOG(WARN, "Invalid return value for dag_yield", K(ret));
|
||||
}
|
||||
}
|
||||
::usleep(2*SLEEP_SLICE);
|
||||
if (OB_ISNULL(scheduler = MTL(ObTenantDagScheduler*))) {
|
||||
COMMON_LOG(WARN, "Failed to get tenant dag scheduler for this tenant", K_(seq), K_(cnt), K_(cancel_seq), KP(scheduler));
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
} else if (OB_FAIL(scheduler->cancel_dag(dag_, true))) {
|
||||
COMMON_LOG(WARN, "Failed to triger cancel this (running) dag", K_(seq), K_(cnt), K_(cancel_seq));
|
||||
} else {
|
||||
ret = OB_CANCELED;
|
||||
COMMON_LOG(INFO, "Successfully triger cancel this (running) dag", K_(seq), K_(cnt), K_(cancel_seq));
|
||||
}
|
||||
} else {
|
||||
while (true) {
|
||||
if (OB_FAIL(dag_yield()) && OB_CANCELED == ret) {
|
||||
COMMON_LOG(INFO, "Cancel this task since the whole dag is canceled", K_(seq), K_(cnt), K_(cancel_seq));
|
||||
break;
|
||||
}
|
||||
if (nullptr != finish_flag_) {
|
||||
if (ATOMIC_LOAD(finish_flag_) == true || seq_ % 2 == 1) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
::usleep(SLEEP_SLICE);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
VIRTUAL_TO_STRING_KV("type", "MaybeCanceledLoopWaitTask", K(*dag_), K_(seq), K_(cnt), K_(cancel_seq));
|
||||
|
||||
private:
|
||||
int64_t seq_;
|
||||
int64_t cnt_;
|
||||
int64_t cancel_seq_;
|
||||
bool *finish_flag_;
|
||||
};
|
||||
|
||||
template<class T>
|
||||
int alloc_task(ObIDag &dag, T *&task) {
|
||||
int ret = OB_SUCCESS;
|
||||
@ -448,7 +553,9 @@ public:
|
||||
VIRTUAL_TO_STRING_KV(K_(is_inited), K_(type), K_(id), K(task_list_.get_size()));
|
||||
protected:
|
||||
int64_t id_;
|
||||
// expect ret for op_
|
||||
int64_t expect_;
|
||||
// expect ret for this dag
|
||||
int expect_ret_;
|
||||
AtomicOperator op_;
|
||||
bool running_;
|
||||
@ -468,19 +575,11 @@ private:
|
||||
class TestMPDag : public TestDag
|
||||
{
|
||||
public:
|
||||
TestMPDag() : TestDag(ObDagType::DAG_TYPE_MAJOR_MERGE) {}
|
||||
TestMPDag() : TestDag(ObDagType::DAG_TYPE_FAST_MIGRATE) {}
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(TestMPDag);
|
||||
};
|
||||
|
||||
class TestHPDag : public TestDag
|
||||
{
|
||||
public:
|
||||
TestHPDag() : TestDag(ObDagType::DAG_TYPE_MERGE_EXECUTE) {}
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(TestHPDag);
|
||||
};
|
||||
|
||||
class TestHALowDag : public TestDag
|
||||
{
|
||||
public:
|
||||
@ -601,6 +700,38 @@ private:
|
||||
AtomicOperator *op_;
|
||||
};
|
||||
|
||||
class TestCancelDag : public TestDag
|
||||
{
|
||||
public:
|
||||
static int64_t test_round;
|
||||
typedef TestPrepareTask CancelFinishTask;
|
||||
typedef MaybeCanceledLoopWaitTask CancelPrepareTask;
|
||||
TestCancelDag() : TestDag() {}
|
||||
int init_dag(int64_t cnt, int64_t cancel_seq, bool &finish_flag, AtomicOperator *op) {
|
||||
int ret = OB_SUCCESS;
|
||||
test_round++;
|
||||
COMMON_LOG(INFO, "Start Testing TestCancelDag", K(test_round));
|
||||
|
||||
CancelPrepareTask *cancel_task = nullptr;
|
||||
CancelFinishTask *finish_task = nullptr;
|
||||
|
||||
EXPECT_EQ(OB_SUCCESS, alloc_task(cancel_task));
|
||||
EXPECT_EQ(OB_SUCCESS, cancel_task->init(0, cnt, cancel_seq, finish_flag));
|
||||
EXPECT_EQ(OB_SUCCESS, add_task(*cancel_task));
|
||||
|
||||
EXPECT_EQ(OB_SUCCESS, alloc_task(finish_task));
|
||||
EXPECT_EQ(OB_SUCCESS, finish_task->init(1, op));
|
||||
EXPECT_EQ(OB_SUCCESS, add_task(*finish_task));
|
||||
EXPECT_EQ(OB_SUCCESS, cancel_task->add_child(*finish_task));
|
||||
return ret;
|
||||
}
|
||||
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(TestCancelDag);
|
||||
};
|
||||
|
||||
int64_t TestCancelDag::test_round = 0;
|
||||
|
||||
class TestCyclePrepare : public ObITask
|
||||
{
|
||||
public:
|
||||
@ -707,8 +838,9 @@ public:
|
||||
int64_t start_time = ObTimeUtility::current_time();
|
||||
int ret = OB_SUCCESS;
|
||||
int tmp_ret = OB_SUCCESS;
|
||||
ObTenantBase * tenant_base = OB_NEW(ObTenantBase, "TestBase", 1);
|
||||
ObTenantBase * tenant_base = OB_NEW(ObTenantBase, "TestBase", 1001);
|
||||
tenant_base->init();
|
||||
tenant_base->set(scheduler_);
|
||||
ObTenantEnv::set_tenant(tenant_base);
|
||||
|
||||
while (!has_set_stop()
|
||||
@ -750,7 +882,7 @@ public:
|
||||
break;
|
||||
}
|
||||
default : {
|
||||
TestHPDag *hp_dag= NULL;
|
||||
TestMPDag *hp_dag= NULL;
|
||||
if (OB_SUCCESS != (tmp_ret = scheduler_->alloc_dag(hp_dag))) {
|
||||
if (OB_ALLOCATE_MEMORY_FAILED != tmp_ret) {
|
||||
ret = tmp_ret;
|
||||
@ -803,15 +935,24 @@ class TestDagScheduler : public ::testing::Test
|
||||
{
|
||||
public:
|
||||
TestDagScheduler()
|
||||
: tenant_id_(500),
|
||||
: tenant_id_(1001),
|
||||
tablet_scheduler_(nullptr),
|
||||
scheduler_(nullptr),
|
||||
dag_history_mgr_(nullptr),
|
||||
tenant_base_(500),
|
||||
allocator_("DagScheduler")
|
||||
tenant_base_(1001),
|
||||
allocator_("DagScheduler"),
|
||||
inited_(false)
|
||||
{ }
|
||||
~TestDagScheduler() {}
|
||||
void SetUp()
|
||||
{
|
||||
if (!inited_) {
|
||||
ObMallocAllocator::get_instance()->create_and_add_tenant_allocator(1001);
|
||||
inited_ = true;
|
||||
}
|
||||
tablet_scheduler_ = OB_NEW(compaction::ObTenantTabletScheduler, ObModIds::TEST);
|
||||
tenant_base_.set(tablet_scheduler_);
|
||||
|
||||
scheduler_ = OB_NEW(ObTenantDagScheduler, ObModIds::TEST);
|
||||
tenant_base_.set(scheduler_);
|
||||
|
||||
@ -822,11 +963,12 @@ public:
|
||||
ASSERT_EQ(OB_SUCCESS, tenant_base_.init());
|
||||
|
||||
ObMallocAllocator *ma = ObMallocAllocator::get_instance();
|
||||
ASSERT_EQ(OB_SUCCESS, ma->create_and_add_tenant_allocator(tenant_id_));
|
||||
ASSERT_EQ(OB_SUCCESS, ma->set_tenant_limit(tenant_id_, 1LL << 30));
|
||||
}
|
||||
void TearDown()
|
||||
{
|
||||
tablet_scheduler_->destroy();
|
||||
tablet_scheduler_ = nullptr;
|
||||
scheduler_->destroy();
|
||||
scheduler_ = nullptr;
|
||||
dag_history_mgr_->~ObDagWarningHistoryManager();
|
||||
@ -836,10 +978,12 @@ public:
|
||||
}
|
||||
private:
|
||||
const uint64_t tenant_id_;
|
||||
compaction::ObTenantTabletScheduler *tablet_scheduler_;
|
||||
ObTenantDagScheduler *scheduler_;
|
||||
ObDagWarningHistoryManager *dag_history_mgr_;
|
||||
ObTenantBase tenant_base_;
|
||||
ObArenaAllocator allocator_;
|
||||
bool inited_;
|
||||
DISALLOW_COPY_AND_ASSIGN(TestDagScheduler);
|
||||
};
|
||||
|
||||
@ -857,7 +1001,7 @@ TEST_F(TestDagScheduler, test_init)
|
||||
}
|
||||
|
||||
|
||||
TEST_F(TestDagScheduler, baisc_test)
|
||||
TEST_F(TestDagScheduler, basic_test)
|
||||
{
|
||||
ObTenantDagScheduler *scheduler = MTL(ObTenantDagScheduler*);
|
||||
ASSERT_TRUE(nullptr != scheduler);
|
||||
@ -1133,7 +1277,7 @@ TEST_F(TestDagScheduler, test_priority)
|
||||
int64_t threads_sum = 0;
|
||||
int64_t work_thread_num = 0;
|
||||
for (int64_t i = 0; i < ObDagPrio::DAG_PRIO_MAX; ++i) { // calc sum of default_low_limit
|
||||
threads_sum += scheduler->up_limits_[i];
|
||||
threads_sum += scheduler->prio_sche_[i].limits_;
|
||||
}
|
||||
work_thread_num = threads_sum;
|
||||
|
||||
@ -1241,9 +1385,9 @@ void print_state(int64_t idx)
|
||||
{
|
||||
ObTenantDagScheduler *scheduler = MTL(ObTenantDagScheduler*);
|
||||
ASSERT_TRUE(nullptr != scheduler);
|
||||
COMMON_LOG(INFO, "scheduler state: ", K(scheduler->total_running_task_cnt_), K(scheduler->work_thread_num_),
|
||||
K(scheduler->total_worker_cnt_), K(scheduler->low_limits_[idx]),
|
||||
K(scheduler->up_limits_[idx]), K(scheduler->running_task_cnts_[idx]));
|
||||
COMMON_LOG(INFO, "scheduler state: ", K(scheduler->get_total_running_task_cnt()), K(scheduler->work_thread_num_),
|
||||
K(scheduler->total_worker_cnt_), K(scheduler->prio_sche_[idx].limits_),
|
||||
K(scheduler->prio_sche_[idx].running_task_cnts_));
|
||||
}
|
||||
|
||||
TEST_F(TestDagScheduler, test_set_concurrency)
|
||||
@ -1251,14 +1395,14 @@ TEST_F(TestDagScheduler, test_set_concurrency)
|
||||
ObTenantDagScheduler *scheduler = MTL(ObTenantDagScheduler*);
|
||||
ASSERT_TRUE(nullptr != scheduler);
|
||||
|
||||
int64_t prio = ObDagPrio::DAG_PRIO_COMPACTION_MID;
|
||||
int64_t prio = ObDagPrio::DAG_PRIO_HA_MID;
|
||||
int32_t uplimit = OB_DAG_PRIOS[prio].score_;
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->init(MTL_ID(), time_slice));
|
||||
|
||||
int cnt = 30;
|
||||
|
||||
scheduler->dump_dag_status();
|
||||
TestHPDag *dag = NULL;
|
||||
TestMPDag *dag = NULL;
|
||||
AtomicIncTask *inc_task = NULL;
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->alloc_dag(dag));
|
||||
EXPECT_EQ(OB_SUCCESS, dag->init(1));
|
||||
@ -1267,39 +1411,35 @@ TEST_F(TestDagScheduler, test_set_concurrency)
|
||||
EXPECT_EQ(OB_SUCCESS, dag->add_task(*inc_task));
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->add_dag(dag));
|
||||
|
||||
CHECK_EQ_UTIL_TIMEOUT(OB_DAG_PRIOS[prio].score_, scheduler->low_limits_[prio]);
|
||||
CHECK_EQ_UTIL_TIMEOUT(uplimit, scheduler->up_limits_[prio]);
|
||||
CHECK_EQ_UTIL_TIMEOUT(uplimit, scheduler->total_running_task_cnt_);
|
||||
CHECK_EQ_UTIL_TIMEOUT(OB_DAG_PRIOS[prio].score_, scheduler->prio_sche_[prio].limits_);
|
||||
CHECK_EQ_UTIL_TIMEOUT(uplimit, scheduler->prio_sche_[prio].limits_);
|
||||
CHECK_EQ_UTIL_TIMEOUT(uplimit, scheduler->get_total_running_task_cnt());
|
||||
EXPECT_TRUE(uplimit <= scheduler->work_thread_num_);
|
||||
// set max to 20
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->set_thread_score(prio, 20));
|
||||
EXPECT_EQ(20, scheduler->up_limits_[prio]);
|
||||
EXPECT_EQ(20, scheduler->prio_sche_[prio].limits_);
|
||||
//EXPECT_EQ(41, scheduler->work_thread_num_);
|
||||
// set to 1
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->set_thread_score(prio, 1));
|
||||
print_state(prio);
|
||||
EXPECT_EQ(1, scheduler->low_limits_[prio]);
|
||||
EXPECT_EQ(1, scheduler->up_limits_[prio]);
|
||||
CHECK_EQ_UTIL_TIMEOUT(1, scheduler->total_running_task_cnt_);
|
||||
EXPECT_EQ(1, scheduler->prio_sche_[prio].limits_);
|
||||
CHECK_EQ_UTIL_TIMEOUT(1, scheduler->get_total_running_task_cnt());
|
||||
EXPECT_TRUE(1 <= scheduler->work_thread_num_);
|
||||
// set to 2
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->set_thread_score(prio, 2));
|
||||
print_state(prio);
|
||||
EXPECT_EQ(2, scheduler->low_limits_[prio]);
|
||||
EXPECT_EQ(2, scheduler->up_limits_[prio]);
|
||||
CHECK_EQ_UTIL_TIMEOUT(2, scheduler->total_running_task_cnt_);
|
||||
EXPECT_EQ(2, scheduler->prio_sche_[prio].limits_);
|
||||
CHECK_EQ_UTIL_TIMEOUT(2, scheduler->get_total_running_task_cnt());
|
||||
EXPECT_TRUE(2 <= scheduler->work_thread_num_);
|
||||
// set to 5
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->set_thread_score(prio, 5));
|
||||
print_state(prio);
|
||||
EXPECT_EQ(5, scheduler->low_limits_[prio]);
|
||||
EXPECT_EQ(5, scheduler->up_limits_[prio]);
|
||||
EXPECT_EQ(5, scheduler->prio_sche_[prio].limits_);
|
||||
EXPECT_TRUE(5 <= scheduler->work_thread_num_);
|
||||
// set to 0
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->set_thread_score(prio, 0));
|
||||
print_state(prio);
|
||||
EXPECT_EQ(uplimit, scheduler->low_limits_[prio]);
|
||||
EXPECT_EQ(scheduler->up_limits_[prio], uplimit);
|
||||
EXPECT_EQ(uplimit, scheduler->prio_sche_[prio].limits_);
|
||||
EXPECT_TRUE(uplimit <= scheduler->work_thread_num_);
|
||||
wait_scheduler();
|
||||
}
|
||||
@ -1328,7 +1468,7 @@ TEST_F(TestDagScheduler, test_get_dag_count)
|
||||
TestMulTask *mul_task2 = NULL;
|
||||
int64_t counter = 1;
|
||||
|
||||
EXPECT_EQ(0, scheduler->get_dag_count(ObDagType::DAG_TYPE_MAJOR_MERGE));
|
||||
EXPECT_EQ(0, scheduler->get_dag_count(ObDagType::DAG_TYPE_FAST_MIGRATE));
|
||||
EXPECT_EQ(0, scheduler->get_dag_count(ObDagType::DAG_TYPE_MERGE_EXECUTE));
|
||||
EXPECT_EQ(0, scheduler->get_dag_count(ObDagType::DAG_TYPE_DDL));
|
||||
EXPECT_EQ(-1, scheduler->get_dag_count(ObDagType::DAG_TYPE_MAX));
|
||||
@ -1339,9 +1479,9 @@ TEST_F(TestDagScheduler, test_get_dag_count)
|
||||
EXPECT_EQ(OB_SUCCESS, mul_task->init(&counter));
|
||||
EXPECT_EQ(OB_SUCCESS, dag->add_task(*mul_task));
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->add_dag(dag));
|
||||
sleep(1);
|
||||
sleep(10);
|
||||
EXPECT_EQ(0, scheduler->get_dag_count(ObDagType::DAG_TYPE_MERGE_EXECUTE));
|
||||
EXPECT_EQ(0, scheduler->get_dag_count(ObDagType::DAG_TYPE_MAJOR_MERGE));
|
||||
CHECK_EQ_UTIL_TIMEOUT(0, scheduler->get_dag_count(ObDagType::DAG_TYPE_FAST_MIGRATE));
|
||||
EXPECT_EQ(0, scheduler->get_dag_count(ObDagType::DAG_TYPE_DDL));
|
||||
EXPECT_EQ(-1, scheduler->get_dag_count(ObDagType::DAG_TYPE_MAX));
|
||||
scheduler->stop();
|
||||
@ -1352,7 +1492,7 @@ TEST_F(TestDagScheduler, test_get_dag_count)
|
||||
EXPECT_EQ(OB_SUCCESS, dag->add_task(*mul_task));
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->add_dag(dag));
|
||||
EXPECT_EQ(0, scheduler->get_dag_count(ObDagType::DAG_TYPE_MERGE_EXECUTE));
|
||||
EXPECT_EQ(1, scheduler->get_dag_count(ObDagType::DAG_TYPE_MAJOR_MERGE));
|
||||
EXPECT_EQ(1, scheduler->get_dag_count(ObDagType::DAG_TYPE_FAST_MIGRATE));
|
||||
EXPECT_EQ(0, scheduler->get_dag_count(ObDagType::DAG_TYPE_DDL));
|
||||
EXPECT_EQ(-1, scheduler->get_dag_count(ObDagType::DAG_TYPE_MAX));
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->alloc_dag(dag2));
|
||||
@ -1362,7 +1502,7 @@ TEST_F(TestDagScheduler, test_get_dag_count)
|
||||
EXPECT_EQ(OB_SUCCESS, dag2->add_task(*mul_task2));
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->add_dag(dag2));
|
||||
EXPECT_EQ(0, scheduler->get_dag_count(ObDagType::DAG_TYPE_MERGE_EXECUTE));
|
||||
EXPECT_EQ(2, scheduler->get_dag_count(ObDagType::DAG_TYPE_MAJOR_MERGE));
|
||||
EXPECT_EQ(2, scheduler->get_dag_count(ObDagType::DAG_TYPE_FAST_MIGRATE));
|
||||
EXPECT_EQ(0, scheduler->get_dag_count(ObDagType::DAG_TYPE_DDL));
|
||||
EXPECT_EQ(-1, scheduler->get_dag_count(ObDagType::DAG_TYPE_MAX));
|
||||
}
|
||||
@ -1388,7 +1528,7 @@ TEST_F(TestDagScheduler, test_destroy_when_running)
|
||||
EXPECT_EQ(OB_SUCCESS, alloc_task(*dag1, inc_task));
|
||||
EXPECT_EQ(OB_SUCCESS, inc_task->init(1, thread_cnt * 3, *op, 2*sleep_slice));
|
||||
EXPECT_EQ(OB_SUCCESS, dag1->add_task(*inc_task));
|
||||
TestHPDag *dag2 = NULL;
|
||||
TestMPDag *dag2 = NULL;
|
||||
AtomicMulTask *mul_task = NULL;
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->alloc_dag(dag2));
|
||||
EXPECT_EQ(OB_SUCCESS, dag2->init(2));
|
||||
@ -1417,10 +1557,9 @@ TEST_F(TestDagScheduler, test_up_limit)
|
||||
|
||||
TestLPDag *dag1 = NULL;
|
||||
AtomicIncTask *inc_task = NULL;
|
||||
const int32_t lp_min = scheduler->low_limits_[ObDagPrio::DAG_PRIO_HA_LOW];
|
||||
const int32_t lp_max = scheduler->up_limits_[ObDagPrio::DAG_PRIO_HA_LOW];
|
||||
const int32_t mp_max = scheduler->up_limits_[ObDagPrio::DAG_PRIO_HA_MID];
|
||||
const int32_t hp_max = scheduler->up_limits_[ObDagPrio::DAG_PRIO_HA_HIGH];
|
||||
const int32_t lp_max = scheduler->prio_sche_[ObDagPrio::DAG_PRIO_HA_LOW].limits_;
|
||||
const int32_t mp_max = scheduler->prio_sche_[ObDagPrio::DAG_PRIO_HA_MID].limits_;
|
||||
const int32_t hp_max = scheduler->prio_sche_[ObDagPrio::DAG_PRIO_HA_HIGH].limits_;
|
||||
const int64_t cnt = 64;
|
||||
scheduler->dump_dag_status();
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->alloc_dag(dag1));
|
||||
@ -1429,7 +1568,8 @@ TEST_F(TestDagScheduler, test_up_limit)
|
||||
EXPECT_EQ(OB_SUCCESS, alloc_task(*dag1, inc_task));
|
||||
EXPECT_EQ(OB_SUCCESS, inc_task->init(1, cnt, op, 2*sleep_slice));
|
||||
EXPECT_EQ(OB_SUCCESS, dag1->add_task(*inc_task));
|
||||
TestHPDag *dag2 = NULL;
|
||||
|
||||
TestMPDag *dag2 = NULL;
|
||||
AtomicMulTask *mul_task = NULL;
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->alloc_dag(dag2));
|
||||
EXPECT_EQ(OB_SUCCESS, dag2->init(2));
|
||||
@ -1437,6 +1577,7 @@ TEST_F(TestDagScheduler, test_up_limit)
|
||||
EXPECT_EQ(OB_SUCCESS, alloc_task(*dag2, mul_task));
|
||||
EXPECT_EQ(OB_SUCCESS, mul_task->init(1, cnt, op, 4*sleep_slice));
|
||||
EXPECT_EQ(OB_SUCCESS, dag2->add_task(*mul_task));
|
||||
|
||||
TestMPDag *dag3 = NULL;
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->alloc_dag(dag3));
|
||||
EXPECT_EQ(OB_SUCCESS, dag3->init(3));
|
||||
@ -1455,7 +1596,6 @@ TEST_F(TestDagScheduler, test_up_limit)
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->add_dag(dag3));
|
||||
CHECK_EQ_UTIL_TIMEOUT(hp_max, scheduler->get_running_task_cnt(ObDagPrio::DAG_PRIO_HA_HIGH));
|
||||
CHECK_EQ_UTIL_TIMEOUT(MIN(scheduler->work_thread_num_ - hp_max, mp_max), scheduler->get_running_task_cnt(ObDagPrio::DAG_PRIO_HA_MID));
|
||||
CHECK_EQ_UTIL_TIMEOUT(lp_min, scheduler->get_running_task_cnt(ObDagPrio::DAG_PRIO_HA_LOW));
|
||||
|
||||
wait_scheduler();
|
||||
}
|
||||
@ -1469,7 +1609,7 @@ TEST_F(TestDagScheduler, test_emergency_task)
|
||||
AtomicOperator op(0);
|
||||
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->set_thread_score(ObDagPrio::DAG_PRIO_DDL, 1));
|
||||
EXPECT_EQ(1, scheduler->up_limits_[ObDagPrio::DAG_PRIO_DDL]);
|
||||
EXPECT_EQ(1, scheduler->prio_sche_[ObDagPrio::DAG_PRIO_DDL].limits_);
|
||||
TestLPDag *dag1 = NULL;
|
||||
AtomicIncTask *inc_task = NULL;
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->alloc_dag(dag1));
|
||||
@ -1524,7 +1664,7 @@ TEST_F(TestDagScheduler, test_check_ls_compaction_dag_exist_with_cancel)
|
||||
ASSERT_TRUE(nullptr != scheduler);
|
||||
ASSERT_EQ(OB_SUCCESS, scheduler->init(MTL_ID(), time_slice, 64));
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->set_thread_score(ObDagPrio::DAG_PRIO_COMPACTION_MID, 1));
|
||||
EXPECT_EQ(1, scheduler->up_limits_[ObDagPrio::DAG_PRIO_COMPACTION_MID]);
|
||||
EXPECT_EQ(1, scheduler->prio_sche_[ObDagPrio::DAG_PRIO_COMPACTION_MID].limits_);
|
||||
|
||||
LoopWaitTask *wait_task = nullptr;
|
||||
const int64_t dag_cnt = 6;
|
||||
@ -1543,7 +1683,7 @@ TEST_F(TestDagScheduler, test_check_ls_compaction_dag_exist_with_cancel)
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->add_dag(dag));
|
||||
}
|
||||
EXPECT_EQ(dag_cnt, scheduler->dag_cnts_[ObDagType::DAG_TYPE_MERGE_EXECUTE]);
|
||||
CHECK_EQ_UTIL_TIMEOUT(1, scheduler->running_task_cnts_[ObDagPrio::DAG_PRIO_COMPACTION_MID]);
|
||||
CHECK_EQ_UTIL_TIMEOUT(1, scheduler->get_running_task_cnt(ObDagPrio::DAG_PRIO_COMPACTION_MID));
|
||||
|
||||
// cancel two waiting dag of ls_ids[0]
|
||||
bool exist = false;
|
||||
@ -1562,6 +1702,115 @@ TEST_F(TestDagScheduler, test_check_ls_compaction_dag_exist_with_cancel)
|
||||
EXPECT_EQ(exist, false);
|
||||
}
|
||||
|
||||
TEST_F(TestDagScheduler, test_cancel_running_dag)
|
||||
{
|
||||
ObTenantDagScheduler *scheduler = MTL(ObTenantDagScheduler*);
|
||||
ASSERT_TRUE(nullptr != scheduler);
|
||||
ASSERT_EQ(OB_SUCCESS, scheduler->init(MTL_ID(), time_slice));
|
||||
|
||||
int64_t cnt = 10;
|
||||
int64_t cancel_seq = 0;
|
||||
bool finish_flag = false;
|
||||
AtomicOperator op(0);
|
||||
TestCancelDag *cancel_dag = nullptr;
|
||||
TestCancelDag *cancel_dag_key = nullptr;
|
||||
|
||||
// The dag canceled in prepare task so the finish task can not finish
|
||||
// 1. Cancel in the first round of prepare task
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->alloc_dag(cancel_dag));
|
||||
EXPECT_EQ(OB_SUCCESS, cancel_dag->init(1));
|
||||
EXPECT_EQ(OB_SUCCESS, cancel_dag->init_dag(cnt, cancel_seq, finish_flag, &op));
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->add_dag(cancel_dag));
|
||||
wait_scheduler();
|
||||
EXPECT_EQ(0, op.value());
|
||||
|
||||
// 2. Cancel in the middle round of prepare task
|
||||
cancel_seq = 5;
|
||||
op.reset();
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->alloc_dag(cancel_dag));
|
||||
EXPECT_EQ(OB_SUCCESS, cancel_dag->init(1));
|
||||
EXPECT_EQ(OB_SUCCESS, cancel_dag->init_dag(cnt, cancel_seq, finish_flag, &op));
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->add_dag(cancel_dag));
|
||||
wait_scheduler();
|
||||
EXPECT_EQ(0, op.value());
|
||||
|
||||
// 3. Cancel in the last round of prepare task
|
||||
cancel_seq = 9;
|
||||
op.reset();
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->alloc_dag(cancel_dag));
|
||||
EXPECT_EQ(OB_SUCCESS, cancel_dag->init(1));
|
||||
EXPECT_EQ(OB_SUCCESS, cancel_dag->init_dag(cnt, cancel_seq, finish_flag, &op));
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->add_dag(cancel_dag));
|
||||
wait_scheduler();
|
||||
EXPECT_EQ(0, op.value());
|
||||
|
||||
// 4. Cancel even all other prepare task finsihed
|
||||
finish_flag = true;
|
||||
cancel_seq = 9;
|
||||
op.reset();
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->alloc_dag(cancel_dag));
|
||||
EXPECT_EQ(OB_SUCCESS, cancel_dag->init(1));
|
||||
EXPECT_EQ(OB_SUCCESS, cancel_dag->init_dag(cnt, cancel_seq, finish_flag, &op));
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->add_dag(cancel_dag));
|
||||
wait_scheduler();
|
||||
EXPECT_EQ(0, op.value());
|
||||
|
||||
// 5. Can not cancel if prepare task does not call yield
|
||||
finish_flag = true;
|
||||
cancel_seq = 11;
|
||||
op.reset();
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->alloc_dag(cancel_dag));
|
||||
EXPECT_EQ(OB_SUCCESS, cancel_dag->init(1));
|
||||
EXPECT_EQ(OB_SUCCESS, cancel_dag->init_dag(cnt, cancel_seq, finish_flag, &op));
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->add_dag(cancel_dag));
|
||||
wait_scheduler();
|
||||
EXPECT_EQ(8, op.value());
|
||||
|
||||
// 6. Test cancel ready dag
|
||||
finish_flag = false;
|
||||
cancel_seq = 3;
|
||||
op.reset();
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->alloc_dag(cancel_dag));
|
||||
EXPECT_EQ(OB_SUCCESS, cancel_dag->init(1));
|
||||
EXPECT_EQ(OB_SUCCESS, cancel_dag->init_dag(cnt, cancel_seq, finish_flag, &op));
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->add_dag(cancel_dag));
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->cancel_dag(cancel_dag, true));
|
||||
wait_scheduler();
|
||||
EXPECT_EQ(0, op.value());
|
||||
|
||||
// 7. Test cancel dag after dag finish(running ok)
|
||||
finish_flag = true;
|
||||
cancel_seq = 11;
|
||||
op.reset();
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->alloc_dag(cancel_dag));
|
||||
EXPECT_EQ(OB_SUCCESS, cancel_dag->init(1));
|
||||
EXPECT_EQ(OB_SUCCESS, cancel_dag->init_dag(cnt, cancel_seq, finish_flag, &op));
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->add_dag(cancel_dag));
|
||||
wait_scheduler();
|
||||
EXPECT_EQ(8, op.value());
|
||||
// Example for canceling a maybe finished dag
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->alloc_dag(cancel_dag_key));
|
||||
EXPECT_EQ(OB_SUCCESS, cancel_dag_key->init(1)); // the same hash key with cancel_dag
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->cancel_dag(cancel_dag_key, true));
|
||||
scheduler->free_dag(*cancel_dag_key);
|
||||
|
||||
|
||||
// 8. Test cancel dag after dag finish(canceled)
|
||||
finish_flag = true;
|
||||
cancel_seq = 9;
|
||||
op.reset();
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->alloc_dag(cancel_dag));
|
||||
EXPECT_EQ(OB_SUCCESS, cancel_dag->init(1));
|
||||
EXPECT_EQ(OB_SUCCESS, cancel_dag->init_dag(cnt, cancel_seq, finish_flag, &op));
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->add_dag(cancel_dag));
|
||||
wait_scheduler();
|
||||
EXPECT_EQ(0, op.value());
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->alloc_dag(cancel_dag_key));
|
||||
EXPECT_EQ(OB_SUCCESS, cancel_dag_key->init(1));
|
||||
EXPECT_EQ(OB_SUCCESS, scheduler->cancel_dag(cancel_dag_key, true));
|
||||
scheduler->free_dag(*cancel_dag_key);
|
||||
}
|
||||
|
||||
/*
|
||||
TEST_F(TestDagScheduler, test_large_thread_cnt)
|
||||
{
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -62,13 +62,13 @@ TEST(ObTestDatumCmp, defined_nullsafe_func_by_type)
|
||||
std::ofstream of_result(tmp_file);
|
||||
|
||||
for (int i = 0; i < ObMaxType; i++) {
|
||||
of_result << "/**************** " << ob_obj_type_str(static_cast<ObObjType>(i))
|
||||
of_result << "/**************** " << inner_obj_type_str(static_cast<ObObjType>(i))
|
||||
<< " ****************/" << "\n\n";
|
||||
for (int j = 0; j < ObMaxType; j++) {
|
||||
of_result << "<"
|
||||
<< ob_obj_type_str(static_cast<ObObjType>(i))
|
||||
<< inner_obj_type_str(static_cast<ObObjType>(i))
|
||||
<< ", "
|
||||
<< ob_obj_type_str(static_cast<ObObjType>(j))
|
||||
<< inner_obj_type_str(static_cast<ObObjType>(j))
|
||||
<< ">"
|
||||
<< " : ";
|
||||
if (NULL != ObDatumFuncs::get_nullsafe_cmp_func(static_cast<ObObjType>(i),
|
||||
@ -95,18 +95,20 @@ TEST(ObTestDatumCmp, defined_expr_func_by_type)
|
||||
std::ofstream of_result(tmp_file);
|
||||
|
||||
for (int i = 0; i < ObMaxType; i++) {
|
||||
of_result << "/**************** " << ob_obj_type_str(static_cast<ObObjType>(i))
|
||||
of_result << "/**************** " << inner_obj_type_str(static_cast<ObObjType>(i))
|
||||
<< " ****************/" << "\n\n";
|
||||
for (int j = 0; j < ObMaxType; j++) {
|
||||
of_result << "<"
|
||||
<< ob_obj_type_str(static_cast<ObObjType>(i))
|
||||
<< inner_obj_type_str(static_cast<ObObjType>(i))
|
||||
<< ", "
|
||||
<< ob_obj_type_str(static_cast<ObObjType>(j))
|
||||
<< inner_obj_type_str(static_cast<ObObjType>(j))
|
||||
<< "> : ";
|
||||
if (NULL != ObExprCmpFuncsHelper::get_datum_expr_cmp_func(static_cast<ObObjType>(i),
|
||||
static_cast<ObObjType>(j),
|
||||
SCALE_UNKNOWN_YET,
|
||||
SCALE_UNKNOWN_YET,
|
||||
PRECISION_UNKNOWN_YET,
|
||||
PRECISION_UNKNOWN_YET,
|
||||
false,
|
||||
CS_TYPE_COLLATION_FREE,
|
||||
false)) {
|
||||
|
||||
@ -50,6 +50,7 @@
|
||||
<NULL, JSON> : defined
|
||||
<NULL, GEOMETRY> : defined
|
||||
<NULL, UDT> : not defined
|
||||
<NULL, DECIMAL_INT> : defined
|
||||
|
||||
/**************** TINYINT ****************/
|
||||
|
||||
@ -103,6 +104,7 @@
|
||||
<TINYINT, JSON> : not defined
|
||||
<TINYINT, GEOMETRY> : not defined
|
||||
<TINYINT, UDT> : not defined
|
||||
<TINYINT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** SMALLINT ****************/
|
||||
|
||||
@ -156,6 +158,7 @@
|
||||
<SMALLINT, JSON> : not defined
|
||||
<SMALLINT, GEOMETRY> : not defined
|
||||
<SMALLINT, UDT> : not defined
|
||||
<SMALLINT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** MEDIUMINT ****************/
|
||||
|
||||
@ -209,6 +212,7 @@
|
||||
<MEDIUMINT, JSON> : not defined
|
||||
<MEDIUMINT, GEOMETRY> : not defined
|
||||
<MEDIUMINT, UDT> : not defined
|
||||
<MEDIUMINT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** INT ****************/
|
||||
|
||||
@ -262,6 +266,7 @@
|
||||
<INT, JSON> : not defined
|
||||
<INT, GEOMETRY> : not defined
|
||||
<INT, UDT> : not defined
|
||||
<INT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** BIGINT ****************/
|
||||
|
||||
@ -315,6 +320,7 @@
|
||||
<BIGINT, JSON> : not defined
|
||||
<BIGINT, GEOMETRY> : not defined
|
||||
<BIGINT, UDT> : not defined
|
||||
<BIGINT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** TINYINT UNSIGNED ****************/
|
||||
|
||||
@ -368,6 +374,7 @@
|
||||
<TINYINT UNSIGNED, JSON> : not defined
|
||||
<TINYINT UNSIGNED, GEOMETRY> : not defined
|
||||
<TINYINT UNSIGNED, UDT> : not defined
|
||||
<TINYINT UNSIGNED, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** SMALLINT UNSIGNED ****************/
|
||||
|
||||
@ -421,6 +428,7 @@
|
||||
<SMALLINT UNSIGNED, JSON> : not defined
|
||||
<SMALLINT UNSIGNED, GEOMETRY> : not defined
|
||||
<SMALLINT UNSIGNED, UDT> : not defined
|
||||
<SMALLINT UNSIGNED, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** MEDIUMINT UNSIGNED ****************/
|
||||
|
||||
@ -474,6 +482,7 @@
|
||||
<MEDIUMINT UNSIGNED, JSON> : not defined
|
||||
<MEDIUMINT UNSIGNED, GEOMETRY> : not defined
|
||||
<MEDIUMINT UNSIGNED, UDT> : not defined
|
||||
<MEDIUMINT UNSIGNED, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** INT UNSIGNED ****************/
|
||||
|
||||
@ -527,6 +536,7 @@
|
||||
<INT UNSIGNED, JSON> : not defined
|
||||
<INT UNSIGNED, GEOMETRY> : not defined
|
||||
<INT UNSIGNED, UDT> : not defined
|
||||
<INT UNSIGNED, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** BIGINT UNSIGNED ****************/
|
||||
|
||||
@ -580,6 +590,7 @@
|
||||
<BIGINT UNSIGNED, JSON> : not defined
|
||||
<BIGINT UNSIGNED, GEOMETRY> : not defined
|
||||
<BIGINT UNSIGNED, UDT> : not defined
|
||||
<BIGINT UNSIGNED, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** FLOAT ****************/
|
||||
|
||||
@ -633,6 +644,7 @@
|
||||
<FLOAT, JSON> : not defined
|
||||
<FLOAT, GEOMETRY> : not defined
|
||||
<FLOAT, UDT> : not defined
|
||||
<FLOAT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** DOUBLE ****************/
|
||||
|
||||
@ -686,6 +698,7 @@
|
||||
<DOUBLE, JSON> : not defined
|
||||
<DOUBLE, GEOMETRY> : not defined
|
||||
<DOUBLE, UDT> : not defined
|
||||
<DOUBLE, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** FLOAT UNSIGNED ****************/
|
||||
|
||||
@ -739,6 +752,7 @@
|
||||
<FLOAT UNSIGNED, JSON> : not defined
|
||||
<FLOAT UNSIGNED, GEOMETRY> : not defined
|
||||
<FLOAT UNSIGNED, UDT> : not defined
|
||||
<FLOAT UNSIGNED, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** DOUBLE UNSIGNED ****************/
|
||||
|
||||
@ -792,6 +806,7 @@
|
||||
<DOUBLE UNSIGNED, JSON> : not defined
|
||||
<DOUBLE UNSIGNED, GEOMETRY> : not defined
|
||||
<DOUBLE UNSIGNED, UDT> : not defined
|
||||
<DOUBLE UNSIGNED, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** DECIMAL ****************/
|
||||
|
||||
@ -845,6 +860,7 @@
|
||||
<DECIMAL, JSON> : not defined
|
||||
<DECIMAL, GEOMETRY> : not defined
|
||||
<DECIMAL, UDT> : not defined
|
||||
<DECIMAL, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** DECIMAL UNSIGNED ****************/
|
||||
|
||||
@ -898,6 +914,7 @@
|
||||
<DECIMAL UNSIGNED, JSON> : not defined
|
||||
<DECIMAL UNSIGNED, GEOMETRY> : not defined
|
||||
<DECIMAL UNSIGNED, UDT> : not defined
|
||||
<DECIMAL UNSIGNED, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** DATETIME ****************/
|
||||
|
||||
@ -951,6 +968,7 @@
|
||||
<DATETIME, JSON> : not defined
|
||||
<DATETIME, GEOMETRY> : not defined
|
||||
<DATETIME, UDT> : not defined
|
||||
<DATETIME, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** TIMESTAMP ****************/
|
||||
|
||||
@ -1004,6 +1022,7 @@
|
||||
<TIMESTAMP, JSON> : not defined
|
||||
<TIMESTAMP, GEOMETRY> : not defined
|
||||
<TIMESTAMP, UDT> : not defined
|
||||
<TIMESTAMP, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** DATE ****************/
|
||||
|
||||
@ -1057,6 +1076,7 @@
|
||||
<DATE, JSON> : not defined
|
||||
<DATE, GEOMETRY> : not defined
|
||||
<DATE, UDT> : not defined
|
||||
<DATE, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** TIME ****************/
|
||||
|
||||
@ -1110,6 +1130,7 @@
|
||||
<TIME, JSON> : not defined
|
||||
<TIME, GEOMETRY> : not defined
|
||||
<TIME, UDT> : not defined
|
||||
<TIME, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** YEAR ****************/
|
||||
|
||||
@ -1163,6 +1184,7 @@
|
||||
<YEAR, JSON> : not defined
|
||||
<YEAR, GEOMETRY> : not defined
|
||||
<YEAR, UDT> : not defined
|
||||
<YEAR, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** VARCHAR ****************/
|
||||
|
||||
@ -1216,6 +1238,7 @@
|
||||
<VARCHAR, JSON> : not defined
|
||||
<VARCHAR, GEOMETRY> : not defined
|
||||
<VARCHAR, UDT> : not defined
|
||||
<VARCHAR, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** CHAR ****************/
|
||||
|
||||
@ -1269,6 +1292,7 @@
|
||||
<CHAR, JSON> : not defined
|
||||
<CHAR, GEOMETRY> : not defined
|
||||
<CHAR, UDT> : not defined
|
||||
<CHAR, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** HEX_STRING ****************/
|
||||
|
||||
@ -1322,6 +1346,7 @@
|
||||
<HEX_STRING, JSON> : not defined
|
||||
<HEX_STRING, GEOMETRY> : not defined
|
||||
<HEX_STRING, UDT> : not defined
|
||||
<HEX_STRING, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** EXT ****************/
|
||||
|
||||
@ -1375,6 +1400,7 @@
|
||||
<EXT, JSON> : defined
|
||||
<EXT, GEOMETRY> : defined
|
||||
<EXT, UDT> : not defined
|
||||
<EXT, DECIMAL_INT> : defined
|
||||
|
||||
/**************** UNKNOWN ****************/
|
||||
|
||||
@ -1428,6 +1454,7 @@
|
||||
<UNKNOWN, JSON> : not defined
|
||||
<UNKNOWN, GEOMETRY> : not defined
|
||||
<UNKNOWN, UDT> : not defined
|
||||
<UNKNOWN, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** TINYTEXT ****************/
|
||||
|
||||
@ -1481,6 +1508,7 @@
|
||||
<TINYTEXT, JSON> : not defined
|
||||
<TINYTEXT, GEOMETRY> : not defined
|
||||
<TINYTEXT, UDT> : not defined
|
||||
<TINYTEXT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** TEXT ****************/
|
||||
|
||||
@ -1534,6 +1562,7 @@
|
||||
<TEXT, JSON> : not defined
|
||||
<TEXT, GEOMETRY> : not defined
|
||||
<TEXT, UDT> : not defined
|
||||
<TEXT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** MEDIUMTEXT ****************/
|
||||
|
||||
@ -1587,6 +1616,7 @@
|
||||
<MEDIUMTEXT, JSON> : not defined
|
||||
<MEDIUMTEXT, GEOMETRY> : not defined
|
||||
<MEDIUMTEXT, UDT> : not defined
|
||||
<MEDIUMTEXT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** LONGTEXT ****************/
|
||||
|
||||
@ -1640,6 +1670,7 @@
|
||||
<LONGTEXT, JSON> : not defined
|
||||
<LONGTEXT, GEOMETRY> : not defined
|
||||
<LONGTEXT, UDT> : not defined
|
||||
<LONGTEXT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** BIT ****************/
|
||||
|
||||
@ -1693,6 +1724,7 @@
|
||||
<BIT, JSON> : not defined
|
||||
<BIT, GEOMETRY> : not defined
|
||||
<BIT, UDT> : not defined
|
||||
<BIT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** ENUM ****************/
|
||||
|
||||
@ -1746,6 +1778,7 @@
|
||||
<ENUM, JSON> : not defined
|
||||
<ENUM, GEOMETRY> : not defined
|
||||
<ENUM, UDT> : not defined
|
||||
<ENUM, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** SET ****************/
|
||||
|
||||
@ -1799,6 +1832,7 @@
|
||||
<SET, JSON> : not defined
|
||||
<SET, GEOMETRY> : not defined
|
||||
<SET, UDT> : not defined
|
||||
<SET, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** ENUM_INNER ****************/
|
||||
|
||||
@ -1852,6 +1886,7 @@
|
||||
<ENUM_INNER, JSON> : not defined
|
||||
<ENUM_INNER, GEOMETRY> : not defined
|
||||
<ENUM_INNER, UDT> : not defined
|
||||
<ENUM_INNER, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** SET_INNER ****************/
|
||||
|
||||
@ -1905,6 +1940,7 @@
|
||||
<SET_INNER, JSON> : not defined
|
||||
<SET_INNER, GEOMETRY> : not defined
|
||||
<SET_INNER, UDT> : not defined
|
||||
<SET_INNER, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** TIMESTAMP_WITH_TIME_ZONE ****************/
|
||||
|
||||
@ -1958,6 +1994,7 @@
|
||||
<TIMESTAMP_WITH_TIME_ZONE, JSON> : not defined
|
||||
<TIMESTAMP_WITH_TIME_ZONE, GEOMETRY> : not defined
|
||||
<TIMESTAMP_WITH_TIME_ZONE, UDT> : not defined
|
||||
<TIMESTAMP_WITH_TIME_ZONE, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** TIMESTAMP_WITH_LOCAL_TIME_ZONE ****************/
|
||||
|
||||
@ -2011,6 +2048,7 @@
|
||||
<TIMESTAMP_WITH_LOCAL_TIME_ZONE, JSON> : not defined
|
||||
<TIMESTAMP_WITH_LOCAL_TIME_ZONE, GEOMETRY> : not defined
|
||||
<TIMESTAMP_WITH_LOCAL_TIME_ZONE, UDT> : not defined
|
||||
<TIMESTAMP_WITH_LOCAL_TIME_ZONE, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** TIMESTAMP ****************/
|
||||
|
||||
@ -2064,6 +2102,7 @@
|
||||
<TIMESTAMP, JSON> : not defined
|
||||
<TIMESTAMP, GEOMETRY> : not defined
|
||||
<TIMESTAMP, UDT> : not defined
|
||||
<TIMESTAMP, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** RAW ****************/
|
||||
|
||||
@ -2117,6 +2156,7 @@
|
||||
<RAW, JSON> : not defined
|
||||
<RAW, GEOMETRY> : not defined
|
||||
<RAW, UDT> : not defined
|
||||
<RAW, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** INTERVAL_YEAR_TO_MONTH ****************/
|
||||
|
||||
@ -2170,6 +2210,7 @@
|
||||
<INTERVAL_YEAR_TO_MONTH, JSON> : not defined
|
||||
<INTERVAL_YEAR_TO_MONTH, GEOMETRY> : not defined
|
||||
<INTERVAL_YEAR_TO_MONTH, UDT> : not defined
|
||||
<INTERVAL_YEAR_TO_MONTH, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** INTERVAL_DAY_TO_SECOND ****************/
|
||||
|
||||
@ -2223,6 +2264,7 @@
|
||||
<INTERVAL_DAY_TO_SECOND, JSON> : not defined
|
||||
<INTERVAL_DAY_TO_SECOND, GEOMETRY> : not defined
|
||||
<INTERVAL_DAY_TO_SECOND, UDT> : not defined
|
||||
<INTERVAL_DAY_TO_SECOND, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** NUMBER_FLOAT ****************/
|
||||
|
||||
@ -2276,6 +2318,7 @@
|
||||
<NUMBER_FLOAT, JSON> : not defined
|
||||
<NUMBER_FLOAT, GEOMETRY> : not defined
|
||||
<NUMBER_FLOAT, UDT> : not defined
|
||||
<NUMBER_FLOAT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** NVARCHAR2 ****************/
|
||||
|
||||
@ -2329,6 +2372,7 @@
|
||||
<NVARCHAR2, JSON> : not defined
|
||||
<NVARCHAR2, GEOMETRY> : not defined
|
||||
<NVARCHAR2, UDT> : not defined
|
||||
<NVARCHAR2, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** NCHAR ****************/
|
||||
|
||||
@ -2382,6 +2426,7 @@
|
||||
<NCHAR, JSON> : not defined
|
||||
<NCHAR, GEOMETRY> : not defined
|
||||
<NCHAR, UDT> : not defined
|
||||
<NCHAR, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** ROWID ****************/
|
||||
|
||||
@ -2435,6 +2480,7 @@
|
||||
<ROWID, JSON> : not defined
|
||||
<ROWID, GEOMETRY> : not defined
|
||||
<ROWID, UDT> : not defined
|
||||
<ROWID, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** LOB ****************/
|
||||
|
||||
@ -2488,6 +2534,7 @@
|
||||
<LOB, JSON> : not defined
|
||||
<LOB, GEOMETRY> : not defined
|
||||
<LOB, UDT> : not defined
|
||||
<LOB, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** JSON ****************/
|
||||
|
||||
@ -2541,6 +2588,7 @@
|
||||
<JSON, JSON> : defined
|
||||
<JSON, GEOMETRY> : not defined
|
||||
<JSON, UDT> : not defined
|
||||
<JSON, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** GEOMETRY ****************/
|
||||
|
||||
@ -2594,6 +2642,7 @@
|
||||
<GEOMETRY, JSON> : not defined
|
||||
<GEOMETRY, GEOMETRY> : defined
|
||||
<GEOMETRY, UDT> : not defined
|
||||
<GEOMETRY, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** UDT ****************/
|
||||
|
||||
@ -2647,4 +2696,59 @@
|
||||
<UDT, JSON> : not defined
|
||||
<UDT, GEOMETRY> : not defined
|
||||
<UDT, UDT> : not defined
|
||||
<UDT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** DECIMAL_INT ****************/
|
||||
|
||||
<DECIMAL_INT, NULL> : defined
|
||||
<DECIMAL_INT, TINYINT> : not defined
|
||||
<DECIMAL_INT, SMALLINT> : not defined
|
||||
<DECIMAL_INT, MEDIUMINT> : not defined
|
||||
<DECIMAL_INT, INT> : not defined
|
||||
<DECIMAL_INT, BIGINT> : not defined
|
||||
<DECIMAL_INT, TINYINT UNSIGNED> : not defined
|
||||
<DECIMAL_INT, SMALLINT UNSIGNED> : not defined
|
||||
<DECIMAL_INT, MEDIUMINT UNSIGNED> : not defined
|
||||
<DECIMAL_INT, INT UNSIGNED> : not defined
|
||||
<DECIMAL_INT, BIGINT UNSIGNED> : not defined
|
||||
<DECIMAL_INT, FLOAT> : not defined
|
||||
<DECIMAL_INT, DOUBLE> : not defined
|
||||
<DECIMAL_INT, FLOAT UNSIGNED> : not defined
|
||||
<DECIMAL_INT, DOUBLE UNSIGNED> : not defined
|
||||
<DECIMAL_INT, DECIMAL> : not defined
|
||||
<DECIMAL_INT, DECIMAL UNSIGNED> : not defined
|
||||
<DECIMAL_INT, DATETIME> : not defined
|
||||
<DECIMAL_INT, TIMESTAMP> : not defined
|
||||
<DECIMAL_INT, DATE> : not defined
|
||||
<DECIMAL_INT, TIME> : not defined
|
||||
<DECIMAL_INT, YEAR> : not defined
|
||||
<DECIMAL_INT, VARCHAR> : not defined
|
||||
<DECIMAL_INT, CHAR> : not defined
|
||||
<DECIMAL_INT, HEX_STRING> : not defined
|
||||
<DECIMAL_INT, EXT> : defined
|
||||
<DECIMAL_INT, UNKNOWN> : not defined
|
||||
<DECIMAL_INT, TINYTEXT> : not defined
|
||||
<DECIMAL_INT, TEXT> : not defined
|
||||
<DECIMAL_INT, MEDIUMTEXT> : not defined
|
||||
<DECIMAL_INT, LONGTEXT> : not defined
|
||||
<DECIMAL_INT, BIT> : not defined
|
||||
<DECIMAL_INT, ENUM> : not defined
|
||||
<DECIMAL_INT, SET> : not defined
|
||||
<DECIMAL_INT, ENUM_INNER> : not defined
|
||||
<DECIMAL_INT, SET_INNER> : not defined
|
||||
<DECIMAL_INT, TIMESTAMP_WITH_TIME_ZONE> : not defined
|
||||
<DECIMAL_INT, TIMESTAMP_WITH_LOCAL_TIME_ZONE> : not defined
|
||||
<DECIMAL_INT, TIMESTAMP> : not defined
|
||||
<DECIMAL_INT, RAW> : not defined
|
||||
<DECIMAL_INT, INTERVAL_YEAR_TO_MONTH> : not defined
|
||||
<DECIMAL_INT, INTERVAL_DAY_TO_SECOND> : not defined
|
||||
<DECIMAL_INT, NUMBER_FLOAT> : not defined
|
||||
<DECIMAL_INT, NVARCHAR2> : not defined
|
||||
<DECIMAL_INT, NCHAR> : not defined
|
||||
<DECIMAL_INT, ROWID> : not defined
|
||||
<DECIMAL_INT, LOB> : not defined
|
||||
<DECIMAL_INT, JSON> : not defined
|
||||
<DECIMAL_INT, GEOMETRY> : not defined
|
||||
<DECIMAL_INT, UDT> : not defined
|
||||
<DECIMAL_INT, DECIMAL_INT> : defined
|
||||
|
||||
|
||||
@ -50,6 +50,7 @@
|
||||
<NULL, JSON> : defined
|
||||
<NULL, GEOMETRY> : defined
|
||||
<NULL, UDT> : not defined
|
||||
<NULL, DECIMAL_INT> : defined
|
||||
|
||||
/**************** TINYINT ****************/
|
||||
|
||||
@ -103,6 +104,7 @@
|
||||
<TINYINT, JSON> : not defined
|
||||
<TINYINT, GEOMETRY> : not defined
|
||||
<TINYINT, UDT> : not defined
|
||||
<TINYINT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** SMALLINT ****************/
|
||||
|
||||
@ -156,6 +158,7 @@
|
||||
<SMALLINT, JSON> : not defined
|
||||
<SMALLINT, GEOMETRY> : not defined
|
||||
<SMALLINT, UDT> : not defined
|
||||
<SMALLINT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** MEDIUMINT ****************/
|
||||
|
||||
@ -209,6 +212,7 @@
|
||||
<MEDIUMINT, JSON> : not defined
|
||||
<MEDIUMINT, GEOMETRY> : not defined
|
||||
<MEDIUMINT, UDT> : not defined
|
||||
<MEDIUMINT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** INT ****************/
|
||||
|
||||
@ -262,6 +266,7 @@
|
||||
<INT, JSON> : not defined
|
||||
<INT, GEOMETRY> : not defined
|
||||
<INT, UDT> : not defined
|
||||
<INT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** BIGINT ****************/
|
||||
|
||||
@ -315,6 +320,7 @@
|
||||
<BIGINT, JSON> : not defined
|
||||
<BIGINT, GEOMETRY> : not defined
|
||||
<BIGINT, UDT> : not defined
|
||||
<BIGINT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** TINYINT UNSIGNED ****************/
|
||||
|
||||
@ -368,6 +374,7 @@
|
||||
<TINYINT UNSIGNED, JSON> : not defined
|
||||
<TINYINT UNSIGNED, GEOMETRY> : not defined
|
||||
<TINYINT UNSIGNED, UDT> : not defined
|
||||
<TINYINT UNSIGNED, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** SMALLINT UNSIGNED ****************/
|
||||
|
||||
@ -421,6 +428,7 @@
|
||||
<SMALLINT UNSIGNED, JSON> : not defined
|
||||
<SMALLINT UNSIGNED, GEOMETRY> : not defined
|
||||
<SMALLINT UNSIGNED, UDT> : not defined
|
||||
<SMALLINT UNSIGNED, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** MEDIUMINT UNSIGNED ****************/
|
||||
|
||||
@ -474,6 +482,7 @@
|
||||
<MEDIUMINT UNSIGNED, JSON> : not defined
|
||||
<MEDIUMINT UNSIGNED, GEOMETRY> : not defined
|
||||
<MEDIUMINT UNSIGNED, UDT> : not defined
|
||||
<MEDIUMINT UNSIGNED, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** INT UNSIGNED ****************/
|
||||
|
||||
@ -527,6 +536,7 @@
|
||||
<INT UNSIGNED, JSON> : not defined
|
||||
<INT UNSIGNED, GEOMETRY> : not defined
|
||||
<INT UNSIGNED, UDT> : not defined
|
||||
<INT UNSIGNED, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** BIGINT UNSIGNED ****************/
|
||||
|
||||
@ -580,6 +590,7 @@
|
||||
<BIGINT UNSIGNED, JSON> : not defined
|
||||
<BIGINT UNSIGNED, GEOMETRY> : not defined
|
||||
<BIGINT UNSIGNED, UDT> : not defined
|
||||
<BIGINT UNSIGNED, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** FLOAT ****************/
|
||||
|
||||
@ -633,6 +644,7 @@
|
||||
<FLOAT, JSON> : not defined
|
||||
<FLOAT, GEOMETRY> : not defined
|
||||
<FLOAT, UDT> : not defined
|
||||
<FLOAT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** DOUBLE ****************/
|
||||
|
||||
@ -686,6 +698,7 @@
|
||||
<DOUBLE, JSON> : not defined
|
||||
<DOUBLE, GEOMETRY> : not defined
|
||||
<DOUBLE, UDT> : not defined
|
||||
<DOUBLE, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** FLOAT UNSIGNED ****************/
|
||||
|
||||
@ -739,6 +752,7 @@
|
||||
<FLOAT UNSIGNED, JSON> : not defined
|
||||
<FLOAT UNSIGNED, GEOMETRY> : not defined
|
||||
<FLOAT UNSIGNED, UDT> : not defined
|
||||
<FLOAT UNSIGNED, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** DOUBLE UNSIGNED ****************/
|
||||
|
||||
@ -792,6 +806,7 @@
|
||||
<DOUBLE UNSIGNED, JSON> : not defined
|
||||
<DOUBLE UNSIGNED, GEOMETRY> : not defined
|
||||
<DOUBLE UNSIGNED, UDT> : not defined
|
||||
<DOUBLE UNSIGNED, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** DECIMAL ****************/
|
||||
|
||||
@ -845,6 +860,7 @@
|
||||
<DECIMAL, JSON> : not defined
|
||||
<DECIMAL, GEOMETRY> : not defined
|
||||
<DECIMAL, UDT> : not defined
|
||||
<DECIMAL, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** DECIMAL UNSIGNED ****************/
|
||||
|
||||
@ -898,6 +914,7 @@
|
||||
<DECIMAL UNSIGNED, JSON> : not defined
|
||||
<DECIMAL UNSIGNED, GEOMETRY> : not defined
|
||||
<DECIMAL UNSIGNED, UDT> : not defined
|
||||
<DECIMAL UNSIGNED, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** DATETIME ****************/
|
||||
|
||||
@ -951,6 +968,7 @@
|
||||
<DATETIME, JSON> : not defined
|
||||
<DATETIME, GEOMETRY> : not defined
|
||||
<DATETIME, UDT> : not defined
|
||||
<DATETIME, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** TIMESTAMP ****************/
|
||||
|
||||
@ -1004,6 +1022,7 @@
|
||||
<TIMESTAMP, JSON> : not defined
|
||||
<TIMESTAMP, GEOMETRY> : not defined
|
||||
<TIMESTAMP, UDT> : not defined
|
||||
<TIMESTAMP, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** DATE ****************/
|
||||
|
||||
@ -1057,6 +1076,7 @@
|
||||
<DATE, JSON> : not defined
|
||||
<DATE, GEOMETRY> : not defined
|
||||
<DATE, UDT> : not defined
|
||||
<DATE, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** TIME ****************/
|
||||
|
||||
@ -1110,6 +1130,7 @@
|
||||
<TIME, JSON> : not defined
|
||||
<TIME, GEOMETRY> : not defined
|
||||
<TIME, UDT> : not defined
|
||||
<TIME, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** YEAR ****************/
|
||||
|
||||
@ -1163,6 +1184,7 @@
|
||||
<YEAR, JSON> : not defined
|
||||
<YEAR, GEOMETRY> : not defined
|
||||
<YEAR, UDT> : not defined
|
||||
<YEAR, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** VARCHAR ****************/
|
||||
|
||||
@ -1216,6 +1238,7 @@
|
||||
<VARCHAR, JSON> : not defined
|
||||
<VARCHAR, GEOMETRY> : not defined
|
||||
<VARCHAR, UDT> : not defined
|
||||
<VARCHAR, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** CHAR ****************/
|
||||
|
||||
@ -1269,6 +1292,7 @@
|
||||
<CHAR, JSON> : not defined
|
||||
<CHAR, GEOMETRY> : not defined
|
||||
<CHAR, UDT> : not defined
|
||||
<CHAR, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** HEX_STRING ****************/
|
||||
|
||||
@ -1322,6 +1346,7 @@
|
||||
<HEX_STRING, JSON> : not defined
|
||||
<HEX_STRING, GEOMETRY> : not defined
|
||||
<HEX_STRING, UDT> : not defined
|
||||
<HEX_STRING, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** EXT ****************/
|
||||
|
||||
@ -1375,6 +1400,7 @@
|
||||
<EXT, JSON> : defined
|
||||
<EXT, GEOMETRY> : defined
|
||||
<EXT, UDT> : not defined
|
||||
<EXT, DECIMAL_INT> : defined
|
||||
|
||||
/**************** UNKNOWN ****************/
|
||||
|
||||
@ -1428,6 +1454,7 @@
|
||||
<UNKNOWN, JSON> : not defined
|
||||
<UNKNOWN, GEOMETRY> : not defined
|
||||
<UNKNOWN, UDT> : not defined
|
||||
<UNKNOWN, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** TINYTEXT ****************/
|
||||
|
||||
@ -1481,6 +1508,7 @@
|
||||
<TINYTEXT, JSON> : not defined
|
||||
<TINYTEXT, GEOMETRY> : not defined
|
||||
<TINYTEXT, UDT> : not defined
|
||||
<TINYTEXT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** TEXT ****************/
|
||||
|
||||
@ -1534,6 +1562,7 @@
|
||||
<TEXT, JSON> : not defined
|
||||
<TEXT, GEOMETRY> : not defined
|
||||
<TEXT, UDT> : not defined
|
||||
<TEXT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** MEDIUMTEXT ****************/
|
||||
|
||||
@ -1587,6 +1616,7 @@
|
||||
<MEDIUMTEXT, JSON> : not defined
|
||||
<MEDIUMTEXT, GEOMETRY> : not defined
|
||||
<MEDIUMTEXT, UDT> : not defined
|
||||
<MEDIUMTEXT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** LONGTEXT ****************/
|
||||
|
||||
@ -1640,6 +1670,7 @@
|
||||
<LONGTEXT, JSON> : not defined
|
||||
<LONGTEXT, GEOMETRY> : not defined
|
||||
<LONGTEXT, UDT> : not defined
|
||||
<LONGTEXT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** BIT ****************/
|
||||
|
||||
@ -1693,6 +1724,7 @@
|
||||
<BIT, JSON> : not defined
|
||||
<BIT, GEOMETRY> : not defined
|
||||
<BIT, UDT> : not defined
|
||||
<BIT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** ENUM ****************/
|
||||
|
||||
@ -1746,6 +1778,7 @@
|
||||
<ENUM, JSON> : not defined
|
||||
<ENUM, GEOMETRY> : not defined
|
||||
<ENUM, UDT> : not defined
|
||||
<ENUM, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** SET ****************/
|
||||
|
||||
@ -1799,6 +1832,7 @@
|
||||
<SET, JSON> : not defined
|
||||
<SET, GEOMETRY> : not defined
|
||||
<SET, UDT> : not defined
|
||||
<SET, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** ENUM_INNER ****************/
|
||||
|
||||
@ -1852,6 +1886,7 @@
|
||||
<ENUM_INNER, JSON> : not defined
|
||||
<ENUM_INNER, GEOMETRY> : not defined
|
||||
<ENUM_INNER, UDT> : not defined
|
||||
<ENUM_INNER, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** SET_INNER ****************/
|
||||
|
||||
@ -1905,6 +1940,7 @@
|
||||
<SET_INNER, JSON> : not defined
|
||||
<SET_INNER, GEOMETRY> : not defined
|
||||
<SET_INNER, UDT> : not defined
|
||||
<SET_INNER, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** TIMESTAMP_WITH_TIME_ZONE ****************/
|
||||
|
||||
@ -1958,6 +1994,7 @@
|
||||
<TIMESTAMP_WITH_TIME_ZONE, JSON> : not defined
|
||||
<TIMESTAMP_WITH_TIME_ZONE, GEOMETRY> : not defined
|
||||
<TIMESTAMP_WITH_TIME_ZONE, UDT> : not defined
|
||||
<TIMESTAMP_WITH_TIME_ZONE, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** TIMESTAMP_WITH_LOCAL_TIME_ZONE ****************/
|
||||
|
||||
@ -2011,6 +2048,7 @@
|
||||
<TIMESTAMP_WITH_LOCAL_TIME_ZONE, JSON> : not defined
|
||||
<TIMESTAMP_WITH_LOCAL_TIME_ZONE, GEOMETRY> : not defined
|
||||
<TIMESTAMP_WITH_LOCAL_TIME_ZONE, UDT> : not defined
|
||||
<TIMESTAMP_WITH_LOCAL_TIME_ZONE, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** TIMESTAMP ****************/
|
||||
|
||||
@ -2064,6 +2102,7 @@
|
||||
<TIMESTAMP, JSON> : not defined
|
||||
<TIMESTAMP, GEOMETRY> : not defined
|
||||
<TIMESTAMP, UDT> : not defined
|
||||
<TIMESTAMP, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** RAW ****************/
|
||||
|
||||
@ -2117,6 +2156,7 @@
|
||||
<RAW, JSON> : not defined
|
||||
<RAW, GEOMETRY> : not defined
|
||||
<RAW, UDT> : not defined
|
||||
<RAW, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** INTERVAL_YEAR_TO_MONTH ****************/
|
||||
|
||||
@ -2170,6 +2210,7 @@
|
||||
<INTERVAL_YEAR_TO_MONTH, JSON> : not defined
|
||||
<INTERVAL_YEAR_TO_MONTH, GEOMETRY> : not defined
|
||||
<INTERVAL_YEAR_TO_MONTH, UDT> : not defined
|
||||
<INTERVAL_YEAR_TO_MONTH, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** INTERVAL_DAY_TO_SECOND ****************/
|
||||
|
||||
@ -2223,6 +2264,7 @@
|
||||
<INTERVAL_DAY_TO_SECOND, JSON> : not defined
|
||||
<INTERVAL_DAY_TO_SECOND, GEOMETRY> : not defined
|
||||
<INTERVAL_DAY_TO_SECOND, UDT> : not defined
|
||||
<INTERVAL_DAY_TO_SECOND, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** NUMBER_FLOAT ****************/
|
||||
|
||||
@ -2276,6 +2318,7 @@
|
||||
<NUMBER_FLOAT, JSON> : not defined
|
||||
<NUMBER_FLOAT, GEOMETRY> : not defined
|
||||
<NUMBER_FLOAT, UDT> : not defined
|
||||
<NUMBER_FLOAT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** NVARCHAR2 ****************/
|
||||
|
||||
@ -2329,6 +2372,7 @@
|
||||
<NVARCHAR2, JSON> : not defined
|
||||
<NVARCHAR2, GEOMETRY> : not defined
|
||||
<NVARCHAR2, UDT> : not defined
|
||||
<NVARCHAR2, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** NCHAR ****************/
|
||||
|
||||
@ -2382,6 +2426,7 @@
|
||||
<NCHAR, JSON> : not defined
|
||||
<NCHAR, GEOMETRY> : not defined
|
||||
<NCHAR, UDT> : not defined
|
||||
<NCHAR, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** ROWID ****************/
|
||||
|
||||
@ -2435,6 +2480,7 @@
|
||||
<ROWID, JSON> : not defined
|
||||
<ROWID, GEOMETRY> : not defined
|
||||
<ROWID, UDT> : not defined
|
||||
<ROWID, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** LOB ****************/
|
||||
|
||||
@ -2488,6 +2534,7 @@
|
||||
<LOB, JSON> : not defined
|
||||
<LOB, GEOMETRY> : not defined
|
||||
<LOB, UDT> : not defined
|
||||
<LOB, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** JSON ****************/
|
||||
|
||||
@ -2541,6 +2588,7 @@
|
||||
<JSON, JSON> : defined
|
||||
<JSON, GEOMETRY> : not defined
|
||||
<JSON, UDT> : not defined
|
||||
<JSON, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** GEOMETRY ****************/
|
||||
|
||||
@ -2594,6 +2642,7 @@
|
||||
<GEOMETRY, JSON> : not defined
|
||||
<GEOMETRY, GEOMETRY> : defined
|
||||
<GEOMETRY, UDT> : not defined
|
||||
<GEOMETRY, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** UDT ****************/
|
||||
|
||||
@ -2647,4 +2696,59 @@
|
||||
<UDT, JSON> : not defined
|
||||
<UDT, GEOMETRY> : not defined
|
||||
<UDT, UDT> : not defined
|
||||
<UDT, DECIMAL_INT> : not defined
|
||||
|
||||
/**************** DECIMAL_INT ****************/
|
||||
|
||||
<DECIMAL_INT, NULL> : defined
|
||||
<DECIMAL_INT, TINYINT> : not defined
|
||||
<DECIMAL_INT, SMALLINT> : not defined
|
||||
<DECIMAL_INT, MEDIUMINT> : not defined
|
||||
<DECIMAL_INT, INT> : not defined
|
||||
<DECIMAL_INT, BIGINT> : not defined
|
||||
<DECIMAL_INT, TINYINT UNSIGNED> : not defined
|
||||
<DECIMAL_INT, SMALLINT UNSIGNED> : not defined
|
||||
<DECIMAL_INT, MEDIUMINT UNSIGNED> : not defined
|
||||
<DECIMAL_INT, INT UNSIGNED> : not defined
|
||||
<DECIMAL_INT, BIGINT UNSIGNED> : not defined
|
||||
<DECIMAL_INT, FLOAT> : not defined
|
||||
<DECIMAL_INT, DOUBLE> : not defined
|
||||
<DECIMAL_INT, FLOAT UNSIGNED> : not defined
|
||||
<DECIMAL_INT, DOUBLE UNSIGNED> : not defined
|
||||
<DECIMAL_INT, DECIMAL> : not defined
|
||||
<DECIMAL_INT, DECIMAL UNSIGNED> : not defined
|
||||
<DECIMAL_INT, DATETIME> : not defined
|
||||
<DECIMAL_INT, TIMESTAMP> : not defined
|
||||
<DECIMAL_INT, DATE> : not defined
|
||||
<DECIMAL_INT, TIME> : not defined
|
||||
<DECIMAL_INT, YEAR> : not defined
|
||||
<DECIMAL_INT, VARCHAR> : not defined
|
||||
<DECIMAL_INT, CHAR> : not defined
|
||||
<DECIMAL_INT, HEX_STRING> : not defined
|
||||
<DECIMAL_INT, EXT> : defined
|
||||
<DECIMAL_INT, UNKNOWN> : not defined
|
||||
<DECIMAL_INT, TINYTEXT> : not defined
|
||||
<DECIMAL_INT, TEXT> : not defined
|
||||
<DECIMAL_INT, MEDIUMTEXT> : not defined
|
||||
<DECIMAL_INT, LONGTEXT> : not defined
|
||||
<DECIMAL_INT, BIT> : not defined
|
||||
<DECIMAL_INT, ENUM> : not defined
|
||||
<DECIMAL_INT, SET> : not defined
|
||||
<DECIMAL_INT, ENUM_INNER> : not defined
|
||||
<DECIMAL_INT, SET_INNER> : not defined
|
||||
<DECIMAL_INT, TIMESTAMP_WITH_TIME_ZONE> : not defined
|
||||
<DECIMAL_INT, TIMESTAMP_WITH_LOCAL_TIME_ZONE> : not defined
|
||||
<DECIMAL_INT, TIMESTAMP> : not defined
|
||||
<DECIMAL_INT, RAW> : not defined
|
||||
<DECIMAL_INT, INTERVAL_YEAR_TO_MONTH> : not defined
|
||||
<DECIMAL_INT, INTERVAL_DAY_TO_SECOND> : not defined
|
||||
<DECIMAL_INT, NUMBER_FLOAT> : not defined
|
||||
<DECIMAL_INT, NVARCHAR2> : not defined
|
||||
<DECIMAL_INT, NCHAR> : not defined
|
||||
<DECIMAL_INT, ROWID> : not defined
|
||||
<DECIMAL_INT, LOB> : not defined
|
||||
<DECIMAL_INT, JSON> : not defined
|
||||
<DECIMAL_INT, GEOMETRY> : not defined
|
||||
<DECIMAL_INT, UDT> : not defined
|
||||
<DECIMAL_INT, DECIMAL_INT> : defined
|
||||
|
||||
|
||||
Reference in New Issue
Block a user