[FEAT MERGE]4_1_sql_feature

Co-authored-by: leslieyuchen <leslieyuchen@gmail.com>
Co-authored-by: Charles0429 <xiezhenjiang@gmail.com>
Co-authored-by: raywill <hustos@gmail.com>
This commit is contained in:
obdev
2023-01-28 16:01:26 +08:00
committed by ob-robot
parent 3080f2b66f
commit 2d19a9d8f5
846 changed files with 161957 additions and 116661 deletions

View File

@ -706,17 +706,45 @@ int ObShowResolver::resolve(const ParseNode &parse_tree)
}
case T_SHOW_TRACE: {
[&] {
ret = OB_NOT_SUPPORTED;
LOG_USER_ERROR(OB_NOT_SUPPORTED, "show trace");
//if (OB_UNLIKELY(parse_tree.num_child_ != 1 || NULL == parse_tree.children_)) {
// ret = OB_ERR_UNEXPECTED;
// LOG_WARN("parse tree is wrong", K(ret), K(parse_tree.num_child_), K(parse_tree.children_));
//} else {
// show_resv_ctx.condition_node_ = parse_tree.children_[0];
// show_resv_ctx.stmt_type_ = stmt::T_SHOW_TRACE;
// GEN_SQL_STEP_1(ObShowSqlSet::SHOW_TRACE);
// GEN_SQL_STEP_2(ObShowSqlSet::SHOW_TRACE, REAL_NAME(OB_SYS_DATABASE_NAME, OB_ORA_SYS_SCHEMA_NAME), REAL_NAME(OB_ALL_VIRTUAL_TRACE_LOG_TNAME, OB_ALL_VIRTUAL_TRACE_LOG_ORA_TNAME));
//}
if (OB_UNLIKELY(parse_tree.num_child_ != 2 || NULL == parse_tree.children_)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("parse tree is wrong", K(ret), K(parse_tree.num_child_), K(parse_tree.children_));
} else {
show_resv_ctx.condition_node_ = parse_tree.children_[0];
show_resv_ctx.stmt_type_ = stmt::T_SHOW_TRACE;
bool is_row_traceformat = true;
if (NULL != parse_tree.children_[1]) {
ObString show_format;
show_format.assign_ptr(parse_tree.children_[1]->str_value_,
static_cast<ObString::obstr_size_t>(parse_tree.children_[1]->str_len_));
if (show_format.case_compare("JSON")!=0
&& show_format.case_compare("ROW")!=0) {
ret = OB_NOT_SUPPORTED;
LOG_WARN("show format is wrong", K(ret), K(show_format));
LOG_USER_ERROR(OB_NOT_SUPPORTED, "show format only support json/row, other type is ");
} else {
is_row_traceformat = (show_format.case_compare("ROW")==0);
}
}
if (OB_SUCC(ret)) {
session_info_->set_is_row_traceformat(is_row_traceformat);
if (is_row_traceformat) {
GEN_SQL_STEP_1(ObShowSqlSet::SHOW_TRACE);
GEN_SQL_STEP_2(ObShowSqlSet::SHOW_TRACE, REAL_NAME(OB_SYS_DATABASE_NAME, OB_ORA_SYS_SCHEMA_NAME), REAL_NAME(OB_ALL_VIRTUAL_SHOW_TRACE_TNAME, OB_ALL_VIRTUAL_SHOW_TRACE_ORA_TNAME));
} else {
if (is_oracle_mode) {
ret = OB_NOT_SUPPORTED;
LOG_WARN("show trace in json format at oracle mode is not support", K(ret));
LOG_USER_ERROR(OB_NOT_SUPPORTED, "show trace in json format at oracle mode is");
} else {
GEN_SQL_STEP_1(ObShowSqlSet::SHOW_TRACE_JSON);
GEN_SQL_STEP_2(ObShowSqlSet::SHOW_TRACE_JSON, REAL_NAME(OB_SYS_DATABASE_NAME, OB_ORA_SYS_SCHEMA_NAME), REAL_NAME(OB_ALL_VIRTUAL_SHOW_TRACE_TNAME, OB_ALL_VIRTUAL_SHOW_TRACE_ORA_TNAME));
}
}
}
}
}();
break;
}
@ -1304,6 +1332,95 @@ int ObShowResolver::resolve(const ParseNode &parse_tree)
}();
break;
}
case T_SHOW_SEQUENCES: {
if (is_oracle_mode) {
ret = OB_NOT_SUPPORTED;
LOG_USER_ERROR(OB_NOT_SUPPORTED, "show sequence in oracle mode is");
} else if (OB_UNLIKELY(parse_tree.num_child_ != 2 || NULL == parse_tree.children_)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("parse tree is wrong", K(ret), K(parse_tree.num_child_), K(parse_tree.children_));
} else {
show_resv_ctx.stmt_type_ = stmt::T_SHOW_SEQUENCES;
show_resv_ctx.condition_node_ = parse_tree.children_[0];
ParseNode *condition_node = show_resv_ctx.condition_node_;
ObString show_db_name;
uint64_t show_db_id = OB_INVALID_ID;
if (OB_FAIL(get_database_info(parse_tree.children_[1],
database_name,
real_tenant_id,
show_resv_ctx,
show_db_id))) {
LOG_WARN("fail to get database info", K(ret));
} else if (OB_UNLIKELY(OB_INVALID_ID == show_db_id)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("database id is invalid", K(ret), K(show_db_id));
} else {
show_db_name = show_resv_ctx.show_database_name_;
if (OB_FAIL(schema_checker_->check_db_access(session_priv, show_db_name))) {
if (OB_ERR_NO_DB_PRIVILEGE == ret) {
LOG_USER_ERROR(OB_ERR_NO_DB_PRIVILEGE, session_priv.user_name_.length(), session_priv.user_name_.ptr(),
session_priv.host_name_.length(),session_priv.host_name_.ptr(),
show_db_name.length(), show_db_name.ptr());
} else {
LOG_WARN("fail to check priv", K(ret));
}
} else {
if (NULL != condition_node && T_LIKE_CLAUSE == condition_node->type_) {
if (OB_UNLIKELY(condition_node->num_child_ != 2
|| NULL == condition_node->children_)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("invalid like parse node",
K(ret),
K(condition_node->num_child_),
K(condition_node->children_));
} else if (OB_UNLIKELY(NULL == condition_node->children_[0]
|| NULL == condition_node->children_[1])) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("invalid like parse node",
K(ret),
K(condition_node->num_child_),
K(condition_node->children_[0]),
K(condition_node->children_[1]));
} else {
GEN_SQL_STEP_1(ObShowSqlSet::SHOW_SEQUENCES_LIKE,
show_resv_ctx.show_database_name_.length(),
show_resv_ctx.show_database_name_.ptr(),
static_cast<ObString::obstr_size_t>(condition_node->children_[0]->str_len_),//cast int64_t to obstr_size_t
condition_node->children_[0]->str_value_);
GEN_SQL_STEP_2(ObShowSqlSet::SHOW_SEQUENCES_LIKE, OB_SYS_DATABASE_NAME, OB_ALL_SEQUENCE_OBJECT_TNAME, show_db_id);
}
} else {
GEN_SQL_STEP_1(ObShowSqlSet::SHOW_SEQUENCES, show_resv_ctx.show_database_name_.length(),
show_resv_ctx.show_database_name_.ptr());
GEN_SQL_STEP_2(ObShowSqlSet::SHOW_SEQUENCES, OB_SYS_DATABASE_NAME, OB_ALL_SEQUENCE_OBJECT_TNAME, show_db_id);
}
}
//change where condition :Tables_in_xxx=>table_name
if (OB_SUCCESS == ret && NULL != condition_node && T_WHERE_CLAUSE == condition_node->type_) {
char *column_name = NULL;
int64_t tmp_pos = 0;
if (OB_FAIL(NULL == (column_name = static_cast<char *>(params_.allocator_->alloc(OB_MAX_COLUMN_NAME_BUF_LENGTH))))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_ERROR("failed to alloc column name buf", K(column_name));
} else if (OB_FAIL(databuff_printf(column_name,
OB_MAX_COLUMN_NAME_BUF_LENGTH,
tmp_pos,
"sequence_in_%.*s",
show_resv_ctx.show_database_name_.length(),
show_resv_ctx.show_database_name_.ptr()))) {
LOG_WARN("fail to add database name", K(show_resv_ctx.show_database_name_.ptr()));
break;
} else if (FALSE_IT(show_resv_ctx.column_name_ = ObString::make_string(column_name))){
//won't be here
} else if(OB_FAIL(replace_where_clause(condition_node->children_[0], show_resv_ctx))) {
LOG_WARN("fail to replace where clause", K(condition_node->children_[0]));
break;
}
}
}
}
break;
}
case T_SHOW_RESTORE_PREVIEW: {
// TODO: fix restore preview later.
ret = OB_NOT_SUPPORTED;
@ -1950,7 +2067,8 @@ int ObShowResolver::resolve_like_or_where_clause(ObShowResolverContext &ctx)
&& parse_tree->type_ != T_SHOW_TABLEGROUPS
&& parse_tree->type_ != T_SHOW_PROCEDURE_STATUS
&& parse_tree->type_ != T_SHOW_FUNCTION_STATUS
&& parse_tree->type_ != T_SHOW_TRIGGERS)) {
&& parse_tree->type_ != T_SHOW_TRIGGERS
&& parse_tree->type_ != T_SHOW_SEQUENCES)) {
// do nothing
} else {
// Like or Where clause
@ -2625,9 +2743,15 @@ DEFINE_SHOW_CLAUSE_SET(SHOW_INDEXES,
DEFINE_SHOW_CLAUSE_SET(SHOW_TRACE,
NULL,
"SELECT title AS `Title`, key_value AS `KeyValue`, time AS `Time` FROM %s.%s ",
R"(SELECT "TITLE" AS "TITLE", "KEY_VALUE" AS "KEYVALUE", "TIME" AS "TIME" FROM %s.%s )",
"Title");
"SELECT span_name as `Operation`, start_ts as `StartTime`, concat(elapse, ' µs') as `ElapseTime` from %s.%s",
R"(SELECT span_name as "OPERATION", to_char(start_ts,'yyyy/mm/dd hh24:mi:ss') as "START_TIME", concat(elapse, ' µs') as "ELAPSE_TIME" FROM %s.%s)",
NULL);
DEFINE_SHOW_CLAUSE_SET(SHOW_TRACE_JSON,
NULL,
"select json_arrayagg(json_object('tenant_id', tenant_id, 'trace_id', trace_id, 'rec_svr_ip', rec_svr_ip, 'rec_svr_port', rec_svr_port, 'parent', parent_span_id, 'span_id', span_id, 'span_name', span_name, 'start_ts', start_ts, 'end_ts', end_ts, 'elapse', elapse, 'tags', cast(case when tags='' then NULL else tags end as json), 'logs', cast(case when logs='' then NULL else logs end as json))) as ShowTraceJSON from %s.%s",
R"()",
NULL);
DEFINE_SHOW_CLAUSE_SET(SHOW_ENGINES,
NULL,
@ -2817,8 +2941,15 @@ DEFINE_SHOW_CLAUSE_SET(SHOW_RESTORE_PREVIEW,
"SELECT * FROM %s.%s",
NULL,
NULL);
DEFINE_SHOW_CLAUSE_SET(SHOW_SEQUENCES,
"SELECT sequence_name AS `Sequences_in_%.*s` ",
"SELECT sequence_name FROM %s.%s WHERE database_id = %ld ORDER BY sequence_name COLLATE utf8mb4_bin ASC",
NULL,
"sequence_name");
DEFINE_SHOW_CLAUSE_SET(SHOW_SEQUENCES_LIKE,
"SELECT sequence_name AS `Sequences_in_%.*s (%.*s)` ",
"SELECT sequence_name FROM %s.%s WHERE database_id = %ld ORDER BY sequence_name COLLATE utf8mb4_bin ASC",
NULL,
"sequence_name");
}/* ns sql*/
}/* ns oceanbase */