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:
chaser-ch
2023-10-31 15:39:20 +00:00
committed by ob-robot
parent 4057fbc4ae
commit 566e920620
1375 changed files with 239147 additions and 56014 deletions

View File

@ -701,7 +701,7 @@ private:
int64_t start_key_;
};
class TestNode : public KVCacheHazardNode{
class TestNode : public ObKVCacheHazardNode{
public:
TestNode()
: id_(0)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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