[FEAT MERGE] implement mysql dblink and read consistency

Co-authored-by: xianyu-w <707512433@qq.com>
Co-authored-by: sdc <njucssdc@gmail.com>
Co-authored-by: seuwebber <webber_code@163.com>
This commit is contained in:
cqliang1995
2023-05-09 18:32:03 +00:00
committed by ob-robot
parent 38b78ad442
commit 4108e781d4
132 changed files with 2726 additions and 818 deletions

View File

@ -41,7 +41,8 @@ int ObStmtResolver::resolve_table_relation_node(const ParseNode *node,
bool is_org/*false*/,
bool is_oracle_sys_view,
char **dblink_name_ptr,
int32_t *dblink_name_len)
int32_t *dblink_name_len,
bool *has_dblink_node)
{
int ret = OB_SUCCESS;
bool is_db_explicit = false;
@ -53,7 +54,8 @@ int ObStmtResolver::resolve_table_relation_node(const ParseNode *node,
is_org,
is_oracle_sys_view,
dblink_name_ptr,
dblink_name_len))) {
dblink_name_len,
has_dblink_node))) {
LOG_WARN("failed to resolve table name", K(ret));
} else {
// do nothing
@ -75,7 +77,8 @@ int ObStmtResolver::resolve_table_relation_node_v2(const ParseNode *node,
bool is_org/*false*/,
bool is_oracle_sys_view,
char **dblink_name_ptr,
int32_t *dblink_name_len)
int32_t *dblink_name_len,
bool *has_dblink_node)
{
int ret = OB_SUCCESS;
is_db_explicit = false;
@ -85,6 +88,12 @@ int ObStmtResolver::resolve_table_relation_node_v2(const ParseNode *node,
table_name.assign_ptr(const_cast<char*>(relation_node->str_value_), table_len);
ObNameCaseMode mode = OB_NAME_CASE_INVALID;
ObCollationType cs_type = CS_TYPE_INVALID;
if (OB_NOT_NULL(has_dblink_node)) {
*has_dblink_node = false;
if (node->num_child_ >= 3 && NULL != node->children_[2]) {
*has_dblink_node = true;
}
}
if (NULL != dblink_name_ptr &&
NULL != dblink_name_len &&
node->num_child_ >= 3 &&
@ -170,7 +179,7 @@ int ObStmtResolver::resolve_table_relation_node_v2(const ParseNode *node,
return ret;
}
int ObStmtResolver::resolve_dblink_name(const ParseNode *table_node, ObString &dblink_name, bool &is_reverse_link, bool &has_dblink_node)
int ObStmtResolver::resolve_dblink_name(const ParseNode *table_node, uint64_t tenant_id, ObString &dblink_name, bool &is_reverse_link, bool &has_dblink_node)
{
int ret = OB_SUCCESS;
dblink_name.reset();
@ -178,11 +187,24 @@ int ObStmtResolver::resolve_dblink_name(const ParseNode *table_node, ObString &d
!OB_ISNULL(table_node->children_) && !OB_ISNULL(table_node->children_[2])) {
const ParseNode *dblink_node = table_node->children_[2];
has_dblink_node = true;
if (2 == dblink_node->num_child_ && !OB_ISNULL(dblink_node->children_) &&
!OB_ISNULL(dblink_node->children_[0]) && !OB_ISNULL(dblink_node->children_[1])) {
if (!lib::is_oracle_mode()) {
uint64_t compat_version = 0;
if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, compat_version))) {
LOG_WARN("fail to get data version", KR(ret), K(tenant_id));
} else if (compat_version < DATA_VERSION_4_2_0_0) {
ret = OB_NOT_SUPPORTED;
LOG_WARN("mysql dblink is not supported when MIN_DATA_VERSION is below DATA_VERSION_4_2_0_0", K(ret));
}
}
if (OB_FAIL(ret)) {
// do nothing
} else if (2 == dblink_node->num_child_ && !OB_ISNULL(dblink_node->children_) &&
!OB_ISNULL(dblink_node->children_[0])) {
int32_t dblink_name_len = static_cast<int32_t>(dblink_node->children_[0]->str_len_);
dblink_name.assign_ptr(dblink_node->children_[0]->str_value_, dblink_name_len);
is_reverse_link = dblink_node->children_[1]->value_;
if (!OB_ISNULL(dblink_node->children_[1])) {
is_reverse_link = dblink_node->children_[1]->value_;
}
}
}
return ret;