[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:
@ -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));
|
||||
|
||||
@ -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 */
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
Reference in New Issue
Block a user