[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

@ -710,6 +710,7 @@ int ObFlushCacheResolver::resolve(const ParseNode &parse_tree)
} else if (stmt->flush_cache_arg_.cache_type_ != CACHE_TYPE_LIB_CACHE) {
ret = OB_NOT_SUPPORTED;
LOG_WARN("only support lib cache's cache evict by namespace", K(stmt->flush_cache_arg_.cache_type_), K(ret));
LOG_USER_ERROR(OB_NOT_SUPPORTED, "only support lib cache's cache evict by namespace, other type");
} else {
if (OB_UNLIKELY(NULL == namespace_node->children_)) {
ret = OB_ERR_UNEXPECTED;
@ -746,9 +747,11 @@ int ObFlushCacheResolver::resolve(const ParseNode &parse_tree)
} else if (stmt->flush_cache_arg_.cache_type_ != CACHE_TYPE_PLAN) {
ret = OB_NOT_SUPPORTED;
LOG_WARN("only support plan cache's fine-grained cache evict", K(stmt->flush_cache_arg_.cache_type_), K(ret));
LOG_USER_ERROR(OB_NOT_SUPPORTED, "only support plan cache's fine-grained cache evict, other type");
} else if (lib::is_oracle_mode()) {
ret = OB_NOT_SUPPORTED;
LOG_WARN("not supported plan cache's fine-grained cache evict in oracle mode", K(ret));
LOG_USER_ERROR(OB_NOT_SUPPORTED, "plan cache's fine-grained cache evict in oracle mode is");
} else if (OB_ISNULL(sql_id_node->children_)
|| OB_ISNULL(sql_id_node->children_[0])
|| T_SQL_ID != sql_id_node->type_) {
@ -788,7 +791,7 @@ int ObFlushCacheResolver::resolve(const ParseNode &parse_tree)
// and not needs to specify db_name
} else {
ret = OB_NOT_SUPPORTED;
LOG_WARN("not supported flush cache in database level", K(ret));
LOG_USER_ERROR(OB_NOT_SUPPORTED, "flushing cache in database level at coarse flushing");
}
} else if (NULL == db_node) { // db list is empty
// empty db list means clear all db's in fine-grained cache evict
@ -2546,6 +2549,7 @@ int ObPhysicalRestoreTenantResolver::resolve(const ParseNode &parse_tree)
if (T_TABLE_LIST == node->type_) {
// TODO table list restore not support, fix this 4.1
ret = OB_NOT_SUPPORTED;
LOG_USER_ERROR(OB_NOT_SUPPORTED, "table list restore is");
// store database_name/table_name with case sensitive.
// compare database_name/table_name with tenant's name_case_mode.
lib::CompatModeGuard g(lib::Worker::CompatMode::ORACLE);
@ -4156,6 +4160,7 @@ int ObBackupSetDecryptionResolver::resolve(const ParseNode &parse_tree)
if (tenant_id != OB_SYS_TENANT_ID) {
ret = OB_NOT_SUPPORTED;
LOG_WARN("only sys tenant can set decryption", K(ret), K(tenant_id));
LOG_USER_ERROR(OB_NOT_SUPPORTED, "non-sys tenant set decryption is");
}
}
@ -4253,6 +4258,7 @@ int ObAddRestoreSourceResolver::resolve(const ParseNode &parse_tree)
if (tenant_id != OB_SYS_TENANT_ID) {
ret = OB_NOT_SUPPORTED;
LOG_WARN("only sys tenant can set add restore source", K(ret), K(tenant_id));
LOG_USER_ERROR(OB_NOT_SUPPORTED, "non-sys tenant set add restore source is");
} else if (OB_ISNULL(stmt = create_stmt<ObAddRestoreSourceStmt>())) {
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_ERROR("failed to create ObAddRestoreSourceStmt", K(ret));

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

View File

@ -110,6 +110,7 @@ struct ObShowResolver::ObShowSqlSet
DECLARE_SHOW_CLAUSE_SET(SHOW_INDEXES);
DECLARE_SHOW_CLAUSE_SET(SHOW_COLLATION);
DECLARE_SHOW_CLAUSE_SET(SHOW_TRACE);
DECLARE_SHOW_CLAUSE_SET(SHOW_TRACE_JSON);
DECLARE_SHOW_CLAUSE_SET(SHOW_ENGINES);
DECLARE_SHOW_CLAUSE_SET(SHOW_PRIVILEGES);
DECLARE_SHOW_CLAUSE_SET(SHOW_QUERY_RESPONSE_TIME);
@ -147,6 +148,8 @@ struct ObShowResolver::ObShowSqlSet
DECLARE_SHOW_CLAUSE_SET(SHOW_RESTORE_PREVIEW);
DECLARE_SHOW_CLAUSE_SET(SHOW_CREATE_TRIGGER);
DECLARE_SHOW_CLAUSE_SET(SHOW_TRIGGERS_LIKE);
DECLARE_SHOW_CLAUSE_SET(SHOW_SEQUENCES);
DECLARE_SHOW_CLAUSE_SET(SHOW_SEQUENCES_LIKE);
};// ObShowSqlSet
class ObShowResolver::ObSqlStrGenerator

View File

@ -275,8 +275,6 @@ int ObVariableSetResolver::resolve_subquery_info(const ObIArray<ObSubQueryInfo>
} else if (OB_UNLIKELY(T_SELECT != info.sub_query_->type_)) {
ret = OB_ERR_ILLEGAL_TYPE;
LOG_WARN("Unknown statement type in subquery", "stmt_type", info.sub_query_->type_);
} else {
info.ref_expr_->set_expr_level(current_level);
}
if (OB_FAIL(ret)) {
@ -289,7 +287,6 @@ int ObVariableSetResolver::resolve_subquery_info(const ObIArray<ObSubQueryInfo>
// for set stmt, the parent stmt of subquery is subquery itself
// we do this only to make sure that the sub_stmt is not a root stmt
ObDMLStmt *dml_stmt = subquery_resolver.get_select_stmt();
sub_stmt->set_parent_namespace_stmt(dml_stmt);
info.ref_expr_->set_ref_stmt(sub_stmt);
info.ref_expr_->set_output_column(sub_stmt->get_select_item_size());
// the column type of ref_expr stores the target type of subquery