diff --git a/deps/oblib/src/lib/ob_define.h b/deps/oblib/src/lib/ob_define.h index aa012ab746..bdc9c12e4a 100644 --- a/deps/oblib/src/lib/ob_define.h +++ b/deps/oblib/src/lib/ob_define.h @@ -224,6 +224,7 @@ const int64_t OB_USER_MAX_ROWKEY_COLUMN_NUMBER = 64; const int64_t OB_MAX_ROWKEY_COLUMN_NUMBER = 2 * OB_USER_MAX_ROWKEY_COLUMN_NUMBER; const int64_t OB_MAX_VIEW_COLUMN_NAME_LENGTH_MYSQL = 64; const int64_t OB_MAX_COLUMN_NAME_LENGTH = 128; // Compatible with oracle, OB code logic is greater than Times TODO:xiyu +const int64_t OB_MAX_COLUMN_NAME_BINARY_LENGTH = 512; //OB_MAX_COLUMN_NAME_LENGTH * 4 (max character bytes) const int64_t OB_MAX_COLUMN_NAME_BUF_LENGTH = OB_MAX_COLUMN_NAME_LENGTH + 1; const int64_t OB_MAX_COLUMN_NAMES_LENGTH = 2 * 1024; const int64_t OB_MAX_APP_NAME_LENGTH = 128; @@ -255,6 +256,7 @@ const int64_t OB_MAX_USER_TABLE_NAME_LENGTH_MYSQL = 64; // Compatible with mysq const int64_t OB_MAX_USER_TABLE_NAME_LENGTH_ORACLE = 128; // Compatible with Oracle, error is reported when the logic is greater than // The actual maximum table name length of table_schema (the index table will have an additional prefix, so the actual length is greater than OB_MAX_USER_TABLE_NAME_LENGTH) const int64_t OB_MAX_TABLE_NAME_LENGTH = 256; +const int64_t OB_MAX_TABLE_NAME_BINARY_LENGTH = 2048; // See OB_MAX_DATABASE_NAME_BINARY_LENGTH explaination const int64_t OB_MAX_SCHEMA_REF_INFO = 4096; const int64_t OB_MAX_TABLE_NAME_BUF_LENGTH = OB_MAX_TABLE_NAME_LENGTH + 1; const int64_t OB_MAX_PLAN_EXPLAIN_NAME_LENGTH= 256; @@ -298,6 +300,9 @@ const int64_t OB_MAX_QB_NAME_LENGTH = 20; // Compatible with Oracle, hint speci const int64_t OB_MAX_SEQUENCE_NAME_LENGTH = 128; // Compatible with Oracle, error is reported when the logic is greater than const int64_t OB_MAX_KEYSTORE_NAME_LENGTH = 128; const int64_t OB_MAX_DATABASE_NAME_LENGTH = 128; // Not compatible with mysql (mysql is 64), the logic is greater than when an error is reported +const int64_t OB_MAX_DATABASE_NAME_BINARY_LENGTH = 2048; // Should be OB_MAX_DATABASE_NAME_LENGTH * 4(max char bytes), + // reserve some bytes thus OB_MAX_DATABASE_NAME_LENGTH changes will probably not influence it + // it is defined in primary key, and can not change randomly. const int64_t OB_MAX_DATABASE_NAME_BUF_LENGTH = OB_MAX_DATABASE_NAME_LENGTH + 1; const int64_t OB_MAX_TABLEGROUP_NAME_LENGTH = 128; // OB code logic is greater than or equal to an error, so modify it to 65 const int64_t OB_MAX_ALIAS_NAME_LENGTH = 255;// Compatible with mysql, 255 visible characters. Plus 256 bytes at the end of 0 @@ -817,7 +822,8 @@ const int64_t MAX_FREEZE_SUBMIT_STATUS_LENGTH = 64; const int64_t MAX_REPLAY_LOG_TYPE_LENGTH = 64; //columns const int64_t MAX_TABLE_CATALOG_LENGTH = 4096; -const int64_t MAX_COLUMN_COMMENT_LENGTH = 2048; // Consistent with mysql, changed from 1024 to 2048 +const int64_t MAX_COLUMN_COMMENT_LENGTH = 2048; +const int64_t MAX_COLUMN_COMMENT_CHAR_LENGTH = 1024; const int64_t MAX_COLUMN_KEY_LENGTH = 3; const int64_t MAX_NUMERIC_PRECISION_LENGTH = 9; const int64_t MAX_NUMERIC_SCALE_LENGTH = 9; diff --git a/deps/oblib/src/lib/ob_name_def.h b/deps/oblib/src/lib/ob_name_def.h index 2d2b9cc832..f382b257f2 100644 --- a/deps/oblib/src/lib/ob_name_def.h +++ b/deps/oblib/src/lib/ob_name_def.h @@ -754,6 +754,7 @@ #define N_EFFECTIVE_TENANT_ID "effective_tenant_id" #define N_CURRENT_USER "current_user" #define N_CURRENT_USER_PRIV "current_user_priv" +#define N_CURRENT_ROLE "current_role" #define N_USER "user" #define N_HOST_IP "host_ip" #define N_RPC_PORT "rpc_port" diff --git a/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h b/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h index 6e6b2caea0..997d34ec71 100644 --- a/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h +++ b/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h @@ -1089,7 +1089,7 @@ PCODE_DEF(OB_INNER_DROP_TENANT_SNAPSHOT, 0x1603) // for direct load PCODE_DEF(OB_DIRECT_LOAD_CONTROL, 0x1604) -//PCODE_DEF(OB_REVOKE_ROUTINE, 0x1605) +PCODE_DEF(OB_REVOKE_ROUTINE, 0x1605) PCODE_DEF(OB_FLUSH_LS_ARCHIVE, 0x1606) // PCODE_DEF(OB_ACQUIRE_LS_TRANSFER_SCN, 0x1607) diff --git a/src/observer/CMakeLists.txt b/src/observer/CMakeLists.txt index 3aa41958f3..39961d38b3 100644 --- a/src/observer/CMakeLists.txt +++ b/src/observer/CMakeLists.txt @@ -350,6 +350,7 @@ ob_set_subtarget(ob_server virtual_table virtual_table/ob_information_triggers_table.cpp virtual_table/ob_information_user_privileges_table.cpp virtual_table/ob_information_query_response_time.cpp + virtual_table/ob_information_schema_enable_roles_table.cpp virtual_table/ob_iterate_private_virtual_table.cpp virtual_table/ob_iterate_virtual_table.cpp virtual_table/ob_mem_leak_checker_info.cpp diff --git a/src/observer/ob_srv_xlator_rootserver.cpp b/src/observer/ob_srv_xlator_rootserver.cpp index 23c3915c0b..506de874f6 100644 --- a/src/observer/ob_srv_xlator_rootserver.cpp +++ b/src/observer/ob_srv_xlator_rootserver.cpp @@ -181,6 +181,7 @@ void oceanbase::observer::init_srv_xlator_for_rootserver(ObSrvRpcXlator *xlator) RPC_PROCESSOR(rootserver::ObRpcLockUserP, *gctx_.root_service_); RPC_PROCESSOR(rootserver::ObRpcRevokeDBP, *gctx_.root_service_); RPC_PROCESSOR(rootserver::ObRpcRevokeTableP, *gctx_.root_service_); + RPC_PROCESSOR(rootserver::ObRpcRevokeRoutineP, *gctx_.root_service_); RPC_PROCESSOR(rootserver::ObRpcRevokeSysPrivP, *gctx_.root_service_); RPC_PROCESSOR(rootserver::ObRpcAlterRoleP, *gctx_.root_service_); diff --git a/src/observer/virtual_table/ob_all_virtual_archive_dest_status.cpp b/src/observer/virtual_table/ob_all_virtual_archive_dest_status.cpp index 8623bb14b1..7638fd1e51 100644 --- a/src/observer/virtual_table/ob_all_virtual_archive_dest_status.cpp +++ b/src/observer/virtual_table/ob_all_virtual_archive_dest_status.cpp @@ -272,7 +272,7 @@ int ObVirtualArchiveDestStatus::get_all_tenant_ls_(const uint64_t tenant_id) ObSQLClientRetryWeak sql_client_retry_weak(sql_proxy_); SMART_VAR(ObMySQLProxy::MySQLResult, res) { - ObMySQLResult *result = NULL; + common::sqlclient::ObMySQLResult *result = NULL; ObSqlString sql; const static char *SELECT_ALL_LS = "SELECT ls_id FROM %s WHERE tenant_id = %ld and status not in " @@ -316,7 +316,7 @@ int ObVirtualArchiveDestStatus::get_ls_max_scn_(const uint64_t tenant_id) SERVER_LOG(WARN, "not inited", K(ret)); } else { SMART_VAR(ObMySQLProxy::MySQLResult, res) { - ObMySQLResult *result = NULL; + common::sqlclient::ObMySQLResult *result = NULL; ObSqlString sql; const static char *SELECT_LS_BY_TENANT = "SELECT ls_id, max_scn FROM %s WHERE tenant_id=%ld and role='LEADER'"; @@ -380,7 +380,7 @@ int ObVirtualArchiveDestStatus::get_ls_checkpoint_scn_(const uint64_t tenant_id, SERVER_LOG(WARN, "not inited", K(ret)); } else { SMART_VAR(ObMySQLProxy::MySQLResult, res) { - ObMySQLResult *result = NULL; + common::sqlclient::ObMySQLResult *result = NULL; ObSqlString sql; const static char *SELECT_LS_CHECKPOINT = "select ls_id, max(checkpoint_scn) as checkpoint_scn from %s " @@ -472,7 +472,7 @@ int ObVirtualArchiveDestStatus::get_status_info_(const uint64_t tenant_id, SERVER_LOG(WARN, "not inited", K(ret)); } else { SMART_VAR(ObMySQLProxy::MySQLResult, res) { - ObMySQLResult *result = NULL; + common::sqlclient::ObMySQLResult *result = NULL; ObSqlString sql; const static char *SELECT_LOG_ARCHIVE_PROGRESS = "SELECT status,path,checkpoint_scn,comment from %s " @@ -573,7 +573,7 @@ int ObVirtualArchiveDestStatus::check_if_switch_piece_(const uint64_t tenant_id, SERVER_LOG(WARN, "get log archive used piece id failed", K(ret)); } else { SMART_VAR(ObMySQLProxy::MySQLResult, res) { - ObMySQLResult *result = NULL; + common::sqlclient::ObMySQLResult *result = NULL; ObSqlString sql; int64_t tmp_ls_id = share::ObLSID::INVALID_LS_ID; int64_t tmp_piece_id = OB_BACKUP_INVALID_PIECE_ID; @@ -619,7 +619,7 @@ int ObVirtualArchiveDestStatus::get_log_archive_used_piece_id_(const uint64_t te SERVER_LOG(WARN, "not inited", K(ret)); } else { SMART_VAR(ObMySQLProxy::MySQLResult, res) { - ObMySQLResult *result = NULL; + common::sqlclient::ObMySQLResult *result = NULL; ObSqlString sql; const static char *SELECT_RS_PIECE_ID_SQL = "SELECT used_piece_id FROM %s WHERE tenant_id=%ld and dest_id=%ld"; diff --git a/src/observer/virtual_table/ob_all_virtual_proxy_schema.cpp b/src/observer/virtual_table/ob_all_virtual_proxy_schema.cpp index c152d8f9eb..5a0e22873a 100644 --- a/src/observer/virtual_table/ob_all_virtual_proxy_schema.cpp +++ b/src/observer/virtual_table/ob_all_virtual_proxy_schema.cpp @@ -586,12 +586,12 @@ int ObAllVirtualProxySchema::init_data() bool is_oracle_mode = false; if (OB_FAIL(table_schema->check_if_oracle_compat_mode(is_oracle_mode))) { LOG_WARN("fail to check oracle mode", KR(ret), KPC(table_schema)); - } else if (OB_FAIL(get_view_decoded_schema_( - tenant_id, + } else if (OB_FAIL(get_view_decoded_schema_(tenant_id, tenant_name, view_definition, is_oracle_mode, - new_table_schema))) { + new_table_schema, + database_name))) { LOG_WARN("get_view_decoded_schema failed", KR(ret)); } else if (OB_NOT_NULL(new_table_schema)) { table_schema = new_table_schema; @@ -639,7 +639,8 @@ int ObAllVirtualProxySchema::get_view_decoded_schema_( const common::ObString &tenant_name, const common::ObString &view_definition, const bool is_oracle_mode, - const ObTableSchema *&new_table_schema) + const ObTableSchema *&new_table_schema, + const common::ObString &database_name) { int ret = OB_SUCCESS; SMART_VAR(sql::ObSQLSessionInfo, empty_session) { @@ -657,13 +658,24 @@ int ObAllVirtualProxySchema::get_view_decoded_schema_( lib::Worker::CompatMode::MYSQL; empty_session.set_compatibility_mode(static_cast(compat_mode)); empty_session.set_sql_mode(ob_compatibility_mode_to_sql_mode(static_cast(compat_mode))); + if (is_oracle_mode) { + uint64_t database_id = OB_INVALID_ID; + if (OB_FAIL(schema_guard_.get_database_id(tenant_id, database_name, database_id))) { + LOG_WARN("failed to get database id", K(ret)); + } else if (OB_FAIL(empty_session.set_default_database(database_name))) { + LOG_WARN("failed to set default database name", K(ret)); + } else { + empty_session.set_database_id(database_id); + } + } ParseResult parse_result; sql::ObParser parser(*allocator_, empty_session.get_sql_mode()); sql::ObSchemaChecker schema_checker; lib::CompatModeGuard tmp_guard(compat_mode); //FIXME: Resolve view definition directly may failed when sys views are involved. // Select sql is needed here like int ObTableColumns::resolve_view_definition(). - if (OB_FAIL(parser.parse(view_definition, parse_result))) { + if (OB_FAIL(ret)) { + } else if (OB_FAIL(parser.parse(view_definition, parse_result))) { LOG_WARN("parse view definition failed", KR(ret), K(view_definition)); } else if (OB_FAIL(schema_checker.init(schema_guard_))) { LOG_WARN("fail to init schema checker", KR(ret)); diff --git a/src/observer/virtual_table/ob_all_virtual_proxy_schema.h b/src/observer/virtual_table/ob_all_virtual_proxy_schema.h index 756df454a8..0cbdeca1da 100644 --- a/src/observer/virtual_table/ob_all_virtual_proxy_schema.h +++ b/src/observer/virtual_table/ob_all_virtual_proxy_schema.h @@ -129,7 +129,8 @@ private: const common::ObString &tenant_name, const common::ObString &view_definition, const bool is_oracle_mode, - const share::schema::ObTableSchema *&new_table_schema); + const share::schema::ObTableSchema *&new_table_schema, + const common::ObString &database_name); int inner_get_next_row_(); int fill_row_( share::schema::ObSchemaGetterGuard &schema_guard, diff --git a/src/observer/virtual_table/ob_information_columns_table.cpp b/src/observer/virtual_table/ob_information_columns_table.cpp index 34822606cd..c1af3faafe 100644 --- a/src/observer/virtual_table/ob_information_columns_table.cpp +++ b/src/observer/virtual_table/ob_information_columns_table.cpp @@ -950,11 +950,11 @@ int ObInfoSchemaColumnsTable::fill_row_cells(const common::ObString &database_na K(ret), K(cur_row_.count_), K(col_count)); - } else if (OB_FAIL(ObTableColumns::deduce_column_attributes(is_oracle_mode, select_stmt, + } else if (OB_FAIL(ObTableColumns::deduce_column_attributes(is_oracle_mode, *table_schema, select_stmt, select_item, schema_guard_, session_, column_type_str_, column_type_str_len_, - column_attributes, false))) { + column_attributes, false, *allocator_))) { SERVER_LOG(WARN, "failed to deduce column attributes", K(select_item), K(ret)); } else { diff --git a/src/observer/virtual_table/ob_information_schema_enable_roles_table.cpp b/src/observer/virtual_table/ob_information_schema_enable_roles_table.cpp new file mode 100644 index 0000000000..ef5526003e --- /dev/null +++ b/src/observer/virtual_table/ob_information_schema_enable_roles_table.cpp @@ -0,0 +1,158 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#define USING_LOG_PREFIX SERVER +#include "ob_information_schema_enable_roles_table.h" +#include "share/schema/ob_schema_getter_guard.h" +#include "share/schema/ob_schema_utils.h" +#include "observer/ob_server_struct.h" +#include "observer/ob_server.h" + +using namespace oceanbase::common; +using namespace oceanbase::share::schema; + +namespace oceanbase { +namespace observer { +ObInfoSchemaEnableRolesTable::ObInfoSchemaEnableRolesTable() +{ +} + +ObInfoSchemaEnableRolesTable::~ObInfoSchemaEnableRolesTable() +{ + reset(); +} + +void ObInfoSchemaEnableRolesTable::reset() +{ + ObVirtualTableScannerIterator::reset(); +} + +int ObInfoSchemaEnableRolesTable::inner_get_next_row(common::ObNewRow*& row) +{ + int ret = OB_SUCCESS; + if (!start_to_read_) { + if (OB_FAIL(prepare_scan())) { + LOG_WARN("fail to prepare scan", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(scanner_it_.get_next_row(cur_row_))) { + if (OB_ITER_END != ret) { + LOG_WARN("fail to get next row", K(ret)); + } + } else { + row = &cur_row_; + } + } + return ret; +} +int ObInfoSchemaEnableRolesTable::prepare_scan() +{ + int ret = OB_SUCCESS; + enum { + ROLE_NAME = OB_APP_MIN_COLUMN_ID, + ROLE_HOST, + IS_DEFAULT, + IS_MANDATORY, + MAX_COL_ID + }; + + ObObj *cells = NULL; + share::schema::ObSchemaGetterGuard *schema_guard = NULL; + const int64_t col_count = output_column_ids_.count(); + + + if (0 > col_count || col_count > (MAX_COL_ID - OB_APP_MIN_COLUMN_ID)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("column count error ", K(ret), K(col_count)); + } else if (OB_ISNULL(cells = cur_row_.cells_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("cur row cell is NULL", K(ret)); + } else if (col_count > cur_row_.count_) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("column num not match", K(ret), K(cur_row_), K(output_column_ids_)); + } else if (OB_ISNULL(session_) || OB_ISNULL(schema_guard = get_schema_guard())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("not init", K(ret)); + } else { + for (int i = 0; OB_SUCC(ret) && i < session_->get_enable_role_array().count(); ++i) { + const ObUserInfo *user_info = NULL; + const uint64_t role_user_id = session_->get_enable_role_array().at(i); + const ObUserInfo *cur_user_info = NULL; + const uint64_t cur_user_id = session_->get_priv_user_id(); + const uint64_t tenant_id = session_->get_effective_tenant_id(); + if (OB_FAIL(schema_guard->get_user_info(tenant_id, role_user_id, user_info))) { + LOG_WARN("fail to get user id", KR(ret), K(tenant_id), K(role_user_id)); + } else if (OB_FAIL(schema_guard->get_user_info(tenant_id, cur_user_id, cur_user_info))) { + LOG_WARN("fail to get user id", KR(ret), K(tenant_id), K(role_user_id)); + } else if (OB_ISNULL(user_info) || OB_ISNULL(cur_user_info)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("user info is null", K(ret), KP(user_info), KP(cur_user_info), + K(tenant_id), K(cur_user_id), K(role_user_id)); + } + + for (int j = 0; OB_SUCC(ret) && j < col_count; ++j) { + uint64_t col_id = output_column_ids_.at(j); + switch (col_id){ + case ROLE_NAME:{ + cells[j].set_varchar(user_info->get_user_name_str()); + cells[j].set_collation_type(ObCharset::get_system_collation()); + break; + } + case ROLE_HOST: { + cells[j].set_varchar(user_info->get_host_name_str()); + cells[j].set_collation_type(ObCharset::get_system_collation()); + break; + } + case IS_DEFAULT: { + int64_t idx = 0; + bool is_default_role = false; + if (has_exist_in_array(cur_user_info->get_role_id_array(), role_user_id, &idx) + && cur_user_info->get_disable_option( + cur_user_info->get_role_id_option_array().at(idx)) == 0) { + is_default_role = true; + } + cells[j].set_varchar(is_default_role ? "YES" : "NO"); + cells[j].set_collation_type(ObCharset::get_system_collation()); + break; + } + case IS_MANDATORY: { + cells[j].set_varchar("NO"); + cells[j].set_collation_type(ObCharset::get_system_collation()); + break; + } + default: { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid column", K(ret)); + break; + } + } + } + if (OB_SUCC(ret)) { + if (OB_FAIL(scanner_.add_row(cur_row_))) { + LOG_WARN("fail to add row", K(ret), K(cur_row_)); + } + } + } + + if (OB_SUCC(ret)) { + scanner_it_ = scanner_.begin(); + start_to_read_ = true; + } + } + + return ret; +} + +} // namespace observer +} // namespace oceanbase diff --git a/src/observer/virtual_table/ob_information_schema_enable_roles_table.h b/src/observer/virtual_table/ob_information_schema_enable_roles_table.h new file mode 100644 index 0000000000..56d834f382 --- /dev/null +++ b/src/observer/virtual_table/ob_information_schema_enable_roles_table.h @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#ifndef OCEANBASE_OB_INFORMATION_SCHEMA_ENABLE_ROLES_ +#define OCEANBASE_OB_INFORMATION_SCHEMA_ENABLE_ROLES_ + +#include "share/ob_virtual_table_scanner_iterator.h" + +namespace oceanbase +{ +namespace observer +{ +class ObInfoSchemaEnableRolesTable : public common::ObVirtualTableScannerIterator +{ +public: + ObInfoSchemaEnableRolesTable(); + virtual ~ObInfoSchemaEnableRolesTable(); + + virtual void reset(); + virtual int inner_get_next_row(common::ObNewRow *&row) override; + +private: + int prepare_scan(); + + DISALLOW_COPY_AND_ASSIGN(ObInfoSchemaEnableRolesTable); +}; +} +} +#endif /* OCEANBASE_OB_INFORMATION_SCHEMA_ENABLE_ROLES_ */ diff --git a/src/observer/virtual_table/ob_information_user_privileges_table.cpp b/src/observer/virtual_table/ob_information_user_privileges_table.cpp index be6ff0a82b..78495a8d9c 100644 --- a/src/observer/virtual_table/ob_information_user_privileges_table.cpp +++ b/src/observer/virtual_table/ob_information_user_privileges_table.cpp @@ -60,6 +60,12 @@ ObInfoSchemaUserPrivilegesTable::StaticInit::StaticInit() "DROP DATABASE LINK"; ObInfoSchemaUserPrivilegesTable::priv_type_strs[OB_PRIV_CREATE_DATABASE_LINK_SHIFT] = "CREATE DATABASE LINK"; + ObInfoSchemaUserPrivilegesTable::priv_type_strs[OB_PRIV_EXECUTE_SHIFT] = + "EXECUTE"; + ObInfoSchemaUserPrivilegesTable::priv_type_strs[OB_PRIV_ALTER_ROUTINE_SHIFT] = + "ALTER ROUTINE"; + ObInfoSchemaUserPrivilegesTable::priv_type_strs[OB_PRIV_CREATE_ROUTINE_SHIFT] = + "CREATE ROUTINE"; } ObInfoSchemaUserPrivilegesTable::ObInfoSchemaUserPrivilegesTable() diff --git a/src/observer/virtual_table/ob_show_grants.cpp b/src/observer/virtual_table/ob_show_grants.cpp index 60da288c11..23d8dce418 100644 --- a/src/observer/virtual_table/ob_show_grants.cpp +++ b/src/observer/virtual_table/ob_show_grants.cpp @@ -42,6 +42,105 @@ void ObShowGrants::reset() ObVirtualTableScannerIterator::reset(); } +int ObShowGrants::add_priv_map(PRIV_MAP &priv_map, PrivKey &priv_key, ObPrivSet added_priv) +{ + int ret = OB_SUCCESS; + ObPrivSet priv_set = OB_PRIV_SET_EMPTY; + if (OB_FAIL(priv_map.get_refactored(priv_key, priv_set))) { + if (OB_HASH_NOT_EXIST != ret) { + LOG_WARN("fail to get hash map", K(ret)); + } else { + ret = OB_SUCCESS; + } + } + if (OB_SUCC(ret)) { + priv_set |= added_priv; + OZ (priv_map.set_refactored(priv_key, priv_set, 1 /*overwrite*/)); + } + return ret; +} + +int ObShowGrants::add_priv_map_recursively(uint64_t user_id, PRIV_MAP &priv_map, bool expand_roles) +{ + int ret = OB_SUCCESS; + const ObUserInfo *user_info = NULL; + + if (OB_ISNULL(schema_guard_)) { + ret = OB_NOT_INIT; + SERVER_LOG(WARN, "schema guard is NULL", K(ret)); + } else if (OB_UNLIKELY(OB_INVALID_ID == tenant_id_)) { + ret = OB_NOT_INIT; + SERVER_LOG(WARN, "tenant_id is invalid", K(ret)); + } else if (OB_ISNULL(user_info = schema_guard_->get_user_info(tenant_id_, user_id))) { + ret = OB_ERR_USER_NOT_EXIST; + SERVER_LOG(WARN, "User not exist", K(ret), K_(tenant_id)); + } else { + ObArray db_priv_array; + ObArray table_priv_array; + ObArray column_priv_array; + ObArray routine_priv_array; + + OZ (schema_guard_->get_db_priv_with_user_id(tenant_id_, user_id, db_priv_array)); + OZ (schema_guard_->get_table_priv_with_user_id(tenant_id_, user_id, table_priv_array)); + OZ (schema_guard_->get_column_priv_with_user_id(tenant_id_, user_id, column_priv_array)); + OZ (schema_guard_->get_routine_priv_with_user_id(tenant_id_, user_id, routine_priv_array)); + + //user_level + if (OB_SUCC(ret)) { + PrivKey priv_key; + OZ (add_priv_map(priv_map, priv_key, user_info->get_priv_set())); + } + + //db_level + for (int i = 0; OB_SUCC(ret) && i < db_priv_array.count(); i++) { + PrivKey priv_key; + priv_key.db_name_ = db_priv_array.at(i)->get_database_name_str(); + OZ (add_priv_map(priv_map, priv_key, db_priv_array.at(i)->get_priv_set())); + } + + //table_level + for (int i = 0; OB_SUCC(ret) && i < table_priv_array.count(); i++) { + PrivKey priv_key; + priv_key.db_name_ = table_priv_array.at(i)->get_database_name_str(); + priv_key.table_name_ = table_priv_array.at(i)->get_table_name_str(); + OZ (add_priv_map(priv_map, priv_key, table_priv_array.at(i)->get_priv_set())); + } + + //column_level + for (int i = 0; OB_SUCC(ret) && i < column_priv_array.count(); i++) { + PrivKey priv_key; + priv_key.db_name_ = column_priv_array.at(i)->get_database_name_str(); + priv_key.table_name_ = column_priv_array.at(i)->get_table_name_str(); + priv_key.column_name_ = column_priv_array.at(i)->get_column_name_str(); + CK (OB_NOT_NULL(column_priv_array.at(i))); + OZ (add_priv_map(priv_map, priv_key, column_priv_array.at(i)->get_priv_set())); + } + + //routine + for (int i = 0; OB_SUCC(ret) && i < routine_priv_array.count(); i++) { + PrivKey priv_key; + priv_key.db_name_ = routine_priv_array.at(i)->get_database_name_str(); + priv_key.table_name_ = routine_priv_array.at(i)->get_routine_name_str(); + priv_key.obj_type_ = + routine_priv_array.at(i)->get_routine_type() == ObRoutineType::ROUTINE_PROCEDURE_TYPE ? + ObObjectType::PROCEDURE : ObObjectType::FUNCTION; + OZ (add_priv_map(priv_map, priv_key, routine_priv_array.at(i)->get_priv_set())); + } + + if (OB_SUCC(ret) && expand_roles) { + for (int i = 0; OB_SUCC(ret) && i < user_info->get_role_id_array().count(); i++) { + if (OB_FAIL(SMART_CALL(add_priv_map_recursively(user_info->get_role_id_array().at(i), + priv_map, + expand_roles)))) { + LOG_WARN("fail to add_priv_map_recursively", K(ret)); + } + } + } + + } + return ret; +} + int ObShowGrants::inner_get_next_row(common::ObNewRow *&row) { int ret = OB_SUCCESS; @@ -58,7 +157,8 @@ int ObShowGrants::inner_get_next_row(common::ObNewRow *&row) if (!start_to_read_) { ObObj *cells = NULL; uint64_t show_user_id = OB_INVALID_ID; - if (OB_FAIL(calc_show_user_id(show_user_id))) { + ObArray role_ids; + if (OB_FAIL(calc_show_user_id(show_user_id, role_ids))) { SERVER_LOG(WARN, "fail to calc show user id", K(ret)); } else if (OB_UNLIKELY(OB_INVALID_ID == show_user_id)) { ret = OB_ITER_END;//FIXME 暂不支持,返回空集 @@ -74,7 +174,18 @@ int ObShowGrants::inner_get_next_row(common::ObNewRow *&row) const ObUserInfo *user_info = NULL; ObArray db_priv_array; ObArray table_priv_array; + ObArray routine_priv_array; + ObArray column_priv_array; ObArrayobj_priv_array; + PRIV_MAP priv_map; + const int64_t PRIV_BUF_LENGTH = 512; + char buf[PRIV_BUF_LENGTH] = {}; + int64_t pos = 0; + ObString user_name; + ObString host_name; + ObString result; + ObNeedPriv have_priv; + if (OB_ISNULL(user_info = schema_guard_->get_user_info(tenant_id_, show_user_id))) { ret = OB_ERR_USER_NOT_EXIST; SERVER_LOG(WARN, "User not exist", K(ret), K_(tenant_id)); @@ -86,21 +197,154 @@ int ObShowGrants::inner_get_next_row(common::ObNewRow *&row) show_user_id, table_priv_array))) { SERVER_LOG(WARN, "Get table priv with user id error", K(ret)); + } else if (OB_FAIL(schema_guard_->get_routine_priv_with_user_id(tenant_id_, + show_user_id, + routine_priv_array))) { + SERVER_LOG(WARN, "Get routine priv with user id error", K(ret)); + } else if (OB_FAIL(schema_guard_->get_column_priv_with_user_id(tenant_id_, + show_user_id, + column_priv_array))) { + SERVER_LOG(WARN, "Get table priv with user id error", K(ret)); } else if (OB_FAIL(schema_guard_->get_obj_priv_with_grantee_id(tenant_id_, show_user_id, obj_priv_array))) { SERVER_LOG(WARN, "Get table priv with user id error", K(ret)); } else { + user_name = user_info->get_user_name_str(); + host_name = user_info->get_host_name_str(); + } + + if (OB_SUCC(ret) && lib::is_mysql_mode()) { + OZ (priv_map.create(32, "GrantsMap")); + OZ (add_priv_map_recursively(show_user_id, priv_map, false /*expand_roles*/)); + for (int i = 0; OB_SUCC(ret) && i < role_ids.count(); i++) { + OZ (add_priv_map_recursively(role_ids.at(i), priv_map, true /*expand_roles*/)); + } + + //user level + for (PRIV_MAP::const_iterator iter = priv_map.begin(); OB_SUCC(ret) && iter != priv_map.end(); ++iter) { + const PrivKey &priv_key = iter->first; + const ObPrivSet &privs = iter->second; + if (priv_key.db_name_.empty()) { + pos = 0; + have_priv.priv_level_ = OB_PRIV_USER_LEVEL; + have_priv.priv_set_ = privs; + + OZ (get_grants_string(buf, PRIV_BUF_LENGTH, pos, have_priv, user_name, host_name)); + OX (result.assign_ptr(buf, static_cast(pos))); + OZ (fill_row_cells(show_user_id, result)); + OZ (scanner_.add_row(cur_row_)); + } + } + + //db level + for (PRIV_MAP::const_iterator iter = priv_map.begin(); OB_SUCC(ret) && iter != priv_map.end(); ++iter) { + const PrivKey &priv_key = iter->first; + const ObPrivSet &privs = iter->second; + if (!priv_key.db_name_.empty() + && priv_key.table_name_.empty()) { + pos = 0; + have_priv.priv_level_ = OB_PRIV_DB_LEVEL; + have_priv.priv_set_ = privs; + have_priv.db_ = priv_key.db_name_; + + OZ (get_grants_string(buf, PRIV_BUF_LENGTH, pos, have_priv, user_name, host_name)); + OX (result.assign_ptr(buf, static_cast(pos))); + OZ (fill_row_cells(show_user_id, result)); + OZ (scanner_.add_row(cur_row_)); + } + } + + //table and column level + ObArray> priv_key_array; + for (PRIV_MAP::const_iterator iter = priv_map.begin(); OB_SUCC(ret) && iter != priv_map.end(); ++iter) { + if (iter->first.table_name_.empty() + || ObObjectType::INVALID != iter->first.obj_type_) { + //do nothing + } else if (OB_FAIL(priv_key_array.push_back(std::make_pair(iter->first, iter->second)))) { + LOG_WARN("push back failed", K(ret)); + } + } + std::sort(priv_key_array.begin(), priv_key_array.end(), PrivKey::cmp); + ObArray> priv_key_value_set; + for (int64_t i = 0; OB_SUCC(ret) && i < priv_key_array.count(); i++) { + bool need_print = false; + if (OB_FAIL(priv_key_value_set.push_back(priv_key_array.at(i)))) { + LOG_WARN("push back failed", K(ret)); + } else if (i + 1 < priv_key_array.count()) { + if (priv_key_array.at(i).first.db_name_ != priv_key_array.at(i + 1).first.db_name_ + || priv_key_array.at(i).first.table_name_ != priv_key_array.at(i + 1).first.table_name_) { + need_print = true; + } + } else { + need_print = true; + } + + if (OB_SUCC(ret)) { + if (need_print && !priv_key_value_set.empty()) { + have_priv.priv_level_ = OB_PRIV_TABLE_LEVEL; + have_priv.priv_set_ = 0; + have_priv.db_ = priv_key_value_set.at(0).first.db_name_; + have_priv.table_ = priv_key_value_set.at(0).first.table_name_; + have_priv.obj_type_ = priv_key_value_set.at(0).first.obj_type_; + if (priv_key_value_set.at(0).first.column_name_.empty()) { + have_priv.priv_set_ = priv_key_value_set.at(0).second; + OZ (priv_key_value_set.remove(0)); + } else { + have_priv.priv_set_ = 0; + } + pos = 0; + OZ (get_grants_string(buf, PRIV_BUF_LENGTH, pos, have_priv, user_name, host_name, &priv_key_value_set)); + OX (result.assign_ptr(buf, static_cast(pos))); + OZ (fill_row_cells(show_user_id, result)); + OZ (scanner_.add_row(cur_row_)); + + priv_key_value_set.reuse(); + } + } + } + + // pl priv + for (PRIV_MAP::const_iterator iter = priv_map.begin(); OB_SUCC(ret) && iter != priv_map.end(); ++iter) { + const PrivKey &priv_key = iter->first; + const ObPrivSet &privs = iter->second; + if (!priv_key.db_name_.empty() + && !priv_key.table_name_.empty() + && priv_key.obj_type_ != ObObjectType::INVALID) { + pos = 0; + have_priv.priv_level_ = OB_PRIV_ROUTINE_LEVEL; + have_priv.priv_set_ = privs; + have_priv.db_ = priv_key.db_name_; + have_priv.table_ = priv_key.table_name_; + have_priv.obj_type_ = priv_key.obj_type_; + + OZ (get_grants_string(buf, PRIV_BUF_LENGTH, pos, have_priv, user_name, host_name)); + OX (result.assign_ptr(buf, static_cast(pos))); + OZ (fill_row_cells(show_user_id, result)); + OZ (scanner_.add_row(cur_row_)); + } + } + + //grant roles + if (OB_SUCC(ret)) { + for (int i = 0; OB_SUCC(ret) && i < 2; i++) { + pos = 0; + OZ (grant_role_to_buff(buf, PRIV_BUF_LENGTH, pos, *user_info, !!i)); + if (OB_SUCC(ret) && pos > 0) { + result.reset(); + result.assign_ptr(buf, static_cast(pos)); + OZ (fill_row_cells(show_user_id, result)); + OZ (scanner_.add_row(cur_row_)); + } + } + } + } + + if (OB_SUCC(ret) && lib::is_oracle_mode()) { //grants on user - ObString user_name = user_info->get_user_name_str(); - ObString host_name = user_info->get_host_name_str(); - const int64_t PRIV_BUF_LENGTH = 512; - char buf[PRIV_BUF_LENGTH]; - int64_t pos = 0; - ObString result; - ObNeedPriv have_priv; have_priv.priv_level_ = OB_PRIV_USER_LEVEL; have_priv.priv_set_ = user_info->get_priv_set(); + pos = 0; if (OB_SUCCESS != (ret = get_grants_string(buf, PRIV_BUF_LENGTH, pos, have_priv, user_name, host_name))) { SERVER_LOG(WARN, "Fill grants string failed", K(ret)); } else { @@ -132,9 +376,8 @@ int ObShowGrants::inner_get_next_row(common::ObNewRow *&row) } } } - //grants on db.table - for (int64_t i = 0; OB_SUCC(ret) && i< table_priv_array.count(); ++i) { + for (int64_t i = 0; OB_SUCC(ret) && i < table_priv_array.count(); ++i) { pos = 0; const ObTablePriv *table_priv = table_priv_array.at(i); have_priv.priv_level_ = OB_PRIV_TABLE_LEVEL; @@ -153,7 +396,7 @@ int ObShowGrants::inner_get_next_row(common::ObNewRow *&row) } } } - + // grants for obj in oracle for (int64_t i = 0; OB_SUCC(ret) && i< obj_priv_array.count(); ++i) { pos = 0; @@ -252,6 +495,7 @@ int ObShowGrants::inner_get_next_row(common::ObNewRow *&row) } } } + } } if (OB_SUCC(ret)) { @@ -368,17 +612,22 @@ int ObShowGrants::get_grants_string( int64_t &pos, ObNeedPriv &have_priv, ObString &user_name, - ObString &host_name) + ObString &host_name, + ObIArray> *priv_key_array) { int ret = OB_SUCCESS; if (OB_ISNULL(buf)) { ret = OB_INVALID_ARGUMENT; SERVER_LOG(WARN, "Buf is NULL", K(ret)); + } else if (priv_key_array != NULL && have_priv.priv_level_ != OB_PRIV_TABLE_LEVEL) { + ret = OB_INVALID_ARGUMENT; + SERVER_LOG(WARN, "invalid column privilege", K(ret)); } else if (OB_FAIL(databuff_printf(buf, buf_len, pos, "GRANT"))) { SERVER_LOG(WARN, "Fill buffer failed", K(ret)); } else if (OB_FAIL(print_privs_to_buff(buf, buf_len, pos, have_priv.priv_level_, - have_priv.priv_set_))) { + have_priv.priv_set_, + priv_key_array))) { SERVER_LOG(WARN, "Fill privs to buffer failed", K(ret)); } else if (OB_FAIL(priv_level_printf(buf, buf_len, pos, have_priv))) { SERVER_LOG(WARN, "Fill privs to buffer failed", K(ret)); @@ -413,12 +662,75 @@ int ObShowGrants::get_grants_string( return ret; } +int ObShowGrants::print_column_privs_to_buff( + char *buf, + const int64_t buf_len, + int64_t &pos, + ObIArray> &priv_key_array, + const ObPrivType priv_type) +{ + int ret = OB_SUCCESS; + ObPrivSet priv_all = 0; + ObSEArray cols; + if (OB_ISNULL(buf)) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("Buf is NULL", K(ret)); + } + for (int64_t i = 0; OB_SUCC(ret) && i < priv_key_array.count(); i++) { + if ((priv_key_array.at(i).second & priv_type) != 0) { + if (OB_FAIL(cols.push_back(priv_key_array.at(i).first.column_name_))) { + LOG_WARN("push back failed", K(ret)); + } + } + } + + if (OB_SUCC(ret) && cols.count() > 0) { + if (priv_type == OB_PRIV_SELECT) { + if (OB_FAIL(BUF_PRINTF(" SELECT ("))) { + LOG_WARN("buf print failed", K(ret)); + } + } else if (priv_type == OB_PRIV_INSERT) { + if (OB_FAIL(BUF_PRINTF(" INSERT ("))) { + LOG_WARN("buf print failed", K(ret)); + } + } else if (priv_type == OB_PRIV_UPDATE) { + if (OB_FAIL(BUF_PRINTF(" UPDATE ("))) { + LOG_WARN("buf print failed", K(ret)); + } + } else if (priv_type == OB_PRIV_REFERENCES) { + if (OB_FAIL(BUF_PRINTF(" REFERENCES ("))) { + LOG_WARN("buf print failed", K(ret)); + } + } else { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid column priv type", K(ret), K(priv_type)); + } + for (int64_t i = 0; OB_SUCC(ret) && i < cols.count(); i++) { + if (OB_FAIL(databuff_printf(buf, buf_len, pos, "`%.*s`, ", + cols.at(i).length(), cols.at(i).ptr()))) { + LOG_WARN("Fill priv to buffer failed", K(ret)); + } + } + if (OB_SUCC(ret) && cols.count() > 0 && pos > 1) { + pos -= 2; //Delete last ', ' + } + if (OB_SUCC(ret) && OB_FAIL(BUF_PRINTF("),"))) { + LOG_WARN("buf print failed", K(ret)); + } + } + if (OB_FAIL(ret)) { + LOG_WARN("Fill buff failed", K(ret)); + } + return ret; +} + int ObShowGrants::print_privs_to_buff( char *buf, const int64_t buf_len, int64_t &pos, const ObPrivLevel priv_level, - const ObPrivSet priv_set) + const ObPrivSet priv_set, + ObIArray> *priv_key_array) { int ret = OB_SUCCESS; ObPrivSet priv_all = 0; @@ -431,6 +743,8 @@ int ObShowGrants::print_privs_to_buff( priv_all = OB_PRIV_DB_ACC; } else if (OB_PRIV_TABLE_LEVEL == priv_level) { priv_all = OB_PRIV_TABLE_ACC; + } else if (OB_PRIV_ROUTINE_LEVEL == priv_level) { + priv_all = OB_PRIV_ALL; } else if (OB_PRIV_OBJ_ORACLE_LEVEL == priv_level) { } else { ret = OB_INVALID_ARGUMENT; @@ -443,7 +757,7 @@ int ObShowGrants::print_privs_to_buff( SERVER_LOG(WARN, "print obj privs failed", K(ret)); } } else { - if (0 == (priv_set & priv_all)) { + if (0 == (priv_set & priv_all) && (priv_key_array == NULL || priv_key_array->empty())) { ret = databuff_printf(buf, buf_len, pos, " USAGE"); } else if (priv_all == (priv_set & priv_all)) { ret = databuff_printf(buf, buf_len, pos, " ALL PRIVILEGES"); @@ -466,12 +780,24 @@ int ObShowGrants::print_privs_to_buff( if ((priv_set & OB_PRIV_INSERT) && OB_SUCCESS == ret) { ret = BUF_PRINTF(" INSERT,"); } + if (OB_SUCC(ret) && priv_key_array != NULL && OB_FAIL(print_column_privs_to_buff(buf, buf_len, pos, + *priv_key_array, OB_PRIV_INSERT))) { + LOG_WARN("print column privs to buff failed", K(ret)); + } if ((priv_set & OB_PRIV_UPDATE) && OB_SUCCESS == ret) { ret = BUF_PRINTF(" UPDATE,"); } + if (OB_SUCC(ret) && priv_key_array != NULL && OB_FAIL(print_column_privs_to_buff(buf, buf_len, pos, + *priv_key_array, OB_PRIV_UPDATE))) { + LOG_WARN("print column privs to buff failed", K(ret)); + } if ((priv_set & OB_PRIV_SELECT) && OB_SUCCESS == ret) { ret = BUF_PRINTF(" SELECT,"); } + if (OB_SUCC(ret) && priv_key_array != NULL && OB_FAIL(print_column_privs_to_buff(buf, buf_len, pos, + *priv_key_array, OB_PRIV_SELECT))) { + LOG_WARN("print column privs to buff failed", K(ret)); + } if ((priv_set & OB_PRIV_INDEX) && OB_SUCCESS == ret) { ret = BUF_PRINTF(" INDEX,"); } @@ -511,8 +837,9 @@ int ObShowGrants::print_privs_to_buff( if ((priv_set & OB_PRIV_REFERENCES) && OB_SUCCESS == ret) { ret = BUF_PRINTF(" REFERENCES,"); } - if ((priv_set & OB_PRIV_EXECUTE) && OB_SUCCESS == ret) { - ret = BUF_PRINTF(" EXECUTE,"); + if (OB_SUCC(ret) && priv_key_array != NULL && OB_FAIL(print_column_privs_to_buff(buf, buf_len, pos, + *priv_key_array, OB_PRIV_REFERENCES))) { + LOG_WARN("print column privs to buff failed", K(ret)); } if ((priv_set & OB_PRIV_FLASHBACK) && OB_SUCCESS == ret) { ret = BUF_PRINTF(" FLASHBACK,"); @@ -550,6 +877,15 @@ int ObShowGrants::print_privs_to_buff( if ((priv_set & OB_PRIV_CREATE_DATABASE_LINK) && OB_SUCCESS == ret) { ret = BUF_PRINTF(" CREATE DATABASE LINK,"); } + if ((priv_set & OB_PRIV_EXECUTE) && OB_SUCCESS == ret) { + ret = BUF_PRINTF(" EXECUTE,"); + } + if ((priv_set & OB_PRIV_ALTER_ROUTINE) && OB_SUCCESS == ret) { + ret = BUF_PRINTF(" ALTER ROUTINE,"); + } + if ((priv_set & OB_PRIV_CREATE_ROUTINE) && OB_SUCCESS == ret) { + ret = BUF_PRINTF(" CREATE ROUTINE,"); + } if (OB_SUCCESS == ret && pos > 0) { pos--; //Delete last ',' } @@ -631,6 +967,13 @@ int ObShowGrants::priv_level_printf( have_priv.table_.length(), have_priv.table_.ptr()))) { SERVER_LOG(WARN, "Fill privs to buffer failed", K(ret)); } + } else if (OB_PRIV_ROUTINE_LEVEL == have_priv.priv_level_) { + if (OB_FAIL(databuff_printf(buf, buf_len, pos, have_priv.obj_type_ == ObObjectType::PROCEDURE ? " ON PROCEDURE `%.*s`.`%.*s`" : + " ON FUNCTION `%.*s`.`%.*s`", + have_priv.db_.length(), have_priv.db_.ptr(), + have_priv.table_.length(), have_priv.table_.ptr()))) { + SERVER_LOG(WARN, "Fill privs to buffer failed", K(ret)); + } } return ret; } @@ -671,7 +1014,7 @@ int ObShowGrants::grant_priv_to_buff(char *buf, const int64_t buf_len, int64_t & return ret; } -int ObShowGrants::calc_show_user_id(uint64_t &show_user_id) +int ObShowGrants::calc_show_user_id(uint64_t &show_user_id, ObIArray &role_ids) { int ret = OB_SUCCESS; ObRowkey start_key; @@ -689,24 +1032,23 @@ int ObShowGrants::calc_show_user_id(uint64_t &show_user_id) && start_key_obj_ptr[0] != end_key_obj_ptr[0]) { ret = OB_NOT_IMPLEMENT; SERVER_LOG(WARN, "table id must be exact value", K(ret)); - } else if (start_key_obj_ptr[0] == end_key_obj_ptr[0]) { - if (ObIntType == start_key_obj_ptr[0].get_type() - && ObIntType == end_key_obj_ptr[0].get_type()) { - if (OB_INVALID_ID != show_user_id) { - ret = OB_NOT_IMPLEMENT; - SERVER_LOG(WARN, "there must be only one table_id = XXX", K(ret)); - } else { - show_user_id = start_key_obj_ptr[0].get_int(); - } - } else { - ret = OB_ERR_UNEXPECTED; - SERVER_LOG(WARN, "Start key and end key obj type should be ObIntType", - K(ret), - "start type", start_key_obj_ptr[0].get_type(), - "end type", end_key_obj_ptr[0].get_type()); - } } else { - //do nothing + if (start_key_obj_ptr[0] == end_key_obj_ptr[0]) { + if (ObIntType == start_key_obj_ptr[0].get_type() + && ObIntType == end_key_obj_ptr[0].get_type()) { + if (OB_INVALID_ID != show_user_id) { + OZ (role_ids.push_back(start_key_obj_ptr[0].get_int())); + } else { + show_user_id = start_key_obj_ptr[0].get_int(); + } + } else { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "Start key and end key obj type should be ObIntType", + K(ret), + "start type", start_key_obj_ptr[0].get_type(), + "end type", end_key_obj_ptr[0].get_type()); + } + } } } else { ret = OB_ERR_UNEXPECTED; @@ -781,5 +1123,58 @@ int ObShowGrants::has_show_grants_priv(uint64_t show_user_id) const return ret; } +int ObShowGrants::grant_role_to_buff( + char *buf, + const int64_t buf_len, + int64_t &pos, + const ObUserInfo &user_info, + bool with_admin_option) +{ + int ret = OB_SUCCESS; + int64_t pos_bak = pos; + bool is_empty = true; + + if (OB_ISNULL(schema_guard_)) { + ret = OB_NOT_INIT; + SERVER_LOG(WARN, "schema guard is NULL", K(ret)); + } + + OZ (databuff_printf(buf, buf_len, pos, "GRANT ")); + + for (int i = 0; OB_SUCC(ret) && i < user_info.get_role_id_array().count(); i++) { + if (user_info.get_admin_option(user_info.get_role_id_option_array().at(i)) == with_admin_option) { + const ObUserInfo *role = NULL; + if (OB_ISNULL(role = schema_guard_->get_user_info(user_info.get_tenant_id(), + user_info.get_role_id_array().at(i)))) { + //ignore error + LOG_WARN("role not exist", K(ret)); + } else { + is_empty = false; + OZ (databuff_printf(buf, buf_len, pos, "`%.*s`@`%.*s`,", + role->get_user_name_str().length(), + role->get_user_name_str().ptr(), + role->get_host_name_str().length(), + role->get_host_name_str().ptr())); + } + } + } + + if (OB_SUCC(ret) && is_empty) { + pos = pos_bak; + } else { + OX (buf[pos - 1] = ' '); + OZ (databuff_printf(buf, buf_len, pos, "TO `%.*s`@`%.*s`", + user_info.get_user_name_str().length(), + user_info.get_user_name_str().ptr(), + user_info.get_host_name_str().length(), + user_info.get_host_name_str().ptr())); + if (with_admin_option) { + OZ (databuff_printf(buf, buf_len, pos, " WITH ADMIN OPTION")); + } + } + + return ret; +} + }/* ns observer*/ }/* ns oceanbase */ diff --git a/src/observer/virtual_table/ob_show_grants.h b/src/observer/virtual_table/ob_show_grants.h index e1852ded66..780a78698f 100644 --- a/src/observer/virtual_table/ob_show_grants.h +++ b/src/observer/virtual_table/ob_show_grants.h @@ -28,6 +28,58 @@ namespace observer { class ObShowGrants : public common::ObVirtualTableScannerIterator { +public: + struct PrivKey { + + PrivKey() : obj_type_(share::schema::ObObjectType::INVALID) {} + ObString db_name_; + ObString table_name_; + ObString column_name_; + share::schema::ObObjectType obj_type_; + uint64_t hash() const { + uint64_t hash_val = 0; + hash_val = db_name_.hash(hash_val); + hash_val = table_name_.hash(hash_val); + hash_val = column_name_.hash(hash_val); + hash_val = murmurhash(&obj_type_, sizeof(obj_type_), hash_val); + return hash_val; + } + static bool cmp(const std::pair &l, const std::pair &r) { + bool ret = false; + const PrivKey &left = l.first; + const PrivKey &right = r.first; + if (left.db_name_ == right.db_name_) { + if (left.table_name_ == right.table_name_) { + if (left.column_name_ == right.column_name_) { + ret = left.obj_type_ < right.obj_type_; + } else if (left.column_name_ < right.column_name_) { + ret = true; + } else { + ret = false; + } + } else if (left.table_name_ < right.table_name_) { + ret = true; + } else { + ret = false; + } + } else if (left.db_name_ < right.db_name_) { + ret = true; + } else { + ret = false; + } + return ret; + } + int hash(uint64_t &hash_val) const { hash_val = hash(); return OB_SUCCESS; } + bool operator==(const PrivKey &other) const { + return db_name_ == other.db_name_ + && table_name_ == other.table_name_ + && column_name_ == other.column_name_ + && obj_type_ == other.obj_type_; + } + + TO_STRING_KV(K_(db_name), K_(table_name), K_(column_name)); + }; + typedef hash::ObHashMap PRIV_MAP; public: ObShowGrants(); virtual ~ObShowGrants(); @@ -52,16 +104,24 @@ private: // @brief get string 'grant priv on priv_level to user' int get_grants_string(char *buf, const int64_t buf_len, int64_t &pos, share::schema::ObNeedPriv &have_priv, common::ObString &user_name, - common::ObString &host_name); + common::ObString &host_name, + ObIArray> *priv_key_array = NULL); + + int print_column_privs_to_buff(char *buf, + const int64_t buf_len, + int64_t &pos, + ObIArray> &priv_key_array, + const ObPrivType priv_type); // @brief append privileges info without considering grant_option int print_privs_to_buff(char *buf, const int64_t buf_len, int64_t &pos, - share::schema::ObPrivLevel priv_level, const ObPrivSet priv_set); + share::schema::ObPrivLevel priv_level, const ObPrivSet priv_set, + ObIArray> *priv_key_array = NULL); int priv_level_printf(char *buf, const int64_t buf_len, int64_t &pos, share::schema::ObNeedPriv &have_priv); // @brief append grant option info int grant_priv_to_buff(char *buf, const int64_t buf_len, int64_t &pos, const ObPrivSet priv_set); - int calc_show_user_id(uint64_t &show_user_id); + int calc_show_user_id(uint64_t &show_user_id, common::ObIArray &role_ids); int fill_row_cells(uint64_t show_user_id, const common::ObString &grants_str); int has_show_grants_priv(uint64_t show_user_id) const; @@ -84,6 +144,16 @@ private: ObString &obj_name, ObString &col_name); + int grant_role_to_buff( + char *buf, + const int64_t buf_len, + int64_t &pos, + const ObUserInfo &user_info, + bool with_admin_option); + + int add_priv_map_recursively(uint64_t user_id, PRIV_MAP &priv_map, bool expand_roles); + int add_priv_map(PRIV_MAP &priv_map, PrivKey &priv_key, ObPrivSet added_priv); + private: uint64_t tenant_id_; uint64_t user_id_; diff --git a/src/observer/virtual_table/ob_table_columns.cpp b/src/observer/virtual_table/ob_table_columns.cpp index 09de4dfaf7..a027082128 100644 --- a/src/observer/virtual_table/ob_table_columns.cpp +++ b/src/observer/virtual_table/ob_table_columns.cpp @@ -34,7 +34,8 @@ ObTableColumns::ObTableColumns() : ObVirtualTableScannerIterator(), type_str_(), column_type_str_(type_str_), - column_type_str_len_(OB_MAX_SYS_PARAM_NAME_LENGTH) + column_type_str_len_(OB_MAX_SYS_PARAM_NAME_LENGTH), + min_data_version_(OB_INVALID_VERSION) { MEMSET(type_str_, 0, OB_MAX_SYS_PARAM_NAME_LENGTH); } @@ -47,6 +48,15 @@ void ObTableColumns::reset() { MEMSET(type_str_, 0, OB_MAX_SYS_PARAM_NAME_LENGTH); ObVirtualTableScannerIterator::reset(); + min_data_version_ = OB_INVALID_VERSION; +} + +int ObTableColumns::init(uint64_t tenant_id) { + int ret = OB_SUCCESS; + if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, min_data_version_))) { + LOG_WARN("fail to get min data version", K(ret), K(tenant_id)); + } + return ret; } int ObTableColumns::inner_get_next_row(ObNewRow *&row) @@ -57,6 +67,7 @@ int ObTableColumns::inner_get_next_row(ObNewRow *&row) LOG_WARN( "data member is not init", K(ret), K(session_), K(allocator_), K(schema_guard_)); } else { + bool is_column_level = false; if (!start_to_read_) { const ObTableSchema *table_schema = NULL; uint64_t show_table_id = OB_INVALID_ID; @@ -75,6 +86,78 @@ int ObTableColumns::inner_get_next_row(ObNewRow *&row) && is_restrict_access_virtual_table(table_schema->get_table_id())) { ret = OB_TABLE_NOT_EXIST; LOG_WARN("fail to get table schema", K(ret), K(show_table_id)); + } else if (!lib::is_oracle_mode()) { + ObStmtNeedPrivs stmt_need_privs; + stmt_need_privs.need_privs_.set_allocator(allocator_); + ObSessionPrivInfo session_priv; + session_->get_session_priv_info(session_priv); + const ObSimpleDatabaseSchema *db_schema = NULL; + if (OB_UNLIKELY(!session_priv.is_valid())) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("Session priv is invalid", "tenant_id", session_priv.tenant_id_, + "user_id", session_priv.user_id_, K(ret)); + } else if (OB_FAIL(stmt_need_privs.need_privs_.init(3))) { + LOG_WARN("init failed", K(ret)); + } else if (OB_FAIL(schema_guard_->get_database_schema(table_schema->get_tenant_id(), + table_schema->get_database_id(), + db_schema))) { + LOG_WARN("get database schema failed", K(ret)); + } else if (OB_ISNULL(db_schema)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("db schema is null", K(ret)); + } else { + ObNeedPriv need_priv; + //Priv check: global select || db select || table acc || column acc + need_priv.priv_level_ = OB_PRIV_USER_LEVEL; + need_priv.priv_set_ = OB_PRIV_SELECT; + if (OB_FAIL(stmt_need_privs.need_privs_.push_back(need_priv))) { + LOG_WARN("push back failed", K(ret)); + } + if (OB_SUCC(ret)) { + need_priv.priv_level_ = OB_PRIV_DB_LEVEL; + need_priv.priv_set_ = OB_PRIV_SELECT; + need_priv.db_ = db_schema->get_database_name_str(); + if (OB_FAIL(stmt_need_privs.need_privs_.push_back(need_priv))) { + LOG_WARN("push back failed", K(ret)); + } + } + + if (OB_SUCC(ret)) { + need_priv.priv_level_ = OB_PRIV_TABLE_LEVEL; + need_priv.priv_set_ = OB_PRIV_TABLE_ACC; + need_priv.db_ = db_schema->get_database_name_str(); + need_priv.table_ = table_schema->get_table_name_str(); + if (OB_FAIL(stmt_need_privs.need_privs_.push_back(need_priv))) { + LOG_WARN("push back failed", K(ret)); + } + } + if (OB_FAIL(ret)) { + } else if (OB_FAIL(schema_guard_->check_priv_or(session_priv, stmt_need_privs))) { + if (OB_ERR_NO_TABLE_PRIVILEGE == ret) { + ret = OB_SUCCESS; + bool pass = false; + if (OB_FAIL(schema_guard_->check_priv_any_column_priv( + session_priv, db_schema->get_database_name_str(), + table_schema->get_table_name_str(), pass))) { + LOG_WARN("fail to collect privs in roles", K(ret)); + } else if (!pass) { + ret = OB_ERR_NO_TABLE_PRIVILEGE; + LOG_USER_ERROR(OB_ERR_NO_TABLE_PRIVILEGE, (int)strlen("SELECT"), "SELECT", + session_priv.user_name_.length(), session_priv.user_name_.ptr(), + session_priv.host_name_.length(),session_priv.host_name_.ptr(), + table_schema->get_table_name_str().length(), + table_schema->get_table_name_str().ptr()); + } + if (OB_SUCC(ret)) { + is_column_level = true; + } + } else { + LOG_WARN("fail to check priv", K(ret)); + } + } + } + } + if (OB_FAIL(ret)) { } else { bool throw_error = true; if (table_schema->is_view_table() && !table_schema->is_materialized_view()) { @@ -102,8 +185,7 @@ int ObTableColumns::inner_get_next_row(ObNewRow *&row) LOG_WARN("real stmt is NULL", K(ret)); } else { for (int64_t i = 0; OB_SUCC(ret) && i < real_stmt->get_select_item_size(); ++i) { - if (OB_FAIL(fill_row_cells(table_schema->get_tenant_id(), - table_schema->get_table_id(), + if (OB_FAIL(fill_row_cells(*table_schema, real_stmt, real_stmt->get_select_item(i)))) { LOG_WARN("fail to fill row cells", K(ret)); } else if (OB_FAIL(scanner_.add_row(cur_row_))) { @@ -115,17 +197,20 @@ int ObTableColumns::inner_get_next_row(ObNewRow *&row) ObColumnIterByPrevNextID iter(*table_schema); const ObColumnSchemaV2 *col = NULL; while (OB_SUCC(ret) && OB_SUCC(iter.next(col))) { + bool has_column_priv = false; if (OB_ISNULL(col)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("The column is null", K(ret)); - } else if (col->is_shadow_column()) { // 忽略掉shadow列 - // do nothing + } else if (!sql::ObSQLUtils::is_data_version_ge_422_or_431(min_data_version_) && col->is_hidden()) { + // version lower than 4.3.1 does not support SHOW EXTENDED, + // should not output hidden columns. } else if (col->is_invisible_column()) { // 忽略 invisible 列 - // do nothing - } else if (col->is_hidden()) { - // do nothing - } else if (OB_FAIL(fill_row_cells(*table_schema, *col))) { + // mysql 8.0.23 has supported invisivle column, we should not ignore them + // for mysql + } else if (OB_FAIL(fill_row_cells(*table_schema, *col, has_column_priv))) { LOG_WARN("fail to fill row cells", K(ret), K(col)); + } else if (lib::is_mysql_mode() && is_column_level && !has_column_priv) { + //do not output the column } else if (OB_FAIL(scanner_.add_row(cur_row_))) { LOG_WARN("fail to add row", K(ret), K(cur_row_)); } else {/*do nothing*/} @@ -240,9 +325,12 @@ int ObTableColumns::fill_col_privs( } int ObTableColumns::fill_row_cells(const ObTableSchema &table_schema, - const ObColumnSchemaV2 &column_schema) + const ObColumnSchemaV2 &column_schema, + bool &has_column_priv) { int ret = OB_SUCCESS; + has_column_priv = false; + ObPrivSet col_priv_set = 0; uint64_t cell_idx = 0; const ObRowkeyInfo &rowkey_info = table_schema.get_rowkey_info(); char *buf = NULL; @@ -284,6 +372,17 @@ int ObTableColumns::fill_row_cells(const ObTableSchema &table_schema, K(session_->get_effective_tenant_id()), K(table_schema.get_database_id())); } } + if (OB_SUCC(ret) && !is_oracle_mode) { + if (OB_FAIL(schema_guard_->collect_all_priv_for_column(session_priv, + db_schema->get_database_name_str(), + table_schema.get_table_name_str(), + column_schema.get_column_name_str(), + col_priv_set))) { + LOG_WARN("get column priv failed", K(ret)); + } else { + has_column_priv = (col_priv_set != OB_PRIV_SET_EMPTY); + } + } for (int64_t j = 0; OB_SUCC(ret) && j < output_column_ids_.count(); ++j) { uint64_t col_id = output_column_ids_.at(j); @@ -535,7 +634,7 @@ int ObTableColumns::fill_row_cells(const ObTableSchema &table_schema, } else if (OB_UNLIKELY(NULL == db_schema)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("database schema is null", K(ret), KP(db_schema)); - } else { + } else if (is_oracle_mode) { ObNeedPriv need_priv(db_schema->get_database_name(), table_schema.get_table_name(), OB_PRIV_TABLE_LEVEL, OB_PRIV_SELECT, false); @@ -550,15 +649,44 @@ int ObTableColumns::fill_row_cells(const ObTableSchema &table_schema, OZ (fill_col_privs(session_priv, need_priv, OB_PRIV_REFERENCES, "REFERENCES,", buf, buf_len, pos)); - if (OB_SUCC(ret)) { - if (pos > 0) { - cur_row_.cells_[cell_idx].set_varchar(ObString(0, pos - 1, buf)); - } else { - cur_row_.cells_[cell_idx].set_varchar(ObString("")); - } - cur_row_.cells_[cell_idx].set_collation_type( - ObCharset::get_default_collation(ObCharset::get_default_charset())); + } else { + ObNeedPriv need_priv(db_schema->get_database_name(), + table_schema.get_table_name(), + OB_PRIV_TABLE_LEVEL, OB_PRIV_SELECT, false); + + need_priv.priv_set_ = OB_PRIV_SELECT; + if (0 != (col_priv_set & OB_PRIV_SELECT) + || OB_SUCCESS == schema_guard_->check_single_table_priv(session_priv, need_priv)) { + ret = databuff_printf(buf, buf_len, pos, "SELECT,"); } + need_priv.priv_set_ = OB_PRIV_INSERT; + if (OB_FAIL(ret)) { + } else if (0 != (col_priv_set & OB_PRIV_INSERT) + || OB_SUCCESS == schema_guard_->check_single_table_priv(session_priv, need_priv)) { + ret = databuff_printf(buf, buf_len, pos, "INSERT,"); + } + need_priv.priv_set_ = OB_PRIV_UPDATE; + if (OB_FAIL(ret)) { + } else if (0 != (col_priv_set & OB_PRIV_UPDATE) + || OB_SUCCESS == schema_guard_->check_single_table_priv(session_priv, need_priv)) { + ret = databuff_printf(buf, buf_len, pos, "UPDATE,"); + } + need_priv.priv_set_ = OB_PRIV_REFERENCES; + if (OB_FAIL(ret)) { + } else if (0 != (col_priv_set & OB_PRIV_REFERENCES) + || OB_SUCCESS == schema_guard_->check_single_table_priv(session_priv, need_priv)) { + ret = databuff_printf(buf, buf_len, pos, "REFERENCES,"); + } + } + + if (OB_SUCC(ret)) { + if (pos > 0) { + cur_row_.cells_[cell_idx].set_varchar(ObString(0, pos - 1, buf)); + } else { + cur_row_.cells_[cell_idx].set_varchar(ObString("")); + } + cur_row_.cells_[cell_idx].set_collation_type( + ObCharset::get_default_collation(ObCharset::get_default_charset())); } break; } @@ -569,10 +697,10 @@ int ObTableColumns::fill_row_cells(const ObTableSchema &table_schema, break; } case IS_HIDDEN: { - // is_hidden is used for SHOW EXTENDED in 4.2.2 - cur_row_.cells_[cell_idx].set_int(0); - break; - } + const int64_t is_hidden_val = column_schema.is_hidden() ? 1 : 0; + cur_row_.cells_[cell_idx].set_int(is_hidden_val); + break; + } default: { ret = OB_ERR_UNEXPECTED; LOG_WARN("invalid column id", K(ret), K(cell_idx), @@ -588,13 +716,14 @@ int ObTableColumns::fill_row_cells(const ObTableSchema &table_schema, } int ObTableColumns::fill_row_cells( - const uint64_t tenant_id, - const uint64_t table_id, + const ObTableSchema &table_schema, const ObSelectStmt *select_stmt, const SelectItem &select_item) { int ret = OB_SUCCESS; uint64_t cell_idx = 0; + const uint64_t tenant_id = table_schema.get_tenant_id(); + const uint64_t table_id = table_schema.get_table_id(); ColumnAttributes column_attributes; bool is_oracle_mode = false; if (OB_ISNULL(cur_row_.cells_)) { @@ -610,7 +739,11 @@ int ObTableColumns::fill_row_cells( } else if (OB_FAIL(ObCompatModeGetter::check_is_oracle_mode_with_table_id( tenant_id, table_id, is_oracle_mode))) { LOG_WARN("fail to check oracle mode", KR(ret), K(table_id)); + } else if (OB_ISNULL(allocator_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected error", K(ret)); } else if (OB_FAIL(deduce_column_attributes(is_oracle_mode, + table_schema, select_stmt, select_item, schema_guard_, @@ -618,7 +751,8 @@ int ObTableColumns::fill_row_cells( column_type_str_, column_type_str_len_, column_attributes, - false))) { + false, + *allocator_))) { LOG_WARN("failed to deduce column attributes", K(select_item), K(ret)); } else { @@ -687,8 +821,7 @@ int ObTableColumns::fill_row_cells( break; } case IS_HIDDEN: { - // is_hidden is used for SHOW EXTENDED in 4.2.2 - cur_row_.cells_[cell_idx].set_int(0); + cur_row_.cells_[cell_idx].set_int(column_attributes.is_hidden_); break; } default: { @@ -718,6 +851,7 @@ const ObRawExpr *ObTableColumns::skip_inner_added_expr(const ObRawExpr *expr) int ObTableColumns::deduce_column_attributes( const bool is_oracle_mode, + const ObTableSchema &table_schema, const ObSelectStmt *select_stmt, const SelectItem &select_item, share::schema::ObSchemaGetterGuard *schema_guard, @@ -725,7 +859,8 @@ int ObTableColumns::deduce_column_attributes( char *column_type_str, int64_t column_type_str_len, ColumnAttributes &column_attributes, - bool skip_type_str) { + bool skip_type_str, + ObIAllocator &allocator) { int ret = OB_SUCCESS; // nullable = YES: if some binaryref expr is nullable // nullable = NO, other cases @@ -737,7 +872,7 @@ int ObTableColumns::deduce_column_attributes( // default = NULL: other cases //TODO: default = 0 case bool has_default = true; - + ObSqlString priv; ObRawExpr *&item_expr = const_cast(select_item).expr_; // In static engine the scale not idempotent in type deducing, // because the implicit cast is added, see: @@ -847,6 +982,81 @@ int ObTableColumns::deduce_column_attributes( } } + if (OB_SUCC(ret)) { + if (!is_oracle_mode) { + ObSessionPrivInfo session_priv; + session->get_session_priv_info(session_priv); + const ObSimpleDatabaseSchema *db_schema = NULL; + const ObColumnPriv *column_priv = NULL; + if (OB_UNLIKELY(!session_priv.is_valid())) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("Session priv is invalid", "tenant_id", session_priv.tenant_id_, + "user_id", session_priv.user_id_, K(ret)); + } else if (table_schema.get_database_id() == OB_INVALID_ID) { + ret = OB_ERR_BAD_DATABASE; + LOG_WARN("db name not found", K(ret)); + } else if (OB_FAIL(schema_guard->get_database_schema(table_schema.get_tenant_id(), + table_schema.get_database_id(), + db_schema))) { + LOG_WARN("get database schema failed", K(ret)); + } else if (OB_ISNULL(db_schema)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("db schema is null", K(ret)); + } else if (OB_FAIL(schema_guard->get_column_priv(ObColumnPrivSortKey(session_priv.tenant_id_, + session_priv.user_id_, + db_schema->get_database_name_str(), + table_schema.get_table_name_str(), + select_item.alias_name_), + column_priv))) { + LOG_WARN("get column priv failed", K(ret)); + } else { + ObNeedPriv need_priv(db_schema->get_database_name(), + table_schema.get_table_name(), + OB_PRIV_TABLE_LEVEL, OB_PRIV_SELECT, false); + ObPrivSet col_priv_set = 0; + if (column_priv != NULL) { + col_priv_set = column_priv->get_priv_set(); + } + if (0 != (col_priv_set & OB_PRIV_SELECT) + || OB_SUCCESS == schema_guard->check_single_table_priv(session_priv, need_priv)) { + if (OB_FAIL(priv.append("SELECT,"))) { + LOG_WARN("append failed", K(ret)); + } + } + need_priv.priv_set_ = OB_PRIV_INSERT; + if (OB_SUCC(ret)) { + if (0 != (col_priv_set & OB_PRIV_INSERT) + || OB_SUCCESS == schema_guard->check_single_table_priv(session_priv, need_priv)) { + if (OB_FAIL(priv.append("INSERT,"))) { + LOG_WARN("append failed", K(ret)); + } + } + } + need_priv.priv_set_ = OB_PRIV_UPDATE; + if (OB_SUCC(ret)) { + if (0 != (col_priv_set & OB_PRIV_UPDATE) + || OB_SUCCESS == schema_guard->check_single_table_priv(session_priv, need_priv)) { + if (OB_FAIL(priv.append("UPDATE,"))) { + LOG_WARN("append failed", K(ret)); + } + } + } + need_priv.priv_set_ = OB_PRIV_REFERENCES; + if (OB_SUCC(ret)) { + if (0 != (col_priv_set & OB_PRIV_REFERENCES) + || OB_SUCCESS == schema_guard->check_single_table_priv(session_priv, need_priv)) { + if (OB_FAIL(priv.append("REFERENCES,"))) { + LOG_WARN("append failed", K(ret)); + } + } + } + if (OB_SUCC(ret) && !priv.empty()) { + priv.set_length(priv.length() - 1); + } + } + } + } + if (OB_SUCC(ret)) { // set attributes column_attributes.field_ = select_item.alias_name_; @@ -858,8 +1068,9 @@ int ObTableColumns::deduce_column_attributes( column_attributes.null_ = ObString::make_string(nullable ? "YES" : "NO"); column_attributes.default_ = ObString::make_string(!has_default ? "NULL" : ""); column_attributes.extra_ = ObString::make_string(""); - column_attributes.privileges_ = ObString::make_string(""); + OZ (ob_write_string(allocator, priv.string(), column_attributes.privileges_)); column_attributes.result_type_ = select_item.expr_->get_result_type(); + column_attributes.is_hidden_ = 0; //TODO: //ObObj default; //view_column.set_cur_default_value(default); @@ -1032,7 +1243,7 @@ int ObTableColumns::resolve_view_definition( } else if (OB_ISNULL(view_item = select_stmt->get_table_item(0))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("view item is null"); - } else if (OB_UNLIKELY(NULL == (select_stmt = static_cast(view_item->ref_query_)))) { + } else if (OB_ISNULL(select_stmt = static_cast(view_item->ref_query_))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("select_stmt should not NULL", K(ret)); } else { /*do-nothing*/ } diff --git a/src/observer/virtual_table/ob_table_columns.h b/src/observer/virtual_table/ob_table_columns.h index 9df664b85d..7dd5f08657 100644 --- a/src/observer/virtual_table/ob_table_columns.h +++ b/src/observer/virtual_table/ob_table_columns.h @@ -56,12 +56,14 @@ public: common::ObString extra_; common::ObString privileges_; sql::ObExprResType result_type_; + int64_t is_hidden_; int64_t get_data_length() const; }; ObTableColumns(); virtual ~ObTableColumns(); virtual int inner_get_next_row(common::ObNewRow *&row); virtual void reset(); + int init(uint64_t tenant_id); static int resolve_view_definition( common::ObIAllocator* allocator, sql::ObSQLSessionInfo *session, @@ -80,6 +82,7 @@ public: bool &nullable, bool &has_default); static int deduce_column_attributes(const bool is_oracle_mode, + const ObTableSchema &table_schema, const sql::ObSelectStmt *select_stmt, const sql::SelectItem &select_item, share::schema::ObSchemaGetterGuard *schema_guard, @@ -87,8 +90,9 @@ public: char *column_type_str, int64_t column_type_str_len, ColumnAttributes &column_attributes, - bool skip_type_str); // skip_type_str : when use ObTableColumns::deduce_column_attributes in create_view_resolver, + bool skip_type_str, // skip_type_str : when use ObTableColumns::deduce_column_attributes in create_view_resolver, // no field column_type_str, skip + ObIAllocator &allocator); private: enum DESC_COLUMN { @@ -102,13 +106,13 @@ private: EXTRA, PRIVILEGES, COMMENT, - IS_HIDDEN + IS_HIDDEN, }; int calc_show_table_id(uint64_t &show_table_id); int fill_row_cells(const share::schema::ObTableSchema &table_schema, - const share::schema::ObColumnSchemaV2 &column_schema); - int fill_row_cells(const uint64_t tenant_id, - const uint64_t table_id, + const share::schema::ObColumnSchemaV2 &column_schema, + bool &has_column_priv); + int fill_row_cells(const ObTableSchema &table_schema, const sql::ObSelectStmt *select_stmt, const sql::SelectItem &select_item); int set_null_and_default_according_binary_expr(const sql::ObSelectStmt *select_stmt, @@ -147,6 +151,7 @@ private: char type_str_[common::OB_MAX_SYS_PARAM_NAME_LENGTH]; char *column_type_str_; int64_t column_type_str_len_; + uint64_t min_data_version_; DISALLOW_COPY_AND_ASSIGN(ObTableColumns); }; }//observer diff --git a/src/observer/virtual_table/ob_table_index.cpp b/src/observer/virtual_table/ob_table_index.cpp index c989d5dd2f..d48dd72d9a 100644 --- a/src/observer/virtual_table/ob_table_index.cpp +++ b/src/observer/virtual_table/ob_table_index.cpp @@ -39,7 +39,8 @@ ObTableIndex::ObTableIndex() simple_index_infos_(), is_rowkey_end_(false), is_normal_end_(false), - ft_dep_col_idx_(OB_INVALID_ID) + ft_dep_col_idx_(OB_INVALID_ID), + min_data_version_(OB_INVALID_VERSION) { } @@ -85,6 +86,16 @@ void ObTableIndex::reset() is_rowkey_end_ = false; simple_index_infos_.reset(); ft_dep_col_idx_ = OB_INVALID_ID; + min_data_version_ = OB_INVALID_VERSION; +} + +int ObTableIndex::init(uint64_t tenant_id) { + int ret = OB_SUCCESS; + tenant_id_ = tenant_id; + if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id_, min_data_version_))) { + LOG_WARN("fail to get min data version", K(ret), K(tenant_id_)); + } + return ret; } int ObTableIndex::inner_get_next_row(common::ObNewRow *&row) @@ -279,6 +290,59 @@ int ObTableIndex::add_table_indexes(const ObTableSchema &table_schema, } +int ObTableIndex::get_rowkey_index_column(const ObTableSchema &table_schema, + const ObColumnSchemaV2 *&column_schema, + bool &is_column_visible, + bool &is_end) +{ + int ret = OB_SUCCESS; + // is_compat: compatible mode for version lower than 4.3.1 which does not support SHOW EXTENDED + const bool is_compat = !sql::ObSQLUtils::is_data_version_ge_422_or_431(min_data_version_); + common::ObArray store_column_ids; + const ObRowkeyInfo &rowkey_info = table_schema.get_rowkey_info(); + ObRowkeyColumn rowkey_col; + is_end = false; + if (OB_UNLIKELY(rowkey_info_idx_ < 0)) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "rowkey_info_idx_ is wrong", K(rowkey_info_idx_)); + } else if (OB_FAIL(table_schema.get_store_column_ids(store_column_ids, true))) { + SERVER_LOG(WARN, "get store column ids failed"); + } else if (rowkey_info_idx_ >= (is_compat ? rowkey_info.get_size() : store_column_ids.count())) { + is_end = true; + rowkey_info_idx_ = OB_INVALID_ID; + } else if (is_compat) { + is_column_visible = true; + if (table_schema.is_heap_table()) { + // don't show hidden pk + // used for only hidden pk in the RowKey Table_schema + is_end = true; + rowkey_info_idx_ = OB_INVALID_ID; + } else if (OB_FAIL(rowkey_info.get_column(rowkey_info_idx_, rowkey_col))) { + SERVER_LOG(WARN, "fail to get column", K(ret)); + } else if (OB_UNLIKELY(NULL == (column_schema = table_schema.get_column_schema(rowkey_col.column_id_)))) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "fail to get column schema", K(ret), K(rowkey_col.column_id_)); + } else { + is_end = false; + } + } else { + is_column_visible = false; + if (table_schema.is_view_table()) { + is_end = true; + rowkey_info_idx_ = OB_INVALID_ID; + } else if (!table_schema.is_heap_table() + && OB_FAIL(rowkey_info.is_rowkey_column(store_column_ids.at(rowkey_info_idx_).col_id_, is_column_visible))) { + SERVER_LOG(WARN, "fail to check rowkey column", K(ret), K(store_column_ids.at(rowkey_info_idx_).col_id_)); + } else if (OB_UNLIKELY(NULL == (column_schema = table_schema.get_column_schema(store_column_ids.at(rowkey_info_idx_).col_id_)))) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "fail to get column schema", K(ret), K(store_column_ids.at(rowkey_info_idx_).col_id_)); + } else { + is_end = false; + } + } + return ret; +} + int ObTableIndex::add_rowkey_indexes(const ObTableSchema &table_schema, const ObString &database_name, ObObj *cells, @@ -286,7 +350,6 @@ int ObTableIndex::add_rowkey_indexes(const ObTableSchema &table_schema, bool &is_end) { int ret = OB_SUCCESS; - const ObRowkeyInfo &rowkey_info = table_schema.get_rowkey_info(); if (OB_INVALID_ID == static_cast(rowkey_info_idx_)) { rowkey_info_idx_ = 0; } @@ -300,27 +363,18 @@ int ObTableIndex::add_rowkey_indexes(const ObTableSchema &table_schema, K(ret), K(cur_row_.count_), K(col_count)); - } else if (OB_UNLIKELY(rowkey_info_idx_ < 0)) { - ret = OB_ERR_UNEXPECTED; - SERVER_LOG(WARN, "rowkey_info_idx_ is wrong", K(rowkey_info_idx_)); - } else if (rowkey_info_idx_ >= rowkey_info.get_size()) { - is_end = true; - rowkey_info_idx_ = OB_INVALID_ID; } else { const ObColumnSchemaV2 *column_schema = NULL; - ObRowkeyColumn rowkey_col; - if (table_schema.is_heap_table()) { - // don't show hidden pk - // used for only hidden pk in the RowKey Table_schema - is_end = true; - rowkey_info_idx_ = OB_INVALID_ID; - } else if (OB_FAIL(rowkey_info.get_column(rowkey_info_idx_, rowkey_col))) { - SERVER_LOG(WARN, "fail to get column", K(ret)); - } else if (OB_UNLIKELY(NULL == (column_schema = table_schema.get_column_schema(rowkey_col.column_id_)))) { + bool is_column_visible = false; + if (OB_FAIL(get_rowkey_index_column(table_schema, column_schema, + is_column_visible, is_end))) { + SERVER_LOG(WARN, "fail to get rowkey index column", K(ret)); + } else if (is_end) { + // do nothing + } else if (OB_ISNULL(column_schema)) { ret = OB_ERR_UNEXPECTED; - SERVER_LOG(WARN, "fail to get column schema", K(ret), K(rowkey_col.column_id_)); + SERVER_LOG(WARN, "column schema is NULL", K(ret)); } else { - is_end = false; uint64_t cell_idx = 0; for (int64_t j = 0; OB_SUCC(ret) && j < col_count; ++j) { uint64_t col_id = output_column_ids_.at(j); @@ -435,11 +489,13 @@ int ObTableIndex::add_rowkey_indexes(const ObTableSchema &table_schema, } // is_column_visible case OB_APP_MIN_COLUMN_ID + 18: { - // is_column_visible is used for SHOW EXTENDED in 4.2.2 - cells[cell_idx].set_int(1); + if (is_column_visible) { + cells[cell_idx].set_int(1); + } else { + cells[cell_idx].set_int(0); + } break; } - default: { ret = OB_ERR_UNEXPECTED; SERVER_LOG(WARN, "invalid column id", K(ret), K(cell_idx), @@ -577,6 +633,103 @@ int ObTableIndex::add_normal_indexes(const ObTableSchema &table_schema, return ret; } +int ObTableIndex::get_normal_index_column(const ObTableSchema &table_schema, + const ObTableSchema *index_schema, + const ObColumnSchemaV2 *&column_schema, + bool &is_column_visible, + bool &is_end) +{ + int ret = OB_SUCCESS; + // is_compat: compatible mode for version lower than 4.3.1 or 4.2.2 which does not support SHOW EXTENDED + const bool is_compat = !sql::ObSQLUtils::is_data_version_ge_422_or_431(min_data_version_); + common::ObArray store_column_ids; + is_end = false; + if (OB_ISNULL(index_schema)) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "index schema pointer is NULL", K(ret)); + } else if (OB_UNLIKELY(index_column_idx_ < 0)) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "index_column_idx_ is wrong", K(ret)); + } else if (OB_FAIL(index_schema->get_store_column_ids(store_column_ids, true))) { + SERVER_LOG(WARN, "get store columns fail", K(ret)); + } else if (index_column_idx_ >= + (is_compat ? index_schema->get_index_info().get_size() : store_column_ids.count())) { + is_end = true; + index_column_idx_ = OB_INVALID_ID; + } else { + const ObIndexInfo &index_info = index_schema->get_index_info(); + is_column_visible = false; + if (is_compat) { + const ObRowkeyColumn *rowkey_column; + is_column_visible = true; + if (OB_ISNULL(rowkey_column = index_info.get_column(index_column_idx_))) { + ret = OB_SCHEMA_ERROR; + SERVER_LOG(WARN, "fail to get rowkey column", K(ret)); + } else if (index_schema->is_spatial_index()) { + if (rowkey_column->type_.get_type() == ObVarcharType) { + is_end = true; // mbr列不需要输出 + index_column_idx_ = OB_INVALID_ID; + } else { // cellid列,获取主表geo列column_name + const ObColumnSchemaV2 *cellid_column = NULL; + if (OB_ISNULL(cellid_column = index_schema->get_column_schema(rowkey_column->column_id_))) { + ret = OB_SCHEMA_ERROR; + SERVER_LOG(WARN, "fail to get data table cellid column schema", K(ret), K(rowkey_column->column_id_)); + } else if (OB_ISNULL(column_schema = table_schema.get_column_schema(cellid_column->get_geo_col_id()))) { + ret = OB_SCHEMA_ERROR; + SERVER_LOG(WARN, "fail to get data table geo column schema", K(ret), K(cellid_column->get_geo_col_id())); + } + } + } else if (OB_ISNULL(column_schema = table_schema.get_column_schema(rowkey_column->column_id_))) { // 索引表的column_id跟数据表的对应列的column_id是相等的 + ret = OB_SCHEMA_ERROR; + SERVER_LOG(WARN, "fail to get data table column schema", K(ret), K_(rowkey_column->column_id)); + } + } else { + const ObColDesc *column_desc; + if (OB_ISNULL(column_desc = &store_column_ids.at(index_column_idx_))) { + ret = OB_SCHEMA_ERROR; + SERVER_LOG(WARN, "fail to get column desc", K(ret)); + } else if (OB_FAIL(index_info.is_rowkey_column(column_desc->col_id_, is_column_visible))) { + SERVER_LOG(WARN, "fail to check rowkey column", K(ret), K(column_desc->col_id_)); + } else if (index_schema->is_spatial_index()) { + if (!is_column_visible) { + // normal column + if (OB_ISNULL(column_schema = table_schema.get_column_schema(column_desc->col_id_))) { + ret = OB_SCHEMA_ERROR; + SERVER_LOG(WARN, "fail to get data table column schema", K(ret), K(column_desc->col_id_)); + } + } else if (column_desc->col_type_.get_type() == ObVarcharType) { + is_column_visible = false; // mbr列 + if (OB_ISNULL(column_schema = index_schema->get_column_schema(column_desc->col_id_))) { + ret = OB_SCHEMA_ERROR; + SERVER_LOG(WARN, "fail to get data table mbr column schema", K(ret), K(column_desc->col_id_)); + } + } else { // cellid列,获取主表geo列column_name + const ObColumnSchemaV2 *cellid_column = NULL; + if (OB_ISNULL(cellid_column = index_schema->get_column_schema(column_desc->col_id_))) { + ret = OB_SCHEMA_ERROR; + SERVER_LOG(WARN, "fail to get data table cellid column schema", K(ret), K(column_desc->col_id_)); + } else if (OB_ISNULL(column_schema = table_schema.get_column_schema(cellid_column->get_geo_col_id()))) { + ret = OB_SCHEMA_ERROR; + SERVER_LOG(WARN, "fail to get data table geo column schema", K(ret), K(cellid_column->get_geo_col_id())); + } + } + } else if (column_desc->col_id_ < OB_MIN_SHADOW_COLUMN_ID) { + if (OB_ISNULL(column_schema = table_schema.get_column_schema(column_desc->col_id_))) { // 索引表的column_id跟数据表的对应列的column_id是相等的 + ret = OB_SCHEMA_ERROR; + SERVER_LOG(WARN, "fail to get data table column schema", K(ret), K(column_desc->col_id_)); + } + } else { + // shadow column should get schema from index_schema + if (OB_ISNULL(column_schema = index_schema->get_column_schema(column_desc->col_id_))) { + ret = OB_SCHEMA_ERROR; + SERVER_LOG(WARN, "fail to get data table column schema", K(ret), K(column_desc->col_id_)); + } + } + } + } + return ret; +} + int ObTableIndex::add_normal_index_column(const ObString &database_name, const ObTableSchema &table_schema, const ObTableSchema *index_schema, @@ -596,20 +749,12 @@ int ObTableIndex::add_normal_index_column(const ObString &database_name, ret = OB_ERR_UNEXPECTED; SERVER_LOG(WARN, "cells count is less than output column count", K(ret), K(cur_row_.count_), K(col_count)); - } else if (OB_UNLIKELY(index_column_idx_ < 0)) { - ret = OB_ERR_UNEXPECTED; - SERVER_LOG(WARN, "index_column_idx_ is wrong", K(ret)); - } else if (index_column_idx_ >= index_schema->get_index_info().get_size()) { - is_end = true; - index_column_idx_ = OB_INVALID_ID; } else { - const ObIndexInfo &index_info = index_schema->get_index_info(); - const ObRowkeyColumn *rowkey_column = index_info.get_column(index_column_idx_); - const ObColumnSchemaV2 *column_schema = NULL; - const ObColumnSchemaV2 *index_column = NULL; ObString index_name; char *buf = NULL; int64_t buf_len = number::ObNumber::MAX_PRINTABLE_SIZE; + const ObColumnSchemaV2 *column_schema = NULL; + bool is_column_visible; const ObTableSchema *real_table_schema = &table_schema; if (table_schema.is_materialized_view()) { // a mview's indexes are built upon its container table @@ -627,37 +772,21 @@ int ObTableIndex::add_normal_index_column(const ObString &database_name, } if (OB_FAIL(ret)) { - } else if (OB_UNLIKELY(NULL == rowkey_column)) { - ret = OB_SCHEMA_ERROR; - SERVER_LOG(WARN, "fail to get rowkey column", K(ret)); - } else if (index_schema->is_spatial_index()) { - if (rowkey_column->type_.get_type() == ObVarcharType) { - is_end = true; // mbr列不需要输出 - index_column_idx_ = OB_INVALID_ID; - } else { // cellid列,获取主表geo列column_name - const ObColumnSchemaV2 *cellid_column = NULL; - if (OB_ISNULL(cellid_column = index_schema->get_column_schema(rowkey_column->column_id_))) { - ret = OB_SCHEMA_ERROR; - SERVER_LOG(WARN, "fail to get data table cellid column schema", K(ret), K(rowkey_column->column_id_)); - } else if (OB_ISNULL(column_schema = real_table_schema->get_column_schema(cellid_column->get_geo_col_id()))) { - ret = OB_SCHEMA_ERROR; - SERVER_LOG(WARN, "fail to get data table geo column schema", K(ret), K(cellid_column->get_geo_col_id())); - } - } - } else if (OB_ISNULL(column_schema = real_table_schema->get_column_schema(rowkey_column->column_id_))) { // 索引表的column_id跟数据表的对应列的column_id是相等的 - ret = OB_SCHEMA_ERROR; - SERVER_LOG(WARN, "fail to get data table column schema", K(ret), K_(rowkey_column->column_id)); - } - - if (OB_FAIL(ret) || is_end) { - } else if (OB_ISNULL(index_column = index_schema->get_column_schema(rowkey_column->column_id_))) { - ret = OB_SCHEMA_ERROR; - SERVER_LOG(WARN, "get index column schema failed", K_(rowkey_column->column_id)); + } else if (OB_ISNULL(real_table_schema)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected error", K(ret)); + } else if (OB_FAIL(get_normal_index_column(*real_table_schema, index_schema, column_schema, + is_column_visible, is_end))) { + SERVER_LOG(WARN, "fail to get normal index column", K(ret)); + } else if (is_end) { + // do nothing + } else if (OB_ISNULL(column_schema)) { + ret = OB_ALLOCATE_MEMORY_FAILED; + SERVER_LOG(WARN, "column schema is NULL", K(ret)); } else if (OB_ISNULL(buf = static_cast(allocator_->alloc(buf_len)))) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("allocate memory for print buffer failed", K(ret), K(buf_len)); } else { - is_end = false; uint64_t cell_idx = 0; for (int64_t j = 0; OB_SUCC(ret) && j < col_count; ++j) { uint64_t col_id = output_column_ids_.at(j); @@ -820,8 +949,11 @@ int ObTableIndex::add_normal_index_column(const ObString &database_name, } // is_column_visible case OB_APP_MIN_COLUMN_ID + 18: { - // is_column_visible is used for SHOW EXTENDED in 4.2.2 - cells[cell_idx].set_int(1); + if (is_column_visible) { + cells[cell_idx].set_int(1); + } else { + cells[cell_idx].set_int(0); + } break; } default: { @@ -1016,8 +1148,7 @@ int ObTableIndex::add_fulltext_index_column(const ObString &database_name, } // is_column_visible case OB_APP_MIN_COLUMN_ID + 18: { - // is_column_visible is used for SHOW EXTENDED in 4.2.2 - cells[cell_idx].set_int(1); + cells[cell_idx].set_int(1); // TODO this value is set for SHOW EXTENDED INDEX break; } default: { diff --git a/src/observer/virtual_table/ob_table_index.h b/src/observer/virtual_table/ob_table_index.h index 995a4c5ef7..59705a0859 100644 --- a/src/observer/virtual_table/ob_table_index.h +++ b/src/observer/virtual_table/ob_table_index.h @@ -41,7 +41,7 @@ public: virtual int inner_open(); virtual int inner_get_next_row(common::ObNewRow *&row); virtual void reset(); - inline void set_tenant_id(uint64_t tenant_id) { tenant_id_ = tenant_id; } + int init(uint64_t tenant_id); private: int add_table_indexes(const share::schema::ObTableSchema &table_schema, @@ -59,11 +59,20 @@ private: common::ObObj *cells, int64_t col_count, bool &is_end); + int get_rowkey_index_column(const ObTableSchema &table_schema, + const ObColumnSchemaV2 *&column_schema, + bool &is_column_visible, + bool &is_end); int add_normal_indexes(const share::schema::ObTableSchema &table_schema, const common::ObString &database_name, common::ObObj *cells, int64_t col_count, bool &is_end); + int get_normal_index_column(const ObTableSchema &table_schema, + const ObTableSchema *index_schema, + const ObColumnSchemaV2 *&column_schema, + bool &is_column_visible, + bool &is_end); int add_normal_index_column(const common::ObString &database_name, const share::schema::ObTableSchema &table_schema, const share::schema::ObTableSchema *index_schema, @@ -93,6 +102,7 @@ private: bool is_rowkey_end_; bool is_normal_end_; int64_t ft_dep_col_idx_; + uint64_t min_data_version_; DISALLOW_COPY_AND_ASSIGN(ObTableIndex); }; } diff --git a/src/observer/virtual_table/ob_virtual_table_iterator_factory.cpp b/src/observer/virtual_table/ob_virtual_table_iterator_factory.cpp index 1ff025a28a..a0b8f3b52a 100644 --- a/src/observer/virtual_table/ob_virtual_table_iterator_factory.cpp +++ b/src/observer/virtual_table/ob_virtual_table_iterator_factory.cpp @@ -226,6 +226,7 @@ #include "observer/virtual_table/ob_tenant_show_restore_preview.h" #include "observer/virtual_table/ob_all_virtual_nic_info.h" #include "observer/virtual_table/ob_all_virtual_sys_variable_default_value.h" +#include "observer/virtual_table/ob_information_schema_enable_roles_table.h" namespace oceanbase { @@ -1153,15 +1154,22 @@ int ObVTIterCreator::create_vt_iter(ObVTableScanParam ¶ms, { ObTableColumns *table_columns = NULL; if (OB_SUCC(NEW_VIRTUAL_TABLE(ObTableColumns, table_columns))) { - vt_iter = static_cast(table_columns); + if (OB_FAIL(table_columns->init(real_tenant_id))) { + SERVER_LOG(WARN, "fail to init tenant_virtual_table_column", K(ret)); + } else { + vt_iter = static_cast(table_columns); + } } break; } case OB_TENANT_VIRTUAL_TABLE_INDEX_TID: { ObTableIndex *table_index = NULL; if (OB_SUCC(NEW_VIRTUAL_TABLE(ObTableIndex, table_index))) { - table_index->set_tenant_id(real_tenant_id); - vt_iter = static_cast(table_index); + if (OB_FAIL(table_index->init(real_tenant_id))) { + SERVER_LOG(WARN, "fail to init tenant_virtual_table_index", K(ret)); + } else { + vt_iter = static_cast(table_index); + } } break; } @@ -2688,6 +2696,14 @@ int ObVTIterCreator::create_vt_iter(ObVTableScanParam ¶ms, } break; } + case OB_ENABLED_ROLES_TID: + { + ObInfoSchemaEnableRolesTable *enable_roles = NULL; + if (OB_SUCC(NEW_VIRTUAL_TABLE(ObInfoSchemaEnableRolesTable, enable_roles))) { + vt_iter = static_cast(enable_roles); + } + break; + } END_CREATE_VT_ITER_SWITCH_LAMBDA #define AGENT_VIRTUAL_TABLE_CREATE_ITER diff --git a/src/pl/ob_pl.cpp b/src/pl/ob_pl.cpp index ef05d78c1a..5ad932d54c 100644 --- a/src/pl/ob_pl.cpp +++ b/src/pl/ob_pl.cpp @@ -1208,21 +1208,46 @@ int ObPLContext::set_role_id_array(ObPLFunction &routine, ObString user_name = priv_user.split_on('@'); ObString host_name = priv_user; uint64_t priv_user_id = OB_INVALID_ID; + const ObUserInfo *user_info = NULL; - OZ (guard.get_user_id(session_info_->get_effective_tenant_id(), - user_name, - host_name, - priv_user_id)); - if (OB_SUCC(ret) && OB_INVALID_ID == priv_user_id) { + OZ (guard.get_user_info(session_info_->get_effective_tenant_id(), + user_name, host_name, user_info)); + if (OB_SUCC(ret) && OB_ISNULL(user_info)) { ret = OB_ERR_USER_NOT_EXIST; LOG_WARN("fail to get priv user id", K(session_info_->get_effective_tenant_id()), K(user_name), K(host_name), K(routine.get_priv_user())); } + OX (priv_user_id = user_info->get_user_id()); /* save priv user id, and set new priv user id, change grantee_id, for priv check */ if (OB_SUCC(ret) && priv_user_id != session_info_->get_priv_user_id()) { + //backup old session values firstly OX (old_priv_user_id_ = session_info_->get_priv_user_id()); - OX (session_info_->set_priv_user_id(priv_user_id)); + OZ (old_role_id_array_.assign(session_info_->get_enable_role_array())); + OX (old_user_priv_set_ = session_info_->get_user_priv_set()); + OX (old_db_priv_set_ = session_info_->get_db_priv_set()); + OX (need_reset_role_id_array_ = true); + + //assign new session values + //1. priv user_id + OX (session_info_->set_priv_user_id(priv_user_id)); + //2. roles + bool activate_all_role = false; + OZ (session_info_->get_activate_all_role_on_login(activate_all_role)); + OX (session_info_->get_enable_role_array().reuse()); + for (int i = 0; OB_SUCC(ret) && i < user_info->get_role_id_array().count(); ++i) { + if (activate_all_role + || user_info->get_disable_option(user_info->get_role_id_option_array().at(i)) == 0) { + OZ (session_info_->get_enable_role_array().push_back(user_info->get_role_id_array().at(i))); + } + } + //3. user priv set + OX (session_info_->set_user_priv_set(user_info->get_priv_set())); + //4. db priv set + ObPrivSet db_priv_set; + OZ (guard.get_db_priv_set(session_info_->get_effective_tenant_id(), + priv_user_id, session_info_->get_database_name(), db_priv_set)); + OX (session_info_->set_db_priv_set(db_priv_set)); } } return ret; @@ -1240,8 +1265,16 @@ void ObPLContext::reset_role_id_array(int &ret) need_reset_role_id_array_ = false; ret = OB_SUCCESS == ret ? tmp_ret : ret; } else { + //priv user session_info_->set_priv_user_id(old_priv_user_id_); + //role array + tmp_ret = session_info_->set_enable_role_array(old_role_id_array_); + //user priv set + session_info_->set_user_priv_set(old_user_priv_set_); + //db priv set + session_info_->set_db_priv_set(old_db_priv_set_); need_reset_role_id_array_ = false; + ret = OB_SUCCESS == ret ? tmp_ret : ret; } } } @@ -2118,8 +2151,20 @@ int ObPL::execute(ObExecContext &ctx, } } } + const ObDatabaseSchema *db_schema = NULL; + ObString db_name = ""; + ObSchemaGetterGuard *guard = ctx.get_sql_ctx()->schema_guard_; + CK (OB_NOT_NULL(guard)); + if (OB_SUCC(ret) && lib::is_mysql_mode()) { + OZ (guard->get_database_schema(ctx.get_my_session()->get_effective_tenant_id(), + routine->get_database_id(), + db_schema)); + if (OB_SUCC(ret)) { + db_name = db_schema->get_database_name_str(); + } + } if (OB_SUCC(ret) && !ObUDTObjectType::is_object_id(package_id)) { - OZ (check_exec_priv(ctx, routine)); + OZ (check_exec_priv(ctx, db_name, routine)); } } // prepare it ... @@ -2153,6 +2198,23 @@ int ObPL::execute(ObExecContext &ctx, && routine != NULL) { \ routine = NULL; \ } + + //check mysql definer has execute priv + if (OB_SUCC(ret) && lib::is_mysql_mode() && !ObUDTObjectType::is_object_id(package_id)) { + const ObDatabaseSchema *db_schema = NULL; + ObString db_name = ""; + ObSchemaGetterGuard *guard = ctx.get_sql_ctx()->schema_guard_; + CK (OB_NOT_NULL(guard)); + OZ (guard->get_database_schema(ctx.get_my_session()->get_effective_tenant_id(), + routine->get_database_id(), + db_schema)); + CK (OB_NOT_NULL(db_schema)); + if (OB_SUCC(ret)) { + db_name = db_schema->get_database_name_str(); + } + OZ (check_exec_priv(ctx, db_schema->get_database_name_str(), routine)); + } + // NOTE: restore stmt type saved before get_pl_function before start execution ctx.get_my_session()->set_stmt_type(saved_stmt_type); try { @@ -3661,6 +3723,7 @@ int ObPLExecRecursionCtx::dec_and_check_depth(uint64_t package_id, uint64_t proc /* check用户是否有调用存储过程的权限 */ int ObPL::check_exec_priv( ObExecContext &exec_ctx, + const ObString &database_name, ObPLFunction *routine) { int ret = OB_SUCCESS; @@ -3674,19 +3737,15 @@ int ObPL::check_exec_priv( OX (func_id = routine->get_routine_id()); OX (db_id = routine->get_database_id()); + ObSchemaGetterGuard *guard = exec_ctx.get_sql_ctx()->schema_guard_; + CK (OB_NOT_NULL(guard)); + OX (tenant_id = exec_ctx.get_my_session()->get_effective_tenant_id()); if (OB_SUCC(ret) && OB_INVALID_ID != pkg_id && !ObTriggerInfo::is_trigger_package_id(pkg_id) && OB_INVALID_ID != db_id && OB_INVALID_ID != func_id) { - const ObDatabaseSchema *db_schema = NULL; CK (exec_ctx.get_my_session() != NULL); - OX (tenant_id = exec_ctx.get_my_session()->get_effective_tenant_id()); - ObSchemaGetterGuard *guard = exec_ctx.get_sql_ctx()->schema_guard_; - CK (OB_NOT_NULL(guard)); - OZ (guard->get_database_schema(tenant_id, - db_id, - db_schema)); if (OB_SYS_TENANT_ID == routine->get_tenant_id()) { bool need_check = false; bool need_only_obj_check = false; @@ -3697,7 +3756,7 @@ int ObPL::check_exec_priv( OZ (ObOraSysChecker::check_ora_obj_priv(*guard, tenant_id, exec_ctx.get_my_session()->get_user_id(), - db_schema->get_database_name(), + database_name, spec_id, OBJ_LEVEL_FOR_TAB_PRIV, need_only_obj_check ? @@ -3711,6 +3770,33 @@ int ObPL::check_exec_priv( } } } + if (OB_SUCC(ret) && lib::is_mysql_mode() && pkg_id == OB_INVALID_ID) { + if (ObSchemaChecker::enable_mysql_pl_priv_check(tenant_id, *guard)) { + share::schema::ObSessionPrivInfo session_priv; + if (OB_FAIL(guard->get_session_priv_info( + exec_ctx.get_my_session()->get_priv_tenant_id(), + exec_ctx.get_my_session()->get_priv_user_id(), + exec_ctx.get_my_session()->get_database_name(), + session_priv))) { + LOG_WARN("fail to get_session_priv_info", K(ret)); + } else if (OB_UNLIKELY(!session_priv.is_valid())) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("Session priv is invalid", "tenant_id", session_priv.tenant_id_, + "user_id", session_priv.user_id_, K(ret)); + } else { + ObNeedPriv need_priv; + need_priv.priv_level_ = OB_PRIV_ROUTINE_LEVEL; + need_priv.db_ = database_name; + need_priv.table_ = routine->get_function_name(); + need_priv.priv_set_ = OB_PRIV_EXECUTE; + const ObRoutineInfo *routine_info = NULL; + OZ (guard->get_routine_info(tenant_id, routine->get_routine_id(), routine_info)); + CK (OB_NOT_NULL(routine_info)); + OX (need_priv.obj_type_ = routine_info->is_procedure() ? ObObjectType::PROCEDURE : ObObjectType::FUNCTION); + OZ (guard->check_routine_priv(session_priv, need_priv)); + } + } + } return ret; } diff --git a/src/pl/ob_pl.h b/src/pl/ob_pl.h index 522c0923a1..6f2cbaa71b 100644 --- a/src/pl/ob_pl.h +++ b/src/pl/ob_pl.h @@ -852,6 +852,8 @@ public: is_function_or_trigger_ = false; last_insert_id_ = 0; trace_id_.reset(); + old_user_priv_set_ = OB_PRIV_SET_EMPTY; + old_db_priv_set_ = OB_PRIV_SET_EMPTY; } int is_inited() { return session_info_ != NULL; } @@ -1001,6 +1003,8 @@ private: uint64_t database_id_; common::ObSEArray old_role_id_array_; uint64_t old_priv_user_id_; + ObPrivSet old_user_priv_set_; + ObPrivSet old_db_priv_set_; bool old_in_definer_; bool need_reset_default_database_; bool need_reset_role_id_array_; @@ -1105,6 +1109,7 @@ public: bool is_called_from_sql = false, uint64_t dblink_id = OB_INVALID_ID); int check_exec_priv(sql::ObExecContext &ctx, + const ObString &database_name, ObPLFunction *routine); private: // for normal routine diff --git a/src/pl/ob_pl_package_state.h b/src/pl/ob_pl_package_state.h index 3a3c8ba2b6..bf59f3b0f7 100644 --- a/src/pl/ob_pl_package_state.h +++ b/src/pl/ob_pl_package_state.h @@ -166,8 +166,8 @@ public: common::ObString &key, common::ObObj &value); inline bool get_serially_reusable() const { return serially_reusable_; } - int remove_user_variables_for_package_state(ObSQLSessionInfo &session); - int check_package_state_valid(ObExecContext &exec_ctx, bool &valid); + int remove_user_variables_for_package_state(sql::ObSQLSessionInfo &session); + int check_package_state_valid(sql::ObExecContext &exec_ctx, bool &valid); uint64_t get_package_id() { return package_id_; } ObIArray &get_vars() { return vars_; } diff --git a/src/pl/parser/pl_non_reserved_keywords_mysql_mode.c b/src/pl/parser/pl_non_reserved_keywords_mysql_mode.c index 6efa1e697f..2cf7221714 100644 --- a/src/pl/parser/pl_non_reserved_keywords_mysql_mode.c +++ b/src/pl/parser/pl_non_reserved_keywords_mysql_mode.c @@ -95,6 +95,7 @@ static const NonReservedKeyword Mysql_pl_none_reserved_keywords[] = {"rollback", ROLLBACK}, {"row", ROW}, {"rowtype", ROWTYPE}, + {"role", ROLE}, {"schema_name", SCHEMA_NAME}, {"signal", SIGNAL}, {"sqlexception", SQLEXCEPTION}, @@ -136,9 +137,9 @@ static const NonReservedKeyword Mysql_pl_none_reserved_keywords[] = {"follows", FOLLOWS}, {"double", DOUBLE}, {"precision", PRECISION}, - {"dec", NUMBER}, - {"decimal", NUMBER}, - {"numeric", NUMBER}, + {"dec", DEC}, + {"decimal", DECIMAL}, + {"numeric", NUMERIC}, {"real", DOUBLE}, {"bit", BIT}, {"datetime", DATETIME}, @@ -169,7 +170,7 @@ static const NonReservedKeyword Mysql_pl_none_reserved_keywords[] = {"tinyblob", TINYBLOB}, {"mediumblob", MEDIUMBLOB}, {"longblob", LONGBLOB}, - {"fixed", NUMBER}, + {"fixed", FIXED}, {"authid", AUTHID}, {"or", OR}, {"replace", REPLACE}, diff --git a/src/pl/parser/pl_parser_mysql_mode.y b/src/pl/parser/pl_parser_mysql_mode.y index 4bc2f8d353..58b27f7dc7 100644 --- a/src/pl/parser/pl_parser_mysql_mode.y +++ b/src/pl/parser/pl_parser_mysql_mode.y @@ -128,6 +128,7 @@ int obpl_mysql_wrap_node_into_subquery(ObParseCtx *_parse_ctx, ParseNode *node) parse_result.is_not_utf8_connection_ = _parse_ctx->is_not_utf8_connection_; parse_result.connection_collation_ = _parse_ctx->connection_collation_; parse_result.sql_mode_ = _parse_ctx->scanner_ctx_.sql_mode_; + parse_result.semicolon_start_col_ = INT32_MAX; if (0 == parse_sql_stmt(&parse_result)) { *node = *parse_result.result_tree_->children_[0]; node->str_value_ = subquery; @@ -194,38 +195,41 @@ void obpl_mysql_wrap_get_user_var_into_subquery(ObParseCtx *parse_ctx, ParseNode /*these tokens can't be used for obj names*/ %token END_P -/* reserved key words */ -%token ALTER BEFORE BY CALL CASE CONDITION CONTINUE CREATE CURRENT_USER CURSOR DECLARE - DEFAULT DELETE DETERMINISTIC DROP EACH ELSE ELSEIF EXISTS EXIT FETCH FOR FROM IF IN - INDEX INOUT INSERT INTO IS ITERATE LEAVE LIMIT LONG LOOP MODIFIES NOT ON OR OUT - PROCEDURE READS REPEAT REPLACE RESIGNAL RETURN SELECT SIGNAL SQL SQLEXCEPTION - SQLSTATE SQLWARNING TABLE THEN TRIGGER UPDATE USING WHEN WHILE -/* reserved key words only used in ob, in mysql these keywords are non reserved*/ -%token COMMIT ROLLBACK DO UNTIL - %token SQL_KEYWORD SQL_TOKEN PARAM_ASSIGN_OPERATOR %token PARSER_SYNTAX_ERROR /*used internal*/ %token IDENT STRING INTNUM DECIMAL_VAL HEX_STRING_VALUE DATE_VALUE SYSTEM_VARIABLE USER_VARIABLE NULLX %token USER_NAME -//*data type keyword*/ -%token TINYINT SMALLINT MEDIUMINT INTEGER BIGINT FLOAT DOUBLE PRECISION NUMBER NUMERIC BIT - DATETIME TIMESTAMP TIME DATE YEAR CHARACTER TEXT VARCHAR NCHAR NVARCHAR BINARY VARBINARY UNSIGNED - SIGNED ZEROFILL COLLATE SET CHARSET BOOL BOOLEAN BLOB ENUM TINYTEXT MEDIUMTEXT LONGTEXT TINYBLOB +/* reserved key words */ +%token +//-----------------------------reserved keyword begin----------------------------------------------- + ALTER BEFORE BY CALL CASE CONDITION CONTINUE CREATE CURRENT_USER CURSOR DECLARE + DEFAULT DELETE DETERMINISTIC DROP EACH ELSE ELSEIF EXISTS EXIT FETCH FOR FROM IF IN + INDEX INOUT INSERT INTO IS ITERATE LEAVE LIMIT LONG LOOP MODIFIES NOT ON OR OUT + PROCEDURE READS REPEAT REPLACE RESIGNAL RETURN SELECT SIGNAL SQL SQLEXCEPTION + SQLSTATE SQLWARNING TABLE THEN TRIGGER UPDATE USING WHEN WHILE + TINYINT SMALLINT MEDIUMINT INTEGER BIGINT FLOAT DOUBLE PRECISION DEC DECIMAL NUMERIC + CHARACTER VARCHAR BINARY VARBINARY UNSIGNED + ZEROFILL COLLATE SET BLOB TINYTEXT MEDIUMTEXT LONGTEXT TINYBLOB MEDIUMBLOB LONGBLOB VARYING +/* reserved key words only used in ob, in mysql these keywords are non reserved*/ + CHARSET COMMIT ROLLBACK DO UNTIL +//-----------------------------reserved keyword end------------------------------------------------- /* non reserved key words */ %token +//-----------------------------non_reserved keyword begin------------------------------------------- AFTER AUTHID BEGIN_KEY BINARY_INTEGER BODY C CATALOG_NAME CLASS_ORIGIN CLOSE COLUMN_NAME COMMENT CONSTRAINT_CATALOG CONSTRAINT_NAME CONSTRAINT_ORIGIN CONSTRAINT_SCHEMA CONTAINS COUNT CURSOR_NAME DATA DEFINER END_KEY EXTEND FOLLOWS FOUND FUNCTION HANDLER INTERFACE INVOKER JSON LANGUAGE MESSAGE_TEXT MYSQL_ERRNO NATIONAL NEXT NO OF OPEN PACKAGE PRAGMA PRECEDES RECORD RETURNS ROW ROWTYPE - SCHEMA_NAME SECURITY SUBCLASS_ORIGIN TABLE_NAME TYPE USER VALUE - + SCHEMA_NAME SECURITY SUBCLASS_ORIGIN TABLE_NAME USER TYPE VALUE DATETIME TIMESTAMP TIME DATE YEAR + TEXT NCHAR NVARCHAR BOOL BOOLEAN ENUM BIT FIXED SIGNED ROLE +//-----------------------------non_reserved keyword end--------------------------------------------- %right END_KEY %left ELSE IF ELSEIF %nonassoc LOWER_PARENS -%nonassoc FUNCTION +%nonassoc FUNCTION ZEROFILL SIGNED UNSIGNED %nonassoc PARENS %left '(' ')' %nonassoc AUTHID INTERFACE @@ -270,17 +274,17 @@ void obpl_mysql_wrap_get_user_var_into_subquery(ObParseCtx *parse_ctx, ParseNode %type opt_tail_package_name %type opt_replace %type create_trigger_stmt drop_trigger_stmt plsql_trigger_source -%type trigger_definition trigger_event trigger_body pl_obj_access_ref opt_trigger_order +%type trigger_definition trigger_event trigger_body pl_obj_access_ref %type trigger_time /*SQL data type*/ %type scalar_data_type opt_charset collation opt_collation charset_name collation_name %type number_literal literal charset_key opt_float_precision opt_number_precision opt_binary %type string_list text_string %type string_length_i opt_string_length_i opt_int_length_i opt_string_length_i_v2 -%type opt_bit_length_i opt_datetime_fsp_i opt_unsigned_i opt_zerofill_i opt_year_i +%type opt_bit_length_i opt_datetime_fsp_i opt_year_i %type int_type_i float_type_i datetime_type_i date_year_type_i text_type_i blob_type_i %type nchar_type_i nvarchar_type_i -%type variable +%type variable number_type %% /***************************************************************************** * @@ -411,6 +415,20 @@ sql_stmt: do_parse_sql_stmt(sql_stmt, parse_ctx, @1.first_column, @1.last_column, 2, ';', END_P); malloc_non_terminal_node($$, parse_ctx->mem_pool_, T_SQL_STMT, 1, sql_stmt); } + | CREATE ROLE /*sql stmt tail*/ + { + //read sql query string直到读到token';'或者END_P + ParseNode *sql_stmt = NULL; + do_parse_sql_stmt(sql_stmt, parse_ctx, @1.first_column, @1.last_column, 2, ';', END_P); + malloc_non_terminal_node($$, parse_ctx->mem_pool_, T_SQL_STMT, 1, sql_stmt); + } + | DROP ROLE /*sql stmt tail*/ + { + //read sql query string直到读到token';'或者END_P + ParseNode *sql_stmt = NULL; + do_parse_sql_stmt(sql_stmt, parse_ctx, @1.first_column, @1.last_column, 2, ';', END_P); + malloc_non_terminal_node($$, parse_ctx->mem_pool_, T_SQL_STMT, 1, sql_stmt); + } | CREATE OR REPLACE sql_keyword /*sql stmt tail*/ { //read sql query string直到读到token';'或者END_P @@ -439,7 +457,9 @@ sql_stmt: do_parse_sql_stmt(sql_stmt, parse_ctx, @1.first_column, @1.last_column, 2, ';', END_P); if (T_SET_PASSWORD == sql_stmt->type_ || T_SET_NAMES == sql_stmt->type_ || - T_SET_CHARSET == sql_stmt->type_) { + T_SET_CHARSET == sql_stmt->type_ || + T_SET_ROLE == sql_stmt->type_ || + T_ALTER_USER_DEFAULT_ROLE == sql_stmt->type_) { malloc_non_terminal_node($$, parse_ctx->mem_pool_, T_SQL_STMT, 1, sql_stmt); } else { $$ = sql_stmt; @@ -737,12 +757,30 @@ unreserved_keyword: | RETURNS | ROW | ROWTYPE + | ROLE | SCHEMA_NAME | SECURITY | SUBCLASS_ORIGIN | TABLE_NAME | TYPE | VALUE + | FOLLOWS + | PRECEDES + | NATIONAL + | DATETIME + | TIMESTAMP + | TIME + | DATE + | YEAR + | TEXT + | NCHAR + | NVARCHAR + | BOOL + | BOOLEAN + | ENUM + | BIT + | FIXED + | SIGNED ; /***************************************************************************** @@ -1044,9 +1082,23 @@ plsql_trigger_source: ; trigger_definition: - trigger_time trigger_event ON sp_name FOR EACH ROW opt_trigger_order trigger_body + trigger_time trigger_event ON sp_name FOR EACH ROW trigger_body { - malloc_non_terminal_node($$, parse_ctx->mem_pool_, T_TG_SIMPLE_DML, 4, $2, $4, $8, $9); + malloc_non_terminal_node($$, parse_ctx->mem_pool_, T_TG_SIMPLE_DML, 4, $2, $4, NULL, $8); + $$->int16_values_[0] = $1; + } + | trigger_time trigger_event ON sp_name FOR EACH ROW FOLLOWS sp_name trigger_body + { + malloc_non_terminal_node($$, parse_ctx->mem_pool_, T_TG_ORDER, 1, $9); + $$->value_ = 1; // FOLLOWS + malloc_non_terminal_node($$, parse_ctx->mem_pool_, T_TG_SIMPLE_DML, 4, $2, $4, $$, $10); + $$->int16_values_[0] = $1; + } + | trigger_time trigger_event ON sp_name FOR EACH ROW PRECEDES sp_name trigger_body + { + malloc_non_terminal_node($$, parse_ctx->mem_pool_, T_TG_ORDER, 1, $9); + $$->value_ = 2; // PRECEDES + malloc_non_terminal_node($$, parse_ctx->mem_pool_, T_TG_SIMPLE_DML, 4, $2, $4, $$, $10); $$->int16_values_[0] = $1; } @@ -1061,19 +1113,6 @@ trigger_event: | UPDATE { malloc_terminal_node($$, parse_ctx->mem_pool_, T_UPDATE); } ; -opt_trigger_order: - /*EMPTY*/ { $$ = NULL; } - | FOLLOWS sp_name - { - malloc_non_terminal_node($$, parse_ctx->mem_pool_, T_TG_ORDER, 1, $2); - $$->value_ = 1; // FOLLOWS - } - | PRECEDES sp_name - { - malloc_non_terminal_node($$, parse_ctx->mem_pool_, T_TG_ORDER, 1, $2); - $$->value_ = 2; // PRECEDES - } - trigger_body: sp_proc_stmt { @@ -1918,35 +1957,191 @@ opt_if_exists: ; scalar_data_type: - int_type_i opt_int_length_i opt_unsigned_i opt_zerofill_i + int_type_i opt_int_length_i %prec LOWER_PARENS { - malloc_terminal_node($$, parse_ctx->mem_pool_, ($3 || $4) ? $1 + (T_UTINYINT - T_TINYINT) : $1); + malloc_terminal_node($$, parse_ctx->mem_pool_, $1); $$->int16_values_[0] = $2; - $$->int16_values_[2] = $4; /* 2 is the same index as float or number. */ + $$->int16_values_[2] = 0; /* 2 is the same index as float or number. */ } - | float_type_i opt_float_precision opt_unsigned_i opt_zerofill_i + | int_type_i opt_int_length_i ZEROFILL + { + malloc_terminal_node($$, parse_ctx->mem_pool_, $1 + (T_UTINYINT - T_TINYINT)); + $$->int16_values_[0] = $2; + $$->int16_values_[2] = 1; /* 2 is the same index as float or number. */ + } + | int_type_i opt_int_length_i SIGNED + { + malloc_terminal_node($$, parse_ctx->mem_pool_, $1); + $$->int16_values_[0] = $2; + $$->int16_values_[2] = 0; /* 2 is the same index as float or number. */ + } + | int_type_i opt_int_length_i SIGNED ZEROFILL + { + malloc_terminal_node($$, parse_ctx->mem_pool_, $1 + (T_UTINYINT - T_TINYINT)); + $$->int16_values_[0] = $2; + $$->int16_values_[2] = 1; /* 2 is the same index as float or number. */ + } + | int_type_i opt_int_length_i UNSIGNED + { + malloc_terminal_node($$, parse_ctx->mem_pool_, $1 + (T_UTINYINT - T_TINYINT)); + $$->int16_values_[0] = $2; + $$->int16_values_[2] = 0; /* 2 is the same index as float or number. */ + } + | int_type_i opt_int_length_i UNSIGNED ZEROFILL + { + malloc_terminal_node($$, parse_ctx->mem_pool_, $1 + (T_UTINYINT - T_TINYINT)); + $$->int16_values_[0] = $2; + $$->int16_values_[2] = 1; /* 2 is the same index as float or number. */ + } + | float_type_i opt_float_precision %prec LOWER_PARENS { if (T_FLOAT != $1 && NULL != $2 && -1 == $2->int16_values_[1]) { obpl_mysql_yyerror(&@2, parse_ctx, "double type not support double(M) syntax\n"); YYERROR; } - malloc_terminal_node($$, parse_ctx->mem_pool_, ($3 || $4) ? $1 + (T_UFLOAT - T_FLOAT) : $1); + malloc_terminal_node($$, parse_ctx->mem_pool_, $1); if (NULL != $2) { $$->int16_values_[0] = $2->int16_values_[0]; $$->int16_values_[1] = $2->int16_values_[1]; } /* malloc_terminal_node() has set memory to 0 filled, so there is no else. */ - $$->int16_values_[2] = $4; + $$->int16_values_[2] = 0; } - | NUMBER opt_number_precision opt_unsigned_i opt_zerofill_i + | float_type_i opt_float_precision ZEROFILL { - malloc_terminal_node($$, parse_ctx->mem_pool_, ($3 || $4) ? T_UNUMBER : T_NUMBER); + if (T_FLOAT != $1 && NULL != $2 && -1 == $2->int16_values_[1]) { + obpl_mysql_yyerror(&@2, parse_ctx, "double type not support double(M) syntax\n"); + YYERROR; + } + malloc_terminal_node($$, parse_ctx->mem_pool_, $1 + (T_UFLOAT - T_FLOAT)); if (NULL != $2) { $$->int16_values_[0] = $2->int16_values_[0]; $$->int16_values_[1] = $2->int16_values_[1]; } /* malloc_terminal_node() has set memory to 0 filled, so there is no else. */ - $$->int16_values_[2] = $4; + $$->int16_values_[2] = 1; + } + | float_type_i opt_float_precision SIGNED + { + if (T_FLOAT != $1 && NULL != $2 && -1 == $2->int16_values_[1]) { + obpl_mysql_yyerror(&@2, parse_ctx, "double type not support double(M) syntax\n"); + YYERROR; + } + malloc_terminal_node($$, parse_ctx->mem_pool_, $1); + if (NULL != $2) { + $$->int16_values_[0] = $2->int16_values_[0]; + $$->int16_values_[1] = $2->int16_values_[1]; + } + /* malloc_terminal_node() has set memory to 0 filled, so there is no else. */ + $$->int16_values_[2] = 0; + } + | float_type_i opt_float_precision SIGNED ZEROFILL + { + if (T_FLOAT != $1 && NULL != $2 && -1 == $2->int16_values_[1]) { + obpl_mysql_yyerror(&@2, parse_ctx, "double type not support double(M) syntax\n"); + YYERROR; + } + malloc_terminal_node($$, parse_ctx->mem_pool_, $1 + (T_UFLOAT - T_FLOAT)); + if (NULL != $2) { + $$->int16_values_[0] = $2->int16_values_[0]; + $$->int16_values_[1] = $2->int16_values_[1]; + } + /* malloc_terminal_node() has set memory to 0 filled, so there is no else. */ + $$->int16_values_[2] = 1; + } + | float_type_i opt_float_precision UNSIGNED + { + if (T_FLOAT != $1 && NULL != $2 && -1 == $2->int16_values_[1]) { + obpl_mysql_yyerror(&@2, parse_ctx, "double type not support double(M) syntax\n"); + YYERROR; + } + malloc_terminal_node($$, parse_ctx->mem_pool_, $1 + (T_UFLOAT - T_FLOAT)); + if (NULL != $2) { + $$->int16_values_[0] = $2->int16_values_[0]; + $$->int16_values_[1] = $2->int16_values_[1]; + } + /* malloc_terminal_node() has set memory to 0 filled, so there is no else. */ + $$->int16_values_[2] = 0; + } + | float_type_i opt_float_precision UNSIGNED ZEROFILL + { + if (T_FLOAT != $1 && NULL != $2 && -1 == $2->int16_values_[1]) { + obpl_mysql_yyerror(&@2, parse_ctx, "double type not support double(M) syntax\n"); + YYERROR; + } + malloc_terminal_node($$, parse_ctx->mem_pool_, $1 + (T_UFLOAT - T_FLOAT)); + if (NULL != $2) { + $$->int16_values_[0] = $2->int16_values_[0]; + $$->int16_values_[1] = $2->int16_values_[1]; + } + /* malloc_terminal_node() has set memory to 0 filled, so there is no else. */ + $$->int16_values_[2] = 1; + } + | number_type opt_number_precision %prec LOWER_PARENS + { + (void)($1); + malloc_terminal_node($$, parse_ctx->mem_pool_, T_NUMBER); + if (NULL != $2) { + $$->int16_values_[0] = $2->int16_values_[0]; + $$->int16_values_[1] = $2->int16_values_[1]; + } + /* malloc_terminal_node() has set memory to 0 filled, so there is no else. */ + $$->int16_values_[2] = 0; + } + | number_type opt_number_precision ZEROFILL + { + (void)($1); + malloc_terminal_node($$, parse_ctx->mem_pool_, T_UNUMBER); + if (NULL != $2) { + $$->int16_values_[0] = $2->int16_values_[0]; + $$->int16_values_[1] = $2->int16_values_[1]; + } + /* malloc_terminal_node() has set memory to 0 filled, so there is no else. */ + $$->int16_values_[2] = 1; + } + | number_type opt_number_precision SIGNED + { + (void)($1); + malloc_terminal_node($$, parse_ctx->mem_pool_, T_NUMBER); + if (NULL != $2) { + $$->int16_values_[0] = $2->int16_values_[0]; + $$->int16_values_[1] = $2->int16_values_[1]; + } + /* malloc_terminal_node() has set memory to 0 filled, so there is no else. */ + $$->int16_values_[2] = 0; + } + | number_type opt_number_precision SIGNED ZEROFILL + { + (void)($1); + malloc_terminal_node($$, parse_ctx->mem_pool_, T_UNUMBER); + if (NULL != $2) { + $$->int16_values_[0] = $2->int16_values_[0]; + $$->int16_values_[1] = $2->int16_values_[1]; + } + /* malloc_terminal_node() has set memory to 0 filled, so there is no else. */ + $$->int16_values_[2] = 1; + } + | number_type opt_number_precision UNSIGNED + { + (void)($1); + malloc_terminal_node($$, parse_ctx->mem_pool_, T_UNUMBER); + if (NULL != $2) { + $$->int16_values_[0] = $2->int16_values_[0]; + $$->int16_values_[1] = $2->int16_values_[1]; + } + /* malloc_terminal_node() has set memory to 0 filled, so there is no else. */ + $$->int16_values_[2] = 0; + } + | number_type opt_number_precision UNSIGNED ZEROFILL + { + (void)($1); + malloc_terminal_node($$, parse_ctx->mem_pool_, T_UNUMBER); + if (NULL != $2) { + $$->int16_values_[0] = $2->int16_values_[0]; + $$->int16_values_[1] = $2->int16_values_[1]; + } + /* malloc_terminal_node() has set memory to 0 filled, so there is no else. */ + $$->int16_values_[2] = 1; } | datetime_type_i opt_datetime_fsp_i { @@ -2087,22 +2282,10 @@ scalar_data_type: $$->int32_values_[0] = 0;//not used so far $$->int32_values_[1] = 0; /* is char */ } - | pl_obj_access_ref + | JSON { - if ($1 != NULL && $1->type_ == T_SP_OBJ_ACCESS_REF && - $1->num_child_ == 2 && - $1->children_[0] != NULL && - $1->children_[0]->type_ == T_SP_ACCESS_NAME && - $1->children_[0]->num_child_ == 3 && - $1->children_[0]->children_[0] == NULL && - $1->children_[0]->children_[1] == NULL && - nodename_equal($1->children_[0]->children_[2], "JSON", 4)) { - malloc_terminal_node($$, parse_ctx->mem_pool_, T_JSON); - $$->int32_values_[0] = 0; - } else { - obpl_mysql_yyerror(&@1, parse_ctx, "Syntax Error\n"); - YYERROR; - } + malloc_terminal_node($$, parse_ctx->mem_pool_, T_JSON); + $$->int32_values_[0] = 0; } | pl_obj_access_ref '%' ROWTYPE { @@ -2141,6 +2324,12 @@ datetime_type_i: | TIME { $$ = T_TIME; } ; +number_type: +DEC { $$ = NULL; } +| DECIMAL { $$ = NULL; } +| NUMERIC { $$ = NULL; } +| FIXED { $$ = NULL; } + date_year_type_i: DATE { $$ = T_DATE; } | YEAR opt_year_i { $$ = T_YEAR; } @@ -2356,17 +2545,6 @@ opt_string_length_i: } ; -opt_unsigned_i: - UNSIGNED { $$ = 1; } - | SIGNED { $$ = 0; } - | /*EMPTY*/ { $$ = 0; } -; - -opt_zerofill_i: - ZEROFILL { $$ = 1; } - | /*EMPTY*/ { $$ = 0; } -; - opt_binary: BINARY { @@ -2612,6 +2790,7 @@ ParseNode *obpl_mysql_read_sql_construct(ObParseCtx *parse_ctx, const char *pref parse_result.is_not_utf8_connection_ = parse_ctx->is_not_utf8_connection_; parse_result.connection_collation_ = parse_ctx->connection_collation_; parse_result.sql_mode_ = parse_ctx->scanner_ctx_.sql_mode_; + parse_result.semicolon_start_col_ = INT32_MAX; } if (sql_str_len <= 0) { //do nothing diff --git a/src/rootserver/ob_ddl_operator.cpp b/src/rootserver/ob_ddl_operator.cpp index f47b8dd1b2..3aa7f42cc8 100644 --- a/src/rootserver/ob_ddl_operator.cpp +++ b/src/rootserver/ob_ddl_operator.cpp @@ -6587,6 +6587,33 @@ int ObDDLOperator::drop_db_table_privs( } } + // delete column privileges of this user MYSQL + if (OB_SUCC(ret)) { + ObArray column_privs; + if (OB_FAIL(schema_guard.get_column_priv_with_user_id( + tenant_id, user_id, column_privs))) { + LOG_WARN("Get table privileges of user to be deleted error", + K(tenant_id), K(user_id), K(ret)); + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < column_privs.count(); ++i) { + const ObColumnPriv *column_priv = column_privs.at(i); + int64_t new_schema_version = OB_INVALID_VERSION; + ObPrivSet empty_priv = 0; + ObString dcl_stmt; + if (OB_ISNULL(column_priv)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("table priv is NULL", K(ret), K(column_priv)); + } else if (OB_FAIL(schema_service_.gen_new_schema_version(tenant_id, new_schema_version))) { + LOG_WARN("fail to gen new schema_version", K(ret), K(tenant_id)); + } else if (OB_FAIL(schema_sql_service->get_priv_sql_service().grant_column( + column_priv->get_sort_key(), column_priv->get_priv_id(), empty_priv, + new_schema_version, &dcl_stmt, trans, false))) { + LOG_WARN("Delete table privilege failed", K(column_priv), K(ret)); + } + } + } + } + // delete oracle table privileges of this user ORACLE if (OB_SUCC(ret)) { ObArray obj_privs; @@ -6609,6 +6636,31 @@ int ObDDLOperator::drop_db_table_privs( } } + // delete routine privileges of this user MYSQL + if (OB_SUCC(ret)) { + ObArray routine_privs; + if (OB_FAIL(schema_guard.get_routine_priv_with_user_id( + tenant_id, user_id, routine_privs))) { + LOG_WARN("Get table privileges of user to be deleted error", + K(tenant_id), K(user_id), K(ret)); + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < routine_privs.count(); ++i) { + const ObRoutinePriv *routine_priv = routine_privs.at(i); + int64_t new_schema_version = OB_INVALID_VERSION; + ObPrivSet empty_priv = 0; + ObString dcl_stmt; + if (OB_ISNULL(routine_priv)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("table priv is NULL", K(ret), K(routine_priv)); + } else if (OB_FAIL(schema_service_.gen_new_schema_version(tenant_id, new_schema_version))) { + LOG_WARN("fail to gen new schema_version", K(ret), K(tenant_id)); + } else if (OB_FAIL(schema_sql_service->get_priv_sql_service().grant_routine( + routine_priv->get_sort_key(), empty_priv, new_schema_version, &dcl_stmt, trans, 0, false))) { + LOG_WARN("Delete table privilege failed", K(routine_priv), K(ret)); + } + } + } + } return ret; } @@ -7393,6 +7445,147 @@ int ObDDLOperator::grant_table( return ret; } +int ObDDLOperator::grant_routine( + const ObRoutinePrivSortKey &routine_priv_key, + const ObPrivSet priv_set, + common::ObMySQLTransaction &trans, + const uint64_t option, + const bool gen_ddl_stmt) +{ + int ret = OB_SUCCESS; + ObRawObjPrivArray new_obj_priv_array; + const uint64_t tenant_id = routine_priv_key.tenant_id_; + ObSchemaGetterGuard schema_guard; + ObSchemaService *schema_sql_service = schema_service_.get_schema_service(); + if (OB_ISNULL(schema_sql_service)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("schama service_impl and schema manage must not null", + "schema_service_impl", schema_sql_service, K(ret)); + } else if (!routine_priv_key.is_valid()) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("routine_priv_key is invalid", K(routine_priv_key), K(ret)); + } else if (0 == priv_set) { + //do nothing + } else if (OB_FAIL(schema_service_.get_tenant_schema_guard(tenant_id, schema_guard))) { + LOG_WARN("failed to get schema guard", K(ret)); + } else { + ObPrivSet new_priv = priv_set; + ObPrivSet routine_priv_set = OB_PRIV_SET_EMPTY; + if (OB_FAIL(schema_guard.get_routine_priv_set(routine_priv_key, routine_priv_set))) { + LOG_WARN("get routine priv set failed", K(ret)); + } else { + bool need_flush = true; + new_priv |= routine_priv_set; + need_flush = (new_priv != routine_priv_set); + if (need_flush) { + ObSqlString ddl_stmt_str; + ObString ddl_sql; + const ObUserInfo *user_info = NULL; + ObNeedPriv need_priv; + need_priv.db_ = routine_priv_key.db_; + need_priv.table_ = routine_priv_key.routine_; + need_priv.priv_level_ = OB_PRIV_ROUTINE_LEVEL; + need_priv.priv_set_ = (~routine_priv_set) & new_priv; + need_priv.obj_type_ = routine_priv_key.routine_type_ == ObRoutineType::ROUTINE_PROCEDURE_TYPE ? + ObObjectType::PROCEDURE : ObObjectType::FUNCTION; + if (OB_FAIL(schema_guard.get_user_info(tenant_id, routine_priv_key.user_id_, user_info))) { + LOG_WARN("get user info failed", K(routine_priv_key), K(ret)); + } else if (OB_ISNULL(user_info)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("user not exist", K(routine_priv_key), K(ret)); + } else if (gen_ddl_stmt == true && OB_FAIL(ObDDLSqlGenerator::gen_routine_priv_sql( + ObAccountArg(user_info->get_user_name_str(), user_info->get_host_name_str()), + need_priv, true, /*is_grant*/ ddl_stmt_str))) { + LOG_WARN("gen_routine_priv_sql failed", K(ret), K(need_priv)); + } else if (FALSE_IT(ddl_sql = ddl_stmt_str.string())) { + } else { + int64_t new_schema_version = OB_INVALID_VERSION; + int64_t new_schema_version_ora = OB_INVALID_VERSION; + if (OB_FAIL(schema_service_.gen_new_schema_version(tenant_id, new_schema_version))) { + LOG_WARN("fail to gen new schema_version", K(ret), K(tenant_id)); + } else if (OB_FAIL(schema_sql_service->get_priv_sql_service().grant_routine( + routine_priv_key, new_priv, new_schema_version, &ddl_sql, trans, option, true))) { + LOG_WARN("priv sql service grant routine failed", K(ret)); + } + } + } + } + } + + return ret; +} + +int ObDDLOperator::grant_column( + ObSchemaGetterGuard &schema_guard, + const ObColumnPrivSortKey &column_priv_key, + const ObPrivSet priv_set, + const ObString *ddl_stmt_str, + common::ObMySQLTransaction &trans, + const bool is_grant) +{ + int ret = OB_SUCCESS; + const uint64_t tenant_id = column_priv_key.tenant_id_; + ObSchemaService *schema_sql_service = schema_service_.get_schema_service(); + if (OB_ISNULL(schema_sql_service)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("schama service_impl and schema manage must not null", + "schema_service_impl", schema_sql_service, K(ret)); + } else if (!column_priv_key.is_valid()) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("column_priv_key is invalid", K(column_priv_key), K(ret)); + } else if (0 == priv_set) { + //do nothing + } else { + ObPrivSet new_priv = OB_PRIV_SET_EMPTY; + ObPrivSet column_priv_set = OB_PRIV_SET_EMPTY; + uint64_t column_priv_id = OB_INVALID_ID; + if (OB_FAIL(schema_guard.get_column_priv_id(tenant_id, column_priv_key.user_id_, column_priv_key.db_, + column_priv_key.table_, column_priv_key.column_, column_priv_id))) { + LOG_WARN("get column priv id failed", K(ret)); + } else if (column_priv_id == OB_INVALID_ID) { + if (!is_grant) { + ret = OB_ERR_CANNOT_REVOKE_PRIVILEGES_YOU_DID_NOT_GRANT; + LOG_WARN("revoke no such grant", K(ret), K(column_priv_key)); + } else { + uint64_t new_column_priv_id = OB_INVALID_ID; + if (OB_FAIL(schema_sql_service->fetch_new_priv_id(tenant_id, new_column_priv_id))) { + LOG_WARN("fail to fetch new priv ids", KR(ret), K(tenant_id)); + } else if (OB_UNLIKELY(OB_INVALID_ID == new_column_priv_id)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("object_id is invalid", KR(ret), K(tenant_id)); + } else { + column_priv_id = new_column_priv_id; + } + } + } else if (OB_FAIL(schema_guard.get_column_priv_set(column_priv_key, column_priv_set))) { + LOG_WARN("get table priv set failed", K(ret)); + } + + if (OB_SUCC(ret)) { + bool need_flush = true; + if (is_grant) { + new_priv = column_priv_set | priv_set; + } else { + new_priv = column_priv_set & (~priv_set); + } + need_flush = (new_priv != column_priv_set); + + if (need_flush) { + int64_t new_schema_version = OB_INVALID_VERSION; + if (OB_FAIL(schema_service_.gen_new_schema_version(tenant_id, new_schema_version))) { + LOG_WARN("fail to gen new schema_version", K(ret), K(tenant_id)); + } else if (OB_FAIL(schema_sql_service->get_priv_sql_service().grant_column( + column_priv_key, column_priv_id, new_priv, new_schema_version, + ddl_stmt_str, trans, is_grant))) { + LOG_WARN("grant column failed", K(ret)); + } + } + } + } + + return ret; +} + /* in: grantor, grantee, obj_type, obj_id out: table_packed_privs array of col_id which has col privs @@ -7689,14 +7882,23 @@ int ObDDLOperator::revoke_table( } else if (OB_PRIV_SET_EMPTY == table_priv_set && !revoke_all_ora && obj_priv_array.count() == 0) { - ret = OB_ERR_CANNOT_REVOKE_PRIVILEGES_YOU_DID_NOT_GRANT; - LOG_WARN("No such grant to revoke", K(table_priv_key), K(ret)); + ObArray column_privs; + if (OB_FAIL(schema_guard.get_column_priv_in_table(table_priv_key, column_privs))) { + LOG_WARN("get column priv in table failed", K(ret)); + } else { + if (column_privs.count() > 0) { + //do nothing here, and will revoke column priv behind. + } else { + ret = OB_ERR_CANNOT_REVOKE_PRIVILEGES_YOU_DID_NOT_GRANT; + LOG_WARN("No such grant to revoke", K(table_priv_key), K(ret)); + } + } } else if (0 == priv_set && obj_priv_array.count() == 0) { // do-nothing } else { ObPrivSet new_priv = table_priv_set & (~priv_set); /* If there is an intersection between the existing permissions and the permissions that require revoke */ - if (table_priv_set & priv_set) { + if (0 != (table_priv_set & priv_set)) { ObSqlString ddl_stmt_str; ObString ddl_sql; const ObUserInfo *user_info = NULL; @@ -7729,10 +7931,10 @@ int ObDDLOperator::revoke_table( trans))) { LOG_WARN("drop fk cascase failed", K(table_priv_key), K(ret)); } else if (OB_FAIL(ObDDLSqlGenerator::gen_table_priv_sql( - ObAccountArg(user_info->get_user_name_str(), user_info->get_host_name_str()), - need_priv, - false, /*is_grant*/ - ddl_stmt_str))) { + ObAccountArg(user_info->get_user_name_str(), user_info->get_host_name_str()), + need_priv, + false, /*is_grant*/ + ddl_stmt_str))) { LOG_WARN("gen_table_priv_sql failed", K(ret), K(need_priv)); } else if (FALSE_IT(ddl_sql = ddl_stmt_str.string())) { } else if (OB_FAIL(schema_service_.gen_new_schema_version(tenant_id, @@ -7808,6 +8010,83 @@ int ObDDLOperator::revoke_table( return ret; } +int ObDDLOperator::revoke_routine( + const ObRoutinePrivSortKey &routine_priv_key, + const ObPrivSet priv_set, + common::ObMySQLTransaction &trans, + bool report_error, + const bool gen_ddl_stmt) +{ + int ret = OB_SUCCESS; + const uint64_t tenant_id = routine_priv_key.tenant_id_; + ObSchemaGetterGuard schema_guard; + ObSchemaService *schema_sql_service = schema_service_.get_schema_service(); + if (OB_ISNULL(schema_sql_service)) { + ret = OB_ERR_SYS; + LOG_ERROR("schama service_impl and schema manage must not null", + "schema_service_impl", schema_sql_service, + K(ret)); + } else if (!routine_priv_key.is_valid()) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("db_priv_key is invalid", K(routine_priv_key), K(ret)); + } else if (OB_FAIL(schema_service_.get_tenant_schema_guard(tenant_id, schema_guard))) { + LOG_WARN("failed to get schema guard", K(ret)); + } else { + ObPrivSet routine_priv_set = OB_PRIV_SET_EMPTY; + if (OB_FAIL(schema_guard.get_routine_priv_set(routine_priv_key, routine_priv_set))) { + LOG_WARN("get routine priv set failed", K(ret)); + } else if (OB_PRIV_SET_EMPTY == routine_priv_set) { + if (report_error) { + ret = OB_ERR_CANNOT_REVOKE_PRIVILEGES_YOU_DID_NOT_GRANT; + LOG_WARN("No such grant to revoke", K(routine_priv_key), K(routine_priv_set), K(ret)); + } + } else if (0 == priv_set) { + // do-nothing + } else { + ObPrivSet new_priv = routine_priv_set & (~priv_set); + /* If there is an intersection between the existing permissions and the permissions that require revoke */ + if ((routine_priv_set & priv_set) != 0) { + ObSqlString ddl_stmt_str; + ObString ddl_sql; + const ObUserInfo *user_info = NULL; + ObNeedPriv need_priv; + share::ObRawObjPrivArray option_priv_array; + + need_priv.db_ = routine_priv_key.db_; + need_priv.table_ = routine_priv_key.routine_; + need_priv.priv_level_ = OB_PRIV_ROUTINE_LEVEL; + need_priv.priv_set_ = routine_priv_set & priv_set; //priv to revoke + need_priv.obj_type_ = routine_priv_key.routine_type_ == ObRoutineType::ROUTINE_PROCEDURE_TYPE ? + ObObjectType::PROCEDURE : ObObjectType::FUNCTION; + int64_t new_schema_version = OB_INVALID_VERSION; + int64_t new_schema_version_ora = OB_INVALID_VERSION; + bool is_all = false; + bool has_ref_priv = false; + if (OB_FAIL(schema_guard.get_user_info(tenant_id, routine_priv_key.user_id_, user_info))) { + LOG_WARN("get user info failed", K(routine_priv_key), K(ret)); + } else if (OB_ISNULL(user_info)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("user not exist", K(routine_priv_key), K(ret)); + } else if (gen_ddl_stmt == true && OB_FAIL(ObDDLSqlGenerator::gen_routine_priv_sql( + ObAccountArg(user_info->get_user_name_str(), user_info->get_host_name_str()), + need_priv, + false, /*is_grant*/ + ddl_stmt_str))) { + LOG_WARN("gen_routine_priv_sql failed", K(ret), K(need_priv)); + } else if (FALSE_IT(ddl_sql = ddl_stmt_str.string())) { + } else if (OB_FAIL(schema_service_.gen_new_schema_version(tenant_id, + new_schema_version))) { + LOG_WARN("fail to gen new schema_version", K(ret), K(tenant_id)); + } else if (OB_FAIL(schema_sql_service->get_priv_sql_service().revoke_routine( + routine_priv_key, new_priv, new_schema_version, &ddl_sql, trans))) { + LOG_WARN("Failed to revoke routine", K(routine_priv_key), K(ret)); + } + } + } + } + return ret; +} + int ObDDLOperator::get_flush_role_array( const uint64_t option, const common::ObIArray &org_role_ids, @@ -7851,6 +8130,7 @@ int ObDDLOperator::grant_revoke_role( ObSchemaGetterGuard schema_guard; int64_t new_schema_version = OB_INVALID_VERSION; ObString ddl_sql; + bool is_oracle_mode = false; if (OB_ISNULL(schema_service)) { ret = OB_ERR_SYS; @@ -7859,6 +8139,8 @@ int ObDDLOperator::grant_revoke_role( LOG_WARN("fail to gen new schema_version", K(ret), K(tenant_id)); } else if (OB_FAIL(schema_service_.get_tenant_schema_guard(tenant_id, schema_guard))) { LOG_WARN("failed to get schema guard", K(ret)); + } else if (OB_FAIL(ObCompatModeGetter::check_is_oracle_mode_with_tenant_id(tenant_id, is_oracle_mode))) { + LOG_WARN("fail to get compat mode", K(ret)); } else { common::ObSEArray role_ids; bool need_flush = false; @@ -7892,13 +8174,21 @@ int ObDDLOperator::grant_revoke_role( } else if (NULL == role_info) { ret = OB_ERR_UNEXPECTED; LOG_WARN("role doesn't exist", K(ret), K(role_id)); - } else if (OB_FAIL(sql_string.append_fmt("%s", role_info->get_user_name()))) { + } else if (is_oracle_mode ? + OB_FAIL(sql_string.append_fmt("%s", role_info->get_user_name())) + : OB_FAIL(sql_string.append_fmt("`%s`@`%s`", + role_info->get_user_name(), + role_info->get_host_name()))) { LOG_WARN("append sql failed", K(ret)); } } } if (OB_SUCC(ret)) { - if (OB_FAIL(sql_string.append_fmt(is_grant ? " TO %s": " FROM %s", user_info.get_user_name()))) { + if (is_oracle_mode ? OB_FAIL(sql_string.append_fmt(is_grant ? " TO %s": " FROM %s", + user_info.get_user_name())) + : OB_FAIL(sql_string.append_fmt(is_grant ? " TO `%s`@`%s`": " FROM `%s`@`%s`", + user_info.get_user_name(), + user_info.get_host_name()))) { LOG_WARN("append sql failed", K(ret)); } else if (is_grant && option != NO_OPTION && OB_FAIL(sql_string.append_fmt( " WITH ADMIN OPTION"))) { diff --git a/src/rootserver/ob_ddl_operator.h b/src/rootserver/ob_ddl_operator.h index a4bbcd8c0c..07ecd8beb6 100644 --- a/src/rootserver/ob_ddl_operator.h +++ b/src/rootserver/ob_ddl_operator.h @@ -617,6 +617,23 @@ public: const share::schema::ObObjPrivSortKey &obj_priv_key, const share::ObRawObjPrivArray &obj_priv_array, const bool revoke_all_ora); + + virtual int grant_routine(const ObRoutinePrivSortKey &routine_priv_key, + const ObPrivSet priv_set, + common::ObMySQLTransaction &trans, + const uint64_t option, + const bool gen_ddl_stmt = true); + virtual int revoke_routine(const ObRoutinePrivSortKey &routine_priv_key, + const ObPrivSet priv_set, + common::ObMySQLTransaction &trans, + const bool report_error = true, + const bool gen_ddl_stmt = true); + virtual int grant_column(ObSchemaGetterGuard &schema_guard, + const ObColumnPrivSortKey &column_priv_key, + const ObPrivSet priv_set, + const ObString *ddl_stmt_str, + common::ObMySQLTransaction &trans, + const bool is_grant); virtual int grant_revoke_role(const uint64_t tenant_id, const share::schema::ObUserInfo &user_info, const common::ObIArray &role_ids, diff --git a/src/rootserver/ob_ddl_service.cpp b/src/rootserver/ob_ddl_service.cpp index 3246043891..f8744dd517 100755 --- a/src/rootserver/ob_ddl_service.cpp +++ b/src/rootserver/ob_ddl_service.cpp @@ -1552,7 +1552,7 @@ int ObDDLService::check_table_udt_id_is_exist(share::schema::ObSchemaGetterGuard if (OB_ISNULL(col)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get column schema failed", K(ret)); - } else if (col->is_extend()) { + } else if (col->get_meta_type().is_user_defined_sql_type()) { // delete hidden primary key if (OB_FAIL(check_udt_id_is_exist(schema_guard, *col, tenant_id))) { LOG_WARN("fail to check column udt id", K(ret)); @@ -6096,6 +6096,34 @@ int ObDDLService::lock_tables_of_database(const ObDatabaseSchema &database_schem return ret; } +int ObDDLService::check_parallel_ddl_conflict( + share::schema::ObSchemaGetterGuard &schema_guard, + const obrpc::ObDDLArg &arg) +{ + int ret = OB_SUCCESS; + int64_t schema_version = OB_INVALID_VERSION; + + if (arg.is_need_check_based_schema_objects()) { + for (int64_t i = 0; OB_SUCC(ret) && (i < arg.based_schema_object_infos_.count()); ++i) { + const ObBasedSchemaObjectInfo &info = arg.based_schema_object_infos_.at(i); + if (OB_FAIL(schema_guard.get_schema_version( + info.schema_type_, + info.schema_tenant_id_ == OB_INVALID_TENANT_ID ? arg.exec_tenant_id_: info.schema_tenant_id_, + info.schema_id_, + schema_version))) { + LOG_WARN("failed to get_schema_version", K(ret), K(arg.exec_tenant_id_), K(info)); + } else if (OB_INVALID_VERSION == schema_version) { + ret = OB_ERR_PARALLEL_DDL_CONFLICT; + LOG_WARN("schema_version is OB_INVALID_VERSION", K(ret), K(info)); + } else if (schema_version != info.schema_version_) { + ret = OB_ERR_PARALLEL_DDL_CONFLICT; + LOG_WARN("schema_version is not equal to info.schema_version_", K(ret), K(schema_version), K(info)); + } + } + } + + return ret; +} int ObDDLService::lock_tables_in_recyclebin(const ObDatabaseSchema &database_schema, ObMySQLTransaction &trans) { @@ -13740,6 +13768,7 @@ int ObDDLService::get_and_check_table_schema( schema_guard.set_session_id(alter_table_arg.session_id_); const ObString &origin_database_name = alter_table_schema.get_origin_database_name(); const ObString &origin_table_name = alter_table_schema.get_origin_table_name(); + bool is_alter_comment = false; if (origin_database_name.empty() || origin_table_name.empty()) { ret = OB_INVALID_ARGUMENT; LOG_WARN("database name or table name is null", K(alter_table_schema), @@ -13747,6 +13776,7 @@ int ObDDLService::get_and_check_table_schema( } else { bool is_index = false; bool is_db_in_recyclebin = false; + uint64_t compat_version = OB_INVALID_VERSION; if (OB_FAIL(schema_guard.get_table_schema(tenant_id, origin_database_name, origin_table_name, @@ -13799,8 +13829,14 @@ int ObDDLService::get_and_check_table_schema( LOG_WARN("alter materialized view is not supported", KR(ret)); LOG_USER_ERROR(OB_NOT_SUPPORTED, "alter materialized view is"); } + } else if (OB_FAIL(alter_table_arg.is_alter_comment(is_alter_comment))) { + LOG_WARN("failed to get is alter comment", K(ret)); + } else if (OB_FAIL(GET_MIN_DATA_VERSION(orig_table_schema->get_tenant_id(), compat_version))) { + LOG_WARN("get min data_version failed", K(ret), K(orig_table_schema->get_tenant_id())); } else if (!orig_table_schema->is_user_table() && !orig_table_schema->is_sys_table() + && !(orig_table_schema->is_view_table() && is_alter_comment + && ObSQLUtils::is_data_version_ge_422_or_431(compat_version)) && !orig_table_schema->is_tmp_table() && !orig_table_schema->is_external_table()) { ret = OB_ERR_WRONG_OBJECT; @@ -14830,6 +14866,7 @@ int ObDDLService::alter_table(obrpc::ObAlterTableArg &alter_table_arg, start_usec = ObTimeUtility::current_time(); bool is_alter_sess_active_time = false; bool is_alter_duplicate_scope = false; + bool is_alter_comment = false; const AlterTableSchema &alter_table_schema = alter_table_arg.alter_table_schema_; const uint64_t tenant_id = alter_table_schema.get_tenant_id(); int64_t &task_id = res.task_id_; @@ -14846,6 +14883,8 @@ int ObDDLService::alter_table(obrpc::ObAlterTableArg &alter_table_arg, const ObTableSchema *orig_table_schema = NULL; is_alter_sess_active_time = alter_table_schema.alter_option_bitset_.has_member(obrpc::ObAlterTableArg::SESSION_ACTIVE_TIME); is_alter_duplicate_scope = alter_table_schema.alter_option_bitset_.has_member(obrpc::ObAlterTableArg::DUPLICATE_SCOPE); + is_alter_comment = alter_table_schema.alter_option_bitset_.has_member(obrpc::ObAlterTableArg::COMMENT); + LOG_DEBUG("debug view comment", K(is_alter_comment), K(alter_table_schema)); ObTZMapWrap tz_map_wrap; if (OB_FAIL(ret)) { } else if (is_alter_duplicate_scope) { @@ -29432,11 +29471,19 @@ int ObDDLService::create_user(ObCreateUserArg &arg, uint64_t creator_id = arg.creator_id_; if (OB_FAIL(ObCompatModeGetter::check_is_oracle_mode_with_tenant_id(arg.tenant_id_, is_oracle_mode))) { LOG_WARN("fail to check is oracle mode", K(ret)); - } + } else if (!is_oracle_mode && arg.is_create_role_) { + if (OB_FAIL(ObSQLUtils::compatibility_check_for_mysql_role_and_column_priv(arg.tenant_id_))) { + LOG_WARN("not support role while upgrading", K(ret)); + } else if (OB_FAIL(create_mysql_roles_in_trans(arg.tenant_id_, arg.if_not_exist_, arg.user_infos_))) { + LOG_WARN("fail to create mysql roles", K(ret)); + } + } else { for (int64_t i = 0; OB_SUCC(ret) && i < arg.user_infos_.count(); ++i) { ObUserInfo &user_info = arg.user_infos_.at(i); uint64_t user_id = OB_INVALID_ID; if (OB_FAIL(create_user(user_info, creator_id, user_id))) { + const ObString &user_name = user_info.get_user_name_str(); + const ObString &host_name = user_info.get_host_name_str(); if (is_oracle_mode) { // in oracle mode, if creating a user failed, just return the error code directly LOG_WARN("create user failed", K(ret), K(user_info), K(creator_id)); @@ -29456,6 +29503,7 @@ int ObDDLService::create_user(ObCreateUserArg &arg, } } } + } //end if return ret; } @@ -29526,59 +29574,102 @@ int ObDDLService::drop_user(const ObDropUserArg &arg, ObSqlString ddl_stmt_str; ObAccountArg account; ObString ddl_sql; - for (int64_t i = 0; OB_SUCC(ret) && i < arg.users_.count(); ++i) { - ObSchemaGetterGuard schema_guard; - ddl_stmt_str.reuse(); - ddl_sql.reset(); - account.user_name_ = arg.users_.at(i); - account.host_name_ = arg.hosts_.at(i); - const bool is_role = arg.is_role_; - account.is_role_ = is_role; - const ObUserInfo *user_info = NULL; - if (OB_FAIL(get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) { - ret = OB_ERR_SYS; - LOG_WARN("Get schema manager failed", K(ret), K(tenant_id)); - } else if (OB_FAIL(schema_guard.get_user_info(tenant_id, account.user_name_, account.host_name_, user_info))) { - LOG_WARN("get_user_id failed", K(ret), K(ret), K(account)); - } else if (NULL == user_info) { - if (is_role) { - ret = OB_ROLE_NOT_EXIST; - LOG_WARN("drop non-exist user or role", K(ret), K(tenant_id), K(account.user_name_)); - LOG_USER_ERROR(OB_ROLE_NOT_EXIST, account.user_name_.length(), account.user_name_.ptr()); - } else { - ret = OB_SUCCESS; //no such user, recover - LOG_WARN("Try to drop non-exist user or role", K(tenant_id), K(account)); + bool is_oracle_mode = false; + ObSchemaGetterGuard schema_guard; + ObArray user_ids; + + if (OB_FAIL(get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) { + ret = OB_ERR_SYS; + LOG_WARN("Get schema manager failed", K(ret), K(tenant_id)); + } else if (OB_FAIL(ObCompatModeGetter::check_is_oracle_mode_with_tenant_id(tenant_id, is_oracle_mode))) { + LOG_WARN("fail to check compat mode", K(ret)); + } else if (arg.is_role_ && !is_oracle_mode) { + //mysql drop roles in one trans + //either succeeds for all named roles or rolls back and has no effect if any error occurs + bool has_any_role_not_exist = false; + if (OB_FAIL(ObSQLUtils::compatibility_check_for_mysql_role_and_column_priv(arg.tenant_id_))) { + LOG_WARN("not support role while upgrading", K(ret)); + } else if (OB_FAIL(ddl_stmt_str.append("DROP ROLE "))) { + LOG_WARN("fail to append str", K(ret)); + } + for (int64_t i = 0; OB_SUCC(ret) && i < arg.users_.count(); ++i) { + const ObUserInfo *user_info = NULL; + if (OB_FAIL(schema_guard.get_user_info(tenant_id, arg.users_.at(i), arg.hosts_.at(i), user_info))) { + LOG_WARN("get_user_id failed", K(ret)); + } else if (NULL == user_info) { + has_any_role_not_exist = true; + if (OB_FAIL(failed_index.push_back(i))) { + LOG_WARN("fail to push back", K(ret)); + } + LOG_WARN("drop non-exist user or role", K(ret), K(arg.users_.at(i)), K(arg.hosts_.at(i))); + } else if (OB_FAIL(user_ids.push_back(user_info->get_user_id()))) { + LOG_WARN("fail to push back", K(ret)); + } else if (OB_FAIL(ddl_stmt_str.append_fmt("`%.*s`@`%.*s`,", + arg.users_.at(i).length(), arg.users_.at(i).ptr(), + arg.hosts_.at(i).length(), arg.hosts_.at(i).ptr()))) { + LOG_WARN("fail to apend format", K(ret)); + } + } + if (OB_SUCC(ret) && arg.users_.count() > 0 && !has_any_role_not_exist) { + ddl_sql = ObString(ddl_stmt_str.string().length() - 1, ddl_stmt_str.string().ptr()); + if (OB_FAIL(drop_user_in_trans(tenant_id, user_ids, &ddl_sql))) { + LOG_WARN("Drop one user failed", K(account), K(tenant_id), K(user_id), K(ret)); + } + } + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < arg.users_.count(); ++i) { + user_ids.reuse(); + ddl_stmt_str.reuse(); + ddl_sql.reset(); + account.user_name_ = arg.users_.at(i); + account.host_name_ = arg.hosts_.at(i); + const bool is_role = arg.is_role_; + account.is_role_ = is_role; + const ObUserInfo *user_info = NULL; + if (OB_FAIL(schema_guard.get_user_info(tenant_id, account.user_name_, account.host_name_, user_info))) { + LOG_WARN("get_user_id failed", K(ret), K(ret), K(account)); + } else if (NULL == user_info) { + if (is_role) { + ret = OB_ROLE_NOT_EXIST; + LOG_WARN("drop non-exist user or role", K(ret), K(tenant_id), K(account.user_name_)); + LOG_USER_ERROR(OB_ROLE_NOT_EXIST, account.user_name_.length(), account.user_name_.ptr()); + } else { + ret = OB_SUCCESS; //no such user, recover + LOG_WARN("Try to drop non-exist user or role", K(tenant_id), K(account)); + if (OB_FAIL(failed_index.push_back(i))) { + LOG_WARN("push_back failed", K(ret)); + } + } + } else if (is_oracle_mode && is_role != user_info->is_role()) { + if (is_role) { + // Try to drop role, but the current name is user + ret = OB_ROLE_NOT_EXIST; + LOG_WARN("this is an user name", K(ret), K(tenant_id), K(account.user_name_)); + LOG_USER_ERROR(OB_ROLE_NOT_EXIST, account.user_name_.length(), account.user_name_.ptr()); + } else { + // Try to drop user, but the current name is essentially a role + ret = OB_USER_NOT_EXIST; //no such user + LOG_WARN("Try to drop user", K(ret), K(tenant_id), K(account.user_name_)); + } + } else if (OB_FAIL(ObDDLSqlGenerator::gen_drop_user_sql(account, ddl_stmt_str))) { + LOG_WARN("gen drop_user sql failed", K(ret), K(account)); + } else if (FALSE_IT(ddl_sql = ddl_stmt_str.string())) { + } else if (OB_FAIL(user_ids.push_back(user_info->get_user_id()))) { + LOG_WARN("fail to push back", K(ret)); + } else if (OB_FAIL(drop_user_in_trans(tenant_id, user_ids, &ddl_sql))) { + LOG_WARN("Drop one user failed", K(account), K(tenant_id), K(user_id), K(ret)); + ret = OB_SUCCESS; //drop fail, try next, recover if (OB_FAIL(failed_index.push_back(i))) { LOG_WARN("push_back failed", K(ret)); } } - } else if (is_role != user_info->is_role()) { - if (is_role) { - // Try to drop role, but the current name is user - ret = OB_ROLE_NOT_EXIST; - LOG_WARN("this is an user name", K(ret), K(tenant_id), K(account.user_name_)); - LOG_USER_ERROR(OB_ROLE_NOT_EXIST, account.user_name_.length(), account.user_name_.ptr()); - } else { - // Try to drop user, but the current name is essentially a role - ret = OB_USER_NOT_EXIST; //no such user - LOG_WARN("Try to drop user", K(ret), K(tenant_id), K(account.user_name_)); - } - } else if (OB_FAIL(ObDDLSqlGenerator::gen_drop_user_sql(account, ddl_stmt_str))) { - LOG_WARN("gen drop_user sql failed", K(ret), K(account)); - } else if (FALSE_IT(ddl_sql = ddl_stmt_str.string())) { - } else if (OB_FAIL(drop_user_in_trans(tenant_id, user_info->get_user_id(), &ddl_sql))) { - LOG_WARN("Drop one user failed", K(account), K(tenant_id), K(user_id), K(ret)); - ret = OB_SUCCESS; //drop fail, try next, recover - if (OB_FAIL(failed_index.push_back(i))) { - LOG_WARN("push_back failed", K(ret)); - } } - } + } //end if return ret; } int ObDDLService::drop_user_in_trans(const uint64_t tenant_id, - const uint64_t user_id, + const common::ObIArray &user_ids, const ObString *ddl_stmt_str) { int ret = OB_SUCCESS; @@ -29587,7 +29678,7 @@ int ObDDLService::drop_user_in_trans(const uint64_t tenant_id, int64_t refreshed_schema_version = 0; if (OB_FAIL(check_inner_stat())) { LOG_WARN("variable is not init"); - } else if (OB_INVALID_ID == tenant_id || OB_INVALID_ID == user_id) { + } else if (OB_INVALID_ID == tenant_id) { ret = OB_INVALID_ARGUMENT; LOG_WARN("Tenant id is invalid", K(ret)); } else if (OB_FAIL(get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) { @@ -29596,9 +29687,15 @@ int ObDDLService::drop_user_in_trans(const uint64_t tenant_id, LOG_WARN("failed to get tenant schema version", KR(ret), K(tenant_id)); } else if (OB_FAIL(trans.start(sql_proxy_, tenant_id, refreshed_schema_version))) { LOG_WARN("start transaction failed", KR(ret), K(tenant_id), K(refreshed_schema_version)); - } else { + } + + for (int i = 0; OB_SUCC(ret) && i < user_ids.count(); i++) { ObDDLOperator ddl_operator(*schema_service_, *sql_proxy_); - if (OB_FAIL(ddl_operator.drop_user(tenant_id, user_id, ddl_stmt_str, trans))) { + uint64_t user_id = user_ids.at(i); + if (OB_INVALID_ID == user_id) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("User id is invalid", K(ret), K(user_id)); + } else if (OB_FAIL(ddl_operator.drop_user(tenant_id, user_id, (0 == i) ? ddl_stmt_str : NULL, trans))) { LOG_WARN("failed to drop user", K(ret), K(tenant_id), K(user_id)); } else { const ObTenantSchema *tenant_schema = NULL; @@ -30244,12 +30341,14 @@ int ObDDLService::grant_table_and_col_privs_to_user( int ObDDLService::exists_role_grant_cycle( ObSchemaGetterGuard &schema_guard, const uint64_t tenant_id, - uint64_t role_id, - const ObUserInfo *user_info) + const ObUserInfo &role_info, + const ObUserInfo *user_info, + const bool is_oracle_mode) { int ret = OB_SUCCESS; bool found = false; CK (user_info != NULL); + uint64_t role_id = role_info.get_user_id(); ObSEArray role_id_array = user_info->get_role_id_array(); for (int j = 0; OB_SUCC(ret) && !found && j < role_id_array.count(); ++j) { if (role_id == role_id_array.at(j)) { @@ -30258,12 +30357,19 @@ int ObDDLService::exists_role_grant_cycle( const ObUserInfo *tmp_role_info = NULL; OZ (schema_guard.get_user_info(tenant_id, role_id_array.at(j), tmp_role_info)); if (OB_SUCC(ret) && tmp_role_info != NULL) { - OZ (exists_role_grant_cycle(schema_guard, tenant_id, role_id, tmp_role_info)); + OZ (exists_role_grant_cycle(schema_guard, tenant_id, role_info, tmp_role_info, is_oracle_mode)); } } } if (OB_SUCC(ret) && found) { ret = OB_ERR_CIRCULAR_ROLE_GRANT_DETECTED; + if (!is_oracle_mode) { + LOG_USER_ERROR(OB_ERR_CIRCULAR_ROLE_GRANT_DETECTED, + role_info.get_user_name_str().length(), role_info.get_user_name_str().ptr(), + role_info.get_host_name_str().length(), role_info.get_host_name_str().ptr(), + user_info->get_user_name_str().length(), user_info->get_user_name_str().ptr(), + user_info->get_host_name_str().length(), user_info->get_host_name_str().ptr()); + } } return ret; } @@ -30283,6 +30389,8 @@ int ObDDLService::grant(const ObGrantArg &arg) LOG_WARN("arg is invalid", K(arg), K(ret)); } else if (OB_FAIL(get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) { LOG_WARN("fail to get schema guard with version in inner table", K(ret), K(tenant_id)); + } else if (OB_FAIL(check_parallel_ddl_conflict(schema_guard, arg))) { + LOG_WARN("check parallel ddl conflict failed", K(ret)); } else if (OB_FAIL(ObCompatModeGetter::get_tenant_mode(tenant_id, compat_mode))) { LOG_WARN("failed to get compat mode", K(ret), K(tenant_id)); } else { @@ -30344,9 +30452,14 @@ int ObDDLService::grant(const ObGrantArg &arg) ObArray role_ids; ObArray roles_info; // Resolve each role id and role info - for (int64_t i = GRANT_ROLE_MIN_ROLE_NUM - 1; OB_SUCC(ret) && i < roles.count(); ++i) { + bool is_oracle_mode = lib::Worker::CompatMode::ORACLE == compat_mode; + int64_t step = is_oracle_mode ? 1 : 2; + if (!is_oracle_mode) { + OZ (ObSQLUtils::compatibility_check_for_mysql_role_and_column_priv(tenant_id)); + } + for (int64_t i = GRANT_ROLE_MIN_ROLE_NUM - 1; OB_SUCC(ret) && i + step <= roles.count(); i+=step) { // Oracle currently does not support specifying hostname to create a role - const ObString host_name(OB_DEFAULT_HOST_NAME); + const ObString host_name = is_oracle_mode ? ObString(OB_DEFAULT_HOST_NAME) : roles.at(i+1); const ObString role = roles.at(i); const ObUserInfo *role_info = NULL; if (OB_FAIL(schema_guard.get_user_info(tenant_id, role, host_name, role_info))) { @@ -30363,14 +30476,17 @@ int ObDDLService::grant(const ObGrantArg &arg) } // Operate on each user_name for (int i = 0; OB_SUCC(ret) && i < users_info.count(); ++i) { - const ObUserInfo &user_info = users_info.at(i); - if (user_info.is_role()) { + const ObUserInfo &user_info = users_info.at(i); + if (!user_info.is_role() && is_oracle_mode) { + //skip check + } else { // Check if there is a cyclic grant for (int j = 0; OB_SUCC(ret) && j < roles_info.count(); ++j) { if (OB_FAIL(exists_role_grant_cycle(schema_guard, tenant_id, - user_info.get_user_id(), - &roles_info.at(j)))) { + user_info, + &roles_info.at(j), + is_oracle_mode))) { LOG_WARN("role cycle exists", K(ret), K(roles_info.at(j))); } } @@ -30510,7 +30626,7 @@ int ObDDLService::grant(const ObGrantArg &arg) } if (OB_SUCC(ret) && is_user_exist) { - ObNeedPriv need_priv(arg.db_, arg.table_, arg.priv_level_, arg.priv_set_, false); + ObNeedPriv need_priv(arg.db_, arg.table_, arg.priv_level_, arg.priv_set_, false, arg.object_type_); bool is_owner = false; // In oracle mode, if it is oracle syntax, it need to determine grantee is obj owner, // if yes, return success directly @@ -30524,7 +30640,8 @@ int ObDDLService::grant(const ObGrantArg &arg) } if (!is_owner) { /* No column level permissions */ - if (arg.ins_col_ids_.count() + + if (arg.column_names_priv_.count() == 0 && + arg.ins_col_ids_.count() + arg.upd_col_ids_.count() + arg.ref_col_ids_.count() == 0) { ObObjPrivSortKey obj_priv_key(arg.tenant_id_, @@ -30545,8 +30662,9 @@ int ObDDLService::grant(const ObGrantArg &arg) schema_guard))) { LOG_WARN("Grant priv to user failed", K(ret)); } + } else if (lib::Worker::CompatMode::MYSQL == compat_mode) { + OZ (grant_table_and_column_mysql(arg, user_id, user_name, host_name, need_priv, schema_guard)); } else { - // Contains column-level permissions, only supported by oracle grant statement in oracle mode OZ (grant_table_and_col_privs_to_user(arg, user_id, user_name, host_name, need_priv, schema_guard)); } @@ -30588,6 +30706,11 @@ int ObDDLService::revoke(const ObRevokeUserArg &arg) // this process include revoke role user_id = user_info->get_user_id(); ObArray role_ids; + bool is_oracle_mode = false; + OZ (ObCompatModeGetter::check_is_oracle_mode_with_tenant_id(tenant_id, is_oracle_mode)); + if (OB_SUCC(ret) && !is_oracle_mode) { + OZ (ObSQLUtils::compatibility_check_for_mysql_role_and_column_priv(tenant_id)); + } for (int64_t i = 0; OB_SUCC(ret) && i < arg.role_ids_.count(); ++i) { const uint64_t role_id = arg.role_ids_.at(i); const ObUserInfo *role_info = NULL; @@ -30730,6 +30853,23 @@ int ObDDLService::grant_priv_to_user(const uint64_t tenant_id, } break; } + case OB_PRIV_ROUTINE_LEVEL: { + ObRoutinePrivSortKey routine_key(tenant_id, user_id, need_priv.db_, need_priv.table_, + obj_priv_key.obj_type_ == (int)ObObjectType::PROCEDURE ? ObRoutineType::ROUTINE_PROCEDURE_TYPE : + obj_priv_key.obj_type_ == (int)ObObjectType::FUNCTION ? ObRoutineType::ROUTINE_FUNCTION_TYPE : + ObRoutineType::INVALID_ROUTINE_TYPE); + if (OB_FAIL(ObDDLSqlGenerator::gen_routine_priv_sql(ObAccountArg(user_name, host_name), need_priv, true, ddl_stmt_str))) { + LOG_WARN("gen_table_priv sql failed", K(need_priv), K(ret)); + } else if (FALSE_IT(ddl_sql = ddl_stmt_str.string())) { + } else if (OB_FAIL(grant_routine(routine_key, + need_priv.priv_set_, + &ddl_sql, + option, + schema_guard))) { + LOG_WARN("Grant table error", K(ret)); + } + break; + } default: { ret = OB_ERR_UNEXPECTED; LOG_WARN("Unexpected grant level", "GrantLevel", need_priv.priv_level_); @@ -30739,6 +30879,140 @@ int ObDDLService::grant_priv_to_user(const uint64_t tenant_id, return ret; } +int ObDDLService::grant_table_and_column_mysql(const obrpc::ObGrantArg &arg, + uint64_t user_id, + const ObString &user_name, + const ObString &host_name, + const ObNeedPriv &need_priv, + share::schema::ObSchemaGetterGuard &schema_guard) +{ + int ret = OB_SUCCESS; + const uint64_t tenant_id = arg.tenant_id_; + int64_t refreshed_schema_version = 0; + if (OB_FAIL(check_inner_stat())) { + LOG_WARN("variable is not init", KR(ret)); + } else if (OB_FAIL(schema_guard.get_schema_version(tenant_id, refreshed_schema_version))) { + LOG_WARN("failed to get tenant schema version", KR(ret), K(tenant_id)); + } else if (!arg.is_valid()) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("table_key is invalid", K(ret)); + } else { + ObDDLSQLTransaction trans(schema_service_); + if (!is_user_exist(arg.tenant_id_, user_id)) { + ret = OB_USER_NOT_EXIST; + LOG_WARN("User is not exist", "tenant_id", arg.tenant_id_, + "user_id", user_id, + K(ret)); + } else if (OB_FAIL(trans.start(sql_proxy_, tenant_id, refreshed_schema_version))) { + LOG_WARN("start transaction failed", KR(ret), K(tenant_id), K(refreshed_schema_version)); + } else { + ObDDLOperator ddl_operator(*schema_service_, *sql_proxy_); + ObTablePrivSortKey table_key(tenant_id, user_id, need_priv.db_, need_priv.table_); + const share::ObRawObjPrivArray obj_priv_array; + const share::schema::ObObjPrivSortKey obj_key; + uint64_t option = 0; + ObSqlString ddl_stmt_str; + ObString ddl_stmt; + if (OB_FAIL(ObDDLSqlGenerator::gen_table_priv_sql(ObAccountArg(user_name, host_name), + need_priv, true, ddl_stmt_str))) { + LOG_WARN("gen_table_priv sql failed", K(need_priv), K(ret)); + } else if (OB_FALSE_IT(ddl_stmt = ddl_stmt_str.string())) { + } else if (OB_FAIL(ddl_operator.grant_table(table_key, + arg.priv_set_, + &ddl_stmt, + trans, + obj_priv_array, + option, + obj_key))) { + LOG_WARN("fail to grant table", K(ret)); + } else if (OB_FAIL(grant_or_revoke_column_priv_mysql(tenant_id, arg.object_id_, user_id, + user_name, host_name, need_priv.db_, + need_priv.table_, arg.column_names_priv_, + ddl_operator, trans, schema_guard, true))) { + LOG_WARN("grant or revoke column priv mysql failed", K(ret)); + } + + if (trans.is_started()) { + int temp_ret = OB_SUCCESS; + if (OB_SUCCESS != (temp_ret = trans.end(OB_SUCC(ret)))) { + LOG_WARN("trans end failed", "is_commit", OB_SUCCESS == ret, K(temp_ret)); + ret = (OB_SUCC(ret)) ? temp_ret : ret; + } + } + } + } + + // publish schema + if (OB_SUCC(ret)) { + if (OB_FAIL(publish_schema(tenant_id))) { + LOG_WARN("publish schema failed", K(ret)); + } + } + return ret; +} + +int ObDDLService::grant_or_revoke_column_priv_mysql(const uint64_t tenant_id, + const uint64_t table_id, + const uint64_t user_id, + const ObString& user_name, + const ObString& host_name, + const ObString& db, + const ObString& table, + const ObIArray> &column_names_priv, + ObDDLOperator &ddl_operator, + ObDDLSQLTransaction &trans, + ObSchemaGetterGuard &schema_guard, + const bool is_grant) +{ + int ret = OB_SUCCESS; + common::hash::ObHashMap col_privs; + if (OB_FAIL(col_privs.create(OB_MAX_COLUMN_NUMBER, lib::ObLabel("ColPriv")))) { + LOG_WARN("failed to create column id map", K(ret)); + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < column_names_priv.count(); i++) { + ObColumnSchemaHashWrapper column_key(column_names_priv.at(i).first); + ObPrivSet priv_set = 0; + int hash_ret = col_privs.get_refactored(column_key, priv_set); + if (hash_ret == OB_HASH_NOT_EXIST || hash_ret == OB_SUCCESS) { + priv_set |= column_names_priv.at(i).second; + if (OB_FAIL(col_privs.set_refactored(column_key, priv_set, 1))) { + LOG_WARN("set hash refactored failed", K(ret)); + } + } else { + ret = hash_ret; + LOG_WARN("get hash obj failed", K(ret)); + } + } + } + + for (common::hash::ObHashMap::iterator it = col_privs.begin(); + OB_SUCC(ret) && it != col_privs.end(); it++) { + ObColumnPrivSortKey column_key(tenant_id, user_id, db, table, it->first.column_name_); + ObSqlString ddl_stmt_str; + ObString ddl_stmt; + ObNeedPriv need_priv; + need_priv.priv_level_ = OB_PRIV_TABLE_LEVEL; + need_priv.priv_set_ = it->second; + need_priv.db_ = db; + need_priv.table_ = table; + if (OB_FAIL(need_priv.columns_.push_back(it->first.column_name_))) { + LOG_WARN("push back failed", K(ret)); + } else if (OB_FAIL(ObDDLSqlGenerator::gen_column_priv_sql(ObAccountArg(user_name, host_name), + need_priv, is_grant, ddl_stmt_str))) { + LOG_WARN("gen_table_priv sql failed", K(need_priv), K(ret)); + } else if (OB_FALSE_IT(ddl_stmt = ddl_stmt_str.string())) { + } else if (OB_FAIL(ddl_operator.grant_column(schema_guard, + column_key, + it->second, + &ddl_stmt, + trans, + is_grant))) { + LOG_WARN("fail to grant table", K(ret)); + } + } + return ret; +} + int ObDDLService::revoke_all( const uint64_t tenant_id, const ObString &user_name, @@ -30804,16 +31078,28 @@ int ObDDLService::grant_revoke_user( share::schema::ObSchemaGetterGuard &schema_guard) { int ret = OB_SUCCESS; + bool is_ora_mode = false; if (OB_FAIL(check_inner_stat())) { LOG_WARN("variable is not init"); } else if (OB_INVALID_ID == tenant_id) { ret = OB_INVALID_ARGUMENT; LOG_WARN("Tenant id is invalid", K(ret)); + } else if (ObCompatModeGetter::check_is_oracle_mode_with_tenant_id(tenant_id, is_ora_mode)) { + LOG_WARN("fail to check is oracle mode", K(ret)); } else { ObDDLSQLTransaction trans(schema_service_); int64_t refreshed_schema_version = 0; + uint64_t compat_version = 0; if (OB_FAIL(schema_guard.get_schema_version(tenant_id, refreshed_schema_version))) { LOG_WARN("failed to get tenant schema version", KR(ret), K(tenant_id)); + } else if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, compat_version))) { + LOG_WARN("fail to get data version", K(ret), K(tenant_id)); + } else if (!ObSQLUtils::is_data_version_ge_423_or_431(compat_version) && !is_ora_mode + && (0 != (priv_set & OB_PRIV_EXECUTE) || + 0 != (priv_set & OB_PRIV_ALTER_ROUTINE) || + 0 != (priv_set & OB_PRIV_CREATE_ROUTINE))) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("some column of user info is not empty when MIN_DATA_VERSION is below DATA_VERSION_4_3_1_0 or DATA_VERSION_4_2_3_0", K(ret), K(priv_set)); } else if (OB_FAIL(trans.start(sql_proxy_, tenant_id, refreshed_schema_version))) { LOG_WARN("Start transaction failed", KR(ret), K(tenant_id), K(refreshed_schema_version)); } else { @@ -30966,9 +31252,14 @@ int ObDDLService::alter_user_default_role(const ObAlterUserProfileArg &arg) ObSEArray disable_flag_array; bool need_flush = true; const ObUserInfo *user_info = NULL; + bool is_oracle_mode = false; if (OB_FAIL(check_inner_stat())) { LOG_WARN("check inner stat failed", K(ret)); + } else if (OB_FAIL(ObCompatModeGetter::check_is_oracle_mode_with_tenant_id(tenant_id, is_oracle_mode))) { + LOG_WARN("fail to check is oracle mode", K(ret)); + } else if (!is_oracle_mode && OB_FAIL(ObSQLUtils::compatibility_check_for_mysql_role_and_column_priv(tenant_id))) { + LOG_WARN("not support set role while upgrading", K(ret)); } else if (OB_UNLIKELY(!is_valid_tenant_id(tenant_id))) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid input schema", K(ret), K(tenant_id)); @@ -30976,36 +31267,47 @@ int ObDDLService::alter_user_default_role(const ObAlterUserProfileArg &arg) schema_guard))) { LOG_WARN("fail to get schema guard", K(ret), K(tenant_id)); } else { - /* 1. check user exists */ - if (OB_FAIL(schema_guard.get_user_info(tenant_id, arg.user_id_, user_info))) { - LOG_WARN("get user info fail", K(tenant_id), K(arg.user_id_)); - } else if (NULL == user_info) { - ret = OB_ERR_USER_NOT_EXIST; - LOG_WARN("user is null", K(ret)); - } else { - /* 2. build role disable flag array */ - OZ (build_need_flush_role_array(schema_guard, tenant_id, user_info, arg, - need_flush, role_id_array, disable_flag_array)); - } - } - - if (OB_SUCC(ret) && need_flush) { - ObDDLSQLTransaction trans(schema_service_); ObDDLOperator ddl_operator(*schema_service_, *sql_proxy_); - int64_t refreshed_schema_version = 0; - if (OB_FAIL(schema_guard.get_schema_version(tenant_id, refreshed_schema_version))) { - LOG_WARN("failed to get tenant schema version", KR(ret), K(tenant_id)); - } else if (OB_FAIL(trans.start(sql_proxy_, tenant_id, refreshed_schema_version))) { - LOG_WARN("start transaction failed", KR(ret), K(tenant_id), K(refreshed_schema_version)); - } else if (OB_FAIL(ddl_operator.alter_user_default_role(arg.ddl_stmt_str_, - *user_info, - role_id_array, - disable_flag_array, - trans))) { - LOG_WARN("fail to alter user profile", K(ret), K(user_info)); + + for (int i = 0; OB_SUCC(ret) && i < MAX(1, arg.user_ids_.count()); i++) { + /* 1. check user exists */ + uint64_t user_id = arg.user_ids_.empty() ? arg.user_id_ : arg.user_ids_.at(i); + if (OB_FAIL(schema_guard.get_user_info(tenant_id, user_id, user_info))) { + LOG_WARN("get user info fail", K(tenant_id), K(user_id)); + } else if (NULL == user_info) { + ret = OB_ERR_USER_NOT_EXIST; + LOG_WARN("user is null", K(ret)); + } else { + /* 2. build role disable flag array */ + role_id_array.reuse(); + disable_flag_array.reuse(); + OZ (build_need_flush_role_array(schema_guard, tenant_id, user_info, arg, + need_flush, role_id_array, disable_flag_array)); + LOG_DEBUG("check role id array", K(need_flush), K(role_id_array), K(disable_flag_array), K(arg.default_role_flag_)); + } + + if (OB_SUCC(ret) && need_flush) { + if (!trans.is_started()) { + int64_t refreshed_schema_version = 0; + if (OB_FAIL(schema_guard.get_schema_version(tenant_id, refreshed_schema_version))) { + LOG_WARN("failed to get tenant schema version", KR(ret), K(tenant_id)); + } else if (OB_FAIL(trans.start(sql_proxy_, tenant_id, refreshed_schema_version))) { + LOG_WARN("start transaction failed", KR(ret), K(tenant_id), K(refreshed_schema_version)); + } + } + if (OB_FAIL(ret)) { + } else if (OB_FAIL(ddl_operator.alter_user_default_role(arg.ddl_stmt_str_, + *user_info, + role_id_array, + disable_flag_array, + trans))) { + LOG_WARN("fail to alter user profile", K(ret), K(user_info)); + } + } } + if (trans.is_started()) { int temp_ret = OB_SUCCESS; if (OB_SUCCESS != (temp_ret = trans.end(OB_SUCC(ret)))) { @@ -31021,6 +31323,8 @@ int ObDDLService::alter_user_default_role(const ObAlterUserProfileArg &arg) } } + + return ret; } @@ -31254,8 +31558,7 @@ int ObDDLService::grant_database( // publish schema if (OB_SUCC(ret)) { - ret = publish_schema(tenant_id); - if (OB_FAIL(ret)) { + if (OB_FAIL(publish_schema(tenant_id))) { LOG_WARN("publish schema failed", K(ret)); } } @@ -31270,11 +31573,23 @@ int ObDDLService::revoke_database( const uint64_t tenant_id = db_key.tenant_id_; ObSchemaGetterGuard schema_guard; int64_t refreshed_schema_version = 0; + uint64_t compat_version = 0; + bool is_ora_mode = false; if (OB_FAIL(check_inner_stat())) { LOG_WARN("variable is not init"); } else if (!db_key.is_valid()) { ret = OB_INVALID_ARGUMENT; LOG_WARN("db_key is invalid", K(db_key), K(ret)); + } else if (ObCompatModeGetter::check_is_oracle_mode_with_tenant_id(tenant_id, is_ora_mode)) { + LOG_WARN("fail to check is oracle mode", K(ret)); + } else if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, compat_version))) { + LOG_WARN("fail to get data version", K(ret), K(tenant_id)); + } else if (!ObSQLUtils::is_data_version_ge_423_or_431(compat_version) && !is_ora_mode + && (0 != (priv_set & OB_PRIV_EXECUTE) || + 0 != (priv_set & OB_PRIV_ALTER_ROUTINE) || + 0 != (priv_set & OB_PRIV_CREATE_ROUTINE))) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("some column of user info is not empty when MIN_DATA_VERSION is below DATA_VERSION_4_3_1_0 or DATA_VERSION_4_2_3_0", K(ret), K(priv_set)); } else if (OB_FAIL(get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) { LOG_WARN("fail to get schema guard with version in inner table", K(ret), K(tenant_id)); } else { @@ -31574,15 +31889,131 @@ int ObDDLService::grant_table( // publish schema if (OB_SUCC(ret)) { - ret = publish_schema(tenant_id); - if (OB_FAIL(ret)) { + if (OB_FAIL(publish_schema(tenant_id))) { LOG_WARN("publish schema failed", K(ret)); } } return ret; } +int ObDDLService::revoke_table_and_column_mysql(const obrpc::ObRevokeTableArg& arg) +{ + int ret = OB_SUCCESS; + const uint64_t tenant_id = arg.tenant_id_; + ObSchemaGetterGuard schema_guard; + int64_t refreshed_schema_version = 0; + if (OB_FAIL(check_inner_stat())) { + LOG_WARN("variable is not init"); + } else if (OB_UNLIKELY(!arg.is_valid())) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("arg is invalid", K(arg), K(ret)); + } else if (OB_FAIL(get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) { + LOG_WARN("fail to get schema guard with version in inner table", K(ret), K(tenant_id)); + } else { + ObDDLSQLTransaction trans(schema_service_); + if (OB_FAIL(schema_guard.get_schema_version(tenant_id, refreshed_schema_version))) { + LOG_WARN("failed to get tenant schema version", KR(ret), K(tenant_id)); + } else if (OB_FAIL(trans.start(sql_proxy_, tenant_id, refreshed_schema_version))) { + LOG_WARN("start transaction failed", KR(ret), K(tenant_id), K(refreshed_schema_version)); + } else { + ObPrivSet priv_set = arg.priv_set_; + ObDDLOperator ddl_operator(*schema_service_, *sql_proxy_); + ObTablePrivSortKey table_priv_key(arg.tenant_id_, arg.user_id_, arg.db_, arg.table_); + ObObjPrivSortKey obj_priv_key(arg.tenant_id_, + arg.obj_id_, + arg.obj_type_, + OBJ_LEVEL_FOR_TAB_PRIV, + arg.grantor_id_, + arg.user_id_); + share::ObRawObjPrivArray obj_priv_array; //useless + if (priv_set != 0 && OB_FAIL(ddl_operator.revoke_table(table_priv_key, priv_set, trans, + obj_priv_key, obj_priv_array, false))) { + LOG_WARN("fail to revoke table", K(ret), K(table_priv_key), K(priv_set)); + } else { + ObSEArray, 4> column_names_priv; + if (OB_FAIL(append(column_names_priv, arg.column_names_priv_))) { + LOG_WARN("append failed", K(ret)); + } else if ((priv_set & OB_PRIV_SELECT) != 0 + || (priv_set & OB_PRIV_INSERT) != 0 + || (priv_set & OB_PRIV_UPDATE) != 0 + || (priv_set & OB_PRIV_REFERENCES) != 0) { + ObSEArray column_privs; + if (OB_FAIL(schema_guard.get_column_priv_in_table(tenant_id, arg.user_id_, arg.db_, arg.table_, column_privs))) { + LOG_WARN("get column priv in table failed", K(ret)); + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < column_privs.count(); i++) { + if (OB_ISNULL(column_privs.at(i))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("column priv is null", K(ret)); + } else if ((priv_set & OB_PRIV_SELECT) != 0 + && (column_privs.at(i)->get_priv_set() & OB_PRIV_SELECT) != 0) { + if (OB_FAIL(column_names_priv.push_back( + std::make_pair(column_privs.at(i)->get_column_name_str(), OB_PRIV_SELECT)))) { + LOG_WARN("push back failed", K(ret)); + } + } + if (OB_FAIL(ret)) { + } else if ((priv_set & OB_PRIV_INSERT) != 0 + && (column_privs.at(i)->get_priv_set() & OB_PRIV_INSERT) != 0) { + if (OB_FAIL(column_names_priv.push_back( + std::make_pair(column_privs.at(i)->get_column_name_str(), OB_PRIV_INSERT)))) { + LOG_WARN("push back failed", K(ret)); + } + } + if (OB_FAIL(ret)) { + } else if ((priv_set & OB_PRIV_UPDATE) != 0 + && (column_privs.at(i)->get_priv_set() & OB_PRIV_UPDATE) != 0) { + if (OB_FAIL(column_names_priv.push_back( + std::make_pair(column_privs.at(i)->get_column_name_str(), OB_PRIV_UPDATE)))) { + LOG_WARN("push back failed", K(ret)); + } + } + if (OB_FAIL(ret)) { + } else if ((priv_set & OB_PRIV_REFERENCES) != 0 + && (column_privs.at(i)->get_priv_set() & OB_PRIV_REFERENCES) != 0) { + if (OB_FAIL(column_names_priv.push_back( + std::make_pair(column_privs.at(i)->get_column_name_str(), OB_PRIV_REFERENCES)))) { + LOG_WARN("push back failed", K(ret)); + } + } + } + } + } + if (OB_SUCC(ret)) { + const ObUserInfo *user_info = NULL; + if (OB_FAIL(schema_guard.get_user_info(tenant_id, arg.user_id_, user_info))) { + LOG_WARN("get user info failed", K(table_priv_key), K(ret)); + } else if (OB_ISNULL(user_info)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("user not exist", K(table_priv_key), K(ret)); + } else if (OB_FAIL(grant_or_revoke_column_priv_mysql(tenant_id, arg.obj_id_, arg.user_id_, + user_info->get_user_name_str(), + user_info->get_host_name_str(), + arg.db_, arg.table_, column_names_priv, + ddl_operator, trans, schema_guard, false))) { + LOG_WARN("grant or revoke column priv mysql failed", K(ret)); + } + } + } + } + if (trans.is_started()) { + int temp_ret = OB_SUCCESS; + if (OB_SUCCESS != (temp_ret = trans.end(OB_SUCC(ret)))) { + LOG_WARN("trans end failed", "is_commit", OB_SUCCESS == ret, K(temp_ret)); + ret = (OB_SUCC(ret)) ? temp_ret : ret; + } + } + } + // publish schema + if (OB_SUCC(ret)) { + if (OB_FAIL(publish_schema(tenant_id))) { + LOG_WARN("publish schema failed", K(ret)); + } + } + return ret; +} int ObDDLService::revoke_table( + const obrpc::ObRevokeTableArg &arg, const share::schema::ObTablePrivSortKey &table_key, const ObPrivSet priv_set, const share::schema::ObObjPrivSortKey &obj_key, @@ -31601,6 +32032,8 @@ int ObDDLService::revoke_table( LOG_WARN("table_key is invalid", K(table_key), K(ret)); } else if (OB_FAIL(get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) { LOG_WARN("fail to get schema guard", KR(ret), K(tenant_id)); + } else if (OB_FAIL(check_parallel_ddl_conflict(schema_guard, arg))) { + LOG_WARN("check parallel ddl conflict failed", K(ret)); } else if (OB_FAIL(schema_guard.get_schema_version(tenant_id, refreshed_schema_version))) { LOG_WARN("failed to get tenant schema version", KR(ret), K(tenant_id)); } else { @@ -31628,6 +32061,123 @@ int ObDDLService::revoke_table( } } + // publish schema + if (OB_SUCC(ret)) { + if (OB_FAIL(publish_schema(tenant_id))) { + LOG_WARN("publish schema failed", K(ret)); + } + } + return ret; +} + +int ObDDLService::revoke_routine( + const share::schema::ObRoutinePrivSortKey &routine_key, + const ObPrivSet priv_set) +{ + int ret = OB_SUCCESS; + const uint64_t tenant_id = routine_key.tenant_id_; + int64_t refreshed_schema_version = 0; + ObSchemaGetterGuard schema_guard; + uint64_t compat_version = 0; + if (OB_FAIL(check_inner_stat())) { + LOG_WARN("variable is not init"); + } else if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, compat_version))) { + LOG_WARN("fail to get data version", K(ret), K(tenant_id)); + } else if (!ObSQLUtils::is_data_version_ge_423_or_431(compat_version)) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("version lower than 4.3.1 or 4.2.3 does not support this operation", K(ret)); + } else if (!routine_key.is_valid()) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("routine_key is invalid", K(routine_key), K(ret)); + } else if (OB_FAIL(get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) { + LOG_WARN("fail to get schema guard", KR(ret), K(tenant_id)); + } else if (OB_FAIL(schema_guard.get_schema_version(tenant_id, refreshed_schema_version))) { + LOG_WARN("failed to get tenant schema version", KR(ret), K(tenant_id)); + } else { + ObDDLSQLTransaction trans(schema_service_); + if (!is_user_exist(routine_key.tenant_id_, routine_key.user_id_)) { + ret = OB_USER_NOT_EXIST; + LOG_WARN("User is not exist", "tenant_id", routine_key.tenant_id_, + "user_id", routine_key.user_id_, + K(ret)); + } else if (OB_FAIL(trans.start(sql_proxy_, tenant_id, refreshed_schema_version))) { + LOG_WARN("Start transaction failed", KR(ret), K(tenant_id), K(refreshed_schema_version)); + } else { + ObDDLOperator ddl_operator(*schema_service_, *sql_proxy_); + if (OB_FAIL(ddl_operator.revoke_routine(routine_key, priv_set, trans))) { + LOG_WARN("fail to revoke routine", K(ret), K(routine_key), K(priv_set)); + } + if (trans.is_started()) { + int temp_ret = OB_SUCCESS; + if (OB_SUCCESS != (temp_ret = trans.end(OB_SUCC(ret)))) { + LOG_WARN("trans end failed", "is_commit", OB_SUCCESS == ret, K(temp_ret)); + ret = (OB_SUCC(ret)) ? temp_ret : ret; + } + } + } + } + + // publish schema + if (OB_SUCC(ret)) { + ret = publish_schema(tenant_id); + if (OB_FAIL(ret)) { + LOG_WARN("publish schema failed", K(ret)); + } + } + return ret; +} + + +int ObDDLService::grant_routine( + const share::schema::ObRoutinePrivSortKey &routine_key, + const ObPrivSet priv_set, + const ObString *ddl_stmt_str, + const uint64_t option, + share::schema::ObSchemaGetterGuard &schema_guard) +{ + int ret = OB_SUCCESS; + const uint64_t tenant_id = routine_key.tenant_id_; + int64_t refreshed_schema_version = 0; + uint64_t compat_version = 0; + if (OB_FAIL(check_inner_stat())) { + LOG_WARN("variable is not init", KR(ret)); + } else if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, compat_version))) { + LOG_WARN("fail to get data version", K(ret), K(tenant_id)); + } else if (!ObSQLUtils::is_data_version_ge_423_or_431(compat_version)) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("version lower than 4.3.1 or 4.2.3 does not support this operation", K(ret)); + } else if (OB_FAIL(schema_guard.get_schema_version(tenant_id, refreshed_schema_version))) { + LOG_WARN("failed to get tenant schema version", KR(ret), K(tenant_id)); + } else if (!routine_key.is_valid()) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("routine_key is invalid", K(routine_key), K(ret)); + } else { + ObDDLSQLTransaction trans(schema_service_); + if (!is_user_exist(routine_key.tenant_id_, routine_key.user_id_)) { + ret = OB_USER_NOT_EXIST; + LOG_WARN("User is not exist", "tenant_id", routine_key.tenant_id_, + "user_id", routine_key.user_id_, + K(ret)); + } else if (OB_FAIL(trans.start(sql_proxy_, tenant_id, refreshed_schema_version))) { + LOG_WARN("start transaction failed", KR(ret), K(tenant_id), K(refreshed_schema_version)); + } else { + ObDDLOperator ddl_operator(*schema_service_, *sql_proxy_); + if (OB_FAIL(ddl_operator.grant_routine(routine_key, + priv_set, + trans, + option))) { + LOG_WARN("fail to grant routine", K(ret), K(routine_key), K(priv_set)); + } + if (trans.is_started()) { + int temp_ret = OB_SUCCESS; + if (OB_SUCCESS != (temp_ret = trans.end(OB_SUCC(ret)))) { + LOG_WARN("trans end failed", "is_commit", OB_SUCCESS == ret, K(temp_ret)); + ret = (OB_SUCC(ret)) ? temp_ret : ret; + } + } + } + } + // publish schema if (OB_SUCC(ret)) { ret = publish_schema(tenant_id); @@ -32041,6 +32591,54 @@ int ObDDLService::create_routine(ObRoutineInfo &routine_info, } } } + lib::Worker::CompatMode compat_mode = lib::Worker::CompatMode::INVALID; + uint64_t data_version = 0; + if (OB_FAIL(ret)) { + } else if (replace) { + } else if (OB_FAIL(ObCompatModeGetter::get_tenant_mode(tenant_id, compat_mode))) { + LOG_WARN("failed to get compat mode", K(ret), K(tenant_id)); + } else if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, data_version))) { + LOG_WARN("fail to get data version", K(tenant_id)); + } else if (ObSQLUtils::is_data_version_ge_423_or_431(data_version) && lib::Worker::CompatMode::MYSQL == compat_mode) { + const ObSysVarSchema *sys_var = NULL; + ObMalloc alloc(ObModIds::OB_TEMP_VARIABLES); + ObObj val; + if (OB_FAIL(schema_guard.get_tenant_system_variable(tenant_id, SYS_VAR_AUTOMATIC_SP_PRIVILEGES, sys_var))) { + LOG_WARN("fail to get tenant var schema", K(ret)); + } else if (OB_ISNULL(sys_var)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("sys variable schema is null", KR(ret)); + } else if (OB_FAIL(sys_var->get_value(&alloc, NULL, val))) { + LOG_WARN("fail to get charset var value", K(ret)); + } else { + bool grant_priv = val.get_bool(); + if (grant_priv) { + int64_t db_id = routine_info.get_database_id(); + const ObDatabaseSchema* database_schema = NULL; + if (OB_FAIL(schema_guard.get_database_schema(tenant_id, db_id, database_schema))) { + LOG_WARN("get database schema failed", K(ret)); + } else if (OB_ISNULL(database_schema)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("database schema should not be null", K(ret)); + } else { + ObRoutinePrivSortKey routine_key(tenant_id, routine_info.get_owner_id(), + database_schema->get_database_name_str(), + routine_info.get_routine_name(), routine_info.is_procedure() ? + ObRoutineType::ROUTINE_PROCEDURE_TYPE : ObRoutineType::ROUTINE_FUNCTION_TYPE); + ObPrivSet priv_set = (OB_PRIV_EXECUTE | OB_PRIV_ALTER_ROUTINE); + int64_t option = 0; + const bool gen_ddl_stmt = false; + if (OB_FAIL(ddl_operator.grant_routine(routine_key, + priv_set, + trans, + option, + gen_ddl_stmt))) { + LOG_WARN("fail to grant routine", K(ret), K(routine_key), K(priv_set)); + } + } + } + } + } if (trans.is_started()) { int temp_ret = OB_SUCCESS; if (OB_SUCCESS != (temp_ret = trans.end(OB_SUCC(ret)))) { @@ -32048,7 +32646,6 @@ int ObDDLService::create_routine(ObRoutineInfo &routine_info, ret = (OB_SUCC(ret)) ? temp_ret : ret; } } - if (OB_SUCC(ret)) { if (OB_FAIL(publish_schema(tenant_id))) { LOG_WARN("publish schema failed", K(ret)); @@ -32119,6 +32716,48 @@ int ObDDLService::drop_routine(const ObRoutineInfo &routine_info, LOG_WARN("failed to modify obj status", K(ret)); } else if (OB_FAIL(ddl_operator.drop_routine(routine_info, trans, error_info, ddl_stmt_str))) { LOG_WARN("drop procedure failed", K(ret), K(routine_info)); + } else { + lib::Worker::CompatMode compat_mode = lib::Worker::CompatMode::INVALID; + uint64_t data_version = 0; + if (OB_FAIL(ObCompatModeGetter::get_tenant_mode(tenant_id, compat_mode))) { + LOG_WARN("failed to get compat mode", K(ret), K(tenant_id)); + } else if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, data_version))) { + LOG_WARN("fail to get data version", K(tenant_id)); + } else if (ObSQLUtils::is_data_version_ge_423_or_431(data_version) && lib::Worker::CompatMode::MYSQL == compat_mode) { + const ObSysVarSchema *sys_var = NULL; + ObMalloc alloc(ObModIds::OB_TEMP_VARIABLES); + ObObj val; + if (OB_FAIL(schema_guard.get_tenant_system_variable(tenant_id, SYS_VAR_AUTOMATIC_SP_PRIVILEGES, sys_var))) { + LOG_WARN("fail to get tenant var schema", K(ret)); + } else if (OB_ISNULL(sys_var)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("sys variable schema is null", KR(ret)); + } else if (OB_FAIL(sys_var->get_value(&alloc, NULL, val))) { + LOG_WARN("fail to get charset var value", K(ret)); + } else { + bool revoke_priv = val.get_bool(); + if (revoke_priv) { + int64_t db_id = routine_info.get_database_id(); + const ObDatabaseSchema* database_schema = NULL; + if (OB_FAIL(schema_guard.get_database_schema(tenant_id, db_id, database_schema))) { + LOG_WARN("get database schema failed", K(ret)); + } else if (OB_ISNULL(database_schema)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("database schema is null", K(ret)); + } else { + ObRoutinePrivSortKey routine_key(tenant_id, routine_info.get_owner_id(), + database_schema->get_database_name_str(), + routine_info.get_routine_name(), routine_info.is_procedure() ? + ObRoutineType::ROUTINE_PROCEDURE_TYPE : ObRoutineType::ROUTINE_FUNCTION_TYPE); + ObPrivSet priv_set = (OB_PRIV_EXECUTE | OB_PRIV_ALTER_ROUTINE); + bool gen_ddl_stmt = false; + if (OB_FAIL(ddl_operator.revoke_routine(routine_key, priv_set, trans, false, gen_ddl_stmt))) { + LOG_WARN("fail to grant routine", K(ret), K(routine_key), K(priv_set)); + } + } + } + } + } } if (trans.is_started()) { int temp_ret = OB_SUCCESS; @@ -33617,6 +34256,7 @@ int ObDDLService::check_user_exist(const share::schema::ObUserInfo &user_info) c int ret = OB_SUCCESS; bool is_user_name_exist = false; bool is_user_id_exist = false; + bool is_oracle_mode = false; if (OB_FAIL(check_inner_stat())) { LOG_WARN("variable is not init"); } else if (OB_FAIL(schema_service_->check_user_exist(user_info.get_tenant_id(), @@ -33628,8 +34268,10 @@ int ObDDLService::check_user_exist(const share::schema::ObUserInfo &user_info) c user_info.get_tenant_id(), user_info.get_user_id(), is_user_id_exist))) { LOG_WARN("Failed to check whether user exist", "tenant_id", user_info.get_tenant_id(), "user_id", user_info.get_user_id(), K(ret)); + } else if (OB_FAIL(ObCompatModeGetter::check_is_oracle_mode_with_tenant_id(user_info.get_tenant_id(), is_oracle_mode))) { + LOG_WARN("fail to check compat mode", K(ret)); } else if (is_user_name_exist || is_user_id_exist) { - ret = user_info.is_role() ? OB_ROLE_EXIST : OB_ERR_USER_EXIST; + ret = user_info.is_role() && is_oracle_mode ? OB_ROLE_EXIST : OB_ERR_USER_EXIST; LOG_WARN("User/role is exist, cannot create it twice,", "tenant_id", user_info.get_tenant_id(), "user_id", user_info.get_user_id(), @@ -33690,6 +34332,144 @@ int ObDDLService::replay_alter_user(const share::schema::ObUserInfo &user_info, } return ret; } + +int ObDDLService::create_mysql_roles_in_trans(const uint64_t tenant_id, + const bool if_not_exist, + ObIArray &user_infos) +{ + int ret = OB_SUCCESS; + ObSchemaGetterGuard schema_guard; + ObDDLSQLTransaction trans(schema_service_); + ObSqlString ddl_stmt_str; + ObSqlString exist_user_str; + bool role_exist_error = false; + ObSchemaService *schema_service_impl = NULL; + ObArray skip_index; + + if (OB_FAIL(check_inner_stat())) { + LOG_WARN("variable is not init"); + } else if (OB_ISNULL(schema_service_impl = schema_service_->get_schema_service())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("schema_service impl is null", KR(ret)); + } else if (OB_FAIL(get_tenant_schema_guard_with_version_in_inner_table(tenant_id, schema_guard))) { + LOG_WARN("fail to get schema guard with version in inner table", K(ret), K(tenant_id)); + } + + for (int i = 0; OB_SUCC(ret) && i < user_infos.count(); i++) { + share::schema::ObUserInfo &user_info = user_infos.at(i); + if (!user_info.is_role()) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid arg", K(ret)); + } else if (OB_FAIL(check_user_exist(user_info))) { + if (OB_ERR_USER_EXIST == ret) { + ret = OB_SUCCESS; + if (if_not_exist) { + LOG_USER_NOTE(OB_ERR_USER_ALREADY_EXISTS, + user_infos.at(i).get_user_name_str().length(), + user_infos.at(i).get_user_name_str().ptr(), + user_infos.at(i).get_host_name_str().length(), + user_infos.at(i).get_host_name_str().ptr()); + if (OB_FAIL(skip_index.push_back(i))) { + LOG_WARN("fail to push back", K(ret)); + } + } else { + role_exist_error = true; + if (OB_FAIL(exist_user_str.append_fmt("'%.*s'@'%.*s',", + user_info.get_user_name_str().length(), + user_info.get_user_name_str().ptr(), + user_info.get_host_name_str().length(), + user_info.get_host_name_str().ptr()))) { + LOG_WARN("fail to append str", K(ret)); + } + } + } else { + LOG_WARN("fail to check user exist", K(ret)); + } + } + } + + if (OB_SUCC(ret) && role_exist_error) { + ret = OB_CANNOT_USER; + if (exist_user_str.length() > 0) { + exist_user_str.set_length(exist_user_str.length() - 1); + } + LOG_USER_ERROR(OB_CANNOT_USER, (int)strlen("CREATE ROLE"), "CREATE ROLE", + exist_user_str.string().length(), exist_user_str.string().ptr()); + } + + if (OB_SUCC(ret) && skip_index.count() < user_infos.count()) { + + if (OB_SUCC(ret)) { + if (OB_FAIL(ddl_stmt_str.append("CREATE ROLE "))) { + LOG_WARN("fail to append", K(ret)); + } + for (int i = 0; OB_SUCC(ret) && i < user_infos.count(); i++) { + share::schema::ObUserInfo &user_info = user_infos.at(i); + if (has_exist_in_array(skip_index, i)) { + //skip + } else if (OB_FAIL(ddl_stmt_str.append_fmt("`%.*s`@`%.*s`,", + user_info.get_user_name_str().length(), + user_info.get_user_name_str().ptr(), + user_info.get_host_name_str().length(), + user_info.get_host_name_str().ptr()))) { + LOG_WARN("fail to append str", K(ret)); + } + } + if (OB_SUCC(ret) && ddl_stmt_str.length() > 0) { + ddl_stmt_str.set_length(ddl_stmt_str.length() - 1); + } + } + + if (OB_SUCC(ret)) { + int64_t refreshed_schema_version = 0; + if (OB_FAIL(schema_guard.get_schema_version(tenant_id, refreshed_schema_version))) { + LOG_WARN("failed to get tenant schema version", KR(ret), K(tenant_id)); + } else if (OB_FAIL(trans.start(sql_proxy_, tenant_id, refreshed_schema_version))) { + LOG_WARN("Failed to start trans", KR(ret), K(tenant_id), K(refreshed_schema_version)); + } + } + + for (int i = 0; OB_SUCC(ret) && i < user_infos.count(); i++) { + share::schema::ObUserInfo &user_info = user_infos.at(i); + if (has_exist_in_array(skip_index, i)) { + //skip + } else { + uint64_t new_user_id = user_info.get_user_id(); + if (OB_FAIL(schema_service_impl->fetch_new_user_id( + user_info.get_tenant_id(), new_user_id))) { + LOG_WARN("Failed to fetch new_user_id", K(ret)); + } else { + user_info.set_user_id(new_user_id); + } + if (OB_SUCC(ret)) { + ObDDLOperator ddl_operator(*schema_service_, *sql_proxy_); + ObString ddl_sql = ddl_stmt_str.string(); + if (OB_FAIL(ddl_operator.create_user(user_info, (0 == i) ? &ddl_sql : NULL, trans))) { + LOG_WARN("Failed to create user", K(ret)); + } + } + } + } + + if (trans.is_started()) { + int temp_ret = OB_SUCCESS; + if (OB_SUCCESS != (temp_ret = trans.end(OB_SUCC(ret)))) { + LOG_WARN("trans end failed", "is_commit", OB_SUCCESS == ret, K(temp_ret)); + ret = (OB_SUCC(ret)) ? temp_ret : ret; + } + } + + // publish schema + if (OB_SUCC(ret)) { + ret = publish_schema(tenant_id); + if (OB_FAIL(ret)) { + LOG_WARN("publish schema failed", K(ret)); + } + } + } + return ret; +} + int ObDDLService::create_user_in_trans(share::schema::ObUserInfo &user_info, uint64_t creator_id, uint64_t &user_id, @@ -35336,6 +36116,18 @@ int ObDDLService::init_system_variables( SET_TENANT_VARIABLE(SYS_VAR_OB_COMPATIBILITY_MODE, compat_mode_value); } + if (OB_SUCC(ret)) { + char version[common::OB_CLUSTER_VERSION_LENGTH] = {0}; + int64_t len = ObClusterVersion::print_version_str( + version, common::OB_CLUSTER_VERSION_LENGTH, DATA_CURRENT_VERSION); + SET_TENANT_VARIABLE(SYS_VAR_PRIVILEGE_FEATURES_ENABLE, ObString(len, version)); + } + + if (OB_SUCC(ret)) { + ObString enable = "1"; + SET_TENANT_VARIABLE(SYS_VAR__ENABLE_MYSQL_PL_PRIV_CHECK, enable); + } + // If the user does not specify parallel_servers_target when creating tenant, // then calculate a default value based on cpu_count. // Considering that a tenant may have multiple resource pools, it is currently rudely considered diff --git a/src/rootserver/ob_ddl_service.h b/src/rootserver/ob_ddl_service.h index 00c4e12481..00ce51fc7d 100644 --- a/src/rootserver/ob_ddl_service.h +++ b/src/rootserver/ob_ddl_service.h @@ -816,8 +816,9 @@ int check_table_udt_id_is_exist(share::schema::ObSchemaGetterGuard &schema_guard share::schema::ObSchemaGetterGuard &schema_guard); int exists_role_grant_cycle(share::schema::ObSchemaGetterGuard &schema_guard, const uint64_t tenant_id, - uint64_t role_id, - const share::schema::ObUserInfo *user_info); + const ObUserInfo &role_info, + const share::schema::ObUserInfo *user_info, + const bool is_oracle_mode); virtual int grant(const obrpc::ObGrantArg &arg); int revoke(const obrpc::ObRevokeUserArg &arg); virtual int grant_priv_to_user(const uint64_t tenant_id, @@ -845,6 +846,25 @@ int check_table_udt_id_is_exist(share::schema::ObSchemaGetterGuard &schema_guard const common::ObString *ddl_stmt_str, share::schema::ObSchemaGetterGuard &schema_guard); + int grant_or_revoke_column_priv_mysql(const uint64_t tenant_id, + const uint64_t table_id, + const uint64_t user_id, + const ObString& user_name, + const ObString& host_name, + const ObString& db, + const ObString& table, + const ObIArray> &column_names_priv, + ObDDLOperator &ddl_operator, + ObDDLSQLTransaction &trans, + ObSchemaGetterGuard &schema_guard, + const bool is_grant); + + int grant_table_and_column_mysql(const obrpc::ObGrantArg &arg, + uint64_t user_id, + const ObString &user_name, + const ObString &host_name, + const ObNeedPriv &need_priv, + share::schema::ObSchemaGetterGuard &schema_guard); int lock_user(const obrpc::ObLockUserArg &arg, common::ObIArray &failed_index); int standby_grant(const obrpc::ObStandbyGrantArg &arg); @@ -883,11 +903,24 @@ int check_table_udt_id_is_exist(share::schema::ObSchemaGetterGuard &schema_guard const uint64_t option, const share::schema::ObObjPrivSortKey &obj_key, share::schema::ObSchemaGetterGuard &schema_guard); - virtual int revoke_table(const share::schema::ObTablePrivSortKey &table_key, + + virtual int grant_routine( + const share::schema::ObRoutinePrivSortKey &routine_key, + const ObPrivSet priv_set, + const ObString *ddl_stmt_str, + const uint64_t option, + share::schema::ObSchemaGetterGuard &schema_guard); + + virtual int revoke_routine( + const share::schema::ObRoutinePrivSortKey &routine_key, + const ObPrivSet priv_set); + virtual int revoke_table(const obrpc::ObRevokeTableArg &arg, + const share::schema::ObTablePrivSortKey &table_key, const ObPrivSet priv_set, const share::schema::ObObjPrivSortKey &obj_key, const share::ObRawObjPrivArray &obj_priv_array, const bool revoke_all_ora); + virtual int revoke_table_and_column_mysql(const obrpc::ObRevokeTableArg& arg); //----End of functions for managing privileges---- //----Functions for managing outlines---- virtual int check_outline_exist(share::schema::ObOutlineInfo &Outline_info, @@ -2020,6 +2053,9 @@ private: ObMySQLTransaction &trans); public: + int check_parallel_ddl_conflict( + share::schema::ObSchemaGetterGuard &schema_guard, + const obrpc::ObDDLArg &arg); int construct_zone_region_list( common::ObIArray &zone_region_list, const common::ObIArray &zone_list); @@ -2216,6 +2252,10 @@ private: uint64_t creator_id, uint64_t &user_id, share::schema::ObSchemaGetterGuard &schema_guard); + + int create_mysql_roles_in_trans(const uint64_t tenant_id, + const bool if_not_exist, + common::ObIArray &user_infos); int replay_alter_user(const share::schema::ObUserInfo &user_info, share::schema::ObSchemaGetterGuard &schema_guard); int set_passwd_in_trans(const uint64_t tenant_id, @@ -2245,7 +2285,7 @@ private: const common::ObString *ddl_stmt_str, share::schema::ObSchemaGetterGuard &schema_guard); int drop_user_in_trans(const uint64_t tenant_id, - const uint64_t user_id, + const common::ObIArray &user_ids, const ObString *ddl_stmt_str); //----End of Functions for managing privileges---- diff --git a/src/rootserver/ob_ddl_sql_generator.cpp b/src/rootserver/ob_ddl_sql_generator.cpp index 61cdabb9c4..a83ef6a492 100644 --- a/src/rootserver/ob_ddl_sql_generator.cpp +++ b/src/rootserver/ob_ddl_sql_generator.cpp @@ -79,8 +79,6 @@ int ObDDLSqlGenerator::get_priv_name(const int64_t priv, const char *&name) name = "RENAME"; break; case OB_PRIV_REFERENCES: name = "REFERENCES"; break; - case OB_PRIV_EXECUTE: - name = "EXECUTE"; break; case OB_PRIV_FLASHBACK: name = "FLASHBACK"; break; case OB_PRIV_READ: @@ -105,6 +103,12 @@ int ObDDLSqlGenerator::get_priv_name(const int64_t priv, const char *&name) name = "DROP DATABASE LINK"; break; case OB_PRIV_CREATE_DATABASE_LINK: name = "CREATE DATABASE LINK"; break; + case OB_PRIV_EXECUTE: + name = "EXECUTE"; break; + case OB_PRIV_ALTER_ROUTINE: + name = "ALTER ROUTINE"; break; + case OB_PRIV_CREATE_ROUTINE: + name = "CREATE ROUTINE"; break; default: { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid priv", K(ret), K(priv)); @@ -638,6 +642,94 @@ int ObDDLSqlGenerator::gen_table_priv_sql(const obrpc::ObAccountArg &account, return ret; } +int ObDDLSqlGenerator::gen_column_priv_sql(const obrpc::ObAccountArg &account, + const ObNeedPriv &need_priv, + const bool is_grant, + ObSqlString &sql_string) +{ + int ret = OB_SUCCESS; + sql_string.reset(); + char GRANT_COLUMN_SQL[] = "GRANT %s(%.*s) ON `%.*s`.`%.*s` TO `%.*s`"; + char REVOKE_COLUMN_SQL[] = "REVOKE %s(%.*s) ON `%.*s`.`%.*s` FROM `%.*s`"; + char NEW_GRANT_COLUMN_SQL[] = "GRANT %s(%.*s) ON `%.*s`.`%.*s` TO `%.*s`@`%.*s`"; + char NEW_REVOKE_COLUMN_SQL[] = "REVOKE %s(%.*s) ON `%.*s`.`%.*s` FROM `%.*s`@`%.*s`"; + ObSqlString priv_string; + if (OB_UNLIKELY(need_priv.db_.empty()) || OB_UNLIKELY(need_priv.table_.empty()) || OB_UNLIKELY(!account.is_valid())) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("db or table or user_name is empty", K(need_priv), K(account), K(ret)); + } else if (need_priv.priv_level_ != OB_PRIV_TABLE_LEVEL) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("priv level is invalid", K(need_priv), K(ret)); + } else if (need_priv.priv_set_ & (~(OB_PRIV_TABLE_ACC | OB_PRIV_GRANT))) { + ret = OB_ILLEGAL_GRANT_FOR_TABLE; + LOG_WARN("Grant/Revoke privilege than can not be used", + "priv_type", ObPrintPrivSet(need_priv.priv_set_), K(ret)); + } else if ((need_priv.priv_set_ & OB_PRIV_TABLE_ACC) == OB_PRIV_TABLE_ACC) { + if (OB_FAIL(priv_string.append("ALL PRIVILEGES"))) { + LOG_WARN("append sql failed", K(ret)); + } else if (!is_grant) { + if ((need_priv.priv_set_ & OB_PRIV_GRANT)) { + if (OB_FAIL(priv_string.append(", GRANT OPTION"))) { + LOG_WARN("append sql failed", K(ret)); + } + } + } + } else if (OB_FAIL(priv_to_name(need_priv.priv_set_, priv_string))) { + LOG_WARN("get priv to name failed", K(ret)); + } + ObSqlString columns_string; + for (int64_t i = 0; OB_SUCC(ret) && i < need_priv.columns_.count(); i++) { + if (i != 0 && OB_FAIL(columns_string.append(","))) { + LOG_WARN("append failed", K(ret)); + } else if (OB_FAIL(columns_string.append(need_priv.columns_.at(i)))) { + LOG_WARN("append failed", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (0 == account.host_name_.compare(OB_DEFAULT_HOST_NAME)) { + if (OB_FAIL(sql_string.append_fmt(adjust_ddl_format_str(is_grant ? GRANT_COLUMN_SQL : REVOKE_COLUMN_SQL), + priv_string.string().ptr(), + columns_string.string().length(), + columns_string.string().ptr(), + need_priv.db_.length(), + need_priv.db_.ptr(), + need_priv.table_.length(), + need_priv.table_.ptr(), + account.user_name_.length(), + account.user_name_.ptr()))) { + LOG_WARN("append sql failed", K(ret)); + } + } else { + if (OB_FAIL(sql_string.append_fmt(adjust_ddl_format_str(is_grant ? NEW_GRANT_COLUMN_SQL : NEW_REVOKE_COLUMN_SQL), + priv_string.string().ptr(), + columns_string.string().length(), + columns_string.string().ptr(), + need_priv.db_.length(), + need_priv.db_.ptr(), + need_priv.table_.length(), + need_priv.table_.ptr(), + account.user_name_.length(), + account.user_name_.ptr(), + account.host_name_.length(), + account.host_name_.ptr()))) { + LOG_WARN("append sql failed", K(ret)); + } + } + } + + if (OB_SUCC(ret) && is_grant) { + if (need_priv.priv_set_ & OB_PRIV_GRANT) { + if (OB_FAIL(sql_string.append(" WITH GRANT OPTION"))) { + LOG_WARN("append sql failed", K(ret)); + } + } + } + LOG_DEBUG("gen table priv sql", K(sql_string.string()), K(priv_string.string()), + K(need_priv), K(is_grant), K(account)); + return ret; +} + int ObDDLSqlGenerator::gen_table_priv_sql_ora(const obrpc::ObAccountArg &account, const ObTablePrivSortKey &table_priv_key, const bool revoke_all_flag, @@ -698,6 +790,77 @@ int ObDDLSqlGenerator::gen_table_priv_sql_ora(const obrpc::ObAccountArg &account return ret; } +int ObDDLSqlGenerator::gen_routine_priv_sql(const obrpc::ObAccountArg &account, + const ObNeedPriv &need_priv, + const bool is_grant, + ObSqlString &sql_string) +{ + int ret = OB_SUCCESS; + char GRANT_PROCEDURE_SQL[] = "GRANT %s ON PROCEDURE `%.*s`.`%.*s` TO `%.*s`"; + char REVOKE_PROCEDURE_SQL[] = "REVOKE %s ON PROCEDURE `%.*s`.`%.*s` FROM `%.*s`"; + char GRANT_FUNCTION_SQL[] = "GRANT %s ON FUNCTION `%.*s`.`%.*s` TO `%.*s`"; + char REVOKE_FUNCTION_SQL[] = "REVOKE %s ON FUNCTION `%.*s`.`%.*s` FROM `%.*s`"; + char NEW_GRANT_PROCEDURE_SQL[] = "GRANT %s ON PROCEDURE `%.*s`.`%.*s` TO `%.*s`@`%.*s`"; + char NEW_REVOKE_PROCEDURE_SQL[] = "REVOKE %s ON PROCEDURE `%.*s`.`%.*s` FROM `%.*s`@`%.*s`"; + char NEW_GRANT_FUNCTION_SQL[] = "GRANT %s ON FUNCTION `%.*s`.`%.*s` TO `%.*s`@`%.*s`"; + char NEW_REVOKE_FUNCTION_SQL[] = "REVOKE %s ON FUNCTION `%.*s`.`%.*s` FROM `%.*s`@`%.*s`"; + ObSqlString priv_string; + if (OB_UNLIKELY(need_priv.db_.empty()) || OB_UNLIKELY(need_priv.table_.empty()) || OB_UNLIKELY(!account.is_valid())) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("db or table or user_name is empty", K(need_priv), K(account), K(ret)); + } else if (need_priv.priv_level_ != OB_PRIV_ROUTINE_LEVEL) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("priv level is invalid", K(need_priv), K(ret)); + } else if (need_priv.priv_set_ & (~(OB_PRIV_ROUTINE_ACC | OB_PRIV_GRANT))) { + ret = OB_ILLEGAL_GRANT_FOR_TABLE; + LOG_WARN("Grant/Revoke privilege than can not be used", + "priv_type", ObPrintPrivSet(need_priv.priv_set_), K(ret)); + } else if (OB_FAIL(priv_to_name(need_priv.priv_set_, priv_string))) { + LOG_WARN("get priv to name failed", K(ret)); + } + + if (OB_SUCC(ret)) { + if (0 == account.host_name_.compare(OB_DEFAULT_HOST_NAME)) { + if (OB_FAIL(sql_string.append_fmt(adjust_ddl_format_str(is_grant ? (need_priv.obj_type_ == ObObjectType::PROCEDURE ? GRANT_PROCEDURE_SQL : GRANT_FUNCTION_SQL) + : (need_priv.obj_type_ == ObObjectType::PROCEDURE ? REVOKE_PROCEDURE_SQL : REVOKE_FUNCTION_SQL)), + priv_string.string().ptr(), + need_priv.db_.length(), + need_priv.db_.ptr(), + need_priv.table_.length(), + need_priv.table_.ptr(), + account.user_name_.length(), + account.user_name_.ptr()))) { + LOG_WARN("append sql failed", K(ret)); + } + } else { + if (OB_FAIL(sql_string.append_fmt(adjust_ddl_format_str(is_grant ? (need_priv.obj_type_ == ObObjectType::PROCEDURE ? NEW_GRANT_PROCEDURE_SQL : NEW_GRANT_FUNCTION_SQL) + : (need_priv.obj_type_ == ObObjectType::PROCEDURE ? NEW_REVOKE_PROCEDURE_SQL : NEW_REVOKE_FUNCTION_SQL)), + priv_string.string().ptr(), + need_priv.db_.length(), + need_priv.db_.ptr(), + need_priv.table_.length(), + need_priv.table_.ptr(), + account.user_name_.length(), + account.user_name_.ptr(), + account.host_name_.length(), + account.host_name_.ptr()))) { + LOG_WARN("append sql failed", K(ret)); + } + } + } + + if (OB_SUCC(ret) && is_grant) { + if (need_priv.priv_set_ & OB_PRIV_GRANT) { + if (OB_FAIL(sql_string.append(" WITH GRANT OPTION"))) { + LOG_WARN("append sql failed", K(ret)); + } + } + } + LOG_DEBUG("gen routine priv sql", K(sql_string.string()), K(priv_string.string()), + K(need_priv), K(is_grant), K(account)); + return ret; +} + int ObDDLSqlGenerator::gen_db_priv_sql(const obrpc::ObAccountArg &account, const ObNeedPriv &need_priv, const bool is_grant, diff --git a/src/rootserver/ob_ddl_sql_generator.h b/src/rootserver/ob_ddl_sql_generator.h index 18bb3b6814..4c94d51af3 100644 --- a/src/rootserver/ob_ddl_sql_generator.h +++ b/src/rootserver/ob_ddl_sql_generator.h @@ -89,7 +89,11 @@ public: const bool revoke_all_flag, const share::ObRawObjPrivArray &obj_priv_array, const bool is_grant, - common::ObSqlString &sql_string); + common::ObSqlString &sql_string); + static int gen_routine_priv_sql(const obrpc::ObAccountArg &account, + const share::schema::ObNeedPriv &need_priv, + const bool is_grant, + common::ObSqlString &sql_string); static int gen_audit_stmt_sql(const common::ObString &username, const share::schema::ObSAuditModifyType modify_type, const share::schema::ObSAuditSchema &audit_schema, @@ -103,6 +107,10 @@ public: const share::schema::ObSAuditOperByType by_type, const share::schema::ObSAuditOperWhenType when_type, common::ObSqlString &sql_string); + static int gen_column_priv_sql(const obrpc::ObAccountArg &account, + const share::schema::ObNeedPriv &need_priv, + const bool is_grant, + ObSqlString &sql_string); private: static int get_priv_name(const int64_t priv, const char *&name); diff --git a/src/rootserver/ob_root_service.cpp b/src/rootserver/ob_root_service.cpp index 54005d5c83..df65fc056f 100755 --- a/src/rootserver/ob_root_service.cpp +++ b/src/rootserver/ob_root_service.cpp @@ -5790,29 +5790,7 @@ int ObRootService::check_parallel_ddl_conflict( share::schema::ObSchemaGetterGuard &schema_guard, const obrpc::ObDDLArg &arg) { - int ret = OB_SUCCESS; - int64_t schema_version = OB_INVALID_VERSION; - - if (arg.is_need_check_based_schema_objects()) { - for (int64_t i = 0; OB_SUCC(ret) && (i < arg.based_schema_object_infos_.count()); ++i) { - const ObBasedSchemaObjectInfo &info = arg.based_schema_object_infos_.at(i); - if (OB_FAIL(schema_guard.get_schema_version( - info.schema_type_, - info.schema_tenant_id_ == OB_INVALID_TENANT_ID ? arg.exec_tenant_id_: info.schema_tenant_id_, - info.schema_id_, - schema_version))) { - LOG_WARN("failed to get_schema_version", K(ret), K(arg.exec_tenant_id_), K(info)); - } else if (OB_INVALID_VERSION == schema_version) { - ret = OB_ERR_PARALLEL_DDL_CONFLICT; - LOG_WARN("schema_version is OB_INVALID_VERSION", K(ret), K(info)); - } else if (schema_version != info.schema_version_) { - ret = OB_ERR_PARALLEL_DDL_CONFLICT; - LOG_WARN("schema_version is not equal to info.schema_version_", K(ret), K(schema_version), K(info)); - } - } - } - - return ret; + return ddl_service_.check_parallel_ddl_conflict(schema_guard, arg); } int ObRootService::init_sequence_id() @@ -6186,7 +6164,17 @@ int ObRootService::grant(const ObGrantArg &arg) ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid arg", K(arg), K(ret)); } else { - if (OB_FAIL(ddl_service_.grant(arg))) { + lib::Worker::CompatMode compat_mode = lib::Worker::CompatMode::INVALID; + if (OB_FAIL(ObCompatModeGetter::get_tenant_mode(arg.tenant_id_, compat_mode))) { + LOG_WARN("failed to get compat mode", K(ret), K(arg.tenant_id_)); + } else if (lib::Worker::CompatMode::ORACLE == compat_mode) { + //do nothing + } else if (arg.column_names_priv_.count() != 0 + && OB_FAIL(ObSQLUtils::compatibility_check_for_mysql_role_and_column_priv(arg.tenant_id_))) { + LOG_WARN("grant or revoke column priv is not suppported", KR(ret)); + } + if (OB_FAIL(ret)) { + } else if (OB_FAIL(ddl_service_.grant(arg))) { LOG_WARN("Grant user failed", K(arg), K(ret)); } } @@ -6342,13 +6330,16 @@ int ObRootService::revoke_database(const ObRevokeDBArg &arg) int ObRootService::revoke_table(const ObRevokeTableArg &arg) { int ret = OB_SUCCESS; + lib::Worker::CompatMode mode; if (!inited_) { ret = OB_NOT_INIT; LOG_WARN("not init", K(ret)); } else if (!arg.is_valid()) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid arg", K(arg), K(ret)); - } else { + } else if (OB_FAIL(ObCompatModeGetter::get_tenant_mode(arg.tenant_id_, mode))) { + LOG_WARN("fail to get tenant mode", K(ret)); + } else if (lib::Worker::CompatMode::ORACLE == mode) { ObTablePrivSortKey table_priv_key(arg.tenant_id_, arg.user_id_, arg.db_, arg.table_); ObObjPrivSortKey obj_priv_key(arg.tenant_id_, arg.obj_id_, @@ -6356,15 +6347,46 @@ int ObRootService::revoke_table(const ObRevokeTableArg &arg) OBJ_LEVEL_FOR_TAB_PRIV, arg.grantor_id_, arg.user_id_); - OZ (ddl_service_.revoke_table(table_priv_key, + OZ (ddl_service_.revoke_table(arg, + table_priv_key, arg.priv_set_, obj_priv_key, arg.obj_priv_array_, arg.revoke_all_ora_)); + } else if (lib::Worker::CompatMode::MYSQL == mode) { + if (arg.column_names_priv_.count() != 0 + && OB_FAIL(ObSQLUtils::compatibility_check_for_mysql_role_and_column_priv(arg.tenant_id_))) { + LOG_WARN("grant or revoke column priv is not suppported", KR(ret)); + } else if (OB_FAIL(ddl_service_.revoke_table_and_column_mysql(arg))) { + LOG_WARN("revoke table and col failed", K(ret)); + } + } else { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected feature action", K(ret)); } return ret; } +int ObRootService::revoke_routine(const ObRevokeRoutineArg &arg) +{ + int ret = OB_SUCCESS; + if (!inited_) { + ret = OB_NOT_INIT; + LOG_WARN("not init", K(ret)); + } else if (!arg.is_valid()) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid arg", K(arg), K(ret)); + } else { + ObRoutinePrivSortKey routine_priv_key(arg.tenant_id_, arg.user_id_, arg.db_, arg.routine_, + (arg.obj_type_ == (int64_t)ObObjectType::PROCEDURE) ? ObRoutineType::ROUTINE_PROCEDURE_TYPE + : (arg.obj_type_ == (int64_t)ObObjectType::FUNCTION) ? ObRoutineType::ROUTINE_FUNCTION_TYPE + : ObRoutineType::INVALID_ROUTINE_TYPE); + OZ (ddl_service_.revoke_routine(routine_priv_key, arg.priv_set_)); + } + return ret; +} + + int ObRootService::revoke_syspriv(const ObRevokeSysPrivArg &arg) { int ret = OB_SUCCESS; diff --git a/src/rootserver/ob_root_service.h b/src/rootserver/ob_root_service.h index 3f33f8a47d..a08e583cfe 100644 --- a/src/rootserver/ob_root_service.h +++ b/src/rootserver/ob_root_service.h @@ -546,6 +546,7 @@ public: int lock_user(const obrpc::ObLockUserArg &arg, common::ObSArray &failed_index); int revoke_database(const obrpc::ObRevokeDBArg &arg); int revoke_table(const obrpc::ObRevokeTableArg &arg); + int revoke_routine(const obrpc::ObRevokeRoutineArg &arg); int revoke_syspriv(const obrpc::ObRevokeSysPrivArg &arg); int alter_user_profile(const obrpc::ObAlterUserProfileArg &arg); int alter_role(const obrpc::ObAlterRoleArg &arg); diff --git a/src/rootserver/ob_rs_rpc_processor.h b/src/rootserver/ob_rs_rpc_processor.h index 971b6fa1d9..298408edca 100644 --- a/src/rootserver/ob_rs_rpc_processor.h +++ b/src/rootserver/ob_rs_rpc_processor.h @@ -362,6 +362,7 @@ DEFINE_DDL_RS_RPC_PROCESSOR(obrpc::OB_ALTER_USER_PROFILE, ObRpcAlterUserProfileP DEFINE_DDL_RS_RPC_PROCESSOR(obrpc::OB_SECURITY_AUDIT, ObRpcSecurityAuditP, handle_security_audit(arg_)); DEFINE_DDL_RS_RPC_PROCESSOR(obrpc::OB_REVOKE_DB, ObRpcRevokeDBP, revoke_database(arg_)); DEFINE_DDL_RS_RPC_PROCESSOR(obrpc::OB_REVOKE_TABLE, ObRpcRevokeTableP, revoke_table(arg_)); +DEFINE_DDL_RS_RPC_PROCESSOR(obrpc::OB_REVOKE_ROUTINE, ObRpcRevokeRoutineP, revoke_routine(arg_)); DEFINE_DDL_RS_RPC_PROCESSOR(obrpc::OB_REVOKE_SYSPRIV, ObRpcRevokeSysPrivP, revoke_syspriv(arg_)); DEFINE_DDL_RS_RPC_PROCESSOR(obrpc::OB_UPDATE_INDEX_TABLE_STATUS, ObUpdateIndexTableStatusP, update_index_status(arg_)); DEFINE_DDL_RS_RPC_PROCESSOR(obrpc::OB_UPDATE_MVIEW_TABLE_STATUS, ObRpcUpdateMViewTableStatusP, update_mview_status(arg_)); @@ -411,6 +412,7 @@ DEFINE_RS_RPC_PROCESSOR(obrpc::OB_STOP_ZONE, ObRpcStopZoneP, stop_zone(arg_)); DEFINE_RS_RPC_PROCESSOR(obrpc::OB_ALTER_ZONE, ObRpcAlterZoneP, alter_zone(arg_)); DEFINE_RS_RPC_PROCESSOR(obrpc::OB_CHECK_DANGLING_REPLICA_FINISH, ObCheckDanglingReplicaFinishP, check_dangling_replica_finish(arg_)); + DEFINE_DDL_RS_RPC_PROCESSOR(obrpc::OB_CREATE_OUTLINE, ObRpcCreateOutlineP, create_outline(arg_)); DEFINE_DDL_RS_RPC_PROCESSOR(obrpc::OB_ALTER_OUTLINE, ObRpcAlterOutlineP, alter_outline(arg_)); DEFINE_DDL_RS_RPC_PROCESSOR(obrpc::OB_DROP_OUTLINE, ObRpcDropOutlineP, drop_outline(arg_)); diff --git a/src/rootserver/ob_schema_history_recycler.cpp b/src/rootserver/ob_schema_history_recycler.cpp index 0955d5ba8d..12db7e5504 100644 --- a/src/rootserver/ob_schema_history_recycler.cpp +++ b/src/rootserver/ob_schema_history_recycler.cpp @@ -922,6 +922,11 @@ int ObSchemaHistoryRecycler::try_recycle_schema_history( rls_context_id); ret = OB_SUCCESS; // overwrite ret + // --------------------------- column priv --------------------------------------------------- + RECYCLE_FIRST_SCHEMA(RECYCLE_AND_COMPRESS, column_priv, OB_ALL_COLUMN_PRIVILEGE_HISTORY_TNAME, + priv_id); + ret = OB_SUCCESS; // overwrite ret + #undef RECYCLE_FIRST_SCHEMA int64_t cost_ts = ObTimeUtility::current_time() - start_ts; ROOTSERVICE_EVENT_ADD("schema_recycler", "batch_recycle_by_tenant", diff --git a/src/rootserver/parallel_ddl/ob_create_table_helper.cpp b/src/rootserver/parallel_ddl/ob_create_table_helper.cpp index d9fa135c7f..2906643c2d 100644 --- a/src/rootserver/parallel_ddl/ob_create_table_helper.cpp +++ b/src/rootserver/parallel_ddl/ob_create_table_helper.cpp @@ -440,7 +440,7 @@ int ObCreateTableHelper::lock_objects_by_id_() if (OB_ISNULL(col)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get column schema failed", KR(ret)); - } else if (col->is_extend()) { + } else if (col->get_meta_type().is_user_defined_sql_type()) { const uint64_t udt_id = col->get_sub_data_type(); if (is_inner_object_id(udt_id) && !is_sys_tenant(tenant_id_)) { // can't add object lock across tenant, assumed that sys inner udt won't be changed. @@ -1041,7 +1041,7 @@ int ObCreateTableHelper::generate_table_schema_() if (OB_ISNULL(col)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get column schema failed", KR(ret)); - } else if (col->is_extend()) { + } else if (col->get_meta_type().is_user_defined_sql_type()) { const uint64_t udt_id = col->get_sub_data_type(); const ObUDTTypeInfo *udt_info = NULL; if (is_inner_object_id(udt_id) && !is_sys_tenant(tenant_id_)) { diff --git a/src/share/inner_table/ob_inner_table_schema.12401_12450.cpp b/src/share/inner_table/ob_inner_table_schema.12401_12450.cpp index 901cfa8c2b..4247e595f8 100644 --- a/src/share/inner_table/ob_inner_table_schema.12401_12450.cpp +++ b/src/share/inner_table/ob_inner_table_schema.12401_12450.cpp @@ -11685,6 +11685,376 @@ int ObInnerTableSchema::all_virtual_checkpoint_diagnose_info_schema(ObTableSchem return ret; } +int ObInnerTableSchema::all_virtual_routine_privilege_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_ROUTINE_PRIVILEGE_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(5); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_ROUTINE_PRIVILEGE_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tenant_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("user_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("database_name", //column_name + ++column_id, //column_id + 3, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_DATABASE_NAME_BINARY_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("routine_name", //column_name + ++column_id, //column_id + 4, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_ROUTINE_NAME_BINARY_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("routine_type", //column_name + ++column_id, //column_id + 5, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA_TS("gmt_create", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(ObPreciseDateTime), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false, //is_autoincrement + false); //is_on_update_for_timestamp + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA_TS("gmt_modified", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(ObPreciseDateTime), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false, //is_autoincrement + false); //is_on_update_for_timestamp + } + + if (OB_SUCC(ret)) { + ObObj all_priv_default; + all_priv_default.set_int(0); + ADD_COLUMN_SCHEMA_T("all_priv", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false, //is_autoincrement + all_priv_default, + all_priv_default); //default_value + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::all_virtual_routine_privilege_history_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_ROUTINE_PRIVILEGE_HISTORY_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(6); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_ROUTINE_PRIVILEGE_HISTORY_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tenant_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("user_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("database_name", //column_name + ++column_id, //column_id + 3, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_DATABASE_NAME_BINARY_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("routine_name", //column_name + ++column_id, //column_id + 4, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_ROUTINE_NAME_BINARY_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("routine_type", //column_name + ++column_id, //column_id + 5, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("schema_version", //column_name + ++column_id, //column_id + 6, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA_TS("gmt_create", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(ObPreciseDateTime), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false, //is_autoincrement + false); //is_on_update_for_timestamp + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA_TS("gmt_modified", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(ObPreciseDateTime), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false, //is_autoincrement + false); //is_on_update_for_timestamp + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("is_deleted", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ObObj all_priv_default; + all_priv_default.set_int(0); + ADD_COLUMN_SCHEMA_T("all_priv", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false, //is_autoincrement + all_priv_default, + all_priv_default); //default_value + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_virtual_aux_stat_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.12451_12500.cpp b/src/share/inner_table/ob_inner_table_schema.12451_12500.cpp index 22e98ce24b..aa03c1b31a 100644 --- a/src/share/inner_table/ob_inner_table_schema.12451_12500.cpp +++ b/src/share/inner_table/ob_inner_table_schema.12451_12500.cpp @@ -1382,6 +1382,406 @@ int ObInnerTableSchema::all_virtual_index_usage_info_schema(ObTableSchema &table return ret; } +int ObInnerTableSchema::all_virtual_column_privilege_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_COLUMN_PRIVILEGE_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(2); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_COLUMN_PRIVILEGE_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tenant_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("priv_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA_TS("gmt_create", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(ObPreciseDateTime), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false, //is_autoincrement + false); //is_on_update_for_timestamp + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA_TS("gmt_modified", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(ObPreciseDateTime), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false, //is_autoincrement + false); //is_on_update_for_timestamp + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("user_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("database_name", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 1024, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("table_name", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 1024, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("column_name", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 1024, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ObObj all_priv_default; + all_priv_default.set_int(0); + ADD_COLUMN_SCHEMA_T("all_priv", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false, //is_autoincrement + all_priv_default, + all_priv_default); //default_value + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::all_virtual_column_privilege_history_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_COLUMN_PRIVILEGE_HISTORY_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(3); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_COLUMN_PRIVILEGE_HISTORY_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tenant_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("priv_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("schema_version", //column_name + ++column_id, //column_id + 3, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA_TS("gmt_create", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(ObPreciseDateTime), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false, //is_autoincrement + false); //is_on_update_for_timestamp + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA_TS("gmt_modified", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(ObPreciseDateTime), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false, //is_autoincrement + false); //is_on_update_for_timestamp + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("is_deleted", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("user_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("database_name", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 1024, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("table_name", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 1024, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("column_name", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 1024, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ObObj all_priv_default; + all_priv_default.set_int(0); + ADD_COLUMN_SCHEMA_T("all_priv", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false, //is_autoincrement + all_priv_default, + all_priv_default); //default_value + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_virtual_tenant_snapshot_ls_replica_history_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; @@ -1623,6 +2023,126 @@ int ObInnerTableSchema::all_virtual_tenant_snapshot_ls_replica_history_schema(Ob return ret; } +int ObInnerTableSchema::enabled_roles_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_INFORMATION_SCHEMA_ID); + table_schema.set_table_id(OB_ENABLED_ROLES_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ENABLED_ROLES_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ObObj role_name_default; + role_name_default.set_null(); + ADD_COLUMN_SCHEMA_T("ROLE_NAME", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + OB_MAX_SYS_PARAM_NAME_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false, //is_autoincrement + role_name_default, + role_name_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj role_host_default; + role_host_default.set_null(); + ADD_COLUMN_SCHEMA_T("ROLE_HOST", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + OB_MAX_SYS_PARAM_VALUE_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false, //is_autoincrement + role_host_default, + role_host_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj is_default_default; + is_default_default.set_null(); + ADD_COLUMN_SCHEMA_T("IS_DEFAULT", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + OB_MAX_SYS_PARAM_VALUE_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false, //is_autoincrement + is_default_default, + is_default_default); //default_value + } + + if (OB_SUCC(ret)) { + ObObj is_mandatory_default; + is_mandatory_default.set_varchar(ObString::make_string("")); + ADD_COLUMN_SCHEMA_T("IS_MANDATORY", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + OB_MAX_SYS_PARAM_VALUE_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false, //is_autoincrement + is_mandatory_default, + is_mandatory_default); //default_value + } + table_schema.set_index_using_type(USING_HASH); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_virtual_nic_info_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.21151_21200.cpp b/src/share/inner_table/ob_inner_table_schema.21151_21200.cpp index df234f2c74..06c1418bed 100644 --- a/src/share/inner_table/ob_inner_table_schema.21151_21200.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21151_21200.cpp @@ -60,7 +60,7 @@ int ObInnerTableSchema::column_privileges_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT CAST(NULL AS CHAR(292)) AS GRANTEE, CAST('def' AS CHAR(512)) AS TABLE_CATALOG, CAST(NULL AS CHAR(64)) AS TABLE_SCHEMA, CAST(NULL AS CHAR(64)) AS TABLE_NAME, CAST(NULL AS CHAR(64)) AS COLUMN_NAME, CAST(NULL AS CHAR(64)) AS PRIVILEGE_TYPE, CAST(NULL AS CHAR(3)) AS IS_GRANTABLE FROM DUAL WHERE 1 = 0 )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(SELECT cast(concat('''', B.user_name, '''', '@', '''', B.host, '''') as char(292)) as GRANTEE, cast('def' as char(512)) AS TABLE_CATALOG, cast(DATABASE_NAME as char(64)) AS TABLE_SCHEMA, cast(TABLE_NAME as char(64)) AS TABLE_NAME, cast(COLUMN_NAME as char(64)) AS COLUMN_NAME, cast(CASE WHEN V1.C1 = 0 AND (A.all_priv & 1) != 0 THEN 'SELECT' WHEN V1.C1 = 1 AND (A.all_priv & 2) != 0 THEN 'INSERT' WHEN V1.C1 = 2 AND (A.all_priv & 4) != 0 THEN 'UPDATE' WHEN V1.C1 = 3 AND (A.all_priv & 8) != 0 THEN 'REFERENCES' END AS char(64)) AS PRIVILEGE_TYPE, cast(case when priv_grant_option = 1 then 'YES' ELSE 'NO' END as char(3)) AS IS_GRANTABLE FROM oceanbase.__all_column_privilege A, oceanbase.__all_user B, (SELECT 0 AS C1 UNION ALL SELECT 1 AS C1 UNION ALL SELECT 2 AS C1 UNION ALL SELECT 3 AS C1) V1 WHERE A.tenant_id = B.tenant_id and A.tenant_id = 0 and A.user_id = B.user_id AND ((V1.C1 = 0 AND (A.all_priv & 1) != 0) OR (V1.C1 = 1 AND (A.all_priv & 2) != 0) OR (V1.C1 = 2 AND (A.all_priv & 4) != 0 OR (V1.C1 = 0 AND (A.all_priv & 8) != 0))) )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.21301_21350.cpp b/src/share/inner_table/ob_inner_table_schema.21301_21350.cpp index 557cec5b6f..3ab25c7c74 100644 --- a/src/share/inner_table/ob_inner_table_schema.21301_21350.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21301_21350.cpp @@ -1567,7 +1567,7 @@ int ObInnerTableSchema::dba_ob_users_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT USER_NAME, HOST, PASSWD, INFO, (CASE WHEN PRIV_ALTER = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_ALTER, (CASE WHEN PRIV_CREATE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE, (CASE WHEN PRIV_DELETE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_DELETE, (CASE WHEN PRIV_DROP = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_DROP, (CASE WHEN PRIV_GRANT_OPTION = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_GRANT_OPTION, (CASE WHEN PRIV_INSERT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_INSERT, (CASE WHEN PRIV_UPDATE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_UPDATE, (CASE WHEN PRIV_SELECT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SELECT, (CASE WHEN PRIV_INDEX = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_INDEX, (CASE WHEN PRIV_CREATE_VIEW = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_VIEW, (CASE WHEN PRIV_SHOW_VIEW = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SHOW_VIEW, (CASE WHEN PRIV_SHOW_DB = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SHOW_DB, (CASE WHEN PRIV_CREATE_USER = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_USER, (CASE WHEN PRIV_SUPER = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SUPER, (CASE WHEN IS_LOCKED = 0 THEN 'NO' ELSE 'YES' END) AS IS_LOCKED, (CASE WHEN PRIV_PROCESS = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_PROCESS, (CASE WHEN PRIV_CREATE_SYNONYM = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_SYNONYM, SSL_TYPE, SSL_CIPHER, X509_ISSUER, X509_SUBJECT, (CASE WHEN TYPE = 0 THEN 'USER' ELSE 'ROLE' END) AS TYPE, PROFILE_ID, PASSWORD_LAST_CHANGED, (CASE WHEN PRIV_FILE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_FILE, (CASE WHEN PRIV_ALTER_TENANT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_ALTER_TENANT, (CASE WHEN PRIV_ALTER_SYSTEM = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_ALTER_SYSTEM, (CASE WHEN PRIV_CREATE_RESOURCE_POOL = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_RESOURCE_POOL, (CASE WHEN PRIV_CREATE_RESOURCE_UNIT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_RESOURCE_UNIT, MAX_CONNECTIONS, MAX_USER_CONNECTIONS, (CASE WHEN PRIV_REPL_SLAVE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_REPL_SLAVE, (CASE WHEN PRIV_REPL_CLIENT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_REPL_CLIENT, (CASE WHEN PRIV_DROP_DATABASE_LINK = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_DROP_DATABASE_LINK, (CASE WHEN PRIV_CREATE_DATABASE_LINK = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_DATABASE_LINK FROM OCEANBASE.__all_user; )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT USER_NAME, HOST, PASSWD, INFO, (CASE WHEN PRIV_ALTER = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_ALTER, (CASE WHEN PRIV_CREATE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE, (CASE WHEN PRIV_DELETE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_DELETE, (CASE WHEN PRIV_DROP = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_DROP, (CASE WHEN PRIV_GRANT_OPTION = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_GRANT_OPTION, (CASE WHEN PRIV_INSERT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_INSERT, (CASE WHEN PRIV_UPDATE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_UPDATE, (CASE WHEN PRIV_SELECT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SELECT, (CASE WHEN PRIV_INDEX = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_INDEX, (CASE WHEN PRIV_CREATE_VIEW = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_VIEW, (CASE WHEN PRIV_SHOW_VIEW = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SHOW_VIEW, (CASE WHEN PRIV_SHOW_DB = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SHOW_DB, (CASE WHEN PRIV_CREATE_USER = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_USER, (CASE WHEN PRIV_SUPER = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SUPER, (CASE WHEN IS_LOCKED = 0 THEN 'NO' ELSE 'YES' END) AS IS_LOCKED, (CASE WHEN PRIV_PROCESS = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_PROCESS, (CASE WHEN PRIV_CREATE_SYNONYM = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_SYNONYM, SSL_TYPE, SSL_CIPHER, X509_ISSUER, X509_SUBJECT, (CASE WHEN TYPE = 0 THEN 'USER' ELSE 'ROLE' END) AS TYPE, PROFILE_ID, PASSWORD_LAST_CHANGED, (CASE WHEN PRIV_FILE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_FILE, (CASE WHEN PRIV_ALTER_TENANT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_ALTER_TENANT, (CASE WHEN PRIV_ALTER_SYSTEM = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_ALTER_SYSTEM, (CASE WHEN PRIV_CREATE_RESOURCE_POOL = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_RESOURCE_POOL, (CASE WHEN PRIV_CREATE_RESOURCE_UNIT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_RESOURCE_UNIT, MAX_CONNECTIONS, MAX_USER_CONNECTIONS, (CASE WHEN PRIV_REPL_SLAVE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_REPL_SLAVE, (CASE WHEN PRIV_REPL_CLIENT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_REPL_CLIENT, (CASE WHEN PRIV_DROP_DATABASE_LINK = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_DROP_DATABASE_LINK, (CASE WHEN PRIV_CREATE_DATABASE_LINK = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_DATABASE_LINK, (CASE WHEN (PRIV_OTHERS & (1 << 0)) != 0 THEN 'YES' ELSE 'NO' END) AS PRIV_EXECUTE, (CASE WHEN (PRIV_OTHERS & (1 << 1)) != 0 THEN 'YES' ELSE 'NO' END) AS PRIV_ALTER_ROUTINE, (CASE WHEN (PRIV_OTHERS & (1 << 2)) != 0 THEN 'YES' ELSE 'NO' END) AS PRIV_CREATE_ROUTINE FROM OCEANBASE.__all_user; )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1617,7 +1617,7 @@ int ObInnerTableSchema::cdb_ob_users_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT TENANT_ID, USER_NAME, HOST, PASSWD, INFO, (CASE WHEN PRIV_ALTER = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_ALTER, (CASE WHEN PRIV_CREATE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE, (CASE WHEN PRIV_DELETE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_DELETE, (CASE WHEN PRIV_DROP = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_DROP, (CASE WHEN PRIV_GRANT_OPTION = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_GRANT_OPTION, (CASE WHEN PRIV_INSERT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_INSERT, (CASE WHEN PRIV_UPDATE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_UPDATE, (CASE WHEN PRIV_SELECT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SELECT, (CASE WHEN PRIV_INDEX = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_INDEX, (CASE WHEN PRIV_CREATE_VIEW = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_VIEW, (CASE WHEN PRIV_SHOW_VIEW = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SHOW_VIEW, (CASE WHEN PRIV_SHOW_DB = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SHOW_DB, (CASE WHEN PRIV_CREATE_USER = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_USER, (CASE WHEN PRIV_SUPER = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SUPER, (CASE WHEN IS_LOCKED = 0 THEN 'NO' ELSE 'YES' END) AS IS_LOCKED, (CASE WHEN PRIV_PROCESS = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_PROCESS, (CASE WHEN PRIV_CREATE_SYNONYM = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_SYNONYM, SSL_TYPE, SSL_CIPHER, X509_ISSUER, X509_SUBJECT, (CASE WHEN TYPE = 0 THEN 'USER' ELSE 'ROLE' END) AS TYPE, PROFILE_ID, PASSWORD_LAST_CHANGED, (CASE WHEN PRIV_FILE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_FILE, (CASE WHEN PRIV_ALTER_TENANT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_ALTER_TENANT, (CASE WHEN PRIV_ALTER_SYSTEM = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_ALTER_SYSTEM, (CASE WHEN PRIV_CREATE_RESOURCE_POOL = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_RESOURCE_POOL, (CASE WHEN PRIV_CREATE_RESOURCE_UNIT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_RESOURCE_UNIT, MAX_CONNECTIONS, MAX_USER_CONNECTIONS, (CASE WHEN PRIV_REPL_SLAVE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_REPL_SLAVE, (CASE WHEN PRIV_REPL_CLIENT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_REPL_CLIENT, (CASE WHEN PRIV_DROP_DATABASE_LINK = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_DROP_DATABASE_LINK, (CASE WHEN PRIV_CREATE_DATABASE_LINK = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_DATABASE_LINK FROM OCEANBASE.__all_virtual_user; )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT TENANT_ID, USER_NAME, HOST, PASSWD, INFO, (CASE WHEN PRIV_ALTER = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_ALTER, (CASE WHEN PRIV_CREATE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE, (CASE WHEN PRIV_DELETE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_DELETE, (CASE WHEN PRIV_DROP = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_DROP, (CASE WHEN PRIV_GRANT_OPTION = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_GRANT_OPTION, (CASE WHEN PRIV_INSERT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_INSERT, (CASE WHEN PRIV_UPDATE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_UPDATE, (CASE WHEN PRIV_SELECT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SELECT, (CASE WHEN PRIV_INDEX = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_INDEX, (CASE WHEN PRIV_CREATE_VIEW = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_VIEW, (CASE WHEN PRIV_SHOW_VIEW = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SHOW_VIEW, (CASE WHEN PRIV_SHOW_DB = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SHOW_DB, (CASE WHEN PRIV_CREATE_USER = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_USER, (CASE WHEN PRIV_SUPER = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SUPER, (CASE WHEN IS_LOCKED = 0 THEN 'NO' ELSE 'YES' END) AS IS_LOCKED, (CASE WHEN PRIV_PROCESS = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_PROCESS, (CASE WHEN PRIV_CREATE_SYNONYM = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_SYNONYM, SSL_TYPE, SSL_CIPHER, X509_ISSUER, X509_SUBJECT, (CASE WHEN TYPE = 0 THEN 'USER' ELSE 'ROLE' END) AS TYPE, PROFILE_ID, PASSWORD_LAST_CHANGED, (CASE WHEN PRIV_FILE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_FILE, (CASE WHEN PRIV_ALTER_TENANT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_ALTER_TENANT, (CASE WHEN PRIV_ALTER_SYSTEM = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_ALTER_SYSTEM, (CASE WHEN PRIV_CREATE_RESOURCE_POOL = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_RESOURCE_POOL, (CASE WHEN PRIV_CREATE_RESOURCE_UNIT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_RESOURCE_UNIT, MAX_CONNECTIONS, MAX_USER_CONNECTIONS, (CASE WHEN PRIV_REPL_SLAVE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_REPL_SLAVE, (CASE WHEN PRIV_REPL_CLIENT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_REPL_CLIENT, (CASE WHEN PRIV_DROP_DATABASE_LINK = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_DROP_DATABASE_LINK, (CASE WHEN PRIV_CREATE_DATABASE_LINK = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_DATABASE_LINK, (CASE WHEN (PRIV_OTHERS & (1 << 0)) != 0 THEN 'YES' ELSE 'NO' END) AS PRIV_EXECUTE, (CASE WHEN (PRIV_OTHERS & (1 << 1)) != 0 THEN 'YES' ELSE 'NO' END) AS PRIV_ALTER_ROUTINE, (CASE WHEN (PRIV_OTHERS & (1 << 2)) != 0 THEN 'YES' ELSE 'NO' END) AS PRIV_CREATE_ROUTINE FROM OCEANBASE.__all_virtual_user; )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1667,7 +1667,7 @@ int ObInnerTableSchema::dba_ob_database_privilege_schema(ObTableSchema &table_sc table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT A.USER_ID USER_ID, B.USER_NAME USERNAME, A.DATABASE_NAME DATABASE_NAME, A.GMT_CREATE GMT_CREATE, A.GMT_MODIFIED GMT_MODIFIED, (CASE WHEN A.PRIV_ALTER = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_ALTER, (CASE WHEN A.PRIV_CREATE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE, (CASE WHEN A.PRIV_DELETE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_DELETE, (CASE WHEN A.PRIV_DROP = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_DROP, (CASE WHEN A.PRIV_GRANT_OPTION = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_GRANT_OPTION, (CASE WHEN A.PRIV_INSERT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_INSERT, (CASE WHEN A.PRIV_UPDATE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_UPDATE, (CASE WHEN A.PRIV_SELECT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SELECT, (CASE WHEN A.PRIV_INDEX = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_INDEX, (CASE WHEN A.PRIV_CREATE_VIEW = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_VIEW, (CASE WHEN A.PRIV_SHOW_VIEW = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SHOW_VIEW FROM OCEANBASE.__all_database_privilege A INNER JOIN OCEANBASE.__all_user B ON A.TENANT_ID = B.TENANT_ID AND A.USER_ID = B.USER_ID; )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT A.USER_ID USER_ID, B.USER_NAME USERNAME, A.DATABASE_NAME DATABASE_NAME, A.GMT_CREATE GMT_CREATE, A.GMT_MODIFIED GMT_MODIFIED, (CASE WHEN A.PRIV_ALTER = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_ALTER, (CASE WHEN A.PRIV_CREATE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE, (CASE WHEN A.PRIV_DELETE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_DELETE, (CASE WHEN A.PRIV_DROP = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_DROP, (CASE WHEN A.PRIV_GRANT_OPTION = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_GRANT_OPTION, (CASE WHEN A.PRIV_INSERT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_INSERT, (CASE WHEN A.PRIV_UPDATE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_UPDATE, (CASE WHEN A.PRIV_SELECT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SELECT, (CASE WHEN A.PRIV_INDEX = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_INDEX, (CASE WHEN A.PRIV_CREATE_VIEW = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_VIEW, (CASE WHEN A.PRIV_SHOW_VIEW = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SHOW_VIEW, (CASE WHEN (A.PRIV_OTHERS & (1 << 0)) != 0 THEN 'YES' ELSE 'NO' END) AS PRIV_EXECUTE, (CASE WHEN (A.PRIV_OTHERS & (1 << 1)) != 0 THEN 'YES' ELSE 'NO' END) AS PRIV_ALTER_ROUTINE, (CASE WHEN (A.PRIV_OTHERS & (1 << 2)) != 0 THEN 'YES' ELSE 'NO' END) AS PRIV_CREATE_ROUTINE FROM OCEANBASE.__all_database_privilege A INNER JOIN OCEANBASE.__all_user B ON A.TENANT_ID = B.TENANT_ID AND A.USER_ID = B.USER_ID; )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -1717,7 +1717,7 @@ int ObInnerTableSchema::cdb_ob_database_privilege_schema(ObTableSchema &table_sc table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT A.TENANT_ID, A.USER_ID USER_ID, B.USER_NAME USERNAME, A.DATABASE_NAME DATABASE_NAME, A.GMT_CREATE GMT_CREATE, A.GMT_MODIFIED GMT_MODIFIED, (CASE WHEN A.PRIV_ALTER = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_ALTER, (CASE WHEN A.PRIV_CREATE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE, (CASE WHEN A.PRIV_DELETE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_DELETE, (CASE WHEN A.PRIV_DROP = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_DROP, (CASE WHEN A.PRIV_GRANT_OPTION = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_GRANT_OPTION, (CASE WHEN A.PRIV_INSERT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_INSERT, (CASE WHEN A.PRIV_UPDATE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_UPDATE, (CASE WHEN A.PRIV_SELECT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SELECT, (CASE WHEN A.PRIV_INDEX = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_INDEX, (CASE WHEN A.PRIV_CREATE_VIEW = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_VIEW, (CASE WHEN A.PRIV_SHOW_VIEW = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SHOW_VIEW FROM OCEANBASE.__all_virtual_database_privilege A INNER JOIN OCEANBASE.__all_virtual_user B ON A.USER_ID = B.USER_ID AND A.TENANT_ID = B.TENANT_ID; )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT A.TENANT_ID, A.USER_ID USER_ID, B.USER_NAME USERNAME, A.DATABASE_NAME DATABASE_NAME, A.GMT_CREATE GMT_CREATE, A.GMT_MODIFIED GMT_MODIFIED, (CASE WHEN A.PRIV_ALTER = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_ALTER, (CASE WHEN A.PRIV_CREATE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE, (CASE WHEN A.PRIV_DELETE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_DELETE, (CASE WHEN A.PRIV_DROP = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_DROP, (CASE WHEN A.PRIV_GRANT_OPTION = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_GRANT_OPTION, (CASE WHEN A.PRIV_INSERT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_INSERT, (CASE WHEN A.PRIV_UPDATE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_UPDATE, (CASE WHEN A.PRIV_SELECT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SELECT, (CASE WHEN A.PRIV_INDEX = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_INDEX, (CASE WHEN A.PRIV_CREATE_VIEW = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_VIEW, (CASE WHEN A.PRIV_SHOW_VIEW = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SHOW_VIEW, (CASE WHEN (A.PRIV_OTHERS & (1 << 0)) != 0 THEN 'YES' ELSE 'NO' END) AS PRIV_EXECUTE, (CASE WHEN (A.PRIV_OTHERS & (1 << 1)) != 0 THEN 'YES' ELSE 'NO' END) AS PRIV_ALTER_ROUTINE, (CASE WHEN (A.PRIV_OTHERS & (1 << 2)) != 0 THEN 'YES' ELSE 'NO' END) AS PRIV_CREATE_ROUTINE FROM OCEANBASE.__all_virtual_database_privilege A INNER JOIN OCEANBASE.__all_virtual_user B ON A.USER_ID = B.USER_ID AND A.TENANT_ID = B.TENANT_ID; )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -2067,7 +2067,7 @@ int ObInnerTableSchema::user_privileges_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(CONCAT('''', V.USER_NAME, '''', '@', '''', V.HOST, '''') AS CHAR(81)) AS GRANTEE , CAST('def' AS CHAR(512)) AS TABLE_CATALOG , CAST(V.PRIVILEGE_TYPE AS CHAR(64)) AS PRIVILEGE_TYPE , CAST(V.IS_GRANTABLE AS CHAR(3)) AS IS_GRANTABLE FROM (SELECT U.USER_NAME AS USER_NAME, U.HOST AS HOST, CASE WHEN V1.C1 = 1 AND U.PRIV_ALTER = 1 THEN 'ALTER' WHEN V1.C1 = 2 AND U.PRIV_CREATE = 1 THEN 'CREATE' WHEN V1.C1 = 3 AND U.PRIV_CREATE_USER = 1 THEN 'CREATE USER' WHEN V1.C1 = 4 AND U.PRIV_DELETE = 1 THEN 'DELETE' WHEN V1.C1 = 5 AND U.PRIV_DROP = 1 THEN 'DROP' WHEN V1.C1 = 7 AND U.PRIV_INSERT = 1 THEN 'INSERT' WHEN V1.C1 = 8 AND U.PRIV_UPDATE = 1 THEN 'UPDATE' WHEN V1.C1 = 9 AND U.PRIV_SELECT = 1 THEN 'SELECT' WHEN V1.C1 = 10 AND U.PRIV_INDEX = 1 THEN 'INDEX' WHEN V1.C1 = 11 AND U.PRIV_CREATE_VIEW = 1 THEN 'CREATE VIEW' WHEN V1.C1 = 12 AND U.PRIV_SHOW_VIEW = 1 THEN 'SHOW VIEW' WHEN V1.C1 = 13 AND U.PRIV_SHOW_DB = 1 THEN 'SHOW DATABASES' WHEN V1.C1 = 14 AND U.PRIV_SUPER = 1 THEN 'SUPER' WHEN V1.C1 = 15 AND U.PRIV_PROCESS = 1 THEN 'PROCESS' WHEN V1.C1 = 17 AND U.PRIV_CREATE_SYNONYM = 1 THEN 'CREATE SYNONYM' WHEN V1.C1 = 27 AND U.PRIV_FILE = 1 THEN 'FILE' WHEN V1.C1 = 28 AND U.PRIV_ALTER_TENANT = 1 THEN 'ALTER TENANT' WHEN V1.C1 = 29 AND U.PRIV_ALTER_SYSTEM = 1 THEN 'ALTER SYSTEM' WHEN V1.C1 = 30 AND U.PRIV_CREATE_RESOURCE_POOL = 1 THEN 'CREATE RESOURCE POOL' WHEN V1.C1 = 31 AND U.PRIV_CREATE_RESOURCE_UNIT = 1 THEN 'CREATE RESOURCE UNIT' WHEN V1.C1 = 33 AND U.PRIV_REPL_SLAVE = 1 THEN 'REPLICATION SLAVE' WHEN V1.C1 = 34 AND U.PRIV_REPL_CLIENT = 1 THEN 'REPLICATION CLIENT' WHEN V1.C1 = 35 AND U.PRIV_DROP_DATABASE_LINK = 1 THEN 'DROP DATABASE LINK' WHEN V1.C1 = 36 AND U.PRIV_CREATE_DATABASE_LINK = 1 THEN 'CREATE DATABASE LINK' WHEN V1.C1 = 0 AND U.PRIV_ALTER = 0 AND U.PRIV_CREATE = 0 AND U.PRIV_CREATE_USER = 0 AND U.PRIV_DELETE = 0 AND U.PRIV_DROP = 0 AND U.PRIV_INSERT = 0 AND U.PRIV_UPDATE = 0 AND U.PRIV_SELECT = 0 AND U.PRIV_INDEX = 0 AND U.PRIV_CREATE_VIEW = 0 AND U.PRIV_SHOW_VIEW = 0 AND U.PRIV_SHOW_DB = 0 AND U.PRIV_SUPER = 0 AND U.PRIV_PROCESS = 0 AND U.PRIV_CREATE_SYNONYM = 0 AND U.PRIV_FILE = 0 AND U.PRIV_ALTER_TENANT = 0 AND U.PRIV_ALTER_SYSTEM = 0 AND U.PRIV_CREATE_RESOURCE_POOL = 0 AND U.PRIV_CREATE_RESOURCE_UNIT = 0 AND U.PRIV_REPL_SLAVE = 0 AND U.PRIV_REPL_CLIENT = 0 AND U.PRIV_DROP_DATABASE_LINK = 0 AND U.PRIV_CREATE_DATABASE_LINK = 0 THEN 'USAGE' END PRIVILEGE_TYPE , CASE WHEN U.PRIV_GRANT_OPTION = 0 THEN 'NO' WHEN U.PRIV_ALTER = 0 AND U.PRIV_CREATE = 0 AND U.PRIV_CREATE_USER = 0 AND U.PRIV_DELETE = 0 AND U.PRIV_DROP = 0 AND U.PRIV_INSERT = 0 AND U.PRIV_UPDATE = 0 AND U.PRIV_SELECT = 0 AND U.PRIV_INDEX = 0 AND U.PRIV_CREATE_VIEW = 0 AND U.PRIV_SHOW_VIEW = 0 AND U.PRIV_SHOW_DB = 0 AND U.PRIV_SUPER = 0 AND U.PRIV_PROCESS = 0 AND U.PRIV_CREATE_SYNONYM = 0 AND U.PRIV_FILE = 0 AND U.PRIV_ALTER_TENANT = 0 AND U.PRIV_ALTER_SYSTEM = 0 AND U.PRIV_CREATE_RESOURCE_POOL = 0 AND U.PRIV_CREATE_RESOURCE_UNIT = 0 AND U.PRIV_REPL_SLAVE = 0 AND U.PRIV_REPL_CLIENT = 0 AND U.PRIV_DROP_DATABASE_LINK = 0 AND U.PRIV_CREATE_DATABASE_LINK = 0 THEN 'NO' WHEN U.PRIV_GRANT_OPTION = 1 THEN 'YES' END IS_GRANTABLE FROM oceanbase.__all_user U, (SELECT 0 AS C1 UNION ALL SELECT 1 AS C1 UNION ALL SELECT 2 AS C1 UNION ALL SELECT 3 AS C1 UNION ALL SELECT 4 AS C1 UNION ALL SELECT 5 AS C1 UNION ALL SELECT 7 AS C1 UNION ALL SELECT 8 AS C1 UNION ALL SELECT 9 AS C1 UNION ALL SELECT 10 AS C1 UNION ALL SELECT 11 AS C1 UNION ALL SELECT 12 AS C1 UNION ALL SELECT 13 AS C1 UNION ALL SELECT 14 AS C1 UNION ALL SELECT 15 AS C1 UNION ALL SELECT 17 AS C1 UNION ALL SELECT 27 AS C1 UNION ALL SELECT 28 AS C1 UNION ALL SELECT 29 AS C1 UNION ALL SELECT 30 AS C1 UNION ALL SELECT 31 AS C1 UNION ALL SELECT 33 AS C1 UNION ALL SELECT 34 AS C1 UNION ALL SELECT 35 AS C1 UNION ALL SELECT 36 AS C1) V1, (SELECT USER_ID FROM oceanbase.__all_user WHERE TENANT_ID = 0 AND CONCAT(USER_NAME, '@', HOST) = CURRENT_USER()) CURR LEFT JOIN (SELECT USER_ID FROM oceanbase.__all_database_privilege WHERE TENANT_ID = 0 AND DATABASE_NAME = 'mysql' AND PRIV_SELECT = 1) DB ON CURR.USER_ID = DB.USER_ID WHERE U.TENANT_ID = 0 AND (DB.USER_ID IS NOT NULL OR 512 & CURRENT_USER_PRIV() = 512 OR U.USER_ID = CURR.USER_ID)) V WHERE V.PRIVILEGE_TYPE IS NOT NULL )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(CONCAT('''', V.USER_NAME, '''', '@', '''', V.HOST, '''') AS CHAR(81)) AS GRANTEE , CAST('def' AS CHAR(512)) AS TABLE_CATALOG , CAST(V.PRIVILEGE_TYPE AS CHAR(64)) AS PRIVILEGE_TYPE , CAST(V.IS_GRANTABLE AS CHAR(3)) AS IS_GRANTABLE FROM (SELECT U.USER_NAME AS USER_NAME, U.HOST AS HOST, CASE WHEN V1.C1 = 1 AND U.PRIV_ALTER = 1 THEN 'ALTER' WHEN V1.C1 = 2 AND U.PRIV_CREATE = 1 THEN 'CREATE' WHEN V1.C1 = 3 AND U.PRIV_CREATE_USER = 1 THEN 'CREATE USER' WHEN V1.C1 = 4 AND U.PRIV_DELETE = 1 THEN 'DELETE' WHEN V1.C1 = 5 AND U.PRIV_DROP = 1 THEN 'DROP' WHEN V1.C1 = 7 AND U.PRIV_INSERT = 1 THEN 'INSERT' WHEN V1.C1 = 8 AND U.PRIV_UPDATE = 1 THEN 'UPDATE' WHEN V1.C1 = 9 AND U.PRIV_SELECT = 1 THEN 'SELECT' WHEN V1.C1 = 10 AND U.PRIV_INDEX = 1 THEN 'INDEX' WHEN V1.C1 = 11 AND U.PRIV_CREATE_VIEW = 1 THEN 'CREATE VIEW' WHEN V1.C1 = 12 AND U.PRIV_SHOW_VIEW = 1 THEN 'SHOW VIEW' WHEN V1.C1 = 13 AND U.PRIV_SHOW_DB = 1 THEN 'SHOW DATABASES' WHEN V1.C1 = 14 AND U.PRIV_SUPER = 1 THEN 'SUPER' WHEN V1.C1 = 15 AND U.PRIV_PROCESS = 1 THEN 'PROCESS' WHEN V1.C1 = 17 AND U.PRIV_CREATE_SYNONYM = 1 THEN 'CREATE SYNONYM' WHEN V1.C1 = 27 AND U.PRIV_FILE = 1 THEN 'FILE' WHEN V1.C1 = 28 AND U.PRIV_ALTER_TENANT = 1 THEN 'ALTER TENANT' WHEN V1.C1 = 29 AND U.PRIV_ALTER_SYSTEM = 1 THEN 'ALTER SYSTEM' WHEN V1.C1 = 30 AND U.PRIV_CREATE_RESOURCE_POOL = 1 THEN 'CREATE RESOURCE POOL' WHEN V1.C1 = 31 AND U.PRIV_CREATE_RESOURCE_UNIT = 1 THEN 'CREATE RESOURCE UNIT' WHEN V1.C1 = 33 AND U.PRIV_REPL_SLAVE = 1 THEN 'REPLICATION SLAVE' WHEN V1.C1 = 34 AND U.PRIV_REPL_CLIENT = 1 THEN 'REPLICATION CLIENT' WHEN V1.C1 = 35 AND U.PRIV_DROP_DATABASE_LINK = 1 THEN 'DROP DATABASE LINK' WHEN V1.C1 = 36 AND U.PRIV_CREATE_DATABASE_LINK = 1 THEN 'CREATE DATABASE LINK' WHEN V1.C1 = 37 AND (U.PRIV_OTHERS & (1 << 0)) != 0 THEN 'EXECUTE' WHEN V1.C1 = 38 AND (U.PRIV_OTHERS & (1 << 1)) != 0 THEN 'ALTER ROUTINE' WHEN V1.C1 = 39 AND (U.PRIV_OTHERS & (1 << 2)) != 0 THEN 'CREATE ROUTINE' WHEN V1.C1 = 0 AND U.PRIV_ALTER = 0 AND U.PRIV_CREATE = 0 AND U.PRIV_CREATE_USER = 0 AND U.PRIV_DELETE = 0 AND U.PRIV_DROP = 0 AND U.PRIV_INSERT = 0 AND U.PRIV_UPDATE = 0 AND U.PRIV_SELECT = 0 AND U.PRIV_INDEX = 0 AND U.PRIV_CREATE_VIEW = 0 AND U.PRIV_SHOW_VIEW = 0 AND U.PRIV_SHOW_DB = 0 AND U.PRIV_SUPER = 0 AND U.PRIV_PROCESS = 0 AND U.PRIV_CREATE_SYNONYM = 0 AND U.PRIV_FILE = 0 AND U.PRIV_ALTER_TENANT = 0 AND U.PRIV_ALTER_SYSTEM = 0 AND U.PRIV_CREATE_RESOURCE_POOL = 0 AND U.PRIV_CREATE_RESOURCE_UNIT = 0 AND U.PRIV_REPL_SLAVE = 0 AND U.PRIV_REPL_CLIENT = 0 AND U.PRIV_DROP_DATABASE_LINK = 0 AND U.PRIV_CREATE_DATABASE_LINK = 0 AND U.PRIV_OTHERS = 0 THEN 'USAGE' END PRIVILEGE_TYPE , CASE WHEN U.PRIV_GRANT_OPTION = 0 THEN 'NO' WHEN U.PRIV_ALTER = 0 AND U.PRIV_CREATE = 0 AND U.PRIV_CREATE_USER = 0 AND U.PRIV_DELETE = 0 AND U.PRIV_DROP = 0 AND U.PRIV_INSERT = 0 AND U.PRIV_UPDATE = 0 AND U.PRIV_SELECT = 0 AND U.PRIV_INDEX = 0 AND U.PRIV_CREATE_VIEW = 0 AND U.PRIV_SHOW_VIEW = 0 AND U.PRIV_SHOW_DB = 0 AND U.PRIV_SUPER = 0 AND U.PRIV_PROCESS = 0 AND U.PRIV_CREATE_SYNONYM = 0 AND U.PRIV_FILE = 0 AND U.PRIV_ALTER_TENANT = 0 AND U.PRIV_ALTER_SYSTEM = 0 AND U.PRIV_CREATE_RESOURCE_POOL = 0 AND U.PRIV_CREATE_RESOURCE_UNIT = 0 AND U.PRIV_REPL_SLAVE = 0 AND U.PRIV_REPL_CLIENT = 0 AND U.PRIV_DROP_DATABASE_LINK = 0 AND U.PRIV_CREATE_DATABASE_LINK = 0 AND U.PRIV_OTHERS = 0 THEN 'NO' WHEN U.PRIV_GRANT_OPTION = 1 THEN 'YES' END IS_GRANTABLE FROM oceanbase.__all_user U, (SELECT 0 AS C1 UNION ALL SELECT 1 AS C1 UNION ALL SELECT 2 AS C1 UNION ALL SELECT 3 AS C1 UNION ALL SELECT 4 AS C1 UNION ALL SELECT 5 AS C1 UNION ALL SELECT 7 AS C1 UNION ALL SELECT 8 AS C1 UNION ALL SELECT 9 AS C1 UNION ALL SELECT 10 AS C1 UNION ALL SELECT 11 AS C1 UNION ALL SELECT 12 AS C1 UNION ALL SELECT 13 AS C1 UNION ALL SELECT 14 AS C1 UNION ALL SELECT 15 AS C1 UNION ALL SELECT 17 AS C1 UNION ALL SELECT 27 AS C1 UNION ALL SELECT 28 AS C1 UNION ALL SELECT 29 AS C1 UNION ALL SELECT 30 AS C1 UNION ALL SELECT 31 AS C1 UNION ALL SELECT 33 AS C1 UNION ALL SELECT 34 AS C1 UNION ALL SELECT 35 AS C1 UNION ALL SELECT 36 AS C1 UNION ALL SELECT 37 AS C1 UNION ALL SELECT 38 AS C1 UNION ALL SELECT 39 AS C1) V1, (SELECT USER_ID FROM oceanbase.__all_user WHERE TENANT_ID = 0 AND CONCAT(USER_NAME, '@', HOST) = CURRENT_USER()) CURR LEFT JOIN (SELECT USER_ID FROM oceanbase.__all_database_privilege WHERE TENANT_ID = 0 AND DATABASE_NAME = 'mysql' AND PRIV_SELECT = 1) DB ON CURR.USER_ID = DB.USER_ID WHERE U.TENANT_ID = 0 AND (DB.USER_ID IS NOT NULL OR 512 & CURRENT_USER_PRIV() = 512 OR U.USER_ID = CURR.USER_ID)) V WHERE V.PRIVILEGE_TYPE IS NOT NULL )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -2117,7 +2117,7 @@ int ObInnerTableSchema::schema_privileges_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(CONCAT('''', V.USER_NAME, '''', '@', '''', V.HOST, '''') AS CHAR(81)) AS GRANTEE , CAST('def' AS CHAR(512)) AS TABLE_CATALOG , CAST(V.DATABASE_NAME AS CHAR(128)) collate utf8mb4_name_case AS TABLE_SCHEMA , CAST(V.PRIVILEGE_TYPE AS CHAR(64)) AS PRIVILEGE_TYPE , CAST(V.IS_GRANTABLE AS CHAR(3)) AS IS_GRANTABLE FROM (SELECT DP.DATABASE_NAME DATABASE_NAME, U.USER_NAME AS USER_NAME, U.HOST AS HOST, CASE WHEN V1.C1 = 1 AND DP.PRIV_ALTER = 1 THEN 'ALTER' WHEN V1.C1 = 2 AND DP.PRIV_CREATE = 1 THEN 'CREATE' WHEN V1.C1 = 4 AND DP.PRIV_DELETE = 1 THEN 'DELETE' WHEN V1.C1 = 5 AND DP.PRIV_DROP = 1 THEN 'DROP' WHEN V1.C1 = 7 AND DP.PRIV_INSERT = 1 THEN 'INSERT' WHEN V1.C1 = 8 AND DP.PRIV_UPDATE = 1 THEN 'UPDATE' WHEN V1.C1 = 9 AND DP.PRIV_SELECT = 1 THEN 'SELECT' WHEN V1.C1 = 10 AND DP.PRIV_INDEX = 1 THEN 'INDEX' WHEN V1.C1 = 11 AND DP.PRIV_CREATE_VIEW = 1 THEN 'CREATE VIEW' WHEN V1.C1 = 12 AND DP.PRIV_SHOW_VIEW = 1 THEN 'SHOW VIEW' ELSE NULL END PRIVILEGE_TYPE , CASE WHEN DP.PRIV_GRANT_OPTION = 1 THEN 'YES' WHEN DP.PRIV_GRANT_OPTION = 0 THEN 'NO' END IS_GRANTABLE FROM oceanbase.__all_database_privilege DP, oceanbase.__all_user U, (SELECT 1 AS C1 UNION ALL SELECT 2 AS C1 UNION ALL SELECT 4 AS C1 UNION ALL SELECT 5 AS C1 UNION ALL SELECT 7 AS C1 UNION ALL SELECT 8 AS C1 UNION ALL SELECT 9 AS C1 UNION ALL SELECT 10 AS C1 UNION ALL SELECT 11 AS C1 UNION ALL SELECT 12 AS C1) V1, (SELECT USER_ID FROM oceanbase.__all_user WHERE TENANT_ID= 0 AND CONCAT(USER_NAME, '@', HOST) = CURRENT_USER()) CURR LEFT JOIN (SELECT USER_ID FROM oceanbase.__all_database_privilege WHERE TENANT_ID = 0 AND DATABASE_NAME = 'mysql' AND PRIV_SELECT = 1) DB ON CURR.USER_ID = DB.USER_ID WHERE DP.TENANT_ID = 0 AND DP.TENANT_ID = U.TENANT_ID AND DP.USER_ID = U.USER_ID AND DP.DATABASE_NAME != '__recyclebin' AND DP.DATABASE_NAME != '__public' AND DP.DATABASE_NAME != 'SYS' AND DP.DATABASE_NAME != 'LBACSYS' AND DP.DATABASE_NAME != 'ORAAUDITOR' AND (DB.USER_ID IS NOT NULL OR 512 & CURRENT_USER_PRIV() = 512 OR DP.USER_ID = CURR.USER_ID)) V WHERE V.PRIVILEGE_TYPE IS NOT NULL )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(CONCAT('''', V.USER_NAME, '''', '@', '''', V.HOST, '''') AS CHAR(81)) AS GRANTEE , CAST('def' AS CHAR(512)) AS TABLE_CATALOG , CAST(V.DATABASE_NAME AS CHAR(128)) collate utf8mb4_name_case AS TABLE_SCHEMA , CAST(V.PRIVILEGE_TYPE AS CHAR(64)) AS PRIVILEGE_TYPE , CAST(V.IS_GRANTABLE AS CHAR(3)) AS IS_GRANTABLE FROM (SELECT DP.DATABASE_NAME DATABASE_NAME, U.USER_NAME AS USER_NAME, U.HOST AS HOST, CASE WHEN V1.C1 = 1 AND DP.PRIV_ALTER = 1 THEN 'ALTER' WHEN V1.C1 = 2 AND DP.PRIV_CREATE = 1 THEN 'CREATE' WHEN V1.C1 = 4 AND DP.PRIV_DELETE = 1 THEN 'DELETE' WHEN V1.C1 = 5 AND DP.PRIV_DROP = 1 THEN 'DROP' WHEN V1.C1 = 7 AND DP.PRIV_INSERT = 1 THEN 'INSERT' WHEN V1.C1 = 8 AND DP.PRIV_UPDATE = 1 THEN 'UPDATE' WHEN V1.C1 = 9 AND DP.PRIV_SELECT = 1 THEN 'SELECT' WHEN V1.C1 = 10 AND DP.PRIV_INDEX = 1 THEN 'INDEX' WHEN V1.C1 = 11 AND DP.PRIV_CREATE_VIEW = 1 THEN 'CREATE VIEW' WHEN V1.C1 = 12 AND DP.PRIV_SHOW_VIEW = 1 THEN 'SHOW VIEW' WHEN V1.C1 = 13 AND (U.PRIV_OTHERS & (1 << 0)) != 0 THEN 'EXECUTE' WHEN V1.C1 = 14 AND (U.PRIV_OTHERS & (1 << 1)) != 0 THEN 'ALTER ROUTINE' WHEN V1.C1 = 15 AND (U.PRIV_OTHERS & (1 << 2)) != 0 THEN 'CREATE ROUTINE' ELSE NULL END PRIVILEGE_TYPE , CASE WHEN DP.PRIV_GRANT_OPTION = 1 THEN 'YES' WHEN DP.PRIV_GRANT_OPTION = 0 THEN 'NO' END IS_GRANTABLE FROM oceanbase.__all_database_privilege DP, oceanbase.__all_user U, (SELECT 1 AS C1 UNION ALL SELECT 2 AS C1 UNION ALL SELECT 4 AS C1 UNION ALL SELECT 5 AS C1 UNION ALL SELECT 7 AS C1 UNION ALL SELECT 8 AS C1 UNION ALL SELECT 9 AS C1 UNION ALL SELECT 10 AS C1 UNION ALL SELECT 11 AS C1 UNION ALL SELECT 12 AS C1 UNION ALL SELECT 13 AS C1 UNION ALL SELECT 14 AS C1 UNION ALL SELECT 15 AS C1) V1, (SELECT USER_ID FROM oceanbase.__all_user WHERE TENANT_ID= 0 AND CONCAT(USER_NAME, '@', HOST) = CURRENT_USER()) CURR LEFT JOIN (SELECT USER_ID FROM oceanbase.__all_database_privilege WHERE TENANT_ID = 0 AND DATABASE_NAME = 'mysql' AND PRIV_SELECT = 1) DB ON CURR.USER_ID = DB.USER_ID WHERE DP.TENANT_ID = 0 AND DP.TENANT_ID = U.TENANT_ID AND DP.USER_ID = U.USER_ID AND DP.DATABASE_NAME != '__recyclebin' AND DP.DATABASE_NAME != '__public' AND DP.DATABASE_NAME != 'SYS' AND DP.DATABASE_NAME != 'LBACSYS' AND DP.DATABASE_NAME != 'ORAAUDITOR' AND (DB.USER_ID IS NOT NULL OR 512 & CURRENT_USER_PRIV() = 512 OR DP.USER_ID = CURR.USER_ID)) V WHERE V.PRIVILEGE_TYPE IS NOT NULL )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.21451_21500.cpp b/src/share/inner_table/ob_inner_table_schema.21451_21500.cpp index 4f97cd8663..dbb88fe8ab 100644 --- a/src/share/inner_table/ob_inner_table_schema.21451_21500.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21451_21500.cpp @@ -925,6 +925,56 @@ int ObInnerTableSchema::v_ob_cgroup_config_schema(ObTableSchema &table_schema) return ret; } +int ObInnerTableSchema::procs_priv_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_MYSQL_SCHEMA_ID); + table_schema.set_table_id(OB_PROCS_PRIV_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_PROCS_PRIV_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT cast(b.host as char(60)) as Host, cast(a.database_name as char(64)) as Db, cast(b.user_name as char(32)) as User, cast(a.routine_name as char(64)) as Routine_name, case when a.routine_type = 1 then 'PROCEDURE' else 'FUNCTION' end as Routine_type, cast(c.priv_user as char(93)) as Grantor, substr(concat(case when (a.all_priv & 1) > 0 then ',Execute' else '' end, case when (a.all_priv & 2) > 0 then ',Alter Routine' else '' end, case when (a.all_priv & 4) > 0 then ',Grant' else '' end), 2) as Proc_priv, cast(a.gmt_modified as date) as Timestamp FROM oceanbase.__all_routine_privilege a, oceanbase.__all_user b, oceanbase.__all_routine c, oceanbase.__all_database d WHERE a.tenant_id = b.tenant_id AND a.user_id = b.user_id AND a.tenant_id = d.tenant_id and a.database_name = d.database_name AND a.tenant_id = c.tenant_id AND a.routine_name = c.routine_name AND a.routine_type = c.routine_type AND c.database_id = d.database_id AND c.package_id = -1; )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::dba_ob_aux_statistics_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.21501_21550.cpp b/src/share/inner_table/ob_inner_table_schema.21501_21550.cpp index 48a2b1a51a..fb4e057353 100644 --- a/src/share/inner_table/ob_inner_table_schema.21501_21550.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21501_21550.cpp @@ -375,6 +375,106 @@ int ObInnerTableSchema::dba_ob_clone_progress_schema(ObTableSchema &table_schema return ret; } +int ObInnerTableSchema::role_edges_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_MYSQL_SCHEMA_ID); + table_schema.set_table_id(OB_ROLE_EDGES_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ROLE_EDGES_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT cast(from_user.host AS char(255)) FROM_HOST, cast(from_user.user_name AS char(128)) FROM_USER, cast(to_user.host AS char(255)) TO_HOST, cast(to_user.user_name AS char(128)) TO_USER, cast(CASE role_map.admin_option WHEN 1 THEN 'Y' ELSE 'N' END AS char(1)) WITH_ADMIN_OPTION FROM oceanbase.__all_tenant_role_grantee_map role_map, oceanbase.__all_user from_user, oceanbase.__all_user to_user WHERE role_map.tenant_id = from_user.tenant_id AND role_map.tenant_id = to_user.tenant_id AND role_map.grantee_id = to_user.user_id AND role_map.role_id = from_user.user_id; )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::default_roles_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_MYSQL_SCHEMA_ID); + table_schema.set_table_id(OB_DEFAULT_ROLES_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_DEFAULT_ROLES_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT cast(to_user.host AS char(255)) HOST, cast(to_user.user_name AS char(128)) USER, cast(from_user.host AS char(255)) DEFAULT_ROLE_HOST, cast(from_user.user_name AS char(128)) DEFAULT_ROLE_USER FROM oceanbase.__all_tenant_role_grantee_map role_map, oceanbase.__all_user from_user, oceanbase.__all_user to_user WHERE role_map.tenant_id = from_user.tenant_id AND role_map.tenant_id = to_user.tenant_id AND role_map.grantee_id = to_user.user_id AND role_map.role_id = from_user.user_id AND role_map.disable_flag = 0; )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::cdb_index_usage_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; @@ -425,6 +525,56 @@ int ObInnerTableSchema::cdb_index_usage_schema(ObTableSchema &table_schema) return ret; } +int ObInnerTableSchema::columns_priv_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_MYSQL_SCHEMA_ID); + table_schema.set_table_id(OB_COLUMNS_PRIV_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_COLUMNS_PRIV_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT cast(b.host as char(255)) as Host, cast(a.database_name as char(128)) as Db, cast(b.user_name as char(128)) as User, cast(a.table_name as char(128)) as Table_name, cast(a.column_name as char(128)) as Column_name, substr(concat(case when (a.all_priv & 1) > 0 then ',Select' else '' end, case when (a.all_priv & 2) > 0 then ',Insert' else '' end, case when (a.all_priv & 4) > 0 then ',Update' else '' end, case when (a.all_priv & 8) > 0 then ',References' else '' end), 2) as Column_priv, cast(a.gmt_modified as datetime) as Timestamp FROM oceanbase.__all_column_privilege a, oceanbase.__all_user b WHERE a.tenant_id = 0 and a.tenant_id = b.tenant_id AND a.user_id = b.user_id )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::gv_ob_ls_snapshots_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.28201_28250.cpp b/src/share/inner_table/ob_inner_table_schema.28201_28250.cpp index 2e81950e47..626b921197 100644 --- a/src/share/inner_table/ob_inner_table_schema.28201_28250.cpp +++ b/src/share/inner_table/ob_inner_table_schema.28201_28250.cpp @@ -11963,6 +11963,151 @@ int ObInnerTableSchema::all_transfer_partition_task_idx_transfer_partition_key_s return ret; } +int ObInnerTableSchema::all_column_privilege_idx_column_privilege_name_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_COLUMN_PRIVILEGE_IDX_COLUMN_PRIVILEGE_NAME_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(2); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(USER_INDEX); + table_schema.set_index_type(INDEX_TYPE_NORMAL_LOCAL); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_COLUMN_PRIVILEGE_IDX_COLUMN_PRIVILEGE_NAME_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ++column_id; // for gmt_create + } + + if (OB_SUCC(ret)) { + ++column_id; // for gmt_modified + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_ALL_COLUMN_PRIVILEGE_IDX_COLUMN_PRIVILEGE_NAME_TID); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("user_id", //column_name + column_id + 3, //column_id + 1, //rowkey_id + 1, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false,//is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("database_name", //column_name + column_id + 4, //column_id + 2, //rowkey_id + 2, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 1024, //column_length + -1, //column_precision + -1, //column_scale + false,//is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("table_name", //column_name + column_id + 5, //column_id + 3, //rowkey_id + 3, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 1024, //column_length + -1, //column_precision + -1, //column_scale + false,//is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("column_name", //column_name + column_id + 6, //column_id + 4, //rowkey_id + 4, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 1024, //column_length + -1, //column_precision + -1, //column_scale + false,//is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tenant_id", //column_name + column_id + 1, //column_id + 5, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false,//is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("priv_id", //column_name + column_id + 2, //column_id + 6, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false,//is_nullable + false); //is_autoincrement + } + table_schema.set_index_status(INDEX_STATUS_AVAILABLE); + table_schema.set_index_type(INDEX_TYPE_NORMAL_LOCAL); + table_schema.set_data_table_id(OB_ALL_COLUMN_PRIVILEGE_TID); + + table_schema.set_max_used_column_id(column_id + 6); + return ret; +} + int ObInnerTableSchema::all_virtual_table_real_agent_ora_idx_data_table_id_real_agent_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.451_500.cpp b/src/share/inner_table/ob_inner_table_schema.451_500.cpp index 95e06c1412..ce18e4b853 100644 --- a/src/share/inner_table/ob_inner_table_schema.451_500.cpp +++ b/src/share/inner_table/ob_inner_table_schema.451_500.cpp @@ -11253,6 +11253,408 @@ int ObInnerTableSchema::all_clone_job_history_schema(ObTableSchema &table_schema return ret; } +int ObInnerTableSchema::all_routine_privilege_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_ROUTINE_PRIVILEGE_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(5); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_ROUTINE_PRIVILEGE_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ObObj gmt_create_default; + ObObj gmt_create_default_null; + + gmt_create_default.set_ext(ObActionFlag::OP_DEFAULT_NOW_FLAG); + gmt_create_default_null.set_null(); + ADD_COLUMN_SCHEMA_TS_T("gmt_create", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampType, //column_type + CS_TYPE_BINARY,//collation_type + 0, //column length + -1, //column_precision + 6, //column_scale + true,//is nullable + false, //is_autoincrement + false, //is_on_update_for_timestamp + gmt_create_default_null, + gmt_create_default) + } + + if (OB_SUCC(ret)) { + ObObj gmt_modified_default; + ObObj gmt_modified_default_null; + + gmt_modified_default.set_ext(ObActionFlag::OP_DEFAULT_NOW_FLAG); + gmt_modified_default_null.set_null(); + ADD_COLUMN_SCHEMA_TS_T("gmt_modified", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampType, //column_type + CS_TYPE_BINARY,//collation_type + 0, //column length + -1, //column_precision + 6, //column_scale + true,//is nullable + false, //is_autoincrement + true, //is_on_update_for_timestamp + gmt_modified_default_null, + gmt_modified_default) + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tenant_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("user_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("database_name", //column_name + ++column_id, //column_id + 3, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_DATABASE_NAME_BINARY_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("routine_name", //column_name + ++column_id, //column_id + 4, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_ROUTINE_NAME_BINARY_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("routine_type", //column_name + ++column_id, //column_id + 5, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ObObj all_priv_default; + all_priv_default.set_int(0); + ADD_COLUMN_SCHEMA_T("all_priv", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false, //is_autoincrement + all_priv_default, + all_priv_default); //default_value + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_ALL_ROUTINE_PRIVILEGE_TID); + table_schema.set_aux_lob_meta_tid(OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_META_TID); + table_schema.set_aux_lob_piece_tid(OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_PIECE_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::all_routine_privilege_history_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_ROUTINE_PRIVILEGE_HISTORY_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(6); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_ROUTINE_PRIVILEGE_HISTORY_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ObObj gmt_create_default; + ObObj gmt_create_default_null; + + gmt_create_default.set_ext(ObActionFlag::OP_DEFAULT_NOW_FLAG); + gmt_create_default_null.set_null(); + ADD_COLUMN_SCHEMA_TS_T("gmt_create", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampType, //column_type + CS_TYPE_BINARY,//collation_type + 0, //column length + -1, //column_precision + 6, //column_scale + true,//is nullable + false, //is_autoincrement + false, //is_on_update_for_timestamp + gmt_create_default_null, + gmt_create_default) + } + + if (OB_SUCC(ret)) { + ObObj gmt_modified_default; + ObObj gmt_modified_default_null; + + gmt_modified_default.set_ext(ObActionFlag::OP_DEFAULT_NOW_FLAG); + gmt_modified_default_null.set_null(); + ADD_COLUMN_SCHEMA_TS_T("gmt_modified", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampType, //column_type + CS_TYPE_BINARY,//collation_type + 0, //column length + -1, //column_precision + 6, //column_scale + true,//is nullable + false, //is_autoincrement + true, //is_on_update_for_timestamp + gmt_modified_default_null, + gmt_modified_default) + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tenant_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("user_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("database_name", //column_name + ++column_id, //column_id + 3, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_DATABASE_NAME_BINARY_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("routine_name", //column_name + ++column_id, //column_id + 4, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + OB_MAX_ROUTINE_NAME_BINARY_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("routine_type", //column_name + ++column_id, //column_id + 5, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("schema_version", //column_name + ++column_id, //column_id + 6, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("is_deleted", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ObObj all_priv_default; + all_priv_default.set_int(0); + ADD_COLUMN_SCHEMA_T("all_priv", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false, //is_autoincrement + all_priv_default, + all_priv_default); //default_value + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_ALL_ROUTINE_PRIVILEGE_HISTORY_TID); + table_schema.set_aux_lob_meta_tid(OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_META_TID); + table_schema.set_aux_lob_piece_tid(OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_PIECE_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_ncomp_dll_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.501_550.cpp b/src/share/inner_table/ob_inner_table_schema.501_550.cpp index c0a71eae5a..0f09a08027 100644 --- a/src/share/inner_table/ob_inner_table_schema.501_550.cpp +++ b/src/share/inner_table/ob_inner_table_schema.501_550.cpp @@ -346,6 +346,438 @@ int ObInnerTableSchema::all_trusted_root_certificate_schema(ObTableSchema &table return ret; } +int ObInnerTableSchema::all_column_privilege_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_COLUMN_PRIVILEGE_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(2); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_COLUMN_PRIVILEGE_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ObObj gmt_create_default; + ObObj gmt_create_default_null; + + gmt_create_default.set_ext(ObActionFlag::OP_DEFAULT_NOW_FLAG); + gmt_create_default_null.set_null(); + ADD_COLUMN_SCHEMA_TS_T("gmt_create", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampType, //column_type + CS_TYPE_BINARY,//collation_type + 0, //column length + -1, //column_precision + 6, //column_scale + true,//is nullable + false, //is_autoincrement + false, //is_on_update_for_timestamp + gmt_create_default_null, + gmt_create_default) + } + + if (OB_SUCC(ret)) { + ObObj gmt_modified_default; + ObObj gmt_modified_default_null; + + gmt_modified_default.set_ext(ObActionFlag::OP_DEFAULT_NOW_FLAG); + gmt_modified_default_null.set_null(); + ADD_COLUMN_SCHEMA_TS_T("gmt_modified", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampType, //column_type + CS_TYPE_BINARY,//collation_type + 0, //column length + -1, //column_precision + 6, //column_scale + true,//is nullable + false, //is_autoincrement + true, //is_on_update_for_timestamp + gmt_modified_default_null, + gmt_modified_default) + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tenant_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("priv_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("user_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("database_name", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 1024, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("table_name", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 1024, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("column_name", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 1024, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ObObj all_priv_default; + all_priv_default.set_int(0); + ADD_COLUMN_SCHEMA_T("all_priv", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false, //is_autoincrement + all_priv_default, + all_priv_default); //default_value + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_ALL_COLUMN_PRIVILEGE_TID); + table_schema.set_aux_lob_meta_tid(OB_ALL_COLUMN_PRIVILEGE_AUX_LOB_META_TID); + table_schema.set_aux_lob_piece_tid(OB_ALL_COLUMN_PRIVILEGE_AUX_LOB_PIECE_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::all_column_privilege_history_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_COLUMN_PRIVILEGE_HISTORY_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(3); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_COLUMN_PRIVILEGE_HISTORY_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ObObj gmt_create_default; + ObObj gmt_create_default_null; + + gmt_create_default.set_ext(ObActionFlag::OP_DEFAULT_NOW_FLAG); + gmt_create_default_null.set_null(); + ADD_COLUMN_SCHEMA_TS_T("gmt_create", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampType, //column_type + CS_TYPE_BINARY,//collation_type + 0, //column length + -1, //column_precision + 6, //column_scale + true,//is nullable + false, //is_autoincrement + false, //is_on_update_for_timestamp + gmt_create_default_null, + gmt_create_default) + } + + if (OB_SUCC(ret)) { + ObObj gmt_modified_default; + ObObj gmt_modified_default_null; + + gmt_modified_default.set_ext(ObActionFlag::OP_DEFAULT_NOW_FLAG); + gmt_modified_default_null.set_null(); + ADD_COLUMN_SCHEMA_TS_T("gmt_modified", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampType, //column_type + CS_TYPE_BINARY,//collation_type + 0, //column length + -1, //column_precision + 6, //column_scale + true,//is nullable + false, //is_autoincrement + true, //is_on_update_for_timestamp + gmt_modified_default_null, + gmt_modified_default) + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tenant_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("priv_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("schema_version", //column_name + ++column_id, //column_id + 3, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("is_deleted", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("user_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("database_name", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 1024, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("table_name", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 1024, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("column_name", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 1024, //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ObObj all_priv_default; + all_priv_default.set_int(0); + ADD_COLUMN_SCHEMA_T("all_priv", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + true, //is_nullable + false, //is_autoincrement + all_priv_default, + all_priv_default); //default_value + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_ALL_COLUMN_PRIVILEGE_HISTORY_TID); + table_schema.set_aux_lob_meta_tid(OB_ALL_COLUMN_PRIVILEGE_HISTORY_AUX_LOB_META_TID); + table_schema.set_aux_lob_piece_tid(OB_ALL_COLUMN_PRIVILEGE_HISTORY_AUX_LOB_PIECE_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_tenant_snapshot_ls_replica_history_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.50451_50500.cpp b/src/share/inner_table/ob_inner_table_schema.50451_50500.cpp index 46fdcb9794..ba6019d5b5 100644 --- a/src/share/inner_table/ob_inner_table_schema.50451_50500.cpp +++ b/src/share/inner_table/ob_inner_table_schema.50451_50500.cpp @@ -4480,6 +4480,276 @@ int ObInnerTableSchema::all_clone_job_history_aux_lob_meta_schema(ObTableSchema return ret; } +int ObInnerTableSchema::all_routine_privilege_aux_lob_meta_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_META_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(2); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(AUX_LOB_META); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_META_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 16, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("seq_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 8192, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("binary_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("char_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("piece_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_data", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 262144, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_META_TID); + table_schema.set_data_table_id(OB_ALL_ROUTINE_PRIVILEGE_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::all_routine_privilege_history_aux_lob_meta_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_META_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(2); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(AUX_LOB_META); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_META_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 16, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("seq_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 8192, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("binary_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("char_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("piece_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_data", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 262144, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_META_TID); + table_schema.set_data_table_id(OB_ALL_ROUTINE_PRIVILEGE_HISTORY_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_ncomp_dll_aux_lob_meta_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.50501_50550.cpp b/src/share/inner_table/ob_inner_table_schema.50501_50550.cpp index 4d98636c04..b4827512fa 100644 --- a/src/share/inner_table/ob_inner_table_schema.50501_50550.cpp +++ b/src/share/inner_table/ob_inner_table_schema.50501_50550.cpp @@ -295,6 +295,276 @@ int ObInnerTableSchema::all_trusted_root_certificate_aux_lob_meta_schema(ObTable return ret; } +int ObInnerTableSchema::all_column_privilege_aux_lob_meta_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_COLUMN_PRIVILEGE_AUX_LOB_META_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(2); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(AUX_LOB_META); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_COLUMN_PRIVILEGE_AUX_LOB_META_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 16, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("seq_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 8192, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("binary_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("char_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("piece_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_data", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 262144, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_ALL_COLUMN_PRIVILEGE_AUX_LOB_META_TID); + table_schema.set_data_table_id(OB_ALL_COLUMN_PRIVILEGE_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::all_column_privilege_history_aux_lob_meta_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_COLUMN_PRIVILEGE_HISTORY_AUX_LOB_META_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(2); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(AUX_LOB_META); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_COLUMN_PRIVILEGE_HISTORY_AUX_LOB_META_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 16, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("seq_id", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 8192, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("binary_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("char_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("piece_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_data", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 262144, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_ALL_COLUMN_PRIVILEGE_HISTORY_AUX_LOB_META_TID); + table_schema.set_data_table_id(OB_ALL_COLUMN_PRIVILEGE_HISTORY_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_tenant_snapshot_ls_replica_history_aux_lob_meta_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.60451_60500.cpp b/src/share/inner_table/ob_inner_table_schema.60451_60500.cpp index a198c02ef3..80f6705133 100644 --- a/src/share/inner_table/ob_inner_table_schema.60451_60500.cpp +++ b/src/share/inner_table/ob_inner_table_schema.60451_60500.cpp @@ -2995,6 +2995,186 @@ int ObInnerTableSchema::all_clone_job_history_aux_lob_piece_schema(ObTableSchema return ret; } +int ObInnerTableSchema::all_routine_privilege_aux_lob_piece_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_PIECE_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(1); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(AUX_LOB_PIECE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_PIECE_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("piece_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("data_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_data", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 32, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_PIECE_TID); + table_schema.set_data_table_id(OB_ALL_ROUTINE_PRIVILEGE_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::all_routine_privilege_history_aux_lob_piece_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_PIECE_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(1); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(AUX_LOB_PIECE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_PIECE_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("piece_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("data_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_data", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 32, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_PIECE_TID); + table_schema.set_data_table_id(OB_ALL_ROUTINE_PRIVILEGE_HISTORY_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_ncomp_dll_aux_lob_piece_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.60501_60550.cpp b/src/share/inner_table/ob_inner_table_schema.60501_60550.cpp index c46228a63a..35848d29e1 100644 --- a/src/share/inner_table/ob_inner_table_schema.60501_60550.cpp +++ b/src/share/inner_table/ob_inner_table_schema.60501_60550.cpp @@ -205,6 +205,186 @@ int ObInnerTableSchema::all_trusted_root_certificate_aux_lob_piece_schema(ObTabl return ret; } +int ObInnerTableSchema::all_column_privilege_aux_lob_piece_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_COLUMN_PRIVILEGE_AUX_LOB_PIECE_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(1); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(AUX_LOB_PIECE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_COLUMN_PRIVILEGE_AUX_LOB_PIECE_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("piece_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("data_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_data", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 32, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_ALL_COLUMN_PRIVILEGE_AUX_LOB_PIECE_TID); + table_schema.set_data_table_id(OB_ALL_COLUMN_PRIVILEGE_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::all_column_privilege_history_aux_lob_piece_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_SYS_TABLEGROUP_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_COLUMN_PRIVILEGE_HISTORY_AUX_LOB_PIECE_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(1); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(AUX_LOB_PIECE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_COLUMN_PRIVILEGE_HISTORY_AUX_LOB_PIECE_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("piece_id", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt64Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("data_len", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObUInt32Type, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(uint32_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("lob_data", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_BINARY, //column_collation_type + 32, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(OB_ALL_COLUMN_PRIVILEGE_HISTORY_AUX_LOB_PIECE_TID); + table_schema.set_data_table_id(OB_ALL_COLUMN_PRIVILEGE_HISTORY_TID); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_tenant_snapshot_ls_replica_history_aux_lob_piece_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.h b/src/share/inner_table/ob_inner_table_schema.h index 8244bab642..946ba84104 100644 --- a/src/share/inner_table/ob_inner_table_schema.h +++ b/src/share/inner_table/ob_inner_table_schema.h @@ -571,6 +571,8 @@ public: static int all_storage_ha_perf_diagnose_history_schema(share::schema::ObTableSchema &table_schema); static int all_clone_job_schema(share::schema::ObTableSchema &table_schema); static int all_clone_job_history_schema(share::schema::ObTableSchema &table_schema); + static int all_routine_privilege_schema(share::schema::ObTableSchema &table_schema); + static int all_routine_privilege_history_schema(share::schema::ObTableSchema &table_schema); static int all_ncomp_dll_schema(share::schema::ObTableSchema &table_schema); static int all_aux_stat_schema(share::schema::ObTableSchema &table_schema); static int all_index_usage_info_schema(share::schema::ObTableSchema &table_schema); @@ -578,6 +580,8 @@ public: static int all_transfer_partition_task_history_schema(share::schema::ObTableSchema &table_schema); static int all_tenant_snapshot_job_schema(share::schema::ObTableSchema &table_schema); static int all_trusted_root_certificate_schema(share::schema::ObTableSchema &table_schema); + static int all_column_privilege_schema(share::schema::ObTableSchema &table_schema); + static int all_column_privilege_history_schema(share::schema::ObTableSchema &table_schema); static int all_tenant_snapshot_ls_replica_history_schema(share::schema::ObTableSchema &table_schema); static int tenant_virtual_all_table_schema(share::schema::ObTableSchema &table_schema); static int tenant_virtual_table_column_schema(share::schema::ObTableSchema &table_schema); @@ -1005,6 +1009,8 @@ public: static int all_virtual_checkpoint_diagnose_memtable_info_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_checkpoint_diagnose_checkpoint_unit_info_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_checkpoint_diagnose_info_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_routine_privilege_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_routine_privilege_history_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_aux_stat_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_sys_variable_default_value_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_transfer_partition_task_schema(share::schema::ObTableSchema &table_schema); @@ -1012,7 +1018,10 @@ public: static int all_virtual_tenant_snapshot_job_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_ls_snapshot_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_index_usage_info_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_column_privilege_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_column_privilege_history_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_tenant_snapshot_ls_replica_history_schema(share::schema::ObTableSchema &table_schema); + static int enabled_roles_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_nic_info_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_sql_audit_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_plan_stat_ora_schema(share::schema::ObTableSchema &table_schema); @@ -1650,6 +1659,7 @@ public: static int v_ob_tenant_runtime_info_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_cgroup_config_schema(share::schema::ObTableSchema &table_schema); static int v_ob_cgroup_config_schema(share::schema::ObTableSchema &table_schema); + static int procs_priv_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_aux_statistics_schema(share::schema::ObTableSchema &table_schema); static int cdb_ob_aux_statistics_schema(share::schema::ObTableSchema &table_schema); static int dba_index_usage_schema(share::schema::ObTableSchema &table_schema); @@ -1660,7 +1670,10 @@ public: static int cdb_ob_transfer_partition_task_history_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_trusted_root_certificate_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_clone_progress_schema(share::schema::ObTableSchema &table_schema); + static int role_edges_schema(share::schema::ObTableSchema &table_schema); + static int default_roles_schema(share::schema::ObTableSchema &table_schema); static int cdb_index_usage_schema(share::schema::ObTableSchema &table_schema); + static int columns_priv_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_ls_snapshots_schema(share::schema::ObTableSchema &table_schema); static int v_ob_ls_snapshots_schema(share::schema::ObTableSchema &table_schema); static int dba_ob_clone_history_schema(share::schema::ObTableSchema &table_schema); @@ -2414,6 +2427,8 @@ public: static int all_storage_ha_perf_diagnose_history_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_clone_job_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_clone_job_history_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); + static int all_routine_privilege_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); + static int all_routine_privilege_history_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_ncomp_dll_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_aux_stat_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_index_usage_info_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); @@ -2421,6 +2436,8 @@ public: static int all_transfer_partition_task_history_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_tenant_snapshot_job_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_trusted_root_certificate_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); + static int all_column_privilege_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); + static int all_column_privilege_history_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_tenant_snapshot_ls_replica_history_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_table_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_column_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); @@ -2701,6 +2718,8 @@ public: static int all_storage_ha_perf_diagnose_history_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_clone_job_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_clone_job_history_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); + static int all_routine_privilege_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); + static int all_routine_privilege_history_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_ncomp_dll_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_aux_stat_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_index_usage_info_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); @@ -2708,6 +2727,8 @@ public: static int all_transfer_partition_task_history_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_tenant_snapshot_job_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_trusted_root_certificate_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); + static int all_column_privilege_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); + static int all_column_privilege_history_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_tenant_snapshot_ls_replica_history_aux_lob_piece_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_ash_all_virtual_ash_i1_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_sql_plan_monitor_all_virtual_sql_plan_monitor_i1_schema(share::schema::ObTableSchema &table_schema); @@ -2903,6 +2924,7 @@ public: static int all_mview_refresh_stats_idx_mview_refresh_stats_end_time_schema(share::schema::ObTableSchema &table_schema); static int all_mview_refresh_stats_idx_mview_refresh_stats_mview_end_time_schema(share::schema::ObTableSchema &table_schema); static int all_transfer_partition_task_idx_transfer_partition_key_schema(share::schema::ObTableSchema &table_schema); + static int all_column_privilege_idx_column_privilege_name_schema(share::schema::ObTableSchema &table_schema); private: DISALLOW_COPY_AND_ASSIGN(ObInnerTableSchema); @@ -3197,6 +3219,8 @@ const schema_create_func sys_table_schema_creators [] = { ObInnerTableSchema::all_storage_ha_perf_diagnose_history_schema, ObInnerTableSchema::all_clone_job_schema, ObInnerTableSchema::all_clone_job_history_schema, + ObInnerTableSchema::all_routine_privilege_schema, + ObInnerTableSchema::all_routine_privilege_history_schema, ObInnerTableSchema::all_ncomp_dll_schema, ObInnerTableSchema::all_aux_stat_schema, ObInnerTableSchema::all_index_usage_info_schema, @@ -3204,6 +3228,8 @@ const schema_create_func sys_table_schema_creators [] = { ObInnerTableSchema::all_transfer_partition_task_history_schema, ObInnerTableSchema::all_tenant_snapshot_job_schema, ObInnerTableSchema::all_trusted_root_certificate_schema, + ObInnerTableSchema::all_column_privilege_schema, + ObInnerTableSchema::all_column_privilege_history_schema, ObInnerTableSchema::all_tenant_snapshot_ls_replica_history_schema, NULL,}; @@ -3634,6 +3660,8 @@ const schema_create_func virtual_table_schema_creators [] = { ObInnerTableSchema::all_virtual_checkpoint_diagnose_memtable_info_schema, ObInnerTableSchema::all_virtual_checkpoint_diagnose_checkpoint_unit_info_schema, ObInnerTableSchema::all_virtual_checkpoint_diagnose_info_schema, + ObInnerTableSchema::all_virtual_routine_privilege_schema, + ObInnerTableSchema::all_virtual_routine_privilege_history_schema, ObInnerTableSchema::all_virtual_aux_stat_schema, ObInnerTableSchema::all_virtual_sys_variable_default_value_schema, ObInnerTableSchema::all_virtual_transfer_partition_task_schema, @@ -3641,7 +3669,10 @@ const schema_create_func virtual_table_schema_creators [] = { ObInnerTableSchema::all_virtual_tenant_snapshot_job_schema, ObInnerTableSchema::all_virtual_ls_snapshot_schema, ObInnerTableSchema::all_virtual_index_usage_info_schema, + ObInnerTableSchema::all_virtual_column_privilege_schema, + ObInnerTableSchema::all_virtual_column_privilege_history_schema, ObInnerTableSchema::all_virtual_tenant_snapshot_ls_replica_history_schema, + ObInnerTableSchema::enabled_roles_schema, ObInnerTableSchema::all_virtual_nic_info_schema, ObInnerTableSchema::all_virtual_ash_all_virtual_ash_i1_schema, ObInnerTableSchema::all_virtual_sql_plan_monitor_all_virtual_sql_plan_monitor_i1_schema, @@ -4373,6 +4404,7 @@ const schema_create_func sys_view_schema_creators [] = { ObInnerTableSchema::v_ob_tenant_runtime_info_schema, ObInnerTableSchema::gv_ob_cgroup_config_schema, ObInnerTableSchema::v_ob_cgroup_config_schema, + ObInnerTableSchema::procs_priv_schema, ObInnerTableSchema::dba_ob_aux_statistics_schema, ObInnerTableSchema::cdb_ob_aux_statistics_schema, ObInnerTableSchema::dba_index_usage_schema, @@ -4383,7 +4415,10 @@ const schema_create_func sys_view_schema_creators [] = { ObInnerTableSchema::cdb_ob_transfer_partition_task_history_schema, ObInnerTableSchema::dba_ob_trusted_root_certificate_schema, ObInnerTableSchema::dba_ob_clone_progress_schema, + ObInnerTableSchema::role_edges_schema, + ObInnerTableSchema::default_roles_schema, ObInnerTableSchema::cdb_index_usage_schema, + ObInnerTableSchema::columns_priv_schema, ObInnerTableSchema::gv_ob_ls_snapshots_schema, ObInnerTableSchema::v_ob_ls_snapshots_schema, ObInnerTableSchema::dba_ob_clone_history_schema, @@ -4967,6 +5002,7 @@ const schema_create_func sys_index_table_schema_creators [] = { ObInnerTableSchema::all_mview_refresh_stats_idx_mview_refresh_stats_end_time_schema, ObInnerTableSchema::all_mview_refresh_stats_idx_mview_refresh_stats_mview_end_time_schema, ObInnerTableSchema::all_transfer_partition_task_idx_transfer_partition_key_schema, + ObInnerTableSchema::all_column_privilege_idx_column_privilege_name_schema, NULL,}; const schema_create_func information_schema_table_schema_creators[] = { @@ -5233,12 +5269,16 @@ const uint64_t tenant_space_tables [] = { OB_ALL_IMPORT_TABLE_TASK_HISTORY_TID, OB_ALL_CLONE_JOB_TID, OB_ALL_CLONE_JOB_HISTORY_TID, + OB_ALL_ROUTINE_PRIVILEGE_TID, + OB_ALL_ROUTINE_PRIVILEGE_HISTORY_TID, OB_ALL_NCOMP_DLL_TID, OB_ALL_AUX_STAT_TID, OB_ALL_INDEX_USAGE_INFO_TID, OB_ALL_TRANSFER_PARTITION_TASK_TID, OB_ALL_TRANSFER_PARTITION_TASK_HISTORY_TID, OB_ALL_TENANT_SNAPSHOT_JOB_TID, + OB_ALL_COLUMN_PRIVILEGE_TID, + OB_ALL_COLUMN_PRIVILEGE_HISTORY_TID, OB_ALL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_TID, OB_TENANT_VIRTUAL_ALL_TABLE_TID, OB_TENANT_VIRTUAL_TABLE_COLUMN_TID, @@ -5462,6 +5502,7 @@ const uint64_t tenant_space_tables [] = { OB_ALL_VIRTUAL_TENANT_SNAPSHOT_JOB_TID, OB_ALL_VIRTUAL_LS_SNAPSHOT_TID, OB_ALL_VIRTUAL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_TID, + OB_ENABLED_ROLES_TID, OB_ALL_VIRTUAL_NIC_INFO_TID, OB_ALL_VIRTUAL_SQL_AUDIT_ORA_TID, OB_ALL_VIRTUAL_SQL_AUDIT_ORA_ALL_VIRTUAL_SQL_AUDIT_I1_TID, @@ -6004,11 +6045,15 @@ const uint64_t tenant_space_tables [] = { OB_DBA_OB_IMPORT_TABLE_TASK_HISTORY_TID, OB_GV_OB_CGROUP_CONFIG_TID, OB_V_OB_CGROUP_CONFIG_TID, + OB_PROCS_PRIV_TID, OB_DBA_OB_AUX_STATISTICS_TID, OB_DBA_INDEX_USAGE_TID, OB_DBA_OB_SYS_VARIABLES_TID, OB_DBA_OB_TRANSFER_PARTITION_TASKS_TID, OB_DBA_OB_TRANSFER_PARTITION_TASK_HISTORY_TID, + OB_ROLE_EDGES_TID, + OB_DEFAULT_ROLES_TID, + OB_COLUMNS_PRIV_TID, OB_GV_OB_LS_SNAPSHOTS_TID, OB_V_OB_LS_SNAPSHOTS_TID, OB_DBA_MVIEW_LOGS_TID, @@ -6571,6 +6616,7 @@ const uint64_t tenant_space_tables [] = { OB_ALL_MVIEW_REFRESH_STATS_IDX_MVIEW_REFRESH_STATS_END_TIME_TID, OB_ALL_MVIEW_REFRESH_STATS_IDX_MVIEW_REFRESH_STATS_MVIEW_END_TIME_TID, OB_ALL_TRANSFER_PARTITION_TASK_IDX_TRANSFER_PARTITION_KEY_TID, + OB_ALL_COLUMN_PRIVILEGE_IDX_COLUMN_PRIVILEGE_NAME_TID, OB_ALL_VIRTUAL_TABLE_REAL_AGENT_ORA_IDX_DATA_TABLE_ID_REAL_AGENT_TID, OB_ALL_VIRTUAL_TABLE_REAL_AGENT_ORA_IDX_DB_TB_NAME_REAL_AGENT_TID, OB_ALL_VIRTUAL_TABLE_REAL_AGENT_ORA_IDX_TB_NAME_REAL_AGENT_TID, @@ -6899,12 +6945,16 @@ const uint64_t tenant_space_tables [] = { OB_ALL_IMPORT_TABLE_TASK_HISTORY_AUX_LOB_META_TID, OB_ALL_CLONE_JOB_AUX_LOB_META_TID, OB_ALL_CLONE_JOB_HISTORY_AUX_LOB_META_TID, + OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_META_TID, + OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_META_TID, OB_ALL_NCOMP_DLL_AUX_LOB_META_TID, OB_ALL_AUX_STAT_AUX_LOB_META_TID, OB_ALL_INDEX_USAGE_INFO_AUX_LOB_META_TID, OB_ALL_TRANSFER_PARTITION_TASK_AUX_LOB_META_TID, OB_ALL_TRANSFER_PARTITION_TASK_HISTORY_AUX_LOB_META_TID, OB_ALL_TENANT_SNAPSHOT_JOB_AUX_LOB_META_TID, + OB_ALL_COLUMN_PRIVILEGE_AUX_LOB_META_TID, + OB_ALL_COLUMN_PRIVILEGE_HISTORY_AUX_LOB_META_TID, OB_ALL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_AUX_LOB_META_TID, OB_ALL_TABLE_AUX_LOB_PIECE_TID, OB_ALL_COLUMN_AUX_LOB_PIECE_TID, @@ -7162,12 +7212,16 @@ const uint64_t tenant_space_tables [] = { OB_ALL_IMPORT_TABLE_TASK_HISTORY_AUX_LOB_PIECE_TID, OB_ALL_CLONE_JOB_AUX_LOB_PIECE_TID, OB_ALL_CLONE_JOB_HISTORY_AUX_LOB_PIECE_TID, + OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_PIECE_TID, + OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_PIECE_TID, OB_ALL_NCOMP_DLL_AUX_LOB_PIECE_TID, OB_ALL_AUX_STAT_AUX_LOB_PIECE_TID, OB_ALL_INDEX_USAGE_INFO_AUX_LOB_PIECE_TID, OB_ALL_TRANSFER_PARTITION_TASK_AUX_LOB_PIECE_TID, OB_ALL_TRANSFER_PARTITION_TASK_HISTORY_AUX_LOB_PIECE_TID, OB_ALL_TENANT_SNAPSHOT_JOB_AUX_LOB_PIECE_TID, + OB_ALL_COLUMN_PRIVILEGE_AUX_LOB_PIECE_TID, + OB_ALL_COLUMN_PRIVILEGE_HISTORY_AUX_LOB_PIECE_TID, OB_ALL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_AUX_LOB_PIECE_TID, }; const uint64_t all_ora_mapping_virtual_table_org_tables [] = { @@ -7725,12 +7779,16 @@ const char* const tenant_space_table_names [] = { OB_ALL_IMPORT_TABLE_TASK_HISTORY_TNAME, OB_ALL_CLONE_JOB_TNAME, OB_ALL_CLONE_JOB_HISTORY_TNAME, + OB_ALL_ROUTINE_PRIVILEGE_TNAME, + OB_ALL_ROUTINE_PRIVILEGE_HISTORY_TNAME, OB_ALL_NCOMP_DLL_TNAME, OB_ALL_AUX_STAT_TNAME, OB_ALL_INDEX_USAGE_INFO_TNAME, OB_ALL_TRANSFER_PARTITION_TASK_TNAME, OB_ALL_TRANSFER_PARTITION_TASK_HISTORY_TNAME, OB_ALL_TENANT_SNAPSHOT_JOB_TNAME, + OB_ALL_COLUMN_PRIVILEGE_TNAME, + OB_ALL_COLUMN_PRIVILEGE_HISTORY_TNAME, OB_ALL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_TNAME, OB_TENANT_VIRTUAL_ALL_TABLE_TNAME, OB_TENANT_VIRTUAL_TABLE_COLUMN_TNAME, @@ -7954,6 +8012,7 @@ const char* const tenant_space_table_names [] = { OB_ALL_VIRTUAL_TENANT_SNAPSHOT_JOB_TNAME, OB_ALL_VIRTUAL_LS_SNAPSHOT_TNAME, OB_ALL_VIRTUAL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_TNAME, + OB_ENABLED_ROLES_TNAME, OB_ALL_VIRTUAL_NIC_INFO_TNAME, OB_ALL_VIRTUAL_SQL_AUDIT_ORA_TNAME, OB_ALL_VIRTUAL_SQL_AUDIT_ORA_ALL_VIRTUAL_SQL_AUDIT_I1_TNAME, @@ -8496,11 +8555,15 @@ const char* const tenant_space_table_names [] = { OB_DBA_OB_IMPORT_TABLE_TASK_HISTORY_TNAME, OB_GV_OB_CGROUP_CONFIG_TNAME, OB_V_OB_CGROUP_CONFIG_TNAME, + OB_PROCS_PRIV_TNAME, OB_DBA_OB_AUX_STATISTICS_TNAME, OB_DBA_INDEX_USAGE_TNAME, OB_DBA_OB_SYS_VARIABLES_TNAME, OB_DBA_OB_TRANSFER_PARTITION_TASKS_TNAME, OB_DBA_OB_TRANSFER_PARTITION_TASK_HISTORY_TNAME, + OB_ROLE_EDGES_TNAME, + OB_DEFAULT_ROLES_TNAME, + OB_COLUMNS_PRIV_TNAME, OB_GV_OB_LS_SNAPSHOTS_TNAME, OB_V_OB_LS_SNAPSHOTS_TNAME, OB_DBA_MVIEW_LOGS_TNAME, @@ -9063,6 +9126,7 @@ const char* const tenant_space_table_names [] = { OB_ALL_MVIEW_REFRESH_STATS_IDX_MVIEW_REFRESH_STATS_END_TIME_TNAME, OB_ALL_MVIEW_REFRESH_STATS_IDX_MVIEW_REFRESH_STATS_MVIEW_END_TIME_TNAME, OB_ALL_TRANSFER_PARTITION_TASK_IDX_TRANSFER_PARTITION_KEY_TNAME, + OB_ALL_COLUMN_PRIVILEGE_IDX_COLUMN_PRIVILEGE_NAME_TNAME, OB_ALL_VIRTUAL_TABLE_REAL_AGENT_ORA_IDX_DATA_TABLE_ID_REAL_AGENT_TNAME, OB_ALL_VIRTUAL_TABLE_REAL_AGENT_ORA_IDX_DB_TB_NAME_REAL_AGENT_TNAME, OB_ALL_VIRTUAL_TABLE_REAL_AGENT_ORA_IDX_TB_NAME_REAL_AGENT_TNAME, @@ -9391,12 +9455,16 @@ const char* const tenant_space_table_names [] = { OB_ALL_IMPORT_TABLE_TASK_HISTORY_AUX_LOB_META_TNAME, OB_ALL_CLONE_JOB_AUX_LOB_META_TNAME, OB_ALL_CLONE_JOB_HISTORY_AUX_LOB_META_TNAME, + OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_META_TNAME, + OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_META_TNAME, OB_ALL_NCOMP_DLL_AUX_LOB_META_TNAME, OB_ALL_AUX_STAT_AUX_LOB_META_TNAME, OB_ALL_INDEX_USAGE_INFO_AUX_LOB_META_TNAME, OB_ALL_TRANSFER_PARTITION_TASK_AUX_LOB_META_TNAME, OB_ALL_TRANSFER_PARTITION_TASK_HISTORY_AUX_LOB_META_TNAME, OB_ALL_TENANT_SNAPSHOT_JOB_AUX_LOB_META_TNAME, + OB_ALL_COLUMN_PRIVILEGE_AUX_LOB_META_TNAME, + OB_ALL_COLUMN_PRIVILEGE_HISTORY_AUX_LOB_META_TNAME, OB_ALL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_AUX_LOB_META_TNAME, OB_ALL_TABLE_AUX_LOB_PIECE_TNAME, OB_ALL_COLUMN_AUX_LOB_PIECE_TNAME, @@ -9654,12 +9722,16 @@ const char* const tenant_space_table_names [] = { OB_ALL_IMPORT_TABLE_TASK_HISTORY_AUX_LOB_PIECE_TNAME, OB_ALL_CLONE_JOB_AUX_LOB_PIECE_TNAME, OB_ALL_CLONE_JOB_HISTORY_AUX_LOB_PIECE_TNAME, + OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_PIECE_TNAME, + OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_PIECE_TNAME, OB_ALL_NCOMP_DLL_AUX_LOB_PIECE_TNAME, OB_ALL_AUX_STAT_AUX_LOB_PIECE_TNAME, OB_ALL_INDEX_USAGE_INFO_AUX_LOB_PIECE_TNAME, OB_ALL_TRANSFER_PARTITION_TASK_AUX_LOB_PIECE_TNAME, OB_ALL_TRANSFER_PARTITION_TASK_HISTORY_AUX_LOB_PIECE_TNAME, OB_ALL_TENANT_SNAPSHOT_JOB_AUX_LOB_PIECE_TNAME, + OB_ALL_COLUMN_PRIVILEGE_AUX_LOB_PIECE_TNAME, + OB_ALL_COLUMN_PRIVILEGE_HISTORY_AUX_LOB_PIECE_TNAME, OB_ALL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_AUX_LOB_PIECE_TNAME, }; const uint64_t only_rs_vtables [] = { @@ -12386,6 +12458,22 @@ LOBMapping const lob_aux_table_mappings [] = { ObInnerTableSchema::all_clone_job_history_aux_lob_piece_schema }, + { + OB_ALL_ROUTINE_PRIVILEGE_TID, + OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_META_TID, + OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_PIECE_TID, + ObInnerTableSchema::all_routine_privilege_aux_lob_meta_schema, + ObInnerTableSchema::all_routine_privilege_aux_lob_piece_schema + }, + + { + OB_ALL_ROUTINE_PRIVILEGE_HISTORY_TID, + OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_META_TID, + OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_PIECE_TID, + ObInnerTableSchema::all_routine_privilege_history_aux_lob_meta_schema, + ObInnerTableSchema::all_routine_privilege_history_aux_lob_piece_schema + }, + { OB_ALL_NCOMP_DLL_TID, OB_ALL_NCOMP_DLL_AUX_LOB_META_TID, @@ -12442,6 +12530,22 @@ LOBMapping const lob_aux_table_mappings [] = { ObInnerTableSchema::all_trusted_root_certificate_aux_lob_piece_schema }, + { + OB_ALL_COLUMN_PRIVILEGE_TID, + OB_ALL_COLUMN_PRIVILEGE_AUX_LOB_META_TID, + OB_ALL_COLUMN_PRIVILEGE_AUX_LOB_PIECE_TID, + ObInnerTableSchema::all_column_privilege_aux_lob_meta_schema, + ObInnerTableSchema::all_column_privilege_aux_lob_piece_schema + }, + + { + OB_ALL_COLUMN_PRIVILEGE_HISTORY_TID, + OB_ALL_COLUMN_PRIVILEGE_HISTORY_AUX_LOB_META_TID, + OB_ALL_COLUMN_PRIVILEGE_HISTORY_AUX_LOB_PIECE_TID, + ObInnerTableSchema::all_column_privilege_history_aux_lob_meta_schema, + ObInnerTableSchema::all_column_privilege_history_aux_lob_piece_schema + }, + { OB_ALL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_TID, OB_ALL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_AUX_LOB_META_TID, @@ -12487,12 +12591,12 @@ static inline int get_sys_table_lob_aux_schema(const uint64_t tid, } const int64_t OB_CORE_TABLE_COUNT = 4; -const int64_t OB_SYS_TABLE_COUNT = 284; -const int64_t OB_VIRTUAL_TABLE_COUNT = 791; -const int64_t OB_SYS_VIEW_COUNT = 856; -const int64_t OB_SYS_TENANT_TABLE_COUNT = 1936; +const int64_t OB_SYS_TABLE_COUNT = 288; +const int64_t OB_VIRTUAL_TABLE_COUNT = 796; +const int64_t OB_SYS_VIEW_COUNT = 860; +const int64_t OB_SYS_TENANT_TABLE_COUNT = 1949; const int64_t OB_CORE_SCHEMA_VERSION = 1; -const int64_t OB_BOOTSTRAP_SCHEMA_VERSION = 1939; +const int64_t OB_BOOTSTRAP_SCHEMA_VERSION = 1952; } // end namespace share } // end namespace oceanbase diff --git a/src/share/inner_table/ob_inner_table_schema.lob.cpp b/src/share/inner_table/ob_inner_table_schema.lob.cpp index 2b18ac0314..0adc2be594 100644 --- a/src/share/inner_table/ob_inner_table_schema.lob.cpp +++ b/src/share/inner_table/ob_inner_table_schema.lob.cpp @@ -21,7 +21,7 @@ inner_lob_map_t inner_lob_map; bool lob_mapping_init() { int ret = OB_SUCCESS; - if (OB_FAIL(inner_lob_map.create(287, ObModIds::OB_INNER_LOB_HASH_SET))) { + if (OB_FAIL(inner_lob_map.create(291, ObModIds::OB_INNER_LOB_HASH_SET))) { SERVER_LOG(WARN, "fail to create inner lob map", K(ret)); } else { for (int64_t i = 0; OB_SUCC(ret) && i < ARRAYSIZEOF(lob_aux_table_mappings); ++i) { diff --git a/src/share/inner_table/ob_inner_table_schema_constants.h b/src/share/inner_table/ob_inner_table_schema_constants.h index f069d53565..c2bf66b86c 100644 --- a/src/share/inner_table/ob_inner_table_schema_constants.h +++ b/src/share/inner_table/ob_inner_table_schema_constants.h @@ -307,6 +307,8 @@ const uint64_t OB_ALL_STORAGE_HA_ERROR_DIAGNOSE_HISTORY_TID = 483; // "__all_sto const uint64_t OB_ALL_STORAGE_HA_PERF_DIAGNOSE_HISTORY_TID = 484; // "__all_storage_ha_perf_diagnose_history" const uint64_t OB_ALL_CLONE_JOB_TID = 485; // "__all_clone_job" const uint64_t OB_ALL_CLONE_JOB_HISTORY_TID = 486; // "__all_clone_job_history" +const uint64_t OB_ALL_ROUTINE_PRIVILEGE_TID = 490; // "__all_routine_privilege" +const uint64_t OB_ALL_ROUTINE_PRIVILEGE_HISTORY_TID = 491; // "__all_routine_privilege_history" const uint64_t OB_ALL_NCOMP_DLL_TID = 493; // "__all_ncomp_dll" const uint64_t OB_ALL_AUX_STAT_TID = 494; // "__all_aux_stat" const uint64_t OB_ALL_INDEX_USAGE_INFO_TID = 495; // "__all_index_usage_info" @@ -314,6 +316,8 @@ const uint64_t OB_ALL_TRANSFER_PARTITION_TASK_TID = 498; // "__all_transfer_part const uint64_t OB_ALL_TRANSFER_PARTITION_TASK_HISTORY_TID = 499; // "__all_transfer_partition_task_history" const uint64_t OB_ALL_TENANT_SNAPSHOT_JOB_TID = 500; // "__all_tenant_snapshot_job" const uint64_t OB_ALL_TRUSTED_ROOT_CERTIFICATE_TID = 502; // "__all_trusted_root_certificate" +const uint64_t OB_ALL_COLUMN_PRIVILEGE_TID = 505; // "__all_column_privilege" +const uint64_t OB_ALL_COLUMN_PRIVILEGE_HISTORY_TID = 506; // "__all_column_privilege_history" const uint64_t OB_ALL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_TID = 507; // "__all_tenant_snapshot_ls_replica_history" const uint64_t OB_TENANT_VIRTUAL_ALL_TABLE_TID = 10001; // "__tenant_virtual_all_table" const uint64_t OB_TENANT_VIRTUAL_TABLE_COLUMN_TID = 10002; // "__tenant_virtual_table_column" @@ -741,6 +745,8 @@ const uint64_t OB_ALL_VIRTUAL_CLONE_JOB_HISTORY_TID = 12436; // "__all_virtual_c const uint64_t OB_ALL_VIRTUAL_CHECKPOINT_DIAGNOSE_MEMTABLE_INFO_TID = 12437; // "__all_virtual_checkpoint_diagnose_memtable_info" const uint64_t OB_ALL_VIRTUAL_CHECKPOINT_DIAGNOSE_CHECKPOINT_UNIT_INFO_TID = 12438; // "__all_virtual_checkpoint_diagnose_checkpoint_unit_info" const uint64_t OB_ALL_VIRTUAL_CHECKPOINT_DIAGNOSE_INFO_TID = 12439; // "__all_virtual_checkpoint_diagnose_info" +const uint64_t OB_ALL_VIRTUAL_ROUTINE_PRIVILEGE_TID = 12443; // "__all_virtual_routine_privilege" +const uint64_t OB_ALL_VIRTUAL_ROUTINE_PRIVILEGE_HISTORY_TID = 12444; // "__all_virtual_routine_privilege_history" const uint64_t OB_ALL_VIRTUAL_AUX_STAT_TID = 12447; // "__all_virtual_aux_stat" const uint64_t OB_ALL_VIRTUAL_SYS_VARIABLE_DEFAULT_VALUE_TID = 12450; // "__all_virtual_sys_variable_default_value" const uint64_t OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_TID = 12451; // "__all_virtual_transfer_partition_task" @@ -748,7 +754,10 @@ const uint64_t OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_HISTORY_TID = 12452; // "_ const uint64_t OB_ALL_VIRTUAL_TENANT_SNAPSHOT_JOB_TID = 12453; // "__all_virtual_tenant_snapshot_job" const uint64_t OB_ALL_VIRTUAL_LS_SNAPSHOT_TID = 12458; // "__all_virtual_ls_snapshot" const uint64_t OB_ALL_VIRTUAL_INDEX_USAGE_INFO_TID = 12459; // "__all_virtual_index_usage_info" +const uint64_t OB_ALL_VIRTUAL_COLUMN_PRIVILEGE_TID = 12462; // "__all_virtual_column_privilege" +const uint64_t OB_ALL_VIRTUAL_COLUMN_PRIVILEGE_HISTORY_TID = 12463; // "__all_virtual_column_privilege_history" const uint64_t OB_ALL_VIRTUAL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_TID = 12464; // "__all_virtual_tenant_snapshot_ls_replica_history" +const uint64_t OB_ENABLED_ROLES_TID = 12466; // "ENABLED_ROLES" const uint64_t OB_ALL_VIRTUAL_NIC_INFO_TID = 12487; // "__all_virtual_nic_info" const uint64_t OB_ALL_VIRTUAL_SQL_AUDIT_ORA_TID = 15009; // "ALL_VIRTUAL_SQL_AUDIT_ORA" const uint64_t OB_ALL_VIRTUAL_PLAN_STAT_ORA_TID = 15010; // "ALL_VIRTUAL_PLAN_STAT_ORA" @@ -1386,6 +1395,7 @@ const uint64_t OB_GV_OB_TENANT_RUNTIME_INFO_TID = 21477; // "GV$OB_TENANT_RUNTIM const uint64_t OB_V_OB_TENANT_RUNTIME_INFO_TID = 21478; // "V$OB_TENANT_RUNTIME_INFO" const uint64_t OB_GV_OB_CGROUP_CONFIG_TID = 21479; // "GV$OB_CGROUP_CONFIG" const uint64_t OB_V_OB_CGROUP_CONFIG_TID = 21480; // "V$OB_CGROUP_CONFIG" +const uint64_t OB_PROCS_PRIV_TID = 21486; // "procs_priv" const uint64_t OB_DBA_OB_AUX_STATISTICS_TID = 21497; // "DBA_OB_AUX_STATISTICS" const uint64_t OB_CDB_OB_AUX_STATISTICS_TID = 21498; // "CDB_OB_AUX_STATISTICS" const uint64_t OB_DBA_INDEX_USAGE_TID = 21499; // "DBA_INDEX_USAGE" @@ -1396,7 +1406,10 @@ const uint64_t OB_DBA_OB_TRANSFER_PARTITION_TASK_HISTORY_TID = 21503; // "DBA_OB const uint64_t OB_CDB_OB_TRANSFER_PARTITION_TASK_HISTORY_TID = 21504; // "CDB_OB_TRANSFER_PARTITION_TASK_HISTORY" const uint64_t OB_DBA_OB_TRUSTED_ROOT_CERTIFICATE_TID = 21509; // "DBA_OB_TRUSTED_ROOT_CERTIFICATE" const uint64_t OB_DBA_OB_CLONE_PROGRESS_TID = 21510; // "DBA_OB_CLONE_PROGRESS" +const uint64_t OB_ROLE_EDGES_TID = 21511; // "role_edges" +const uint64_t OB_DEFAULT_ROLES_TID = 21512; // "default_roles" const uint64_t OB_CDB_INDEX_USAGE_TID = 21513; // "CDB_INDEX_USAGE" +const uint64_t OB_COLUMNS_PRIV_TID = 21516; // "columns_priv" const uint64_t OB_GV_OB_LS_SNAPSHOTS_TID = 21517; // "GV$OB_LS_SNAPSHOTS" const uint64_t OB_V_OB_LS_SNAPSHOTS_TID = 21518; // "V$OB_LS_SNAPSHOTS" const uint64_t OB_DBA_OB_CLONE_HISTORY_TID = 21519; // "DBA_OB_CLONE_HISTORY" @@ -2150,6 +2163,8 @@ const uint64_t OB_ALL_STORAGE_HA_ERROR_DIAGNOSE_HISTORY_AUX_LOB_META_TID = 50483 const uint64_t OB_ALL_STORAGE_HA_PERF_DIAGNOSE_HISTORY_AUX_LOB_META_TID = 50484; // "__all_storage_ha_perf_diagnose_history_aux_lob_meta" const uint64_t OB_ALL_CLONE_JOB_AUX_LOB_META_TID = 50485; // "__all_clone_job_aux_lob_meta" const uint64_t OB_ALL_CLONE_JOB_HISTORY_AUX_LOB_META_TID = 50486; // "__all_clone_job_history_aux_lob_meta" +const uint64_t OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_META_TID = 50490; // "__all_routine_privilege_aux_lob_meta" +const uint64_t OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_META_TID = 50491; // "__all_routine_privilege_history_aux_lob_meta" const uint64_t OB_ALL_NCOMP_DLL_AUX_LOB_META_TID = 50493; // "__all_ncomp_dll_aux_lob_meta" const uint64_t OB_ALL_AUX_STAT_AUX_LOB_META_TID = 50494; // "__all_aux_stat_aux_lob_meta" const uint64_t OB_ALL_INDEX_USAGE_INFO_AUX_LOB_META_TID = 50495; // "__all_index_usage_info_aux_lob_meta" @@ -2157,6 +2172,8 @@ const uint64_t OB_ALL_TRANSFER_PARTITION_TASK_AUX_LOB_META_TID = 50498; // "__al const uint64_t OB_ALL_TRANSFER_PARTITION_TASK_HISTORY_AUX_LOB_META_TID = 50499; // "__all_transfer_partition_task_history_aux_lob_meta" const uint64_t OB_ALL_TENANT_SNAPSHOT_JOB_AUX_LOB_META_TID = 50500; // "__all_tenant_snapshot_job_aux_lob_meta" const uint64_t OB_ALL_TRUSTED_ROOT_CERTIFICATE_AUX_LOB_META_TID = 50502; // "__all_trusted_root_certificate_aux_lob_meta" +const uint64_t OB_ALL_COLUMN_PRIVILEGE_AUX_LOB_META_TID = 50505; // "__all_column_privilege_aux_lob_meta" +const uint64_t OB_ALL_COLUMN_PRIVILEGE_HISTORY_AUX_LOB_META_TID = 50506; // "__all_column_privilege_history_aux_lob_meta" const uint64_t OB_ALL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_AUX_LOB_META_TID = 50507; // "__all_tenant_snapshot_ls_replica_history_aux_lob_meta" const uint64_t OB_ALL_TABLE_AUX_LOB_PIECE_TID = 60003; // "__all_table_aux_lob_piece" const uint64_t OB_ALL_COLUMN_AUX_LOB_PIECE_TID = 60004; // "__all_column_aux_lob_piece" @@ -2437,6 +2454,8 @@ const uint64_t OB_ALL_STORAGE_HA_ERROR_DIAGNOSE_HISTORY_AUX_LOB_PIECE_TID = 6048 const uint64_t OB_ALL_STORAGE_HA_PERF_DIAGNOSE_HISTORY_AUX_LOB_PIECE_TID = 60484; // "__all_storage_ha_perf_diagnose_history_aux_lob_piece" const uint64_t OB_ALL_CLONE_JOB_AUX_LOB_PIECE_TID = 60485; // "__all_clone_job_aux_lob_piece" const uint64_t OB_ALL_CLONE_JOB_HISTORY_AUX_LOB_PIECE_TID = 60486; // "__all_clone_job_history_aux_lob_piece" +const uint64_t OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_PIECE_TID = 60490; // "__all_routine_privilege_aux_lob_piece" +const uint64_t OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_PIECE_TID = 60491; // "__all_routine_privilege_history_aux_lob_piece" const uint64_t OB_ALL_NCOMP_DLL_AUX_LOB_PIECE_TID = 60493; // "__all_ncomp_dll_aux_lob_piece" const uint64_t OB_ALL_AUX_STAT_AUX_LOB_PIECE_TID = 60494; // "__all_aux_stat_aux_lob_piece" const uint64_t OB_ALL_INDEX_USAGE_INFO_AUX_LOB_PIECE_TID = 60495; // "__all_index_usage_info_aux_lob_piece" @@ -2444,6 +2463,8 @@ const uint64_t OB_ALL_TRANSFER_PARTITION_TASK_AUX_LOB_PIECE_TID = 60498; // "__a const uint64_t OB_ALL_TRANSFER_PARTITION_TASK_HISTORY_AUX_LOB_PIECE_TID = 60499; // "__all_transfer_partition_task_history_aux_lob_piece" const uint64_t OB_ALL_TENANT_SNAPSHOT_JOB_AUX_LOB_PIECE_TID = 60500; // "__all_tenant_snapshot_job_aux_lob_piece" const uint64_t OB_ALL_TRUSTED_ROOT_CERTIFICATE_AUX_LOB_PIECE_TID = 60502; // "__all_trusted_root_certificate_aux_lob_piece" +const uint64_t OB_ALL_COLUMN_PRIVILEGE_AUX_LOB_PIECE_TID = 60505; // "__all_column_privilege_aux_lob_piece" +const uint64_t OB_ALL_COLUMN_PRIVILEGE_HISTORY_AUX_LOB_PIECE_TID = 60506; // "__all_column_privilege_history_aux_lob_piece" const uint64_t OB_ALL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_AUX_LOB_PIECE_TID = 60507; // "__all_tenant_snapshot_ls_replica_history_aux_lob_piece" const uint64_t OB_ALL_VIRTUAL_PLAN_CACHE_STAT_ALL_VIRTUAL_PLAN_CACHE_STAT_I1_TID = 14999; // "__all_virtual_plan_cache_stat" const uint64_t OB_ALL_VIRTUAL_SESSION_EVENT_ALL_VIRTUAL_SESSION_EVENT_I1_TID = 14998; // "__all_virtual_session_event" @@ -2567,6 +2588,7 @@ const uint64_t OB_ALL_MVIEW_REFRESH_RUN_STATS_IDX_MVIEW_REFRESH_RUN_STATS_NUM_MV const uint64_t OB_ALL_MVIEW_REFRESH_STATS_IDX_MVIEW_REFRESH_STATS_END_TIME_TID = 101096; // "__all_mview_refresh_stats" const uint64_t OB_ALL_MVIEW_REFRESH_STATS_IDX_MVIEW_REFRESH_STATS_MVIEW_END_TIME_TID = 101097; // "__all_mview_refresh_stats" const uint64_t OB_ALL_TRANSFER_PARTITION_TASK_IDX_TRANSFER_PARTITION_KEY_TID = 101098; // "__all_transfer_partition_task" +const uint64_t OB_ALL_COLUMN_PRIVILEGE_IDX_COLUMN_PRIVILEGE_NAME_TID = 101100; // "__all_column_privilege" const uint64_t OB_ALL_VIRTUAL_TABLE_REAL_AGENT_ORA_IDX_DATA_TABLE_ID_REAL_AGENT_TID = 15306; // "ALL_VIRTUAL_TABLE_REAL_AGENT_ORA" const uint64_t OB_ALL_VIRTUAL_TABLE_REAL_AGENT_ORA_IDX_DB_TB_NAME_REAL_AGENT_TID = 15307; // "ALL_VIRTUAL_TABLE_REAL_AGENT_ORA" const uint64_t OB_ALL_VIRTUAL_TABLE_REAL_AGENT_ORA_IDX_TB_NAME_REAL_AGENT_TID = 15308; // "ALL_VIRTUAL_TABLE_REAL_AGENT_ORA" @@ -2920,6 +2942,8 @@ const char *const OB_ALL_STORAGE_HA_ERROR_DIAGNOSE_HISTORY_TNAME = "__all_storag const char *const OB_ALL_STORAGE_HA_PERF_DIAGNOSE_HISTORY_TNAME = "__all_storage_ha_perf_diagnose_history"; const char *const OB_ALL_CLONE_JOB_TNAME = "__all_clone_job"; const char *const OB_ALL_CLONE_JOB_HISTORY_TNAME = "__all_clone_job_history"; +const char *const OB_ALL_ROUTINE_PRIVILEGE_TNAME = "__all_routine_privilege"; +const char *const OB_ALL_ROUTINE_PRIVILEGE_HISTORY_TNAME = "__all_routine_privilege_history"; const char *const OB_ALL_NCOMP_DLL_TNAME = "__all_ncomp_dll"; const char *const OB_ALL_AUX_STAT_TNAME = "__all_aux_stat"; const char *const OB_ALL_INDEX_USAGE_INFO_TNAME = "__all_index_usage_info"; @@ -2927,6 +2951,8 @@ const char *const OB_ALL_TRANSFER_PARTITION_TASK_TNAME = "__all_transfer_partiti const char *const OB_ALL_TRANSFER_PARTITION_TASK_HISTORY_TNAME = "__all_transfer_partition_task_history"; const char *const OB_ALL_TENANT_SNAPSHOT_JOB_TNAME = "__all_tenant_snapshot_job"; const char *const OB_ALL_TRUSTED_ROOT_CERTIFICATE_TNAME = "__all_trusted_root_certificate"; +const char *const OB_ALL_COLUMN_PRIVILEGE_TNAME = "__all_column_privilege"; +const char *const OB_ALL_COLUMN_PRIVILEGE_HISTORY_TNAME = "__all_column_privilege_history"; const char *const OB_ALL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_TNAME = "__all_tenant_snapshot_ls_replica_history"; const char *const OB_TENANT_VIRTUAL_ALL_TABLE_TNAME = "__tenant_virtual_all_table"; const char *const OB_TENANT_VIRTUAL_TABLE_COLUMN_TNAME = "__tenant_virtual_table_column"; @@ -3354,6 +3380,8 @@ const char *const OB_ALL_VIRTUAL_CLONE_JOB_HISTORY_TNAME = "__all_virtual_clone_ const char *const OB_ALL_VIRTUAL_CHECKPOINT_DIAGNOSE_MEMTABLE_INFO_TNAME = "__all_virtual_checkpoint_diagnose_memtable_info"; const char *const OB_ALL_VIRTUAL_CHECKPOINT_DIAGNOSE_CHECKPOINT_UNIT_INFO_TNAME = "__all_virtual_checkpoint_diagnose_checkpoint_unit_info"; const char *const OB_ALL_VIRTUAL_CHECKPOINT_DIAGNOSE_INFO_TNAME = "__all_virtual_checkpoint_diagnose_info"; +const char *const OB_ALL_VIRTUAL_ROUTINE_PRIVILEGE_TNAME = "__all_virtual_routine_privilege"; +const char *const OB_ALL_VIRTUAL_ROUTINE_PRIVILEGE_HISTORY_TNAME = "__all_virtual_routine_privilege_history"; const char *const OB_ALL_VIRTUAL_AUX_STAT_TNAME = "__all_virtual_aux_stat"; const char *const OB_ALL_VIRTUAL_SYS_VARIABLE_DEFAULT_VALUE_TNAME = "__all_virtual_sys_variable_default_value"; const char *const OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_TNAME = "__all_virtual_transfer_partition_task"; @@ -3361,7 +3389,10 @@ const char *const OB_ALL_VIRTUAL_TRANSFER_PARTITION_TASK_HISTORY_TNAME = "__all_ const char *const OB_ALL_VIRTUAL_TENANT_SNAPSHOT_JOB_TNAME = "__all_virtual_tenant_snapshot_job"; const char *const OB_ALL_VIRTUAL_LS_SNAPSHOT_TNAME = "__all_virtual_ls_snapshot"; const char *const OB_ALL_VIRTUAL_INDEX_USAGE_INFO_TNAME = "__all_virtual_index_usage_info"; +const char *const OB_ALL_VIRTUAL_COLUMN_PRIVILEGE_TNAME = "__all_virtual_column_privilege"; +const char *const OB_ALL_VIRTUAL_COLUMN_PRIVILEGE_HISTORY_TNAME = "__all_virtual_column_privilege_history"; const char *const OB_ALL_VIRTUAL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_TNAME = "__all_virtual_tenant_snapshot_ls_replica_history"; +const char *const OB_ENABLED_ROLES_TNAME = "ENABLED_ROLES"; const char *const OB_ALL_VIRTUAL_NIC_INFO_TNAME = "__all_virtual_nic_info"; const char *const OB_ALL_VIRTUAL_SQL_AUDIT_ORA_TNAME = "ALL_VIRTUAL_SQL_AUDIT"; const char *const OB_ALL_VIRTUAL_PLAN_STAT_ORA_TNAME = "ALL_VIRTUAL_PLAN_STAT"; @@ -3999,6 +4030,7 @@ const char *const OB_GV_OB_TENANT_RUNTIME_INFO_TNAME = "GV$OB_TENANT_RUNTIME_INF const char *const OB_V_OB_TENANT_RUNTIME_INFO_TNAME = "V$OB_TENANT_RUNTIME_INFO"; const char *const OB_GV_OB_CGROUP_CONFIG_TNAME = "GV$OB_CGROUP_CONFIG"; const char *const OB_V_OB_CGROUP_CONFIG_TNAME = "V$OB_CGROUP_CONFIG"; +const char *const OB_PROCS_PRIV_TNAME = "procs_priv"; const char *const OB_DBA_OB_AUX_STATISTICS_TNAME = "DBA_OB_AUX_STATISTICS"; const char *const OB_CDB_OB_AUX_STATISTICS_TNAME = "CDB_OB_AUX_STATISTICS"; const char *const OB_DBA_INDEX_USAGE_TNAME = "DBA_INDEX_USAGE"; @@ -4009,7 +4041,10 @@ const char *const OB_DBA_OB_TRANSFER_PARTITION_TASK_HISTORY_TNAME = "DBA_OB_TRAN const char *const OB_CDB_OB_TRANSFER_PARTITION_TASK_HISTORY_TNAME = "CDB_OB_TRANSFER_PARTITION_TASK_HISTORY"; const char *const OB_DBA_OB_TRUSTED_ROOT_CERTIFICATE_TNAME = "DBA_OB_TRUSTED_ROOT_CERTIFICATE"; const char *const OB_DBA_OB_CLONE_PROGRESS_TNAME = "DBA_OB_CLONE_PROGRESS"; +const char *const OB_ROLE_EDGES_TNAME = "role_edges"; +const char *const OB_DEFAULT_ROLES_TNAME = "default_roles"; const char *const OB_CDB_INDEX_USAGE_TNAME = "CDB_INDEX_USAGE"; +const char *const OB_COLUMNS_PRIV_TNAME = "columns_priv"; const char *const OB_GV_OB_LS_SNAPSHOTS_TNAME = "GV$OB_LS_SNAPSHOTS"; const char *const OB_V_OB_LS_SNAPSHOTS_TNAME = "V$OB_LS_SNAPSHOTS"; const char *const OB_DBA_OB_CLONE_HISTORY_TNAME = "DBA_OB_CLONE_HISTORY"; @@ -4763,6 +4798,8 @@ const char *const OB_ALL_STORAGE_HA_ERROR_DIAGNOSE_HISTORY_AUX_LOB_META_TNAME = const char *const OB_ALL_STORAGE_HA_PERF_DIAGNOSE_HISTORY_AUX_LOB_META_TNAME = "__all_storage_ha_perf_diagnose_history_aux_lob_meta"; const char *const OB_ALL_CLONE_JOB_AUX_LOB_META_TNAME = "__all_clone_job_aux_lob_meta"; const char *const OB_ALL_CLONE_JOB_HISTORY_AUX_LOB_META_TNAME = "__all_clone_job_history_aux_lob_meta"; +const char *const OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_META_TNAME = "__all_routine_privilege_aux_lob_meta"; +const char *const OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_META_TNAME = "__all_routine_privilege_history_aux_lob_meta"; const char *const OB_ALL_NCOMP_DLL_AUX_LOB_META_TNAME = "__all_ncomp_dll_aux_lob_meta"; const char *const OB_ALL_AUX_STAT_AUX_LOB_META_TNAME = "__all_aux_stat_aux_lob_meta"; const char *const OB_ALL_INDEX_USAGE_INFO_AUX_LOB_META_TNAME = "__all_index_usage_info_aux_lob_meta"; @@ -4770,6 +4807,8 @@ const char *const OB_ALL_TRANSFER_PARTITION_TASK_AUX_LOB_META_TNAME = "__all_tra const char *const OB_ALL_TRANSFER_PARTITION_TASK_HISTORY_AUX_LOB_META_TNAME = "__all_transfer_partition_task_history_aux_lob_meta"; const char *const OB_ALL_TENANT_SNAPSHOT_JOB_AUX_LOB_META_TNAME = "__all_tenant_snapshot_job_aux_lob_meta"; const char *const OB_ALL_TRUSTED_ROOT_CERTIFICATE_AUX_LOB_META_TNAME = "__all_trusted_root_certificate_aux_lob_meta"; +const char *const OB_ALL_COLUMN_PRIVILEGE_AUX_LOB_META_TNAME = "__all_column_privilege_aux_lob_meta"; +const char *const OB_ALL_COLUMN_PRIVILEGE_HISTORY_AUX_LOB_META_TNAME = "__all_column_privilege_history_aux_lob_meta"; const char *const OB_ALL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_AUX_LOB_META_TNAME = "__all_tenant_snapshot_ls_replica_history_aux_lob_meta"; const char *const OB_ALL_TABLE_AUX_LOB_PIECE_TNAME = "__all_table_aux_lob_piece"; const char *const OB_ALL_COLUMN_AUX_LOB_PIECE_TNAME = "__all_column_aux_lob_piece"; @@ -5050,6 +5089,8 @@ const char *const OB_ALL_STORAGE_HA_ERROR_DIAGNOSE_HISTORY_AUX_LOB_PIECE_TNAME = const char *const OB_ALL_STORAGE_HA_PERF_DIAGNOSE_HISTORY_AUX_LOB_PIECE_TNAME = "__all_storage_ha_perf_diagnose_history_aux_lob_piece"; const char *const OB_ALL_CLONE_JOB_AUX_LOB_PIECE_TNAME = "__all_clone_job_aux_lob_piece"; const char *const OB_ALL_CLONE_JOB_HISTORY_AUX_LOB_PIECE_TNAME = "__all_clone_job_history_aux_lob_piece"; +const char *const OB_ALL_ROUTINE_PRIVILEGE_AUX_LOB_PIECE_TNAME = "__all_routine_privilege_aux_lob_piece"; +const char *const OB_ALL_ROUTINE_PRIVILEGE_HISTORY_AUX_LOB_PIECE_TNAME = "__all_routine_privilege_history_aux_lob_piece"; const char *const OB_ALL_NCOMP_DLL_AUX_LOB_PIECE_TNAME = "__all_ncomp_dll_aux_lob_piece"; const char *const OB_ALL_AUX_STAT_AUX_LOB_PIECE_TNAME = "__all_aux_stat_aux_lob_piece"; const char *const OB_ALL_INDEX_USAGE_INFO_AUX_LOB_PIECE_TNAME = "__all_index_usage_info_aux_lob_piece"; @@ -5057,6 +5098,8 @@ const char *const OB_ALL_TRANSFER_PARTITION_TASK_AUX_LOB_PIECE_TNAME = "__all_tr const char *const OB_ALL_TRANSFER_PARTITION_TASK_HISTORY_AUX_LOB_PIECE_TNAME = "__all_transfer_partition_task_history_aux_lob_piece"; const char *const OB_ALL_TENANT_SNAPSHOT_JOB_AUX_LOB_PIECE_TNAME = "__all_tenant_snapshot_job_aux_lob_piece"; const char *const OB_ALL_TRUSTED_ROOT_CERTIFICATE_AUX_LOB_PIECE_TNAME = "__all_trusted_root_certificate_aux_lob_piece"; +const char *const OB_ALL_COLUMN_PRIVILEGE_AUX_LOB_PIECE_TNAME = "__all_column_privilege_aux_lob_piece"; +const char *const OB_ALL_COLUMN_PRIVILEGE_HISTORY_AUX_LOB_PIECE_TNAME = "__all_column_privilege_history_aux_lob_piece"; const char *const OB_ALL_TENANT_SNAPSHOT_LS_REPLICA_HISTORY_AUX_LOB_PIECE_TNAME = "__all_tenant_snapshot_ls_replica_history_aux_lob_piece"; const char *const OB_ALL_VIRTUAL_PLAN_CACHE_STAT_ALL_VIRTUAL_PLAN_CACHE_STAT_I1_TNAME = "__idx_11003_all_virtual_plan_cache_stat_i1"; const char *const OB_ALL_VIRTUAL_SESSION_EVENT_ALL_VIRTUAL_SESSION_EVENT_I1_TNAME = "__idx_11013_all_virtual_session_event_i1"; @@ -5180,6 +5223,7 @@ const char *const OB_ALL_MVIEW_REFRESH_RUN_STATS_IDX_MVIEW_REFRESH_RUN_STATS_NUM const char *const OB_ALL_MVIEW_REFRESH_STATS_IDX_MVIEW_REFRESH_STATS_END_TIME_TNAME = "__idx_468_idx_mview_refresh_stats_end_time"; const char *const OB_ALL_MVIEW_REFRESH_STATS_IDX_MVIEW_REFRESH_STATS_MVIEW_END_TIME_TNAME = "__idx_468_idx_mview_refresh_stats_mview_end_time"; const char *const OB_ALL_TRANSFER_PARTITION_TASK_IDX_TRANSFER_PARTITION_KEY_TNAME = "__idx_498_idx_transfer_partition_key"; +const char *const OB_ALL_COLUMN_PRIVILEGE_IDX_COLUMN_PRIVILEGE_NAME_TNAME = "__idx_505_idx_column_privilege_name"; const char *const OB_ALL_VIRTUAL_TABLE_REAL_AGENT_ORA_IDX_DATA_TABLE_ID_REAL_AGENT_TNAME = "__idx_15120_idx_data_table_id_real_agent"; const char *const OB_ALL_VIRTUAL_TABLE_REAL_AGENT_ORA_IDX_DB_TB_NAME_REAL_AGENT_TNAME = "__idx_15120_idx_db_tb_name_real_agent"; const char *const OB_ALL_VIRTUAL_TABLE_REAL_AGENT_ORA_IDX_TB_NAME_REAL_AGENT_TNAME = "__idx_15120_idx_tb_name_real_agent"; diff --git a/src/share/inner_table/ob_inner_table_schema_def.py b/src/share/inner_table/ob_inner_table_schema_def.py index e2c2cf1207..a8199e7e43 100644 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -403,7 +403,7 @@ def_table_schema( # 101: __all_meta_table # abandoned in 4.0 all_user_def = dict( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = '__all_user', table_id = '102', table_type = 'SYSTEM_TABLE', @@ -555,7 +555,7 @@ def_table_schema(**all_tenant_def) def_table_schema(**gen_history_table_def(109, all_tenant_def)) all_table_privilege_def = dict( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = '__all_table_privilege', table_id = '110', table_type = 'SYSTEM_TABLE', @@ -589,7 +589,7 @@ def_table_schema(**all_table_privilege_def) def_table_schema(**gen_history_table_def(111, all_table_privilege_def)) all_database_privilege_def = dict( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = '__all_database_privilege', table_id = '112', table_type = 'SYSTEM_TABLE', @@ -995,7 +995,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = '__all_privilege', table_id = '141', table_type = 'SYSTEM_TABLE', @@ -2355,7 +2355,7 @@ def_table_schema( # 258: __all_tenant_sstable_column_checksum # abandoned in 4.0 all_tenant_security_audit_record_def = dict( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = '__all_tenant_security_audit_record', table_id = '259', table_type = 'SYSTEM_TABLE', @@ -6723,6 +6723,7 @@ def_table_schema( ], ) + # 481 : __all_import_stmt_exec_history # 482 : __all_tablet_reorganize_history def_table_schema( @@ -6852,8 +6853,29 @@ def_table_schema(**all_clone_job_history_def) # 487: __wr_system_event # 488: __wr_event_name # 489: __all_tenant_scheduler_running_job -# 490: __all_routine_privilege -# 491: __all_routine_privilege_history +all_routine_privilege_def = dict( + owner = 'mingye.swj', + table_name = '__all_routine_privilege', + table_id = '490', + table_type = 'SYSTEM_TABLE', + gm_columns = ['gmt_create', 'gmt_modified'], + rowkey_columns = [ + ('tenant_id', 'int'), + ('user_id', 'int'), + ('database_name', 'varbinary:OB_MAX_DATABASE_NAME_BINARY_LENGTH'), + ('routine_name', 'varbinary:OB_MAX_ROUTINE_NAME_BINARY_LENGTH'), + ('routine_type', 'int'), + ], + in_tenant_space = True, + + normal_columns = [ + ('all_priv', 'int', 'false', '0'), + ], +) + +def_table_schema(**all_routine_privilege_def) +def_table_schema(**gen_history_table_def(491, all_routine_privilege_def)) + # 492: __wr_sqlstat all_ncomp_dll = dict( @@ -6996,8 +7018,30 @@ def_table_schema( # 503 : __all_audit_log_filter # 504 : __all_audit_log_user -# 505 : __all_column_privilege -# 506 : __all_column_privilege_history +all_column_privilege_def = dict( + owner = 'mingye.swj', + table_name = '__all_column_privilege', + table_id = '505', + table_type = 'SYSTEM_TABLE', + gm_columns = ['gmt_create', 'gmt_modified'], + rowkey_columns = [ + ('tenant_id', 'int'), + ('priv_id', 'int'), + ], + in_tenant_space = True, + normal_columns =[ + ('user_id', 'int'), + ('database_name', 'varbinary:1024'), + ('table_name', 'varbinary:1024'), + ('column_name', 'varbinary:1024'), + ('all_priv', 'int', 'false', '0'), + ], +) + +def_table_schema(**all_column_privilege_def) + +def_table_schema(**gen_history_table_def(506, all_column_privilege_def)) + all_tenant_snapshot_ls_replica_history_def = dict( owner = 'chensen.cs', table_name = '__all_tenant_snapshot_ls_replica_history', @@ -7222,7 +7266,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = '__tenant_virtual_privilege_grant', table_id = '10007', table_type = 'VIRTUAL_TABLE', @@ -9245,7 +9289,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = '__all_virtual_audit_operation', table_id = '11097', table_type = 'VIRTUAL_TABLE', @@ -9262,7 +9306,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = '__all_virtual_audit_action', table_id = '11098', table_type = 'VIRTUAL_TABLE', @@ -9816,7 +9860,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', database_id = 'OB_MYSQL_SCHEMA_ID', table_name = 'user', table_id = '12009', @@ -9877,7 +9921,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', database_id = 'OB_MYSQL_SCHEMA_ID', table_name = 'db', table_id = '12010', @@ -13948,8 +13992,15 @@ def_table_schema( # 12440: __all_virtual_wr_system_event # 12441: __all_virtual_wr_event_name # 12442: __all_virtual_tenant_scheduler_running_job -# 12443: __all_virtual_routine_privilege -# 12444: __all_virtual_routine_privilege_history +def_table_schema(**gen_iterate_virtual_table_def( + table_id = '12443', + table_name = '__all_virtual_routine_privilege', + keywords = all_def_keywords['__all_routine_privilege'])) + +def_table_schema(**gen_iterate_virtual_table_def( + table_id = '12444', + table_name = '__all_virtual_routine_privilege_history', + keywords = all_def_keywords['__all_routine_privilege_history'])) # 12445: __all_virtual_sqlstat # 12446: __all_virtual_wr_sqlstat def_table_schema(**gen_iterate_virtual_table_def( @@ -14031,15 +14082,41 @@ def_table_schema(**gen_iterate_virtual_table_def( # 12460: __all_virtual_audit_log_filter # 12461: __all_virtual_audit_log_user -# 12462: __all_virtual_column_privilege -# 12463: __all_virtual_column_privilege_history +def_table_schema(**gen_iterate_virtual_table_def( + table_id = '12462', + table_name = '__all_virtual_column_privilege', + keywords = all_def_keywords['__all_column_privilege'])) + +def_table_schema(**gen_iterate_virtual_table_def( + table_id = '12463', + table_name = '__all_virtual_column_privilege_history', + keywords = all_def_keywords['__all_column_privilege_history'])) + def_table_schema(**gen_iterate_private_virtual_table_def( table_id = '12464', table_name = '__all_virtual_tenant_snapshot_ls_replica_history', in_tenant_space = True, keywords = all_def_keywords['__all_tenant_snapshot_ls_replica_history'])) # 12465: __all_virtual_shared_storage_quota -# 12466: enabled_roles + +def_table_schema( + owner = 'jim.wjh', + database_id = 'OB_INFORMATION_SCHEMA_ID', + table_name = 'ENABLED_ROLES', + table_id = '12466', + table_type = 'VIRTUAL_TABLE', + gm_columns = [], + rowkey_columns = [], + in_tenant_space = True, + + normal_columns = [ + ('ROLE_NAME', 'varchar:OB_MAX_SYS_PARAM_NAME_LENGTH', 'true', 'NULL'), + ('ROLE_HOST', 'varchar:OB_MAX_SYS_PARAM_VALUE_LENGTH', 'true', 'NULL'), + ('IS_DEFAULT', 'varchar:OB_MAX_SYS_PARAM_VALUE_LENGTH', 'true', 'NULL'), + ('IS_MANDATORY', 'varchar:OB_MAX_SYS_PARAM_VALUE_LENGTH', 'false', ''), + ], +) + # 12467: __all_virtual_ls_replica_task_history # 12468: __all_virtual_session_ps_info # 12469: __all_virtual_tracepoint_info @@ -14060,6 +14137,7 @@ def_table_schema(**gen_iterate_private_virtual_table_def( # 12484: __all_virtual_res_mgr_consumer_group # 12485: __all_virtual_storage_io_usage # 12486: __all_zone_storage +# def_table_schema( owner = 'gengfu.zpc', @@ -18270,7 +18348,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', tablegroup_id = 'OB_INVALID_ID', database_id = 'OB_INFORMATION_SCHEMA_ID', table_name = 'COLUMN_PRIVILEGES', @@ -18280,16 +18358,25 @@ def_table_schema( normal_columns = [], gm_columns = [], in_tenant_space = True, - view_definition = """SELECT - CAST(NULL AS CHAR(292)) AS GRANTEE, - CAST('def' AS CHAR(512)) AS TABLE_CATALOG, - CAST(NULL AS CHAR(64)) AS TABLE_SCHEMA, - CAST(NULL AS CHAR(64)) AS TABLE_NAME, - CAST(NULL AS CHAR(64)) AS COLUMN_NAME, - CAST(NULL AS CHAR(64)) AS PRIVILEGE_TYPE, - CAST(NULL AS CHAR(3)) AS IS_GRANTABLE - FROM DUAL - WHERE 1 = 0 + view_definition = """SELECT cast(concat('''', B.user_name, '''', '@', '''', B.host, '''') as char(292)) as GRANTEE, + cast('def' as char(512)) AS TABLE_CATALOG, + cast(DATABASE_NAME as char(64)) AS TABLE_SCHEMA, + cast(TABLE_NAME as char(64)) AS TABLE_NAME, + cast(COLUMN_NAME as char(64)) AS COLUMN_NAME, + cast(CASE WHEN V1.C1 = 0 AND (A.all_priv & 1) != 0 THEN 'SELECT' + WHEN V1.C1 = 1 AND (A.all_priv & 2) != 0 THEN 'INSERT' + WHEN V1.C1 = 2 AND (A.all_priv & 4) != 0 THEN 'UPDATE' + WHEN V1.C1 = 3 AND (A.all_priv & 8) != 0 THEN 'REFERENCES' + END AS char(64)) AS PRIVILEGE_TYPE, + cast(case when priv_grant_option = 1 then 'YES' ELSE 'NO' END as char(3)) AS IS_GRANTABLE + FROM oceanbase.__all_column_privilege A, oceanbase.__all_user B, + (SELECT 0 AS C1 + UNION ALL SELECT 1 AS C1 + UNION ALL SELECT 2 AS C1 + UNION ALL SELECT 3 AS C1) V1 + WHERE A.tenant_id = B.tenant_id and A.tenant_id = 0 and A.user_id = B.user_id AND + ((V1.C1 = 0 AND (A.all_priv & 1) != 0) OR (V1.C1 = 1 AND (A.all_priv & 2) != 0) + OR (V1.C1 = 2 AND (A.all_priv & 4) != 0 OR (V1.C1 = 0 AND (A.all_priv & 8) != 0))) """.replace("\n", " "), ) @@ -27935,7 +28022,10 @@ def_table_schema( (CASE WHEN PRIV_REPL_SLAVE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_REPL_SLAVE, (CASE WHEN PRIV_REPL_CLIENT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_REPL_CLIENT, (CASE WHEN PRIV_DROP_DATABASE_LINK = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_DROP_DATABASE_LINK, - (CASE WHEN PRIV_CREATE_DATABASE_LINK = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_DATABASE_LINK + (CASE WHEN PRIV_CREATE_DATABASE_LINK = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_DATABASE_LINK, + (CASE WHEN (PRIV_OTHERS & (1 << 0)) != 0 THEN 'YES' ELSE 'NO' END) AS PRIV_EXECUTE, + (CASE WHEN (PRIV_OTHERS & (1 << 1)) != 0 THEN 'YES' ELSE 'NO' END) AS PRIV_ALTER_ROUTINE, + (CASE WHEN (PRIV_OTHERS & (1 << 2)) != 0 THEN 'YES' ELSE 'NO' END) AS PRIV_CREATE_ROUTINE FROM OCEANBASE.__all_user; """.replace("\n", " ") ) @@ -27989,7 +28079,10 @@ def_table_schema( (CASE WHEN PRIV_REPL_SLAVE = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_REPL_SLAVE, (CASE WHEN PRIV_REPL_CLIENT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_REPL_CLIENT, (CASE WHEN PRIV_DROP_DATABASE_LINK = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_DROP_DATABASE_LINK, - (CASE WHEN PRIV_CREATE_DATABASE_LINK = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_DATABASE_LINK + (CASE WHEN PRIV_CREATE_DATABASE_LINK = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_DATABASE_LINK, + (CASE WHEN (PRIV_OTHERS & (1 << 0)) != 0 THEN 'YES' ELSE 'NO' END) AS PRIV_EXECUTE, + (CASE WHEN (PRIV_OTHERS & (1 << 1)) != 0 THEN 'YES' ELSE 'NO' END) AS PRIV_ALTER_ROUTINE, + (CASE WHEN (PRIV_OTHERS & (1 << 2)) != 0 THEN 'YES' ELSE 'NO' END) AS PRIV_CREATE_ROUTINE FROM OCEANBASE.__all_virtual_user; """.replace("\n", " ") ) @@ -28021,7 +28114,10 @@ def_table_schema( (CASE WHEN A.PRIV_SELECT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SELECT, (CASE WHEN A.PRIV_INDEX = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_INDEX, (CASE WHEN A.PRIV_CREATE_VIEW = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_VIEW, - (CASE WHEN A.PRIV_SHOW_VIEW = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SHOW_VIEW + (CASE WHEN A.PRIV_SHOW_VIEW = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SHOW_VIEW, + (CASE WHEN (A.PRIV_OTHERS & (1 << 0)) != 0 THEN 'YES' ELSE 'NO' END) AS PRIV_EXECUTE, + (CASE WHEN (A.PRIV_OTHERS & (1 << 1)) != 0 THEN 'YES' ELSE 'NO' END) AS PRIV_ALTER_ROUTINE, + (CASE WHEN (A.PRIV_OTHERS & (1 << 2)) != 0 THEN 'YES' ELSE 'NO' END) AS PRIV_CREATE_ROUTINE FROM OCEANBASE.__all_database_privilege A INNER JOIN OCEANBASE.__all_user B ON A.TENANT_ID = B.TENANT_ID AND A.USER_ID = B.USER_ID; """.replace("\n", " ") @@ -28053,7 +28149,10 @@ def_table_schema( (CASE WHEN A.PRIV_SELECT = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SELECT, (CASE WHEN A.PRIV_INDEX = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_INDEX, (CASE WHEN A.PRIV_CREATE_VIEW = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_CREATE_VIEW, - (CASE WHEN A.PRIV_SHOW_VIEW = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SHOW_VIEW + (CASE WHEN A.PRIV_SHOW_VIEW = 0 THEN 'NO' ELSE 'YES' END) AS PRIV_SHOW_VIEW, + (CASE WHEN (A.PRIV_OTHERS & (1 << 0)) != 0 THEN 'YES' ELSE 'NO' END) AS PRIV_EXECUTE, + (CASE WHEN (A.PRIV_OTHERS & (1 << 1)) != 0 THEN 'YES' ELSE 'NO' END) AS PRIV_ALTER_ROUTINE, + (CASE WHEN (A.PRIV_OTHERS & (1 << 2)) != 0 THEN 'YES' ELSE 'NO' END) AS PRIV_CREATE_ROUTINE FROM OCEANBASE.__all_virtual_database_privilege A INNER JOIN OCEANBASE.__all_virtual_user B ON A.USER_ID = B.USER_ID AND A.TENANT_ID = B.TENANT_ID; """.replace("\n", " ") @@ -28490,6 +28589,12 @@ def_table_schema( AND U.PRIV_DROP_DATABASE_LINK = 1 THEN 'DROP DATABASE LINK' WHEN V1.C1 = 36 AND U.PRIV_CREATE_DATABASE_LINK = 1 THEN 'CREATE DATABASE LINK' + WHEN V1.C1 = 37 + AND (U.PRIV_OTHERS & (1 << 0)) != 0 THEN 'EXECUTE' + WHEN V1.C1 = 38 + AND (U.PRIV_OTHERS & (1 << 1)) != 0 THEN 'ALTER ROUTINE' + WHEN V1.C1 = 39 + AND (U.PRIV_OTHERS & (1 << 2)) != 0 THEN 'CREATE ROUTINE' WHEN V1.C1 = 0 AND U.PRIV_ALTER = 0 AND U.PRIV_CREATE = 0 @@ -28514,7 +28619,8 @@ def_table_schema( AND U.PRIV_REPL_SLAVE = 0 AND U.PRIV_REPL_CLIENT = 0 AND U.PRIV_DROP_DATABASE_LINK = 0 - AND U.PRIV_CREATE_DATABASE_LINK = 0 THEN 'USAGE' + AND U.PRIV_CREATE_DATABASE_LINK = 0 + AND U.PRIV_OTHERS = 0 THEN 'USAGE' END PRIVILEGE_TYPE , CASE WHEN U.PRIV_GRANT_OPTION = 0 THEN 'NO' @@ -28541,7 +28647,8 @@ def_table_schema( AND U.PRIV_REPL_SLAVE = 0 AND U.PRIV_REPL_CLIENT = 0 AND U.PRIV_DROP_DATABASE_LINK = 0 - AND U.PRIV_CREATE_DATABASE_LINK = 0 THEN 'NO' + AND U.PRIV_CREATE_DATABASE_LINK = 0 + AND U.PRIV_OTHERS = 0 THEN 'NO' WHEN U.PRIV_GRANT_OPTION = 1 THEN 'YES' END IS_GRANTABLE FROM oceanbase.__all_user U, @@ -28569,7 +28676,10 @@ def_table_schema( UNION ALL SELECT 33 AS C1 UNION ALL SELECT 34 AS C1 UNION ALL SELECT 35 AS C1 - UNION ALL SELECT 36 AS C1) V1, + UNION ALL SELECT 36 AS C1 + UNION ALL SELECT 37 AS C1 + UNION ALL SELECT 38 AS C1 + UNION ALL SELECT 39 AS C1) V1, (SELECT USER_ID FROM oceanbase.__all_user WHERE TENANT_ID = 0 @@ -28632,6 +28742,12 @@ def_table_schema( AND DP.PRIV_CREATE_VIEW = 1 THEN 'CREATE VIEW' WHEN V1.C1 = 12 AND DP.PRIV_SHOW_VIEW = 1 THEN 'SHOW VIEW' + WHEN V1.C1 = 13 + AND (U.PRIV_OTHERS & (1 << 0)) != 0 THEN 'EXECUTE' + WHEN V1.C1 = 14 + AND (U.PRIV_OTHERS & (1 << 1)) != 0 THEN 'ALTER ROUTINE' + WHEN V1.C1 = 15 + AND (U.PRIV_OTHERS & (1 << 2)) != 0 THEN 'CREATE ROUTINE' ELSE NULL END PRIVILEGE_TYPE , CASE @@ -28649,7 +28765,10 @@ def_table_schema( UNION ALL SELECT 9 AS C1 UNION ALL SELECT 10 AS C1 UNION ALL SELECT 11 AS C1 - UNION ALL SELECT 12 AS C1) V1, + UNION ALL SELECT 12 AS C1 + UNION ALL SELECT 13 AS C1 + UNION ALL SELECT 14 AS C1 + UNION ALL SELECT 15 AS C1) V1, (SELECT USER_ID FROM oceanbase.__all_user WHERE TENANT_ID= 0 @@ -32150,7 +32269,36 @@ WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() #21483: DBA_WR_EVENT_NAME #21484: CDB_WR_EVENT_NAME #21485: DBA_OB_FORMAT_OUTLINES -#21486: procs_priv + +def_table_schema( + owner = 'mingye.swj', + database_id = 'OB_MYSQL_SCHEMA_ID', + table_name = 'procs_priv', + table_id = '21486', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + in_tenant_space = True, + view_definition = """ + SELECT cast(b.host as char(60)) as Host, + cast(a.database_name as char(64)) as Db, + cast(b.user_name as char(32)) as User, + cast(a.routine_name as char(64)) as Routine_name, + case when a.routine_type = 1 then 'PROCEDURE' else 'FUNCTION' end as Routine_type, + cast(c.priv_user as char(93)) as Grantor, + substr(concat(case when (a.all_priv & 1) > 0 then ',Execute' else '' end, + case when (a.all_priv & 2) > 0 then ',Alter Routine' else '' end, + case when (a.all_priv & 4) > 0 then ',Grant' else '' end), 2) as Proc_priv, + cast(a.gmt_modified as date) as Timestamp + FROM oceanbase.__all_routine_privilege a, oceanbase.__all_user b, oceanbase.__all_routine c, oceanbase.__all_database d + WHERE a.tenant_id = b.tenant_id AND a.user_id = b.user_id + AND a.tenant_id = d.tenant_id and a.database_name = d.database_name + AND a.tenant_id = c.tenant_id AND a.routine_name = c.routine_name + AND a.routine_type = c.routine_type AND c.database_id = d.database_id AND c.package_id = -1; +""".replace("\n", " ") +) + #21487: GV$OB_SQLSTAT #21488: V$OB_SQLSTAT #21489: DBA_WR_SQLSTAT @@ -32427,8 +32575,58 @@ SELECT job_id AS CLONE_JOB_ID, FROM oceanbase.__all_clone_job ORDER BY CLONE_START_TIME """.replace("\n", " ") ) -#21511: role_edges -#21512: default_roles + +def_table_schema( + owner = 'jim.wjh', + database_id = 'OB_MYSQL_SCHEMA_ID', + table_name = 'role_edges', + table_id = '21511', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + in_tenant_space = True, + view_definition = """ + SELECT cast(from_user.host AS char(255)) FROM_HOST, + cast(from_user.user_name AS char(128)) FROM_USER, + cast(to_user.host AS char(255)) TO_HOST, + cast(to_user.user_name AS char(128)) TO_USER, + cast(CASE role_map.admin_option WHEN 1 THEN 'Y' ELSE 'N' END AS char(1)) WITH_ADMIN_OPTION + FROM oceanbase.__all_tenant_role_grantee_map role_map, + oceanbase.__all_user from_user, + oceanbase.__all_user to_user + WHERE role_map.tenant_id = from_user.tenant_id + AND role_map.tenant_id = to_user.tenant_id + AND role_map.grantee_id = to_user.user_id + AND role_map.role_id = from_user.user_id; +""".replace("\n", " ") +) + +def_table_schema( + owner = 'jim.wjh', + database_id = 'OB_MYSQL_SCHEMA_ID', + table_name = 'default_roles', + table_id = '21512', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + in_tenant_space = True, + view_definition = """ + SELECT cast(to_user.host AS char(255)) HOST, + cast(to_user.user_name AS char(128)) USER, + cast(from_user.host AS char(255)) DEFAULT_ROLE_HOST, + cast(from_user.user_name AS char(128)) DEFAULT_ROLE_USER + FROM oceanbase.__all_tenant_role_grantee_map role_map, + oceanbase.__all_user from_user, + oceanbase.__all_user to_user + WHERE role_map.tenant_id = from_user.tenant_id + AND role_map.tenant_id = to_user.tenant_id + AND role_map.grantee_id = to_user.user_id + AND role_map.role_id = from_user.user_id + AND role_map.disable_flag = 0; +""".replace("\n", " ") +) def_table_schema( owner = 'yangjiali.yjl', @@ -32470,7 +32668,33 @@ def_table_schema( #21514: audit_log_filter #21515: audit_log_user -#21516: columns_priv +def_table_schema( + owner = 'mingye.swj', + database_id = 'OB_MYSQL_SCHEMA_ID', + table_name = 'columns_priv', + table_id = '21516', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + in_tenant_space = True, + view_definition = """ + SELECT cast(b.host as char(255)) as Host, + cast(a.database_name as char(128)) as Db, + cast(b.user_name as char(128)) as User, + cast(a.table_name as char(128)) as Table_name, + cast(a.column_name as char(128)) as Column_name, + substr(concat(case when (a.all_priv & 1) > 0 then ',Select' else '' end, + case when (a.all_priv & 2) > 0 then ',Insert' else '' end, + case when (a.all_priv & 4) > 0 then ',Update' else '' end, + case when (a.all_priv & 8) > 0 then ',References' else '' end), 2) as Column_priv, + cast(a.gmt_modified as datetime) as Timestamp + FROM oceanbase.__all_column_privilege a, oceanbase.__all_user b + WHERE a.tenant_id = 0 and a.tenant_id = b.tenant_id AND a.user_id = b.user_id +""".replace("\n", " ") +) + + def_table_schema( owner = 'wendongbodongbo.wd', table_name = 'GV$OB_LS_SNAPSHOTS', @@ -45237,7 +45461,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'DBA_ROLES', database_id = 'OB_ORA_SYS_DATABASE_ID', table_id = '25121', @@ -45255,7 +45479,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'DBA_ROLE_PRIVS', database_id = 'OB_ORA_SYS_DATABASE_ID', table_id = '25122', @@ -45281,7 +45505,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'USER_ROLE_PRIVS', database_id = 'OB_ORA_SYS_DATABASE_ID', table_id = '25123', @@ -45306,7 +45530,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'DBA_TAB_PRIVS', database_id = 'OB_ORA_SYS_DATABASE_ID', table_id = '25124', @@ -45393,7 +45617,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'ALL_TAB_PRIVS', database_id = 'OB_ORA_SYS_DATABASE_ID', table_id = '25125', @@ -45483,7 +45707,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'USER_TAB_PRIVS', database_id = 'OB_ORA_SYS_DATABASE_ID', table_id = '25126', @@ -45572,7 +45796,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'DBA_SYS_PRIVS', database_id = 'OB_ORA_SYS_DATABASE_ID', table_id = '25127', @@ -45682,7 +45906,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'USER_SYS_PRIVS', database_id = 'OB_ORA_SYS_DATABASE_ID', table_id = '25128', @@ -45794,7 +46018,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'AUDIT_ACTIONS', name_postfix = '_ORA', database_id = 'OB_ORA_SYS_DATABASE_ID', @@ -45812,7 +46036,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'STMT_AUDIT_OPTION_MAP', name_postfix = '_ORA', database_id = 'OB_ORA_SYS_DATABASE_ID', @@ -45831,7 +46055,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'ALL_DEF_AUDIT_OPTS', name_postfix = '_ORA', database_id = 'OB_ORA_SYS_DATABASE_ID', @@ -45864,7 +46088,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'DBA_STMT_AUDIT_OPTS', name_postfix = '_ORA', database_id = 'OB_ORA_SYS_DATABASE_ID', @@ -45901,7 +46125,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'DBA_OBJ_AUDIT_OPTS', name_postfix = '_ORA', database_id = 'OB_ORA_SYS_DATABASE_ID', @@ -46045,7 +46269,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'DBA_AUDIT_TRAIL', name_postfix = '_ORA', database_id = 'OB_ORA_SYS_DATABASE_ID', @@ -46123,7 +46347,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'USER_AUDIT_TRAIL', name_postfix = '_ORA', database_id = 'OB_ORA_SYS_DATABASE_ID', @@ -46205,7 +46429,7 @@ def_table_schema( # bugfix: # return code refers from: select dbms_metadata.get_ddl('VIEW','DBA_AUDIT_EXISTS') from dual; def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'DBA_AUDIT_EXISTS', name_postfix = '_ORA', database_id = 'OB_ORA_SYS_DATABASE_ID', @@ -46268,7 +46492,7 @@ def_table_schema( # DBA_AUDIT_SESSION displays all audit trail records concerning CONNECT and DISCONNECT. def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'DBA_AUDIT_SESSION', name_postfix = '_ORA', database_id = 'OB_ORA_SYS_DATABASE_ID', @@ -46311,7 +46535,7 @@ def_table_schema( # USER_AUDIT_SESSION displays the audit trail records concerning connections and disconnections # of the current user. Its columns are the same as those in DBA_AUDIT_SESSION. def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'USER_AUDIT_SESSION', name_postfix = '_ORA', database_id = 'OB_ORA_SYS_DATABASE_ID', @@ -46355,7 +46579,7 @@ def_table_schema( # DBA_AUDIT_STATEMENT displays audit trail records for all GRANT, REVOKE, # AUDIT, NOAUDIT, and ALTER SYSTEM statements in the database. def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'DBA_AUDIT_STATEMENT', name_postfix = '_ORA', database_id = 'OB_ORA_SYS_DATABASE_ID', @@ -46440,7 +46664,7 @@ def_table_schema( # USER_AUDIT_STATEMENT displays audit trail entries for the GRANT, REVOKE, # AUDIT, NOAUDIT, and ALTER SYSTEM statements issued by the current user. def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'USER_AUDIT_STATEMENT', name_postfix = '_ORA', database_id = 'OB_ORA_SYS_DATABASE_ID', @@ -46525,7 +46749,7 @@ def_table_schema( # DBA_AUDIT_OBJECT displays audit trail records for all objects in the database. def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'DBA_AUDIT_OBJECT', name_postfix = '_ORA', database_id = 'OB_ORA_SYS_DATABASE_ID', @@ -46587,7 +46811,7 @@ def_table_schema( # USER_AUDIT_OBJECT displays audit trail records for the objects accessible to the current user. # Its columns are the same as those in DBA_AUDIT_OBJECT. def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'USER_AUDIT_OBJECT', name_postfix = '_ORA', database_id = 'OB_ORA_SYS_DATABASE_ID', @@ -46648,7 +46872,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'DBA_COL_PRIVS', name_postfix = '_ORA', database_id = 'OB_ORA_SYS_DATABASE_ID', @@ -46712,7 +46936,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'USER_COL_PRIVS', name_postfix = '_ORA', database_id = 'OB_ORA_SYS_DATABASE_ID', @@ -46780,7 +47004,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'ALL_COL_PRIVS', name_postfix = '_ORA', database_id = 'OB_ORA_SYS_DATABASE_ID', @@ -46844,7 +47068,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'ROLE_TAB_PRIVS', name_postfix = '_ORA', database_id = 'OB_ORA_SYS_DATABASE_ID', @@ -46933,7 +47157,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'ROLE_SYS_PRIVS', name_postfix = '_ORA', database_id = 'OB_ORA_SYS_DATABASE_ID', @@ -47045,7 +47269,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'ROLE_ROLE_PRIVS', name_postfix = '_ORA', database_id = 'OB_ORA_SYS_DATABASE_ID', @@ -53671,7 +53895,7 @@ TOTAL_SSSTORE_READ_ROW_COUNT FROM SYS.GV$OB_SQL_AUDIT WHERE SVR_IP=HOST_IP() AND ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'GV$INSTANCE', database_id = 'OB_ORA_SYS_DATABASE_ID', table_id = '28004', @@ -53711,7 +53935,7 @@ def_table_schema( ) def_table_schema( - owner = 'xinqi.zlm', + owner = 'sean.yyj', table_name = 'V$INSTANCE', database_id = 'OB_ORA_SYS_DATABASE_ID', table_id = '28005', @@ -61660,7 +61884,15 @@ def_sys_index_table( keywords = all_def_keywords['__all_transfer_partition_task']) # 101099: __all_client_to_server_session_info -# 101100: __all_column_privilege + +def_sys_index_table( + index_name = 'idx_column_privilege_name', + index_table_id = 101100, + index_columns = ['user_id', 'database_name', 'table_name', 'column_name'], + index_using_type = 'USING_BTREE', + index_type = 'INDEX_TYPE_NORMAL_LOCAL', + keywords = all_def_keywords['__all_column_privilege']) + # 101101: __all_user_proxy_info # 101102: __all_user_proxy_info_history # 101103: __all_user_proxy_role_info_history diff --git a/src/share/inner_table/ob_inner_table_schema_misc.ipp b/src/share/inner_table/ob_inner_table_schema_misc.ipp index 6bcafec02d..d2696cf552 100644 --- a/src/share/inner_table/ob_inner_table_schema_misc.ipp +++ b/src/share/inner_table/ob_inner_table_schema_misc.ipp @@ -1769,6 +1769,8 @@ case OB_ALL_VIRTUAL_COLUMN_GROUP_HISTORY_TID: case OB_ALL_VIRTUAL_COLUMN_GROUP_MAPPING_TID: case OB_ALL_VIRTUAL_COLUMN_GROUP_MAPPING_HISTORY_TID: case OB_ALL_VIRTUAL_COLUMN_HISTORY_TID: +case OB_ALL_VIRTUAL_COLUMN_PRIVILEGE_TID: +case OB_ALL_VIRTUAL_COLUMN_PRIVILEGE_HISTORY_TID: case OB_ALL_VIRTUAL_COLUMN_STAT_TID: case OB_ALL_VIRTUAL_COLUMN_STAT_HISTORY_TID: case OB_ALL_VIRTUAL_COLUMN_USAGE_TID: @@ -1853,6 +1855,8 @@ case OB_ALL_VIRTUAL_ROUTINE_TID: case OB_ALL_VIRTUAL_ROUTINE_HISTORY_TID: case OB_ALL_VIRTUAL_ROUTINE_PARAM_TID: case OB_ALL_VIRTUAL_ROUTINE_PARAM_HISTORY_TID: +case OB_ALL_VIRTUAL_ROUTINE_PRIVILEGE_TID: +case OB_ALL_VIRTUAL_ROUTINE_PRIVILEGE_HISTORY_TID: case OB_ALL_VIRTUAL_SECURITY_AUDIT_TID: case OB_ALL_VIRTUAL_SECURITY_AUDIT_HISTORY_TID: case OB_ALL_VIRTUAL_SECURITY_AUDIT_RECORD_TID: @@ -2138,6 +2142,36 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: break; } + case OB_ALL_VIRTUAL_COLUMN_PRIVILEGE_TID: { + ObIterateVirtualTable *iter = NULL; + if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { + SERVER_LOG(WARN, "create virtual table iterator failed", K(ret)); + } else if (OB_FAIL(iter->init(OB_ALL_COLUMN_PRIVILEGE_TID, index_schema, params))) { + SERVER_LOG(WARN, "virtual table iter init failed", K(ret)); + iter->~ObIterateVirtualTable(); + allocator.free(iter); + iter = NULL; + } else { + vt_iter = iter; + } + break; + } + + case OB_ALL_VIRTUAL_COLUMN_PRIVILEGE_HISTORY_TID: { + ObIterateVirtualTable *iter = NULL; + if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { + SERVER_LOG(WARN, "create virtual table iterator failed", K(ret)); + } else if (OB_FAIL(iter->init(OB_ALL_COLUMN_PRIVILEGE_HISTORY_TID, index_schema, params))) { + SERVER_LOG(WARN, "virtual table iter init failed", K(ret)); + iter->~ObIterateVirtualTable(); + allocator.free(iter); + iter = NULL; + } else { + vt_iter = iter; + } + break; + } + case OB_ALL_VIRTUAL_COLUMN_STAT_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -2197,7 +2231,9 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } + END_CREATE_VT_ITER_SWITCH_LAMBDA + BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_CONSTRAINT_COLUMN_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -2227,9 +2263,7 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } - END_CREATE_VT_ITER_SWITCH_LAMBDA - BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_CONSTRAINT_HISTORY_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -2499,7 +2533,9 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } + END_CREATE_VT_ITER_SWITCH_LAMBDA + BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_ERROR_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -2529,9 +2565,7 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } - END_CREATE_VT_ITER_SWITCH_LAMBDA - BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_FOREIGN_KEY_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -2801,7 +2835,9 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } + END_CREATE_VT_ITER_SWITCH_LAMBDA + BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_MONITOR_MODIFIED_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -2831,9 +2867,7 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } - END_CREATE_VT_ITER_SWITCH_LAMBDA - BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_MVIEW_REFRESH_CHANGE_STATS_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -3103,7 +3137,9 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } + END_CREATE_VT_ITER_SWITCH_LAMBDA + BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_PART_INFO_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -3133,9 +3169,7 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } - END_CREATE_VT_ITER_SWITCH_LAMBDA - BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_PENDING_TRANSACTION_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -3405,6 +3439,38 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } + END_CREATE_VT_ITER_SWITCH_LAMBDA + + BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA + case OB_ALL_VIRTUAL_ROUTINE_PRIVILEGE_TID: { + ObIterateVirtualTable *iter = NULL; + if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { + SERVER_LOG(WARN, "create virtual table iterator failed", K(ret)); + } else if (OB_FAIL(iter->init(OB_ALL_ROUTINE_PRIVILEGE_TID, index_schema, params))) { + SERVER_LOG(WARN, "virtual table iter init failed", K(ret)); + iter->~ObIterateVirtualTable(); + allocator.free(iter); + iter = NULL; + } else { + vt_iter = iter; + } + break; + } + + case OB_ALL_VIRTUAL_ROUTINE_PRIVILEGE_HISTORY_TID: { + ObIterateVirtualTable *iter = NULL; + if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { + SERVER_LOG(WARN, "create virtual table iterator failed", K(ret)); + } else if (OB_FAIL(iter->init(OB_ALL_ROUTINE_PRIVILEGE_HISTORY_TID, index_schema, params))) { + SERVER_LOG(WARN, "virtual table iter init failed", K(ret)); + iter->~ObIterateVirtualTable(); + allocator.free(iter); + iter = NULL; + } else { + vt_iter = iter; + } + break; + } case OB_ALL_VIRTUAL_SECURITY_AUDIT_TID: { ObIterateVirtualTable *iter = NULL; @@ -3435,9 +3501,7 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } - END_CREATE_VT_ITER_SWITCH_LAMBDA - BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_SECURITY_AUDIT_RECORD_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -3677,7 +3741,9 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } + END_CREATE_VT_ITER_SWITCH_LAMBDA + BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_TABLE_PRIVILEGE_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -3737,9 +3803,7 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } - END_CREATE_VT_ITER_SWITCH_LAMBDA - BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_TABLEGROUP_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -3979,7 +4043,9 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } + END_CREATE_VT_ITER_SWITCH_LAMBDA + BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_TENANT_OLS_POLICY_HISTORY_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -4039,9 +4105,7 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } - END_CREATE_VT_ITER_SWITCH_LAMBDA - BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_TENANT_PROFILE_HISTORY_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -4281,7 +4345,9 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } + END_CREATE_VT_ITER_SWITCH_LAMBDA + BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_TRANSFER_TASK_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -4341,9 +4407,7 @@ case OB_ALL_VIRTUAL_USER_HISTORY_TID: } break; } - END_CREATE_VT_ITER_SWITCH_LAMBDA - BEGIN_CREATE_VT_ITER_SWITCH_LAMBDA case OB_ALL_VIRTUAL_TYPE_TID: { ObIterateVirtualTable *iter = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObIterateVirtualTable, iter))) { @@ -4798,6 +4862,7 @@ case OB_ALL_MVIEW_REFRESH_RUN_STATS_IDX_MVIEW_REFRESH_RUN_STATS_NUM_MVS_CURRENT_ case OB_ALL_MVIEW_REFRESH_STATS_IDX_MVIEW_REFRESH_STATS_END_TIME_TID: case OB_ALL_MVIEW_REFRESH_STATS_IDX_MVIEW_REFRESH_STATS_MVIEW_END_TIME_TID: case OB_ALL_TRANSFER_PARTITION_TASK_IDX_TRANSFER_PARTITION_KEY_TID: +case OB_ALL_COLUMN_PRIVILEGE_IDX_COLUMN_PRIVILEGE_NAME_TID: #endif @@ -4849,6 +4914,7 @@ case OB_ALL_PART_TID: case OB_ALL_HISTOGRAM_STAT_HISTORY_TID: case OB_ALL_DBMS_LOCK_ALLOCATED_TID: case OB_ALL_PLAN_BASELINE_ITEM_TID: +case OB_ALL_COLUMN_PRIVILEGE_TID: case OB_ALL_TENANT_GLOBAL_TRANSACTION_TID: case OB_ALL_DATABASE_TID: case OB_ALL_TABLE_HISTORY_TID: @@ -5222,6 +5288,12 @@ case OB_ALL_PLAN_BASELINE_ITEM_TID: { } break; } +case OB_ALL_COLUMN_PRIVILEGE_TID: { + if (FAILEDx(index_tids.push_back(OB_ALL_COLUMN_PRIVILEGE_IDX_COLUMN_PRIVILEGE_NAME_TID))) { + LOG_WARN("fail to push back index tid", KR(ret)); + } + break; +} case OB_ALL_TENANT_GLOBAL_TRANSACTION_TID: { if (FAILEDx(index_tids.push_back(OB_ALL_TENANT_GLOBAL_TRANSACTION_IDX_XA_TRANS_ID_TID))) { LOG_WARN("fail to push back index tid", KR(ret)); @@ -5960,6 +6032,15 @@ case OB_ALL_PLAN_BASELINE_ITEM_TID: { } break; } +case OB_ALL_COLUMN_PRIVILEGE_TID: { + index_schema.reset(); + if (FAILEDx(ObInnerTableSchema::all_column_privilege_idx_column_privilege_name_schema(index_schema))) { + LOG_WARN("fail to create index schema", KR(ret), K(tenant_id), K(data_table_id)); + } else if (OB_FAIL(append_table_(tenant_id, index_schema, tables))) { + LOG_WARN("fail to append", KR(ret), K(tenant_id), K(data_table_id)); + } + break; +} case OB_ALL_TENANT_GLOBAL_TRANSACTION_TID: { index_schema.reset(); if (FAILEDx(ObInnerTableSchema::all_tenant_global_transaction_idx_xa_trans_id_schema(index_schema))) { @@ -6466,5 +6547,7 @@ case OB_ALL_FOREIGN_KEY_TID: { LOG_WARN("add index id failed", KR(ret), K(tenant_id)); } else if (OB_FAIL(table_ids.push_back(OB_ALL_TRANSFER_PARTITION_TASK_IDX_TRANSFER_PARTITION_KEY_TID))) { LOG_WARN("add index id failed", KR(ret), K(tenant_id)); + } else if (OB_FAIL(table_ids.push_back(OB_ALL_COLUMN_PRIVILEGE_IDX_COLUMN_PRIVILEGE_NAME_TID))) { + LOG_WARN("add index id failed", KR(ret), K(tenant_id)); #endif diff --git a/src/share/inner_table/table_id_to_name b/src/share/inner_table/table_id_to_name index 3e4a726d47..83b8769c33 100644 --- a/src/share/inner_table/table_id_to_name +++ b/src/share/inner_table/table_id_to_name @@ -333,6 +333,9 @@ # 484: __all_storage_ha_perf_diagnose_history # 485: __all_clone_job # 486: __all_clone_job_history +# 490: __all_routine_privilege +# 491: __all_routine_privilege_history +# 491: __all_routine_privilege # BASE_TABLE_NAME # 493: __all_ncomp_dll # 494: __all_aux_stat # 495: __all_index_usage_info @@ -341,6 +344,9 @@ # 499: __all_transfer_partition_task # BASE_TABLE_NAME # 500: __all_tenant_snapshot_job # 502: __all_trusted_root_certificate +# 505: __all_column_privilege +# 506: __all_column_privilege_history +# 506: __all_column_privilege # BASE_TABLE_NAME # 507: __all_tenant_snapshot_ls_replica_history # 10001: __tenant_virtual_all_table # 10002: __tenant_virtual_table_column @@ -1060,6 +1066,11 @@ # 12437: __all_virtual_checkpoint_diagnose_memtable_info # 12438: __all_virtual_checkpoint_diagnose_checkpoint_unit_info # 12439: __all_virtual_checkpoint_diagnose_info +# 12443: __all_virtual_routine_privilege +# 12443: __all_routine_privilege # BASE_TABLE_NAME +# 12444: __all_virtual_routine_privilege_history +# 12444: __all_routine_privilege # BASE_TABLE_NAME +# 12444: __all_routine_privilege_history # BASE_TABLE_NAME1 # 12447: __all_virtual_aux_stat # 12447: __all_aux_stat # BASE_TABLE_NAME # 12450: __all_virtual_sys_variable_default_value @@ -1073,8 +1084,14 @@ # 12458: __all_virtual_ls_snapshot # 12459: __all_virtual_index_usage_info # 12459: __all_index_usage_info # BASE_TABLE_NAME +# 12462: __all_virtual_column_privilege +# 12462: __all_column_privilege # BASE_TABLE_NAME +# 12463: __all_virtual_column_privilege_history +# 12463: __all_column_privilege # BASE_TABLE_NAME +# 12463: __all_column_privilege_history # BASE_TABLE_NAME1 # 12464: __all_virtual_tenant_snapshot_ls_replica_history # 12464: __all_tenant_snapshot_ls_replica_history # BASE_TABLE_NAME +# 12466: ENABLED_ROLES # 12487: __all_virtual_nic_info # 15009: ALL_VIRTUAL_SQL_AUDIT # 15009: __all_virtual_sql_audit # BASE_TABLE_NAME @@ -2036,6 +2053,7 @@ # 21478: V$OB_TENANT_RUNTIME_INFO # 21479: GV$OB_CGROUP_CONFIG # 21480: V$OB_CGROUP_CONFIG +# 21486: procs_priv # 21497: DBA_OB_AUX_STATISTICS # 21498: CDB_OB_AUX_STATISTICS # 21499: DBA_INDEX_USAGE @@ -2046,7 +2064,10 @@ # 21504: CDB_OB_TRANSFER_PARTITION_TASK_HISTORY # 21509: DBA_OB_TRUSTED_ROOT_CERTIFICATE # 21510: DBA_OB_CLONE_PROGRESS +# 21511: role_edges +# 21512: default_roles # 21513: CDB_INDEX_USAGE +# 21516: columns_priv # 21517: GV$OB_LS_SNAPSHOTS # 21518: V$OB_LS_SNAPSHOTS # 21519: DBA_OB_CLONE_HISTORY @@ -2906,6 +2927,9 @@ # 101098: __idx_498_idx_transfer_partition_key # 101098: idx_transfer_partition_key # INDEX_NAME # 101098: __all_transfer_partition_task # DATA_BASE_TABLE_NAME +# 101100: __idx_505_idx_column_privilege_name +# 101100: idx_column_privilege_name # INDEX_NAME +# 101100: __all_column_privilege # DATA_BASE_TABLE_NAME # 15306: __idx_15120_idx_data_table_id_real_agent # 15306: idx_data_table_id_real_agent # INDEX_NAME # 15306: __all_table # DATA_BASE_TABLE_NAME diff --git a/src/share/ob_common_rpc_proxy.h b/src/share/ob_common_rpc_proxy.h index 8f7dc6aad5..e1ea8a2bed 100644 --- a/src/share/ob_common_rpc_proxy.h +++ b/src/share/ob_common_rpc_proxy.h @@ -108,6 +108,7 @@ public: RPC_S(PRD lock_user, obrpc::OB_LOCK_USER, (ObLockUserArg), common::ObSArray); RPC_S(PRD revoke_database, obrpc::OB_REVOKE_DB, (ObRevokeDBArg)); RPC_S(PRD revoke_table, obrpc::OB_REVOKE_TABLE, (ObRevokeTableArg)); + RPC_S(PRD revoke_routine, obrpc::OB_REVOKE_ROUTINE, (ObRevokeRoutineArg)); RPC_S(PRD revoke_sys_priv, obrpc::OB_REVOKE_SYSPRIV, (ObRevokeSysPrivArg)); RPC_S(PRD alter_user_profile, obrpc::OB_ALTER_USER_PROFILE, (ObAlterUserProfileArg)); RPC_S(PRD handle_security_audit, obrpc::OB_SECURITY_AUDIT, (ObSecurityAuditArg)); diff --git a/src/share/ob_define.h b/src/share/ob_define.h index 85541ed382..d82dfa08e8 100644 --- a/src/share/ob_define.h +++ b/src/share/ob_define.h @@ -516,6 +516,9 @@ const int64_t OB_MAX_ENCRYPTION_MODE_LENGTH = 64; const int64_t OB_MAX_CORE_TALBE_NAME_LENGTH = 128; const int64_t OB_MAX_OUTLINE_NAME_LENGTH = 128; const int64_t OB_MAX_ROUTINE_NAME_LENGTH = 128; +const int64_t OB_MAX_ROUTINE_NAME_BINARY_LENGTH = 2048; // Should be OB_MAX_ROUTINE_NAME_LENGTH * 4(max char bytes), + // reserve some bytes thus OB_MAX_ROUTINE_NAME_LENGTH changes will probably not influence it + // it is defined in primary key, and can not change randomly. const int64_t OB_MAX_PACKAGE_NAME_LENGTH = 128; const int64_t OB_MAX_KVCACHE_NAME_LENGTH = 128; const int64_t OB_MAX_SYNONYM_NAME_LENGTH = 128; diff --git a/src/share/ob_errno.cpp b/src/share/ob_errno.cpp index fe370b0412..3a90017fdf 100644 --- a/src/share/ob_errno.cpp +++ b/src/share/ob_errno.cpp @@ -11137,13 +11137,13 @@ static const _error _error_OB_ERR_CIRCULAR_ROLE_GRANT_DETECTED = { .error_name = "OB_ERR_CIRCULAR_ROLE_GRANT_DETECTED", .error_cause = "Internal Error", .error_solution = "Contact OceanBase Support", - .mysql_errno = -1, + .mysql_errno = ER_ROLE_GRANTED_TO_ITSELF, .sqlstate = "HY000", - .str_error = "circular role grant detected", - .str_user_error = "circular role grant detected", + .str_error = "The GRANT would create a loop", + .str_user_error = "User account `%.*s`@`%.*s` is directly or indirectly granted to the role `%.*s`@`%.*s`. The GRANT would create a loop", .oracle_errno = 1934, .oracle_str_error = "ORA-01934: circular role grant detected", - .oracle_str_user_error = "ORA-01934: circular role grant detected" + .oracle_str_user_error = "ORA-01934: User account `%.*s`@`%.*s` is directly or indirectly granted to the role `%.*s`@`%.*s`. The GRANT would create a loop" }; static const _error _error_OB_ERR_INVALID_PRIVILEGE_ON_DIRECTORIES = { .error_name = "OB_ERR_INVALID_PRIVILEGE_ON_DIRECTORIES", @@ -11185,7 +11185,7 @@ static const _error _error_OB_ERR_ROLE_NOT_GRANTED_OR_DOES_NOT_EXIST = { .error_name = "OB_ERR_ROLE_NOT_GRANTED_OR_DOES_NOT_EXIST", .error_cause = "Internal Error", .error_solution = "Contact OceanBase Support", - .mysql_errno = -1, + .mysql_errno = ER_ROLE_NOT_GRANTED, .sqlstate = "HY000", .str_error = "role not granted or does not exist", .str_user_error = "role '%.*s' not granted or does not exist", @@ -11209,13 +11209,13 @@ static const _error _error_OB_ERR_ROLE_NOT_GRANTED_TO = { .error_name = "OB_ERR_ROLE_NOT_GRANTED_TO", .error_cause = "Internal Error", .error_solution = "Contact OceanBase Support", - .mysql_errno = -1, + .mysql_errno = ER_ROLE_NOT_GRANTED, .sqlstate = "HY000", .str_error = "ROLE not granted to", - .str_user_error = "ROLE '%.*s' not granted to '%.*s'", + .str_user_error = "`%.*s`@`%.*s` is not granted to `%.*s`@`%.*s`", .oracle_errno = 1951, .oracle_str_error = "ORA-01951: ROLE not granted to", - .oracle_str_user_error = "ORA-01951: ROLE '%.*s' not granted to '%.*s'" + .oracle_str_user_error = "ORA-01951: ROLE '%.*s%.*s' not granted to '%.*s%.*s'" }; static const _error _error_OB_ERR_CANNOT_GRANT_TO_A_ROLE_WITH_GRANT_OPTION = { .error_name = "OB_ERR_CANNOT_GRANT_TO_A_ROLE_WITH_GRANT_OPTION", diff --git a/src/share/ob_errno.def b/src/share/ob_errno.def index dac5531d60..4fe984ce87 100755 --- a/src/share/ob_errno.def +++ b/src/share/ob_errno.def @@ -1076,13 +1076,13 @@ DEFINE_ORACLE_ERROR_EXT(OB_ERR_USER_OR_ROLE_DOES_NOT_EXIST, -5369, -1, "HY000", DEFINE_ORACLE_ERROR(OB_ERR_MISSING_ON_KEYWORD, -5370, -1, "HY000", "missing ON keyword", 969, "missing ON keyword"); DEFINE_ORACLE_ERROR_EXT(OB_ERR_NO_GRANT_OPTION, -5371, -1, "HY000", "grant option does not exists", "grant option does not exist for '%.*s.%.*s'", 1720, "grant option does not exist", "grant option does not exist for '%.*s.%.*s'"); DEFINE_ORACLE_ERROR(OB_ERR_ALTER_INDEX_AND_EXECUTE_NOT_ALLOWED_FOR_VIEWS, -5372, -1, "HY000", "ALTER, INDEX and EXECUTE not allowed for views", 2204, "ALTER, INDEX and EXECUTE not allowed for views"); -DEFINE_ORACLE_ERROR(OB_ERR_CIRCULAR_ROLE_GRANT_DETECTED, -5373, -1, "HY000", "circular role grant detected", 1934, "circular role grant detected"); +DEFINE_ORACLE_ERROR_EXT(OB_ERR_CIRCULAR_ROLE_GRANT_DETECTED, -5373, ER_ROLE_GRANTED_TO_ITSELF, "HY000", "The GRANT would create a loop", "User account `%.*s`@`%.*s` is directly or indirectly granted to the role `%.*s`@`%.*s`. The GRANT would create a loop", 1934, "circular role grant detected", "User account `%.*s`@`%.*s` is directly or indirectly granted to the role `%.*s`@`%.*s`. The GRANT would create a loop"); DEFINE_ORACLE_ERROR(OB_ERR_INVALID_PRIVILEGE_ON_DIRECTORIES, -5374, -1, "HY000", "invalid privilege on directories", 22928, "invalid privilege on directories"); DEFINE_ORACLE_ERROR(OB_ERR_DIRECTORY_ACCESS_DENIED, -5375, -1, "HY000", "directory access denied", 29289, "directory access denied"); DEFINE_ORACLE_ERROR(OB_ERR_MISSING_OR_INVALID_ROLE_NAME, -5376, -1, "HY000", "missing or invalid role name", 1937, "missing or invalid role name"); -DEFINE_ORACLE_ERROR_EXT(OB_ERR_ROLE_NOT_GRANTED_OR_DOES_NOT_EXIST, -5377, -1, "HY000", "role not granted or does not exist", "role '%.*s' not granted or does not exist", 1924, "role not granted or does not exist", "role '%.*s' not granted or does not exist"); +DEFINE_ORACLE_ERROR_EXT(OB_ERR_ROLE_NOT_GRANTED_OR_DOES_NOT_EXIST, -5377, ER_ROLE_NOT_GRANTED, "HY000", "role not granted or does not exist", "role '%.*s' not granted or does not exist", 1924, "role not granted or does not exist", "role '%.*s' not granted or does not exist"); DEFINE_ORACLE_ERROR_EXT(OB_ERR_DEFAULT_ROLE_NOT_GRANTED_TO_USER, -5378, -1, "HY000", "DEFAULT ROLE not granted to user", "DEFAULT ROLE '%.*s' not granted to user", 1955, "DEFAULT ROLE not granted to user", "DEFAULT ROLE '%.*s' not granted to user"); -DEFINE_ORACLE_ERROR_EXT(OB_ERR_ROLE_NOT_GRANTED_TO, -5379, -1, "HY000", "ROLE not granted to", "ROLE '%.*s' not granted to '%.*s'", 1951, "ROLE not granted to", "ROLE '%.*s' not granted to '%.*s'"); +DEFINE_ORACLE_ERROR_EXT(OB_ERR_ROLE_NOT_GRANTED_TO, -5379, ER_ROLE_NOT_GRANTED, "HY000", "ROLE not granted to", "`%.*s`@`%.*s` is not granted to `%.*s`@`%.*s`", 1951, "ROLE not granted to", "ROLE '%.*s%.*s' not granted to '%.*s%.*s'"); DEFINE_ORACLE_ERROR(OB_ERR_CANNOT_GRANT_TO_A_ROLE_WITH_GRANT_OPTION, -5380, -1, "HY000", "cannot GRANT to a role WITH GRANT OPTION", 1926, "cannot GRANT to a role WITH GRANT OPTION"); DEFINE_ORACLE_ERROR(OB_ERR_DUPLICATE_USERNAME_IN_LIST, -5381, -1, "HY000", "duplicate username in list", 1700, "duplicate username in list"); DEFINE_ORACLE_ERROR_EXT(OB_ERR_CANNOT_GRANT_STRING_TO_A_ROLE, -5382, -1, "HY000", "cannot grant string to a role", "cannot grant %.*s to a role", 1931, "cannot grant string to a role", "cannot grant %.*s to a role"); diff --git a/src/share/ob_errno.h b/src/share/ob_errno.h index e763fae41e..ab427db320 100644 --- a/src/share/ob_errno.h +++ b/src/share/ob_errno.h @@ -2802,13 +2802,13 @@ constexpr int OB_ERR_INVALID_DATE_MSG_FMT_V2 = -4219; #define OB_ERR_MISSING_ON_KEYWORD__USER_ERROR_MSG "missing ON keyword" #define OB_ERR_NO_GRANT_OPTION__USER_ERROR_MSG "grant option does not exist for '%.*s.%.*s'" #define OB_ERR_ALTER_INDEX_AND_EXECUTE_NOT_ALLOWED_FOR_VIEWS__USER_ERROR_MSG "ALTER, INDEX and EXECUTE not allowed for views" -#define OB_ERR_CIRCULAR_ROLE_GRANT_DETECTED__USER_ERROR_MSG "circular role grant detected" +#define OB_ERR_CIRCULAR_ROLE_GRANT_DETECTED__USER_ERROR_MSG "User account `%.*s`@`%.*s` is directly or indirectly granted to the role `%.*s`@`%.*s`. The GRANT would create a loop" #define OB_ERR_INVALID_PRIVILEGE_ON_DIRECTORIES__USER_ERROR_MSG "invalid privilege on directories" #define OB_ERR_DIRECTORY_ACCESS_DENIED__USER_ERROR_MSG "directory access denied" #define OB_ERR_MISSING_OR_INVALID_ROLE_NAME__USER_ERROR_MSG "missing or invalid role name" #define OB_ERR_ROLE_NOT_GRANTED_OR_DOES_NOT_EXIST__USER_ERROR_MSG "role '%.*s' not granted or does not exist" #define OB_ERR_DEFAULT_ROLE_NOT_GRANTED_TO_USER__USER_ERROR_MSG "DEFAULT ROLE '%.*s' not granted to user" -#define OB_ERR_ROLE_NOT_GRANTED_TO__USER_ERROR_MSG "ROLE '%.*s' not granted to '%.*s'" +#define OB_ERR_ROLE_NOT_GRANTED_TO__USER_ERROR_MSG "`%.*s`@`%.*s` is not granted to `%.*s`@`%.*s`" #define OB_ERR_CANNOT_GRANT_TO_A_ROLE_WITH_GRANT_OPTION__USER_ERROR_MSG "cannot GRANT to a role WITH GRANT OPTION" #define OB_ERR_DUPLICATE_USERNAME_IN_LIST__USER_ERROR_MSG "duplicate username in list" #define OB_ERR_CANNOT_GRANT_STRING_TO_A_ROLE__USER_ERROR_MSG "cannot grant %.*s to a role" @@ -5050,13 +5050,13 @@ constexpr int OB_ERR_INVALID_DATE_MSG_FMT_V2 = -4219; #define OB_ERR_MISSING_ON_KEYWORD__ORA_USER_ERROR_MSG "ORA-00969: missing ON keyword" #define OB_ERR_NO_GRANT_OPTION__ORA_USER_ERROR_MSG "ORA-01720: grant option does not exist for '%.*s.%.*s'" #define OB_ERR_ALTER_INDEX_AND_EXECUTE_NOT_ALLOWED_FOR_VIEWS__ORA_USER_ERROR_MSG "ORA-02204: ALTER, INDEX and EXECUTE not allowed for views" -#define OB_ERR_CIRCULAR_ROLE_GRANT_DETECTED__ORA_USER_ERROR_MSG "ORA-01934: circular role grant detected" +#define OB_ERR_CIRCULAR_ROLE_GRANT_DETECTED__ORA_USER_ERROR_MSG "ORA-01934: User account `%.*s`@`%.*s` is directly or indirectly granted to the role `%.*s`@`%.*s`. The GRANT would create a loop" #define OB_ERR_INVALID_PRIVILEGE_ON_DIRECTORIES__ORA_USER_ERROR_MSG "ORA-22928: invalid privilege on directories" #define OB_ERR_DIRECTORY_ACCESS_DENIED__ORA_USER_ERROR_MSG "ORA-29289: directory access denied" #define OB_ERR_MISSING_OR_INVALID_ROLE_NAME__ORA_USER_ERROR_MSG "ORA-01937: missing or invalid role name" #define OB_ERR_ROLE_NOT_GRANTED_OR_DOES_NOT_EXIST__ORA_USER_ERROR_MSG "ORA-01924: role '%.*s' not granted or does not exist" #define OB_ERR_DEFAULT_ROLE_NOT_GRANTED_TO_USER__ORA_USER_ERROR_MSG "ORA-01955: DEFAULT ROLE '%.*s' not granted to user" -#define OB_ERR_ROLE_NOT_GRANTED_TO__ORA_USER_ERROR_MSG "ORA-01951: ROLE '%.*s' not granted to '%.*s'" +#define OB_ERR_ROLE_NOT_GRANTED_TO__ORA_USER_ERROR_MSG "ORA-01951: ROLE '%.*s%.*s' not granted to '%.*s%.*s'" #define OB_ERR_CANNOT_GRANT_TO_A_ROLE_WITH_GRANT_OPTION__ORA_USER_ERROR_MSG "ORA-01926: cannot GRANT to a role WITH GRANT OPTION" #define OB_ERR_DUPLICATE_USERNAME_IN_LIST__ORA_USER_ERROR_MSG "ORA-01700: duplicate username in list" #define OB_ERR_CANNOT_GRANT_STRING_TO_A_ROLE__ORA_USER_ERROR_MSG "ORA-01931: cannot grant %.*s to a role" diff --git a/src/share/ob_rpc_struct.cpp b/src/share/ob_rpc_struct.cpp index 8fb5cbaeb8..64847a3da7 100755 --- a/src/share/ob_rpc_struct.cpp +++ b/src/share/ob_rpc_struct.cpp @@ -2073,6 +2073,26 @@ bool ObAlterTableArg::is_allow_when_upgrade() const return bret; } +int ObAlterTableArg::is_alter_comment(bool &is_alter_comment) const +{ + int ret = OB_SUCCESS; + is_alter_comment = alter_table_schema_.alter_option_bitset_.has_member(COMMENT); + if (!is_alter_comment && is_alter_columns_) { + ObTableSchema::const_column_iterator it_begin = alter_table_schema_.column_begin(); + ObTableSchema::const_column_iterator it_end = alter_table_schema_.column_end(); + AlterColumnSchema *alter_column_schema = NULL; + for (; OB_SUCC(ret) && !is_alter_comment && it_begin != it_end; it_begin++) { + if (OB_ISNULL(alter_column_schema = static_cast(*it_begin))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("alter_column_schema is NULL", K(ret)); + } else { + is_alter_comment |= alter_column_schema->is_set_comment_; + } + } + } + return ret; +} + int ObAlterTableArg::set_nls_formats(const common::ObString *nls_formats) { int ret = OB_SUCCESS; @@ -4700,7 +4720,8 @@ bool ObAlterUserProfileArg::is_valid() const return is_valid_tenant_id(tenant_id_) && ((user_name_.length() > 0 && host_name_.length() > 0) - || is_valid_id(user_id_)) ; + || is_valid_id(user_id_) + || user_ids_.count() > 0) ; } OB_SERIALIZE_MEMBER((ObAlterUserProfileArg, ObDDLArg), @@ -4766,7 +4787,7 @@ int ObGrantArg::assign(const ObGrantArg &other) } else if (OB_FAIL(sel_col_ids_.assign(other.sel_col_ids_))) { SHARE_LOG(WARN, "fail to assign sel_col_ids_", K(ret)); } else if (OB_FAIL(column_names_priv_.assign(other.column_names_priv_))) { - LOG_WARN("fail to assin column_names_priv_", K(ret)); + SHARE_LOG(WARN, "fail to assign column_names_priv_", K(ret)); } return ret; } @@ -4956,6 +4977,47 @@ OB_SERIALIZE_MEMBER((ObRevokeTableArg, ObDDLArg), ref_col_ids_, column_names_priv_); +bool ObRevokeRoutineArg::is_valid() const +{ + return OB_INVALID_ID != tenant_id_ && OB_INVALID_ID != user_id_ + && !db_.empty() && !routine_.empty(); +} + +int ObRevokeRoutineArg::assign(const ObRevokeRoutineArg& other) +{ + int ret = OB_SUCCESS; + if (OB_FAIL(ObDDLArg::assign(other))) { + LOG_WARN("fail to assign ddl arg", KR(ret)); + } else if (OB_FAIL(obj_priv_array_.assign(other.obj_priv_array_))) { + LOG_WARN("assign failed", K(ret)); + } else { + tenant_id_ = other.tenant_id_; + user_id_ = other.user_id_; + db_ = other.db_; + routine_ = other.routine_; + priv_set_ = other.priv_set_; + grant_ = other.grant_; + obj_id_ = other.obj_id_; + obj_type_ = other.obj_type_; + grantor_id_ = other.grantor_id_; + revoke_all_ora_ = other.revoke_all_ora_; + } + return ret; +} + +OB_SERIALIZE_MEMBER((ObRevokeRoutineArg, ObDDLArg), + tenant_id_, + user_id_, + db_, + routine_, + priv_set_, + grant_, + obj_id_, + obj_type_, + grantor_id_, + obj_priv_array_, + revoke_all_ora_); + bool ObRevokeSysPrivArg::is_valid() const { return OB_INVALID_ID != tenant_id_ && OB_INVALID_ID != grantee_id_; @@ -4969,9 +5031,9 @@ int ObRevokeSysPrivArg::assign(const ObRevokeSysPrivArg &other) if (OB_FAIL(ObDDLArg::assign(other))) { LOG_WARN("fail to assign ddl arg", KR(ret)); } else if (OB_FAIL(sys_priv_array_.assign(other.sys_priv_array_))) { - LOG_WARN("fail to assign sys_priv_array_", K(ret)); + LOG_WARN("fail to assign sys_priv_array_", KR(ret)); } else if (OB_FAIL(role_ids_.assign(other.role_ids_))) { - LOG_WARN("fail to assign role_ids_"); + LOG_WARN("fail to assign role_ids_", KR(ret)); } return ret; } diff --git a/src/share/ob_rpc_struct.h b/src/share/ob_rpc_struct.h index 050a2a4fc3..4907ea3792 100755 --- a/src/share/ob_rpc_struct.h +++ b/src/share/ob_rpc_struct.h @@ -2189,6 +2189,7 @@ public: tz_info_wrap_.set_tz_info_map(tz_info_map); tz_info_.set_tz_info_map(tz_info_map); } + int is_alter_comment(bool &is_alter_comment) const; int set_nls_formats(const common::ObString *nls_formats); int set_nls_formats(const common::ObString &nls_date_format, const common::ObString &nls_timestamp_format, @@ -5353,7 +5354,7 @@ public: object_id_(common::OB_INVALID_ID), ins_col_ids_(), upd_col_ids_(), ref_col_ids_(), grantor_id_(common::OB_INVALID_ID), remain_roles_(), is_inner_(false), - sel_col_ids_(), column_names_priv_() + sel_col_ids_(), column_names_priv_() { } virtual ~ObGrantArg() {} bool is_valid() const; @@ -5364,7 +5365,7 @@ public: TO_STRING_KV(K_(tenant_id), K_(priv_level), K_(db), K_(table), K_(priv_set), K_(users_passwd), K_(hosts), K_(need_create_user), K_(has_create_user_priv), K_(option), K_(object_type), K_(object_id), K_(grantor_id), K_(ins_col_ids), - K_(upd_col_ids), K_(ref_col_ids), K_(grantor_id)); + K_(upd_col_ids), K_(ref_col_ids), K_(grantor_id), K_(column_names_priv)); uint64_t tenant_id_; share::schema::ObPrivLevel priv_level_; @@ -5466,9 +5467,10 @@ public: obj_priv_array_(), revoke_all_ora_(false), sel_col_ids_(), ins_col_ids_(), upd_col_ids_(), ref_col_ids_(), column_names_priv_() { } - bool is_valid() const; int assign(const ObRevokeTableArg& other); + bool is_valid() const; + TO_STRING_KV(K_(tenant_id), K_(user_id), K_(db), @@ -5478,7 +5480,8 @@ public: K_(obj_id), K_(obj_type), K_(grantor_id), - K_(obj_priv_array)); + K_(obj_priv_array), + K_(column_names_priv)); uint64_t tenant_id_; uint64_t user_id_; @@ -5496,6 +5499,44 @@ public: common::ObSEArray upd_col_ids_; common::ObSEArray ref_col_ids_; common::ObSEArray, 4> column_names_priv_; +private: + DISALLOW_COPY_AND_ASSIGN(ObRevokeTableArg); +}; + +struct ObRevokeRoutineArg : public ObDDLArg +{ + OB_UNIS_VERSION(1); + +public: + ObRevokeRoutineArg() : ObDDLArg(), tenant_id_(common::OB_INVALID_ID), user_id_(common::OB_INVALID_ID), + priv_set_(0), grant_(true), obj_id_(common::OB_INVALID_ID), + obj_type_(common::OB_INVALID_ID), grantor_id_(common::OB_INVALID_ID), + obj_priv_array_(), revoke_all_ora_(false) + { } + bool is_valid() const; + int assign(const ObRevokeRoutineArg &other); + TO_STRING_KV(K_(tenant_id), + K_(user_id), + K_(db), + K_(routine), + "priv_set", share::schema::ObPrintPrivSet(priv_set_), + K_(grant), + K_(obj_id), + K_(obj_type), + K_(grantor_id), + K_(obj_priv_array)); + + uint64_t tenant_id_; + uint64_t user_id_; + common::ObString db_; + common::ObString routine_; + ObPrivSet priv_set_; + bool grant_; + uint64_t obj_id_; + uint64_t obj_type_; + uint64_t grantor_id_; + share::ObRawObjPrivArray obj_priv_array_; + bool revoke_all_ora_; }; struct ObRevokeSysPrivArg : public ObDDLArg @@ -6788,7 +6829,14 @@ struct ObCreateRoutineArg : public ObDDLArg { OB_UNIS_VERSION(1); public: - ObCreateRoutineArg(): routine_info_(), db_name_(), is_or_replace_(false), is_need_alter_(false), error_info_(), with_if_not_exist_(false) {} + ObCreateRoutineArg() + : routine_info_(), + db_name_(), + is_or_replace_(false), + is_need_alter_(false), + error_info_(), + dependency_infos_(), + with_if_not_exist_(false) {} virtual ~ObCreateRoutineArg() {} bool is_valid() const; int assign(const ObCreateRoutineArg &other); diff --git a/src/share/schema/ob_priv_mgr.cpp b/src/share/schema/ob_priv_mgr.cpp index a23440ab6c..1615d1f622 100644 --- a/src/share/schema/ob_priv_mgr.cpp +++ b/src/share/schema/ob_priv_mgr.cpp @@ -88,6 +88,10 @@ ObPrivMgr::ObPrivMgr() db_privs_(0, NULL, SET_USE_500(ObModIds::OB_SCHEMA_PRIV_DB_PRIVS, ObCtxIds::SCHEMA_SERVICE)), table_privs_(0, NULL, SET_USE_500(ObModIds::OB_SCHEMA_PRIV_TABLE_PRIVS, ObCtxIds::SCHEMA_SERVICE)), table_priv_map_(SET_USE_500(ObModIds::OB_SCHEMA_PRIV_TABLE_PRIV_MAP, ObCtxIds::SCHEMA_SERVICE)), + routine_privs_(0, NULL, SET_USE_500("PRIV_ROUTINE", ObCtxIds::SCHEMA_SERVICE)), + routine_priv_map_(SET_USE_500("PRIV_ROUTINE", ObCtxIds::SCHEMA_SERVICE)), + column_privs_sort_by_name_(0, NULL, SET_USE_500("PRIV_COL_NAME", ObCtxIds::SCHEMA_SERVICE)), + column_privs_sort_by_id_(0, NULL, SET_USE_500("PRIV_COL_ID", ObCtxIds::SCHEMA_SERVICE)), obj_privs_(0, NULL, SET_USE_500(ObModIds::OB_SCHEMA_PRIV_OBJ_PRIVS, ObCtxIds::SCHEMA_SERVICE)), obj_priv_map_(SET_USE_500(ObModIds::OB_SCHEMA_PRIV_OBJ_PRIV_MAP, ObCtxIds::SCHEMA_SERVICE)), sys_privs_(0, NULL, SET_USE_500(ObModIds::OB_SCHEMA_PRIV_SYS_PRIVS, ObCtxIds::SCHEMA_SERVICE)) @@ -102,6 +106,10 @@ ObPrivMgr::ObPrivMgr(ObIAllocator &allocator) db_privs_(0, NULL, SET_USE_500(ObModIds::OB_SCHEMA_PRIV_DB_PRIVS, ObCtxIds::SCHEMA_SERVICE)), table_privs_(0, NULL, SET_USE_500(ObModIds::OB_SCHEMA_PRIV_TABLE_PRIVS, ObCtxIds::SCHEMA_SERVICE)), table_priv_map_(SET_USE_500(ObModIds::OB_SCHEMA_PRIV_TABLE_PRIV_MAP, ObCtxIds::SCHEMA_SERVICE)), + routine_privs_(0, NULL, SET_USE_500("PRIV_ROUTINE", ObCtxIds::SCHEMA_SERVICE)), + routine_priv_map_(SET_USE_500("PRIV_ROUTINE", ObCtxIds::SCHEMA_SERVICE)), + column_privs_sort_by_name_(0, NULL, SET_USE_500("PRIV_COL_NAME", ObCtxIds::SCHEMA_SERVICE)), + column_privs_sort_by_id_(0, NULL, SET_USE_500("PRIV_COL_ID", ObCtxIds::SCHEMA_SERVICE)), obj_privs_(0, NULL, SET_USE_500(ObModIds::OB_SCHEMA_PRIV_OBJ_PRIVS, ObCtxIds::SCHEMA_SERVICE)), obj_priv_map_(SET_USE_500(ObModIds::OB_SCHEMA_PRIV_OBJ_PRIV_MAP, ObCtxIds::SCHEMA_SERVICE)), sys_privs_(0, NULL, SET_USE_500(ObModIds::OB_SCHEMA_PRIV_SYS_PRIVS, ObCtxIds::SCHEMA_SERVICE)) @@ -117,6 +125,8 @@ int ObPrivMgr::init() if (OB_FAIL(table_priv_map_.init())) { LOG_WARN("init table priv map failed", K(ret)); + } else if (OB_FAIL(routine_priv_map_.init())) { + LOG_WARN("init table priv map failed", K(ret)); } else if (OB_FAIL(obj_priv_map_.init())) { LOG_WARN("init obj priv map failed", K(ret)); } @@ -129,10 +139,14 @@ void ObPrivMgr::reset() // reset will not release memory for vector, use clear() db_privs_.clear(); table_privs_.clear(); + routine_privs_.clear(); sys_privs_.clear(); table_priv_map_.clear(); + routine_priv_map_.clear(); obj_privs_.clear(); obj_priv_map_.clear(); + column_privs_sort_by_name_.clear(); + column_privs_sort_by_id_.clear(); } int ObPrivMgr::assign(const ObPrivMgr &other) @@ -153,6 +167,10 @@ int ObPrivMgr::assign(const ObPrivMgr &other) ASSIGN_FIELD(table_priv_map_); ASSIGN_FIELD(obj_privs_); ASSIGN_FIELD(obj_priv_map_); + ASSIGN_FIELD(routine_privs_); + ASSIGN_FIELD(routine_priv_map_); + ASSIGN_FIELD(column_privs_sort_by_name_); + ASSIGN_FIELD(column_privs_sort_by_id_); #undef ASSIGN_FIELD } @@ -185,6 +203,16 @@ int ObPrivMgr::deep_copy(const ObPrivMgr &other) LOG_WARN("add table priv failed", K(*table_priv), K(ret)); } } + for (RoutinePrivIter iter = other.routine_privs_.begin(); + OB_SUCC(ret) && iter != other.routine_privs_.end(); iter++) { + ObRoutinePriv *routine_priv = *iter; + if (OB_ISNULL(routine_priv)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("NULL ptr", K(routine_priv), K(ret)); + } else if (OB_FAIL(add_routine_priv(*routine_priv))) { + LOG_WARN("add routine priv failed", K(*routine_priv), K(ret)); + } + } for (SysPrivIter iter = other.sys_privs_.begin(); OB_SUCC(ret) && iter != other.sys_privs_.end(); iter++) { ObSysPriv *sys_priv = *iter; @@ -205,6 +233,16 @@ int ObPrivMgr::deep_copy(const ObPrivMgr &other) LOG_WARN("add obj priv failed", K(*obj_priv), K(ret)); } } + for (ColumnPrivIter iter = other.column_privs_sort_by_id_.begin(); + OB_SUCC(ret) && iter != other.column_privs_sort_by_id_.end(); iter++) { + ObColumnPriv *column_priv = *iter; + if (OB_ISNULL(column_priv)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("NULL ptr", K(column_priv), K(ret)); + } else if (OB_FAIL(add_column_priv(*column_priv))) { + LOG_WARN("add obj priv failed", K(*column_priv), K(ret)); + } + } } return ret; @@ -622,6 +660,265 @@ int ObPrivMgr::add_table_priv(const ObTablePriv &table_priv) return ret; } +int ObPrivMgr::add_routine_privs(const common::ObIArray &routine_privs) +{ + int ret = OB_SUCCESS; + + FOREACH_CNT_X(routine_priv, routine_privs, OB_SUCC(ret)) { + if (OB_FAIL(add_routine_priv(*routine_priv))) { + LOG_WARN("add routine priv failed", K(ret), K(*routine_priv)); + } + } + + return ret; +} + +int ObPrivMgr::add_column_privs(const common::ObIArray &column_privs) +{ + int ret = OB_SUCCESS; + + FOREACH_CNT_X(column_priv, column_privs, OB_SUCC(ret)) { + if (OB_FAIL(add_column_priv(*column_priv))) { + LOG_WARN("add column priv failed", K(ret), K(*column_priv)); + } + } + + return ret; +} + +int ObPrivMgr::del_routine_privs(const common::ObIArray &routine_priv_keys) +{ + int ret = OB_SUCCESS; + + FOREACH_CNT_X(routine_priv_key, routine_priv_keys, OB_SUCC(ret)) { + if (OB_FAIL(del_routine_priv(*routine_priv_key))) { + LOG_WARN("del routine priv failed", K(ret), K(*routine_priv_key)); + } + } + + return ret; +} + +int ObPrivMgr::del_column_privs(const common::ObIArray &column_priv_keys) +{ + int ret = OB_SUCCESS; + + FOREACH_CNT_X(column_priv_key, column_priv_keys, OB_SUCC(ret)) { + if (OB_FAIL(del_column_priv(*column_priv_key))) { + LOG_WARN("del column priv failed", K(ret), K(*column_priv_key)); + } + } + + return ret; +} + +int ObPrivMgr::add_routine_priv(const ObRoutinePriv &routine_priv) +{ + int ret = OB_SUCCESS; + + ObRoutinePriv *new_routine_priv = NULL; + RoutinePrivIter iter = NULL; + ObRoutinePriv *replaced_routine_priv = NULL; + + if (OB_FAIL(ObSchemaUtils::alloc_schema(allocator_, + routine_priv, + new_routine_priv))) { + LOG_WARN("alloc schema failed", K(ret)); + } else if (OB_ISNULL(new_routine_priv)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("NULL ptr", K(ret), K(new_routine_priv)); + } else if (OB_FAIL(routine_privs_.replace(new_routine_priv, + iter, + ObRoutinePriv::cmp, + ObRoutinePriv::equal, + replaced_routine_priv))) { + LOG_WARN("Failed to put table_priv into table_priv vector", K(ret)); + } else { + int hash_ret = routine_priv_map_.set_refactored(new_routine_priv->get_sort_key(), new_routine_priv, 1); + if (OB_SUCCESS != hash_ret && OB_HASH_EXIST != hash_ret) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Failed to build routine hashmap", + "routine_priv_key", new_routine_priv->get_sort_key(), + K(ret), K(hash_ret)); + } + } + + // ignore ret + + if (OB_SUCC(ret) && routine_privs_.count() != routine_priv_map_.item_count()) { + LOG_WARN("routine priv is non-consistent between map and vector", + "routine_privs vector count", routine_privs_.count(), + "routine_privs map size", routine_priv_map_.item_count()); + if (OB_FAIL(rebuild_routine_priv_hashmap())) { + LOG_WARN("rebuild routine hashmap failed", K(ret)); + } else if (routine_privs_.count() != routine_priv_map_.item_count()) { + right_to_die_or_duty_to_live(); + } + } + + return ret; +} + +int ObPrivMgr::add_column_priv(const ObColumnPriv &column_priv) +{ + int ret = OB_SUCCESS; + + ObColumnPriv *new_column_priv = NULL; + ColumnPrivIter iter = NULL; + ObColumnPriv *replaced_column_priv = NULL; + + if (OB_FAIL(ObSchemaUtils::alloc_schema(allocator_, + column_priv, + new_column_priv))) { + LOG_WARN("alloc schema failed", K(ret)); + } else if (OB_ISNULL(new_column_priv)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("NULL ptr", K(ret), K(new_column_priv)); + } else if (OB_FAIL(column_privs_sort_by_id_.replace(new_column_priv, + iter, + ObColumnPriv::cmp_by_id, + ObColumnPriv::equal_by_id, + replaced_column_priv))) { + LOG_WARN("Failed to put column_priv into column_priv_sort_by_id vector", K(ret)); + } else if (OB_FAIL(column_privs_sort_by_name_.replace(new_column_priv, + iter, + ObColumnPriv::cmp_by_sort_key, + ObColumnPriv::equal_by_sort_key, + replaced_column_priv))) { + LOG_WARN("Failed to put column_priv into column_priv vector", K(ret)); + } + + // ignore ret + if (OB_FAIL(ret)) { + } else if (column_privs_sort_by_id_.count() != column_privs_sort_by_name_.count()) { + LOG_WARN("column priv is non-consistent between map and vector", + "column_privs vector count", column_privs_sort_by_id_.count(), + "column_privs sort by name vector count", column_privs_sort_by_name_.count(), KPC(new_column_priv)); + if (OB_FAIL(rebuild_column_priv_hashmap_and_vec())) { + LOG_WARN("rebuild column hashmap failed", K(ret)); + } else if (column_privs_sort_by_id_.count() != column_privs_sort_by_name_.count()) { + right_to_die_or_duty_to_live(); + } + } + + return ret; +} + +int ObPrivMgr::rebuild_routine_priv_hashmap() +{ + int ret = OB_SUCCESS; + routine_priv_map_.clear(); + for (ConstRoutinePrivIter iter = routine_privs_.begin(); + iter != routine_privs_.end() && OB_SUCC(ret); ++iter) { + ObRoutinePriv *routine_priv = *iter; + if (OB_ISNULL(routine_priv)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("routine priv schema is NULL", K(ret), K(routine_priv)); + } else { + int hash_ret = routine_priv_map_.set_refactored(routine_priv->get_sort_key(), routine_priv, 0); + if (OB_SUCCESS != hash_ret) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("build routine priv hashmap failed", K(ret), K(hash_ret), K(routine_priv->get_sort_key())); + } + } + } + + return ret; +} + +int ObPrivMgr::del_column_priv(const ObColumnPrivIdKey &column_priv_key) +{ + int ret = OB_SUCCESS; + + ObColumnPriv *column_priv = NULL; + if (OB_FAIL(column_privs_sort_by_id_.remove_if(column_priv_key, + ObColumnPriv::cmp_by_id_key, + ObColumnPriv::equal_by_id_key, + column_priv))) { + if (OB_ENTRY_NOT_EXIST == ret) { + // if item does not exist, regard it as succeeded, may be rebuilded later. + ret = OB_SUCCESS; + LOG_INFO("failed to remove column priv schema, item may not exist", K(ret)); + } else { + LOG_WARN("failed to remove column priv schema", K(ret)); + } + } else if (OB_ISNULL(column_priv)) { + // if item can be found, schema should not be null + // defense code, should not happed + ret = OB_ERR_UNEXPECTED; + LOG_WARN("removed column priv schema return NULL, ", + "tenant_id", column_priv_key.tenant_id_, + "column_priv", column_priv_key.priv_id_, + K(ret)); + } + + ObColumnPriv *column_priv_from_name_vec = NULL; + if (OB_FAIL(ret)) { + } else if (OB_ISNULL(column_priv)) { + //do nothing, may be rebuilded later + } else if (OB_FAIL(column_privs_sort_by_name_.remove_if(column_priv->get_sort_key(), + ObColumnPriv::cmp_sort_key, + ObColumnPriv::equal_sort_key, + column_priv_from_name_vec))) { + if (OB_ENTRY_NOT_EXIST == ret) { + // if item does not exist, regard it as succeeded, may be rebuilded later. + ret = OB_SUCCESS; + LOG_INFO("failed to remove column priv schema, item may not exist", K(ret)); + } else { + LOG_WARN("failed to remove column priv schema", K(ret)); + } + } else if (OB_ISNULL(column_priv_from_name_vec)) { + // if item can be found, schema should not be null + // defense code, should not happed + ret = OB_ERR_UNEXPECTED; + LOG_WARN("removed column priv schema return NULL, ", + "tenant_id", column_priv_key.tenant_id_, + "column_priv", column_priv_key.priv_id_, + K(ret)); + } + if (OB_FAIL(ret)) { + } else if (column_privs_sort_by_id_.count() != column_privs_sort_by_name_.count()) { + LOG_WARN("column priv is non-consistent between map and vector", + "column_privs vector count", column_privs_sort_by_id_.count(), + "column_privs sort by name vector count", column_privs_sort_by_name_.count()); + if (OB_FAIL(rebuild_column_priv_hashmap_and_vec())) { + LOG_WARN("rebuild column hashmap failed", K(ret)); + } else if (column_privs_sort_by_id_.count() != column_privs_sort_by_name_.count()) { + right_to_die_or_duty_to_live(); + } + } + return ret; +} + +int ObPrivMgr::rebuild_column_priv_hashmap_and_vec() +{ + int ret = OB_SUCCESS; + column_privs_sort_by_name_.clear(); + for (ConstColumnPrivIter iter = column_privs_sort_by_id_.begin(); + iter != column_privs_sort_by_id_.end() && OB_SUCC(ret); ++iter) { + ObColumnPriv *column_priv = *iter; + if (OB_ISNULL(column_priv)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("column priv schema is NULL", K(ret), K(column_priv)); + } else { + ColumnPrivIter iter = NULL; + ObColumnPriv *replaced_column_priv = NULL; + if (OB_FAIL(column_privs_sort_by_name_.replace(column_priv, + iter, + ObColumnPriv::cmp_by_sort_key, + ObColumnPriv::equal_by_sort_key, + replaced_column_priv))) { + LOG_WARN("sorted vec replace failed", K(ret)); + } else if (OB_NOT_NULL(replaced_column_priv)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("build column priv vec by name failed", K(ret), KPC(replaced_column_priv), KPC(column_priv)); + } + } + } + + return ret; +} + int ObPrivMgr::add_obj_privs(const common::ObIArray &obj_privs) { int ret = OB_SUCCESS; @@ -703,6 +1000,41 @@ int ObPrivMgr::del_table_priv(const ObTablePrivSortKey &table_priv_key) return ret; } +int ObPrivMgr::del_routine_priv(const ObRoutinePrivSortKey &routine_priv_key) +{ + int ret = OB_SUCCESS; + + ObRoutinePriv *routine_priv = NULL; + if (OB_FAIL(routine_privs_.remove_if(routine_priv_key, + ObRoutinePriv::cmp_sort_key, + ObRoutinePriv::equal_sort_key, + routine_priv))) { + LOG_WARN("Fail to remove routine priv",K(routine_priv_key), K(ret)); + } else if (OB_ISNULL(routine_priv)) { + LOG_WARN("Removed routine_priv return NULL", K(routine_priv)); + } + if (OB_SUCC(ret)) { + int hash_ret = routine_priv_map_.erase_refactored(routine_priv_key); + if (OB_SUCCESS != hash_ret) { + if (OB_HASH_NOT_EXIST != hash_ret) { + ret = OB_ERR_UNEXPECTED; + } + LOG_WARN("Failed to delete routine priv from routine priv map", K(ret), K(hash_ret)); + } + } + if (OB_SUCC(ret) && routine_privs_.count() != routine_priv_map_.item_count()) { + LOG_WARN("routine priv is non-consistent between map and vector", + "routine_privs vector count", routine_privs_.count(), + "routine_privs map size", routine_priv_map_.item_count()); + if (OB_FAIL(rebuild_routine_priv_hashmap())) { + LOG_WARN("rebuild routine hashmap failed", K(ret)); + } else if (routine_privs_.count() != routine_priv_map_.item_count()) { + right_to_die_or_duty_to_live(); + } + } + return ret; +} + int ObPrivMgr::del_obj_priv(const ObObjPrivSortKey &obj_priv_key) { int ret = OB_SUCCESS; @@ -784,6 +1116,86 @@ int ObPrivMgr::get_table_priv_set(const ObTablePrivSortKey &table_priv_key, return ret; } +int ObPrivMgr::get_routine_priv(const ObRoutinePrivSortKey &routine_priv_key, + const ObRoutinePriv *&routine_priv) const +{ + int ret = OB_SUCCESS; + routine_priv = NULL; + + ObRoutinePriv *tmp_routine_priv = NULL; + int hash_ret = routine_priv_map_.get_refactored(routine_priv_key, tmp_routine_priv); + if (OB_SUCCESS == hash_ret) { + if (OB_ISNULL(tmp_routine_priv)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get routine priv return NULL", K(ret), K(routine_priv_key)); + } else { + routine_priv = tmp_routine_priv; + } + } else if (OB_HASH_NOT_EXIST != hash_ret) { + ret = hash_ret; + LOG_WARN("get routine priv not existed", K(ret), K(routine_priv_key)); + } + return ret; +} + +int ObPrivMgr::get_column_priv(const ObColumnPrivSortKey &column_priv_key, + const ObColumnPriv *&column_priv) const +{ + int ret = OB_SUCCESS; + column_priv = NULL; + if (!column_priv_key.is_valid()) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("Invalid argument exist", K(column_priv_key), K(ret)); + } else { + ConstColumnPrivIter iter = + column_privs_sort_by_name_.lower_bound(column_priv_key, ObColumnPriv::cmp_sort_key); + const ObColumnPriv *tmp_column_priv = NULL; + if (iter != column_privs_sort_by_name_.end()) { + if (OB_ISNULL(tmp_column_priv = *iter)) { + ret = OB_ERR_UNEXPECTED; + LOG_ERROR("Invalid user table priv pointer", K(ret)); + } else if (column_priv_key != tmp_column_priv->get_sort_key()) { + column_priv = NULL; + } else { + column_priv = tmp_column_priv; + } + } + } + return ret; +} + +int ObPrivMgr::get_routine_priv_set(const ObRoutinePrivSortKey &routine_priv_key, + ObPrivSet &priv_set) const +{ + int ret = OB_SUCCESS; + priv_set = OB_PRIV_SET_EMPTY; + + const ObRoutinePriv *routine_priv = NULL; + if (OB_FAIL(get_routine_priv(routine_priv_key, routine_priv))) { + LOG_WARN("get table priv failed", K(ret), K(routine_priv_key)); + } else if (NULL != routine_priv) { + priv_set = routine_priv->get_priv_set(); + } + + return ret; +} + +int ObPrivMgr::get_column_priv_set(const ObColumnPrivSortKey &column_priv_key, + ObPrivSet &priv_set) const +{ + int ret = OB_SUCCESS; + priv_set = OB_PRIV_SET_EMPTY; + + const ObColumnPriv *column_priv = NULL; + if (OB_FAIL(get_column_priv(column_priv_key, column_priv))) { + LOG_WARN("get column priv failed", K(ret), K(column_priv_key)); + } else if (NULL != column_priv) { + priv_set = column_priv->get_priv_set(); + } + + return ret; +} + int ObPrivMgr::table_grant_in_db(const uint64_t tenant_id, const uint64_t user_id, const ObString &db, @@ -811,6 +1223,184 @@ int ObPrivMgr::table_grant_in_db(const uint64_t tenant_id, return ret; } +int ObPrivMgr::routine_grant_in_db(const uint64_t tenant_id, + const uint64_t user_id, + const ObString &db, + bool &is_grant) const +{ + int ret = OB_SUCCESS; + is_grant = false; + + if (OB_INVALID_ID == tenant_id || OB_INVALID_ID == user_id || db.length() == 0) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("Invalid argument exist", K(tenant_id), K(user_id), K(db), K(ret)); + } else { + ObRoutinePrivDBKey routine_priv_db_key(tenant_id, user_id, db); + ConstRoutinePrivIter iter = + routine_privs_.lower_bound(routine_priv_db_key, ObRoutinePriv::cmp_db_key); + if (iter != routine_privs_.end()) { + if (OB_ISNULL(*iter)) { + ret = OB_ERR_UNEXPECTED; + LOG_ERROR("Invalid user table priv pointer", K(ret)); + } else if (routine_priv_db_key == (*iter)->get_db_key()) { + is_grant = true; + } + } + } + return ret; +} + +int ObPrivMgr::get_column_priv_in_db(const uint64_t tenant_id, + const uint64_t user_id, + const ObString &db, + ObIArray &column_privs) const +{ + int ret = OB_SUCCESS; + if (OB_INVALID_ID == tenant_id || OB_INVALID_ID == user_id || db.length() == 0) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("Invalid argument exist", K(tenant_id), K(user_id), K(db), K(ret)); + } else { + ObTablePrivDBKey db_priv_key(tenant_id, user_id, db); + ConstColumnPrivIter iter = + column_privs_sort_by_name_.lower_bound(db_priv_key, ObColumnPriv::cmp_db_key); + while (OB_SUCC(ret) && iter != column_privs_sort_by_name_.end()) { + const ObColumnPriv *column_priv = NULL; + if (OB_ISNULL(column_priv = *iter)) { + ret = OB_ERR_UNEXPECTED; + LOG_ERROR("Invalid user table priv pointer", K(ret)); + } else if (db_priv_key != column_priv->get_db_key()) { + break; + } else if (OB_FAIL(column_privs.push_back(column_priv))) { + LOG_WARN("push back column priv failed", K(ret)); + } else { + iter ++; + } + } + } + return ret; +} + + +int ObPrivMgr::get_column_priv_by_id(const uint64_t tenant_id, + const uint64_t priv_id, + const ObColumnPriv *&column_priv) const +{ + int ret = OB_SUCCESS; + column_priv = NULL; + if (OB_INVALID_ID == tenant_id || OB_INVALID_ID == priv_id) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("Invalid argument exist", K(tenant_id), K(priv_id), K(ret)); + } else { + ObColumnPrivIdKey column_priv_key(tenant_id, priv_id); + ConstColumnPrivIter iter = + column_privs_sort_by_id_.lower_bound(column_priv_key, ObColumnPriv::cmp_by_id_key); + const ObColumnPriv *col_priv = NULL; + if (iter != column_privs_sort_by_id_.end()) { + if (OB_ISNULL(col_priv = *iter)) { + ret = OB_ERR_UNEXPECTED; + LOG_ERROR("Invalid user table priv pointer", K(ret)); + } else if (tenant_id != col_priv->get_tenant_id() || priv_id != col_priv->get_priv_id()) { + //do nothing + } else { + column_priv = col_priv; + } + } + } + return ret; +} + +int ObPrivMgr::get_column_priv_id(const uint64_t tenant_id, + const uint64_t user_id, + const ObString &db, + const ObString &table, + const ObString &column, + uint64_t &column_priv_id) const +{ + int ret = OB_SUCCESS; + column_priv_id = OB_INVALID_ID; + if (OB_INVALID_ID == tenant_id || OB_INVALID_ID == user_id + || db.length() == 0 || table.length() == 0 || column.length() == 0) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("Invalid argument exist", K(tenant_id), K(user_id), K(db), K(table), K(column), K(ret)); + } else { + ObColumnPrivSortKey column_priv_key(tenant_id, user_id, db, table, column); + ConstColumnPrivIter iter = + column_privs_sort_by_name_.lower_bound(column_priv_key, ObColumnPriv::cmp_sort_key); + const ObColumnPriv *column_priv = NULL; + if (iter != column_privs_sort_by_name_.end()) { + if (OB_ISNULL(column_priv = *iter)) { + ret = OB_ERR_UNEXPECTED; + LOG_ERROR("Invalid user table priv pointer", K(ret)); + } else if (column_priv_key != column_priv->get_sort_key()) { + column_priv_id = OB_INVALID_ID; + } else { + column_priv_id = column_priv->get_priv_id(); + } + } + } + return ret; +} + +int ObPrivMgr::get_column_priv_in_table(const uint64_t tenant_id, + const uint64_t user_id, + const ObString &db, + const ObString &table, + ObIArray &column_privs) const +{ + int ret = OB_SUCCESS; + column_privs.reset(); + if (OB_INVALID_ID == tenant_id || OB_INVALID_ID == user_id || db.length() == 0 || table.length() == 0) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("Invalid argument exist", K(tenant_id), K(user_id), K(db), K(ret)); + } else { + ObTablePrivSortKey table_priv_key(tenant_id, user_id, db, table); + ConstColumnPrivIter iter = + column_privs_sort_by_name_.lower_bound(table_priv_key, ObColumnPriv::cmp_table_key); + while (OB_SUCC(ret) && iter != column_privs_sort_by_name_.end()) { + const ObColumnPriv *column_priv = NULL; + if (OB_ISNULL(column_priv = *iter)) { + ret = OB_ERR_UNEXPECTED; + LOG_ERROR("Invalid user table priv pointer", K(ret)); + } else if (table_priv_key != column_priv->get_table_key()) { + break; + } else if (OB_FAIL(column_privs.push_back(column_priv))) { + LOG_WARN("push back column priv failed", K(ret)); + } else { + iter ++; + } + } + } + return ret; +} + +int ObPrivMgr::get_column_privs_in_user(const uint64_t tenant_id, + const uint64_t user_id, + ObIArray &column_privs) const +{ + int ret = OB_SUCCESS; + column_privs.reset(); + + ObTenantUserId tenant_user_id(tenant_id, user_id); + ConstColumnPrivIter tenant_column_priv_begin = + column_privs_sort_by_name_.lower_bound(tenant_user_id, ObColumnPriv::cmp_tenant_user_id); + bool is_stop = false; + for (ConstColumnPrivIter iter = tenant_column_priv_begin; + OB_SUCC(ret) && iter != column_privs_sort_by_name_.end() && !is_stop; ++iter) { + const ObColumnPriv *column_priv = NULL; + if (OB_ISNULL(column_priv = *iter)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("NULL ptr", K(ret), K(column_priv)); + } else if (tenant_id != column_priv->get_tenant_id() + || user_id != column_priv->get_user_id()) { + is_stop = true; + } else if (OB_FAIL(column_privs.push_back(column_priv))) { + LOG_WARN("push back table priv failed", K(ret)); + } + } + + return ret; +} + int ObPrivMgr::get_db_privs_in_tenant(const uint64_t tenant_id, ObIArray &db_privs) const { @@ -942,6 +1532,34 @@ int ObPrivMgr::get_table_privs_in_user(const uint64_t tenant_id, return ret; } +int ObPrivMgr::get_routine_privs_in_user(const uint64_t tenant_id, + const uint64_t user_id, + ObIArray &routine_privs) const +{ + int ret = OB_SUCCESS; + routine_privs.reset(); + + ObTenantUserId tenant_user_id(tenant_id, user_id); + ConstRoutinePrivIter tenant_routine_priv_begin = + routine_privs_.lower_bound(tenant_user_id, ObRoutinePriv::cmp_tenant_user_id); + bool is_stop = false; + for (ConstRoutinePrivIter iter = tenant_routine_priv_begin; + OB_SUCC(ret) && iter != routine_privs_.end() && !is_stop; ++iter) { + const ObRoutinePriv *routine_priv = NULL; + if (OB_ISNULL(routine_priv = *iter)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("NULL ptr", K(ret), K(routine_priv)); + } else if (tenant_id != routine_priv->get_tenant_id() + || user_id != routine_priv->get_user_id()) { + is_stop = true; + } else if (OB_FAIL(routine_privs.push_back(routine_priv))) { + LOG_WARN("push back table priv failed", K(ret)); + } + } + + return ret; +} + int ObPrivMgr::get_obj_privs_in_grantee(const uint64_t tenant_id, const uint64_t grantee_id, ObIArray &obj_privs) const @@ -1267,9 +1885,11 @@ int ObPrivMgr::get_schema_statistics(const ObSchemaType schema_type, ObSchemaSta int ret = OB_SUCCESS; schema_info.reset(); if (TABLE_PRIV != schema_type + && ROUTINE_PRIV != schema_type && DATABASE_PRIV != schema_type && SYS_PRIV != schema_type - && OBJ_PRIV != schema_type) { + && OBJ_PRIV != schema_type + && COLUMN_PRIV != schema_type) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid schema type", K(ret), K(schema_type)); } else { @@ -1284,6 +1904,16 @@ int ObPrivMgr::get_schema_statistics(const ObSchemaType schema_type, ObSchemaSta schema_info.size_ += (*it)->get_convert_size(); } } + } else if (ROUTINE_PRIV == schema_type) { + schema_info.count_ = routine_privs_.size(); + for (ConstRoutinePrivIter it = routine_privs_.begin(); OB_SUCC(ret) && it != routine_privs_.end(); it++) { + if (OB_ISNULL(*it)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("schema is null", K(ret)); + } else { + schema_info.size_ += (*it)->get_convert_size(); + } + } } else if (DATABASE_PRIV == schema_type) { schema_info.count_ = db_privs_.size(); for (ConstDBPrivIter it = db_privs_.begin(); OB_SUCC(ret) && it != db_privs_.end(); it++) { @@ -1314,6 +1944,16 @@ int ObPrivMgr::get_schema_statistics(const ObSchemaType schema_type, ObSchemaSta schema_info.size_ += (*it)->get_convert_size(); } } + } else if (COLUMN_PRIV == schema_type) { + schema_info.count_ = column_privs_sort_by_id_.size(); + for (ConstColumnPrivIter it = column_privs_sort_by_id_.begin(); OB_SUCC(ret) && it != column_privs_sort_by_id_.end(); it++) { + if (OB_ISNULL(*it)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("schema is null", K(ret)); + } else { + schema_info.size_ += (*it)->get_convert_size(); + } + } } } return ret; diff --git a/src/share/schema/ob_priv_mgr.h b/src/share/schema/ob_priv_mgr.h index fa5a1d5887..2552fe67b6 100644 --- a/src/share/schema/ob_priv_mgr.h +++ b/src/share/schema/ob_priv_mgr.h @@ -46,6 +46,52 @@ struct ObGetTablePrivKeyV3 key; } }; + +template +struct ObGetRoutinePrivKeyV3 +{ + void operator()(const T & t, const V &v) const + { + UNUSED(t); + UNUSED(v); + } +}; + + +template<> +struct ObGetRoutinePrivKeyV3 +{ + ObRoutinePrivSortKey operator()(const ObRoutinePriv *routine_priv) const + { + ObRoutinePrivSortKey key; + return NULL != routine_priv ? + routine_priv->get_sort_key() : + key; + } +}; + +template +struct ObGetColumnPrivKeyV3 +{ + void operator()(const T & t, const V &v) const + { + UNUSED(t); + UNUSED(v); + } +}; + +template<> +struct ObGetColumnPrivKeyV3 +{ + ObColumnPrivSortKey operator()(const ObColumnPriv *column_priv) const + { + ObColumnPrivSortKey key; + return NULL != column_priv ? + column_priv->get_sort_key() : + key; + } +}; + template struct ObGetObjPrivKey { @@ -70,14 +116,23 @@ class ObPrivMgr { typedef common::ObSortedVector DBPrivInfos; typedef common::ObSortedVector TablePrivInfos; + typedef common::ObSortedVector RoutinePrivInfos; + typedef common::ObSortedVector ColumnPrivInfos; typedef common::ObSortedVectorObjPrivInfos; typedef common::ObSortedVectorSysPrivInfos; typedef common::hash::ObPointerHashMap TablePrivMap; + typedef common::hash::ObPointerHashMap RoutinePrivMap; + typedef common::hash::ObPointerHashMap ColumnPrivMap; typedef common::hash::ObPointerHashMap ObjPrivMap; typedef DBPrivInfos::iterator DBPrivIter; typedef DBPrivInfos::const_iterator ConstDBPrivIter; typedef TablePrivInfos::iterator TablePrivIter; typedef TablePrivInfos::const_iterator ConstTablePrivIter; + typedef RoutinePrivInfos::iterator RoutinePrivIter; + typedef RoutinePrivInfos::const_iterator ConstRoutinePrivIter; + + typedef ColumnPrivInfos::iterator ColumnPrivIter; + typedef ColumnPrivInfos::const_iterator ConstColumnPrivIter; typedef SysPrivInfos::iterator SysPrivIter; typedef SysPrivInfos::const_iterator ConstSysPrivIter; typedef ObjPrivInfos::iterator ObjPrivIter; @@ -110,14 +165,56 @@ public: int add_table_priv(const ObTablePriv &table_priv); int del_table_priv(const ObTablePrivSortKey &table_priv_key); + int add_column_privs(const common::ObIArray &column_privs); + int add_column_priv(const ObColumnPriv &column_priv); + int del_column_privs(const common::ObIArray &column_priv_keys); + int del_column_priv(const ObColumnPrivIdKey &column_priv_key); + int get_table_priv(const ObTablePrivSortKey &table_priv_key, const ObTablePriv *&table_priv) const; int get_table_priv_set(const ObTablePrivSortKey &table_priv_key, ObPrivSet &priv_set) const; + + int add_routine_privs(const common::ObIArray &routine_privs); + int del_routine_privs(const common::ObIArray &routine_priv_keys); + int add_routine_priv(const ObRoutinePriv &routine_priv); + int del_routine_priv(const ObRoutinePrivSortKey &routine_priv_key); + int get_routine_priv(const ObRoutinePrivSortKey &routine_priv_key, + const ObRoutinePriv *&routine_priv) const; + + int get_routine_priv_set(const ObRoutinePrivSortKey &routine_priv_key, + ObPrivSet &priv_set) const; + int get_column_priv_in_table(const uint64_t tenant_id, + const uint64_t user_id, + const ObString &db, + const ObString &table, + ObIArray &column_privs) const; + + int get_column_priv_by_id(const uint64_t tenant_id, + const uint64_t priv_id, + const ObColumnPriv *&column_priv) const; + int get_column_priv_id(const uint64_t tenant_id, + const uint64_t user_id, + const ObString &db, + const ObString &table, + const ObString &column, + uint64_t &column_priv_id) const; + int get_column_priv_in_db(const uint64_t tenant_id, + const uint64_t user_id, + const ObString &db, + ObIArray &column_privs) const; + int get_column_priv(const ObColumnPrivSortKey &column_priv_key, + const ObColumnPriv *&column_priv) const; + int get_column_priv_set(const ObColumnPrivSortKey &column_priv_key, + ObPrivSet &priv_set) const; int table_grant_in_db(const uint64_t tenant_id, const uint64_t user_id, const common::ObString &db, bool &is_grant) const; + int routine_grant_in_db(const uint64_t tenant_id, + const uint64_t user_id, + const ObString &db, + bool &is_grant) const; //obj priv int add_obj_privs(const common::ObIArray &obj_privs); int del_obj_privs(const common::ObIArray &obj_priv_keys); @@ -161,6 +258,15 @@ public: int get_table_privs_in_user(const uint64_t tenant_id, const uint64_t user_id, common::ObIArray &table_privs) const; + int get_routine_privs_in_user(const uint64_t tenant_id, + const uint64_t user_id, + ObIArray &routine_privs) const; + + + + int get_column_privs_in_user(const uint64_t tenant_id, + const uint64_t user_id, + ObIArray &column_privs) const; int get_obj_privs_in_tenant(const uint64_t tenant_id, common::ObIArray &obj_privs) const; int get_obj_privs_in_grantee(const uint64_t tenant_id, @@ -190,12 +296,19 @@ private: DBPrivIter &target_db_priv_iter) const; int get_sys_priv_iter(const ObSysPrivKey &sys_key, SysPrivIter &target_sys_priv_iter) const; + int rebuild_routine_priv_hashmap(); + int rebuild_column_priv_hashmap_and_vec(); private: common::ObArenaAllocator local_allocator_; common::ObIAllocator &allocator_; DBPrivInfos db_privs_; TablePrivInfos table_privs_; TablePrivMap table_priv_map_; + RoutinePrivInfos routine_privs_; + RoutinePrivMap routine_priv_map_; + + ColumnPrivInfos column_privs_sort_by_name_; + ColumnPrivInfos column_privs_sort_by_id_; ObjPrivInfos obj_privs_; ObjPrivMap obj_priv_map_; SysPrivInfos sys_privs_; diff --git a/src/share/schema/ob_priv_sql_service.cpp b/src/share/schema/ob_priv_sql_service.cpp index f37ead5d9c..91a9ae521f 100644 --- a/src/share/schema/ob_priv_sql_service.cpp +++ b/src/share/schema/ob_priv_sql_service.cpp @@ -23,11 +23,14 @@ #include "share/inner_table/ob_inner_table_schema_constants.h" #include "observer/ob_sql_client_decorator.h" #include "sql/resolver/ob_schema_checker.h" +#include "share/ob_max_id_fetcher.h" // ObMaxIdFetcher +#include "sql/ob_sql_utils.h" namespace oceanbase { using namespace common; +using namespace sql; namespace share { namespace schema @@ -281,6 +284,211 @@ int ObPrivSqlService::grant_table( return ret; } + +int ObPrivSqlService::grant_routine( + const ObRoutinePrivSortKey &routine_priv_key, + const ObPrivSet priv_set, + const int64_t new_schema_version, + const ObString *ddl_stmt_str, + ObISQLClient &sql_client, + const uint64_t option, + const bool is_grant) +{ + int ret = OB_SUCCESS; + const bool is_deleted = priv_set == 0; + const uint64_t tenant_id = routine_priv_key.tenant_id_; + const uint64_t exec_tenant_id = ObSchemaUtils::get_exec_tenant_id(tenant_id); + 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 (!ObSQLUtils::is_data_version_ge_423_or_431(compat_version)) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("grant/revoke routine priv is not suppported when tenant's data version is below 4.3.1.0 or 4.2.3.0", KR(ret)); + } else if (!routine_priv_key.is_valid()) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid arguments", K(routine_priv_key), K(ret)); + } else { + int64_t affected_rows = 0; + ObDMLExecHelper exec(sql_client, exec_tenant_id); + ObDMLSqlSplicer dml; + if (OB_FAIL(gen_routine_priv_dml(exec_tenant_id, routine_priv_key, priv_set, dml))) { + LOG_WARN("gen_routine_priv_dml failed", K(routine_priv_key), K(priv_set), K(ret)); + } + // insert into __all_routine_privilege + if (OB_SUCC(ret)) { + if (is_deleted) { + if (OB_FAIL(exec.exec_delete(OB_ALL_ROUTINE_PRIVILEGE_TNAME, dml, affected_rows))) { + LOG_WARN("exec_delete failed", K(ret)); + } + } else { + if (OB_FAIL(exec.exec_replace(OB_ALL_ROUTINE_PRIVILEGE_TNAME, dml, affected_rows))) { + LOG_WARN("exec_replace failed", K(ret)); + } + } + + if (OB_FAIL(ret)) { + } else if (!is_single_row(affected_rows) && !is_double_row(affected_rows)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("affected_rows unexpected to be one ", K(affected_rows), K(ret)); + } + } + + // insert into __all_routine_privilege_history + if (OB_SUCC(ret)) { + if (OB_FAIL(dml.add_pk_column("schema_version", new_schema_version)) + || OB_FAIL(dml.add_column("is_deleted", is_deleted))) { + LOG_WARN("add column failed", K(ret)); + } else if (OB_FAIL(exec.exec_insert(OB_ALL_ROUTINE_PRIVILEGE_HISTORY_TNAME, dml, affected_rows))) { + LOG_WARN("exec_replace failed", K(ret)); + } else if (!is_single_row(affected_rows)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("affected_rows expeccted to be one", K(affected_rows), K(ret)); + } + } + + //log operation + if (OB_SUCC(ret)) { + ObSchemaOperation priv_operation; + priv_operation.tenant_id_ = routine_priv_key.tenant_id_; + priv_operation.user_id_ = routine_priv_key.user_id_; + priv_operation.database_name_ = routine_priv_key.db_; + priv_operation.routine_name_ = routine_priv_key.routine_; + priv_operation.routine_type_ = routine_priv_key.routine_type_; + priv_operation.op_type_ = (is_deleted ? + OB_DDL_DEL_ROUTINE_PRIV : OB_DDL_GRANT_ROUTINE_PRIV); + priv_operation.schema_version_ = new_schema_version; + priv_operation.ddl_stmt_str_ = ddl_stmt_str ? *ddl_stmt_str : ObString(); + if (OB_FAIL(log_operation(priv_operation, sql_client))) { + LOG_WARN("Failed to log operation", K(ret)); + } + } + } + return ret; +} + +int ObPrivSqlService::grant_column( + const ObColumnPrivSortKey &column_priv_key, + uint64_t column_priv_id, + const ObPrivSet priv_set, + const int64_t new_schema_version, + const ObString *ddl_stmt_str, + ObISQLClient &sql_client, + const bool is_grant) +{ + int ret = OB_SUCCESS; + const bool is_deleted = priv_set == 0; + const uint64_t tenant_id = column_priv_key.tenant_id_; + const uint64_t exec_tenant_id = ObSchemaUtils::get_exec_tenant_id(tenant_id); + if (OB_FAIL(ObSQLUtils::compatibility_check_for_mysql_role_and_column_priv(tenant_id))) { + LOG_WARN("grant/revoke column priv is not suppported", KR(ret)); + } else if (!column_priv_key.is_valid()) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid arguments", K(column_priv_key), K(ret)); + } else if (OB_INVALID_ID == column_priv_id) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("column priv id is invalid", K(ret)); + } else { + int64_t affected_rows = 0; + ObDMLExecHelper exec(sql_client, exec_tenant_id); + ObDMLSqlSplicer dml; + uint64_t new_column_priv_id = OB_INVALID_ID; + if (OB_FAIL(gen_column_priv_dml(exec_tenant_id, column_priv_key, column_priv_id, priv_set, dml))) { + LOG_WARN("gen_column_priv_dml failed", K(column_priv_key), K(priv_set), K(ret)); + } + // insert into __all_column_privilege + if (OB_SUCC(ret)) { + if (is_deleted) { + if (OB_FAIL(exec.exec_delete(OB_ALL_COLUMN_PRIVILEGE_TNAME, dml, affected_rows))) { + LOG_WARN("exec_delete failed", K(ret)); + } + } else { + if (OB_FAIL(exec.exec_replace(OB_ALL_COLUMN_PRIVILEGE_TNAME, dml, affected_rows))) { + LOG_WARN("exec_replace failed", K(ret)); + } + } + + if (OB_FAIL(ret)) { + } else if (!is_single_row(affected_rows) && !is_double_row(affected_rows)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("affected_rows unexpected to be one ", K(affected_rows), K(ret)); + } + } + + // insert into __all_column_privilege_history + if (OB_SUCC(ret)) { + if (OB_FAIL(dml.add_pk_column("schema_version", new_schema_version)) + || OB_FAIL(dml.add_column("is_deleted", is_deleted))) { + LOG_WARN("add column failed", K(ret)); + } else if (OB_FAIL(exec.exec_insert(OB_ALL_COLUMN_PRIVILEGE_HISTORY_TNAME, dml, affected_rows))) { + LOG_WARN("exec_replace failed", K(ret)); + } else if (!is_single_row(affected_rows)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("affected_rows expeccted to be one", K(affected_rows), K(ret)); + } + } + //log operation + if (OB_SUCC(ret)) { + ObSchemaOperation priv_operation; + priv_operation.tenant_id_ = column_priv_key.tenant_id_; + priv_operation.column_priv_id_ = column_priv_id; + priv_operation.op_type_ = is_deleted ? + OB_DDL_DEL_COLUMN_PRIV : OB_DDL_GRANT_COLUMN_PRIV; + priv_operation.schema_version_ = new_schema_version; + priv_operation.ddl_stmt_str_ = ddl_stmt_str ? *ddl_stmt_str : ObString(); + if (OB_FAIL(log_operation(priv_operation, sql_client))) { + LOG_WARN("Failed to log operation", K(ret)); + } + } + } + return ret; +} + +int ObPrivSqlService::gen_column_priv_dml( + const uint64_t exec_tenant_id, + const ObColumnPrivSortKey &column_priv_key, + const uint64_t priv_id, + const ObPrivSet &priv_set, + ObDMLSqlSplicer &dml) +{ + int ret = OB_SUCCESS; + int64_t all_priv = 0; + if (OB_FAIL(ObSQLUtils::compatibility_check_for_mysql_role_and_column_priv(exec_tenant_id))) { + LOG_WARN("all column priv is not suppported", KR(ret)); + } else { + if ((priv_set & OB_PRIV_SELECT) != 0) { all_priv |= 1; } + if ((priv_set & OB_PRIV_INSERT) != 0) { all_priv |= 2; } + if ((priv_set & OB_PRIV_UPDATE) != 0) { all_priv |= 4; } + if ((priv_set & OB_PRIV_REFERENCES) != 0) { all_priv |= 8; } + if (OB_FAIL(dml.add_pk_column("tenant_id", 0)) + || OB_FAIL(dml.add_pk_column("user_id", column_priv_key.user_id_)) + || OB_FAIL(dml.add_pk_column("priv_id", priv_id)) + || OB_FAIL(dml.add_column("database_name", column_priv_key.db_)) + || OB_FAIL(dml.add_column("table_name", column_priv_key.table_)) + || OB_FAIL(dml.add_column("column_name", column_priv_key.column_)) + || OB_FAIL(dml.add_column("all_priv", all_priv))) { + LOG_WARN("add column failed", K(ret)); + } + } + return ret; +} + +int ObPrivSqlService::revoke_routine( + const ObRoutinePrivSortKey &routine_priv_key, + const ObPrivSet priv_set, + const int64_t new_schema_version, + const ObString *ddl_stmt_str, + ObISQLClient &sql_client) +{ + return grant_routine(routine_priv_key, + priv_set, + new_schema_version, + ddl_stmt_str, + sql_client, + NO_OPTION, + false); +} + + /* * This function should by called when grant only oracle related privs. * Only deal with Authorization operations of single object. @@ -699,14 +907,51 @@ int ObPrivSqlService::gen_table_priv_dml( return ret; } -int ObPrivSqlService::gen_db_priv_dml( +int ObPrivSqlService::gen_routine_priv_dml( const uint64_t exec_tenant_id, - const ObOriginalDBKey &db_priv_key, + const ObRoutinePrivSortKey &routine_priv_key, const ObPrivSet &priv_set, ObDMLSqlSplicer &dml) { int ret = OB_SUCCESS; - if (OB_FAIL(dml.add_pk_column("tenant_id", ObSchemaUtils::get_extract_tenant_id( + int64_t all_priv = 0; + uint64_t compat_version = 0; + if (OB_FAIL(GET_MIN_DATA_VERSION(exec_tenant_id, compat_version))) { + LOG_WARN("fail to get data version", KR(ret), K(exec_tenant_id)); + } else if (!ObSQLUtils::is_data_version_ge_423_or_431(compat_version)) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("all routine priv is not suppported when tenant's data version is below 4.3.1.0 or 4.2.3.0", KR(ret)); + } else { + if ((priv_set & OB_PRIV_EXECUTE) != 0) { all_priv |= 1; } + if ((priv_set & OB_PRIV_ALTER_ROUTINE) != 0) { all_priv |= 2; } + if ((priv_set & OB_PRIV_GRANT) != 0) { all_priv |= 4; } + if (OB_FAIL(dml.add_pk_column("tenant_id", 0)) + || OB_FAIL(dml.add_pk_column("user_id", routine_priv_key.user_id_)) + || OB_FAIL(dml.add_pk_column("database_name", routine_priv_key.db_)) + || OB_FAIL(dml.add_pk_column("routine_name", routine_priv_key.routine_)) + || OB_FAIL(dml.add_pk_column("routine_type", routine_priv_key.routine_type_)) + || OB_FAIL(dml.add_column("all_priv", all_priv))) { + LOG_WARN("add column failed", K(ret)); + } + } + return ret; +} + +int ObPrivSqlService::gen_db_priv_dml( + const uint64_t exec_tenant_id, + const ObOriginalDBKey &db_priv_key, + const ObPrivSet &priv_set, + ObDMLSqlSplicer &dml) +{ + int ret = OB_SUCCESS; + ObPrivSet priv_others = 0; + priv_others |= (priv_set & OB_PRIV_EXECUTE) != 0 ? 1 : 0; + priv_others |= (priv_set & OB_PRIV_ALTER_ROUTINE) != 0 ? 2 : 0; + priv_others |= (priv_set & OB_PRIV_CREATE_ROUTINE) != 0 ? 4 : 0; + uint64_t compat_version = 0; + if (OB_FAIL(GET_MIN_DATA_VERSION(exec_tenant_id, compat_version))) { + LOG_WARN("fail to get data version", KR(ret), K(exec_tenant_id)); + } else if (OB_FAIL(dml.add_pk_column("tenant_id", ObSchemaUtils::get_extract_tenant_id( exec_tenant_id, db_priv_key.tenant_id_))) || OB_FAIL(dml.add_pk_column("user_id", ObSchemaUtils::get_extract_schema_id( exec_tenant_id, db_priv_key.user_id_))) @@ -724,6 +969,13 @@ int ObPrivSqlService::gen_db_priv_dml( || OB_FAIL(dml.add_column("PRIV_SHOW_VIEW", priv_set & OB_PRIV_SHOW_VIEW ? 1 : 0)) || OB_FAIL(dml.add_gmt_modified())) { LOG_WARN("add column failed", K(ret)); + } else if (!sql::ObSQLUtils::is_data_version_ge_423_or_431(compat_version)) { + if (priv_others != 0) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("priv others is not suppported when tenant's data version is below 4.3.1.0 or 4.2.3.0", KR(ret)); + } + } else if (OB_FAIL(dml.add_column("PRIV_OTHERS", priv_others))) { + LOG_WARN("add column failed", K(ret)); } return ret; } @@ -843,9 +1095,19 @@ int ObPrivSqlService::grant_revoke_role( const int64_t is_deleted = is_grant ? 0 : 1; ObSqlString sql; int64_t affected_rows = 0; + bool is_oracle_mode = false; + + if (OB_FAIL(ObCompatModeGetter::check_is_oracle_mode_with_tenant_id(tenant_id, is_oracle_mode))) { + LOG_WARN("fail to get is oracle mode", K(ret)); + } + + if (OB_SUCC(ret) && !is_oracle_mode) { + OZ (ObSQLUtils::compatibility_check_for_mysql_role_and_column_priv(tenant_id)); + } // __all_tenant_role_grantee_map - if (is_grant) { + if (OB_FAIL(ret)) { + } else if (is_grant) { // grant role to grantee // grant role to user (reentrantly) if (OB_FAIL(sql.append_fmt("REPLACE INTO %s VALUES ", OB_ALL_TENANT_ROLE_GRANTEE_MAP_TNAME))) { @@ -864,7 +1126,7 @@ int ObPrivSqlService::grant_revoke_role( ObSchemaUtils::get_extract_schema_id(exec_tenant_id, grantee_id), ObSchemaUtils::get_extract_schema_id(exec_tenant_id, role_id), option, - static_cast(0) /* disable flag */))) { + static_cast(is_oracle_mode ? 0 : 1) /* disable flag */))) { LOG_WARN("append sql failed, ", K(ret)); } } @@ -922,7 +1184,7 @@ int ObPrivSqlService::grant_revoke_role( new_schema_version, is_deleted, option, - static_cast(0)/* disable flag, xinqi.zlm to do */))) { + static_cast(is_oracle_mode ? 0 : 1)/* disable flag */))) { LOG_WARN("append sql failed, ", K(ret)); } } diff --git a/src/share/schema/ob_priv_sql_service.h b/src/share/schema/ob_priv_sql_service.h index e6484c1bd4..6ff771b33c 100644 --- a/src/share/schema/ob_priv_sql_service.h +++ b/src/share/schema/ob_priv_sql_service.h @@ -88,6 +88,14 @@ public: const share::ObRawObjPrivArray &obj_priv_array, bool is_revoke_all); + virtual int grant_column( + const ObColumnPrivSortKey &column_priv_key, + uint64_t column_priv_id, + const ObPrivSet priv_set, + const int64_t new_schema_version, + const ObString *ddl_stmt_str, + ObISQLClient &sql_client, + const bool is_grant); virtual int revoke_table_ora( const ObObjPrivSortKey &obj_priv_key, const share::ObRawObjPrivArray &obj_priv_array, @@ -100,7 +108,25 @@ public: const ObTablePrivSortKey &table_priv_key, const int64_t new_schema_version, common::ObISQLClient &sql_client); - + virtual int grant_routine( + const ObRoutinePrivSortKey &routine_priv_key, + const ObPrivSet priv_set, + const int64_t new_schema_version, + const ObString *ddl_stmt_str, + ObISQLClient &sql_client, + const uint64_t option, + const bool is_grant); + virtual int revoke_routine( + const ObRoutinePrivSortKey &routine_priv_key, + const ObPrivSet priv_set, + const int64_t new_schema_version, + const ObString *ddl_stmt_str, + ObISQLClient &sql_client); + virtual int gen_routine_priv_dml( + const uint64_t exec_tenant_id, + const ObRoutinePrivSortKey &routine_priv_key, + const ObPrivSet &priv_set, + ObDMLSqlSplicer &dml); virtual int alter_user_default_role( const share::schema::ObUserInfo &user_info, const int64_t new_schema_version, @@ -169,6 +195,13 @@ private: const ObPrivSet &priv_set, share::ObDMLSqlSplicer &dml); + int gen_column_priv_dml( + const uint64_t exec_tenant_id, + const ObColumnPrivSortKey &column_priv_key, + const uint64_t priv_id, + const ObPrivSet &priv_set, + ObDMLSqlSplicer &dml); + int gen_grant_sys_priv_dml( const uint64_t exec_tenant_id, const uint64_t tenant_id, diff --git a/src/share/schema/ob_priv_type.h b/src/share/schema/ob_priv_type.h index 8a48ed65e3..00ec89beae 100644 --- a/src/share/schema/ob_priv_type.h +++ b/src/share/schema/ob_priv_type.h @@ -102,7 +102,6 @@ enum OB_PRIV_SHIFT #define OB_PRIV_LOCK OB_PRIV_GET_TYPE(OB_PRIV_LOCK_SHIFT) #define OB_PRIV_RENAME OB_PRIV_GET_TYPE(OB_PRIV_RENAME_SHIFT) #define OB_PRIV_REFERENCES OB_PRIV_GET_TYPE(OB_PRIV_REFERENCES_SHIFT) -#define OB_PRIV_EXECUTE OB_PRIV_GET_TYPE(OB_PRIV_EXECUTE_SHIFT) #define OB_PRIV_FLASHBACK OB_PRIV_GET_TYPE(OB_PRIV_FLASHBACK_SHIFT) #define OB_PRIV_READ OB_PRIV_GET_TYPE(OB_PRIV_READ_SHIFT) #define OB_PRIV_WRITE OB_PRIV_GET_TYPE(OB_PRIV_WRITE_SHIFT) @@ -116,6 +115,9 @@ enum OB_PRIV_SHIFT #define OB_PRIV_REPL_CLIENT OB_PRIV_GET_TYPE(OB_PRIV_REPL_CLIENT_SHIFT) #define OB_PRIV_DROP_DATABASE_LINK OB_PRIV_GET_TYPE(OB_PRIV_DROP_DATABASE_LINK_SHIFT) #define OB_PRIV_CREATE_DATABASE_LINK OB_PRIV_GET_TYPE(OB_PRIV_CREATE_DATABASE_LINK_SHIFT) +#define OB_PRIV_EXECUTE OB_PRIV_GET_TYPE(OB_PRIV_EXECUTE_SHIFT) +#define OB_PRIV_ALTER_ROUTINE OB_PRIV_GET_TYPE(OB_PRIV_ALTER_ROUTINE_SHIFT) +#define OB_PRIV_CREATE_ROUTINE OB_PRIV_GET_TYPE(OB_PRIV_CREATE_ROUTINE_SHIFT) #define OB_PRIV_ALL \ (OB_PRIV_ALTER | OB_PRIV_CREATE | OB_PRIV_CREATE_USER | OB_PRIV_DELETE | \ @@ -124,19 +126,27 @@ enum OB_PRIV_SHIFT OB_PRIV_SUPER | OB_PRIV_PROCESS | OB_PRIV_CREATE_SYNONYM | OB_PRIV_FILE | \ OB_PRIV_ALTER_TENANT | OB_PRIV_ALTER_SYSTEM | \ OB_PRIV_CREATE_RESOURCE_POOL | OB_PRIV_CREATE_RESOURCE_UNIT| \ - OB_PRIV_REPL_SLAVE | OB_PRIV_REPL_CLIENT | \ - OB_PRIV_DROP_DATABASE_LINK | OB_PRIV_CREATE_DATABASE_LINK) + OB_PRIV_REPL_SLAVE | OB_PRIV_REPL_CLIENT | \ + OB_PRIV_DROP_DATABASE_LINK | OB_PRIV_CREATE_DATABASE_LINK | \ + OB_PRIV_EXECUTE | OB_PRIV_ALTER_ROUTINE | OB_PRIV_CREATE_ROUTINE) #define OB_PRIV_DB_ACC \ (OB_PRIV_ALTER | OB_PRIV_CREATE | OB_PRIV_DELETE | \ OB_PRIV_DROP | OB_PRIV_INSERT | OB_PRIV_UPDATE | OB_PRIV_SELECT | \ - OB_PRIV_INDEX | OB_PRIV_CREATE_VIEW | OB_PRIV_SHOW_VIEW) + OB_PRIV_INDEX | OB_PRIV_CREATE_VIEW | OB_PRIV_SHOW_VIEW | \ + OB_PRIV_EXECUTE | OB_PRIV_ALTER_ROUTINE | OB_PRIV_CREATE_ROUTINE) #define OB_PRIV_TABLE_ACC \ (OB_PRIV_ALTER | OB_PRIV_CREATE | OB_PRIV_DELETE | \ OB_PRIV_DROP | OB_PRIV_INSERT | OB_PRIV_UPDATE | OB_PRIV_SELECT | \ OB_PRIV_INDEX | OB_PRIV_CREATE_VIEW | OB_PRIV_SHOW_VIEW) +#define OB_PRIV_ROUTINE_ACC \ + (OB_PRIV_ALTER_ROUTINE | OB_PRIV_EXECUTE) + +#define OB_PRIV_COLUMN_ACC \ + (OB_PRIV_INSERT | OB_PRIV_UPDATE | OB_PRIV_SELECT) + enum OB_PRIV_OTHERS_TYPE { OB_PRIV_OTHERS_EXECUTE = (1LL << 0), diff --git a/src/share/schema/ob_routine_info.h b/src/share/schema/ob_routine_info.h index 24bdac7dec..b4c6f9c0f4 100644 --- a/src/share/schema/ob_routine_info.h +++ b/src/share/schema/ob_routine_info.h @@ -429,7 +429,7 @@ public: OB_INLINE uint64_t get_object_id() const { return routine_id_; } OB_INLINE ObObjectType get_object_type() const { return ObRoutineType::ROUTINE_PROCEDURE_TYPE == get_routine_type() ? - ObObjectType::PROCEDURE : ObRoutineType::ROUTINE_FUNCTION_TYPE ? + ObObjectType::PROCEDURE : ObRoutineType::ROUTINE_FUNCTION_TYPE == get_routine_type() ? ObObjectType::FUNCTION : ObObjectType::INVALID; } OB_INLINE const common::ObString &get_routine_name() const { return routine_name_; } OB_INLINE int64_t get_overload() const { return overload_; } diff --git a/src/share/schema/ob_routine_mgr.cpp b/src/share/schema/ob_routine_mgr.cpp index b787b9567c..399cfc4970 100644 --- a/src/share/schema/ob_routine_mgr.cpp +++ b/src/share/schema/ob_routine_mgr.cpp @@ -37,22 +37,15 @@ ObSimpleRoutineSchema::ObSimpleRoutineSchema(ObIAllocator *allocator) reset(); } -ObSimpleRoutineSchema::ObSimpleRoutineSchema(const ObSimpleRoutineSchema &other) - : ObSchema() -{ - reset(); - *this = other; -} - ObSimpleRoutineSchema::~ObSimpleRoutineSchema() { } -ObSimpleRoutineSchema &ObSimpleRoutineSchema::operator =(const ObSimpleRoutineSchema &other) +int ObSimpleRoutineSchema::assign(const ObSimpleRoutineSchema &other) { + int ret = OB_SUCCESS; if (this != &other) { reset(); - int ret = OB_SUCCESS; error_ret_ = other.error_ret_; tenant_id_ = other.tenant_id_; database_id_ = other.database_id_; @@ -63,19 +56,19 @@ ObSimpleRoutineSchema &ObSimpleRoutineSchema::operator =(const ObSimpleRoutineSc routine_type_ = other.routine_type_; if (OB_FAIL(deep_copy_str(other.routine_name_, routine_name_))) { LOG_WARN("Fail to deep copy routine name", K(ret)); + } else if (OB_FAIL(deep_copy_str(other.priv_user_, priv_user_))) { + LOG_WARN("Fail to deep copy priv user name", K(ret)); } if (OB_FAIL(ret)) { error_ret_ = ret; } } - - return *this; + return ret; } bool ObSimpleRoutineSchema::operator ==(const ObSimpleRoutineSchema &other) const { bool ret = false; - if (tenant_id_ == other.tenant_id_ && database_id_ == other.database_id_ && package_id_ == other.package_id_ @@ -83,7 +76,8 @@ bool ObSimpleRoutineSchema::operator ==(const ObSimpleRoutineSchema &other) cons && schema_version_ == other.schema_version_ && overload_ == other.overload_ && routine_type_ == other.routine_type_ - && routine_name_ == other.routine_name_) { + && routine_name_ == other.routine_name_ + && priv_user_ == other.priv_user_) { ret = true; } @@ -96,6 +90,7 @@ int64_t ObSimpleRoutineSchema::get_convert_size() const convert_size += sizeof(ObSimpleRoutineSchema); convert_size += routine_name_.length() + 1; + convert_size += priv_user_.length() + 1; return convert_size; } @@ -346,6 +341,22 @@ int ObRoutineMgr::add_routine(const ObSimpleRoutineSchema &routine_schema) return ret; } +int ObRoutineMgr::check_user_reffered_by_definer(const ObString &user_name, bool &ref) const +{ + int ret = OB_SUCCESS; + ref = false; + for (ConstRoutineIter iter = routine_infos_.begin(); OB_SUCC(ret) && !ref && iter != routine_infos_.end(); iter++) { + const ObSimpleRoutineSchema *routine = NULL; + if (OB_ISNULL(routine = *iter)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("NULL ptr", K(ret), K(routine)); + } else if (0 == user_name.compare(routine->get_priv_user())) { + ref = true; + } + } + return ret; +} + int ObRoutineMgr::del_routine(const ObTenantRoutineId &tenant_routine_id) { int ret = OB_SUCCESS; diff --git a/src/share/schema/ob_routine_mgr.h b/src/share/schema/ob_routine_mgr.h index 95e00383e3..fb8cfbd7a0 100644 --- a/src/share/schema/ob_routine_mgr.h +++ b/src/share/schema/ob_routine_mgr.h @@ -84,10 +84,9 @@ class ObSimpleRoutineSchema : public ObSchema public: ObSimpleRoutineSchema(); explicit ObSimpleRoutineSchema(common::ObIAllocator *allocator); - ObSimpleRoutineSchema(const ObSimpleRoutineSchema &src_schema); virtual ~ObSimpleRoutineSchema(); - ObSimpleRoutineSchema &operator =(const ObSimpleRoutineSchema &other); bool operator ==(const ObSimpleRoutineSchema &other) const; + int assign(const ObSimpleRoutineSchema &other); void reset() { tenant_id_ = common::OB_INVALID_ID; @@ -98,6 +97,7 @@ public: schema_version_ = common::OB_INVALID_VERSION; routine_type_ = INVALID_ROUTINE_TYPE; overload_ = common::OB_INVALID_INDEX; + reset_string(priv_user_); ObSchema::reset(); } int64_t get_convert_size() const; @@ -130,6 +130,9 @@ public: { return ObTenantRoutineId(tenant_id_, routine_id_); } ObRoutineType get_routine_type() const { return routine_type_; } void set_routine_type(ObRoutineType routine_type) { routine_type_ = routine_type; } + inline int set_priv_user(const common::ObString &priv_user) + { return deep_copy_str(priv_user, priv_user_); } + inline const common::ObString &get_priv_user() const { return priv_user_; } TO_STRING_KV(K_(tenant_id), K_(database_id), K_(package_id), @@ -137,7 +140,8 @@ public: K_(routine_name), K_(routine_type), K_(overload), - K_(schema_version)); + K_(schema_version), + K_(priv_user)); private: uint64_t tenant_id_; uint64_t database_id_; @@ -147,6 +151,8 @@ private: ObRoutineType routine_type_; uint64_t overload_; int64_t schema_version_; + common::ObString priv_user_; + DISABLE_COPY_ASSIGN(ObSimpleRoutineSchema); }; class ObRoutineNameHashWrapper @@ -261,6 +267,7 @@ class ObRoutineMgr ObGetRoutineKey, 1024> RoutineNameMap; typedef RoutineInfos::iterator RoutineIter; typedef RoutineInfos::const_iterator ConstRoutineIter; + public: ObRoutineMgr(); explicit ObRoutineMgr(common::ObIAllocator &allocator); @@ -295,6 +302,7 @@ public: int del_routine_schemas_in_package(uint64_t tenant_id, uint64_t package_id); int get_routine_schema_count(int64_t &routine_schema_count) const; int get_schema_statistics(ObSchemaStatisticsInfo &schema_info) const; + int check_user_reffered_by_definer(const ObString &user_name, bool &ref) const; private: inline bool check_inner_stat() const; inline static bool compare_routine(const ObSimpleRoutineSchema *lhs, diff --git a/src/share/schema/ob_schema_getter_guard.cpp b/src/share/schema/ob_schema_getter_guard.cpp index 438f649a34..478ecd0ebe 100644 --- a/src/share/schema/ob_schema_getter_guard.cpp +++ b/src/share/schema/ob_schema_getter_guard.cpp @@ -2512,6 +2512,12 @@ int ObSchemaGetterGuard::verify_read_only(const uint64_t tenant_id, } break; } + case OB_PRIV_ROUTINE_LEVEL: { + if (OB_FAIL(verify_db_read_only(tenant_id, need_priv))) { + LOG_WARN("db is read only, can't not execute this statement", KR(ret)); + } + break; + } default:{ ret = OB_ERR_UNEXPECTED; LOG_WARN("unknown privilege level", K(need_priv), KR(ret)); @@ -2574,6 +2580,245 @@ int ObSchemaGetterGuard::verify_table_read_only(const uint64_t tenant_id, return ret; } +typedef int (*COLLECT_FUNC)(const ObPrivMgr &priv_mgr, + const ObUserInfo &role_info, + const ObNeedPriv &need_priv, + ObNeedPriv &collected_priv); + +int collect_user_level_priv_in_roles(const ObPrivMgr &priv_mgr, + const ObUserInfo &role_info, + const ObNeedPriv &need_priv, + ObNeedPriv &collected_priv) +{ + int ret = OB_SUCCESS; + collected_priv.priv_set_ |= role_info.get_priv_set(); + return ret; +} + +int collect_db_level_priv_in_roles(const ObPrivMgr &priv_mgr, + const ObUserInfo &role_info, + const ObNeedPriv &need_priv, + ObNeedPriv &collected_priv) +{ + int ret = OB_SUCCESS; + ObPrivSet role_priv_set = OB_PRIV_SET_EMPTY; + ObOriginalDBKey db_priv_key_role(role_info.get_tenant_id(), + role_info.get_user_id(), + need_priv.db_); + if (OB_FAIL(priv_mgr.get_db_priv_set(db_priv_key_role, role_priv_set))) { + LOG_WARN("get db priv set failed", KR(ret), K(role_priv_set)); + } else { + collected_priv.priv_set_ |= role_priv_set; + } + return ret; +} + + +int collect_table_level_priv_in_roles(const ObPrivMgr &priv_mgr, + const ObUserInfo &role_info, + const ObNeedPriv &need_priv, + ObNeedPriv &collected_priv) +{ + int ret = OB_SUCCESS; + ObPrivSet role_priv_set = OB_PRIV_SET_EMPTY; + ObTablePrivSortKey role_table_priv_key(role_info.get_tenant_id(), + role_info.get_user_id(), + need_priv.db_, + need_priv.table_); + if (OB_FAIL(priv_mgr.get_table_priv_set(role_table_priv_key, role_priv_set))) { + LOG_WARN("get table priv failed", KR(ret), K(role_priv_set) ); + } else { + collected_priv.priv_set_ |= role_priv_set; + } + return ret; +} + +int collect_column_level_priv_in_roles(const ObPrivMgr &priv_mgr, + const ObUserInfo &role_info, + const ObNeedPriv &need_priv, + ObNeedPriv &collected_priv) +{ + int ret = OB_SUCCESS; + ObPrivSet role_priv_set = OB_PRIV_SET_EMPTY; + for (int64_t i = 0; OB_SUCC(ret) && i < need_priv.columns_.count(); i++) { + const ObString &column_name = need_priv.columns_.at(i); + ObColumnPrivSortKey column_priv_key(role_info.get_tenant_id(), + role_info.get_user_id(), + need_priv.db_, + need_priv.table_, + column_name); + if (OB_FAIL(priv_mgr.get_column_priv_set(column_priv_key, role_priv_set))) { + LOG_WARN("get table priv failed", KR(ret)); + } else if (OB_TEST_PRIVS(role_priv_set, need_priv.priv_set_)) { + if (OB_FAIL(add_var_to_array_no_dup(collected_priv.columns_, column_name))) { + LOG_WARN("fail to append array", K(ret)); + } + } + } + return ret; +} + +int collect_any_column_level_priv_in_roles(const ObPrivMgr &priv_mgr, + const ObUserInfo &role_info, + const ObNeedPriv &need_priv, + ObNeedPriv &collected_priv) +{ + int ret = OB_SUCCESS; + ObArray column_privs; + if (OB_FAIL(priv_mgr.get_column_priv_in_table(role_info.get_tenant_id(), + role_info.get_user_id(), + need_priv.db_, + need_priv.table_, + column_privs))) { + LOG_WARN("get table priv failed", KR(ret)); + } else if (column_privs.count() > 0) { + if (OB_FAIL(collected_priv.columns_.push_back(""))) { + LOG_WARN("fail to push back", K(ret)); + } + } + return ret; +} + +int collect_column_level_all_priv_in_roles(const ObPrivMgr &priv_mgr, + const ObUserInfo &role_info, + const ObNeedPriv &need_priv, + ObNeedPriv &collected_priv) +{ + int ret = OB_SUCCESS; + ObPrivSet priv_set = OB_PRIV_SET_EMPTY; + if (need_priv.columns_.count() != 1) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid arg", K(need_priv)); + } else { + ObColumnPrivSortKey column_key(role_info.get_tenant_id(), + role_info.get_user_id(), + need_priv.db_, + need_priv.table_, + need_priv.columns_.at(0)); + + if (OB_FAIL(priv_mgr.get_column_priv_set(column_key, priv_set))) { + LOG_WARN("get table priv failed", KR(ret)); + } else if (priv_set != OB_PRIV_SET_EMPTY) { + collected_priv.priv_set_ |= priv_set; + } + } + return ret; +} + +int collect_user_db_level_priv_in_roles(const ObPrivMgr &priv_mgr, + const ObUserInfo &role_info, + const ObNeedPriv &need_priv, + ObNeedPriv &collected_priv) +{ + int ret = OB_SUCCESS; + ObPrivSet role_priv_set = role_info.get_priv_set(); + if (OB_FAIL(collect_db_level_priv_in_roles(priv_mgr, role_info, need_priv, collected_priv))) { + LOG_WARN("get db priv set failed", KR(ret), K(role_priv_set)); + } else { + collected_priv.priv_set_ |= role_priv_set; + } + return ret; +} + +int collect_user_db_tb_level_priv_in_roles(const ObPrivMgr &priv_mgr, + const ObUserInfo &role_info, + const ObNeedPriv &need_priv, + ObNeedPriv &collected_priv) +{ + int ret = OB_SUCCESS; + ObPrivSet role_priv_set = role_info.get_priv_set(); + if (OB_FAIL(collect_db_level_priv_in_roles(priv_mgr, role_info, need_priv, collected_priv))) { + LOG_WARN("get db priv set failed", KR(ret), K(role_priv_set)); + } else if (OB_FAIL(collect_table_level_priv_in_roles(priv_mgr, role_info, need_priv, collected_priv))) { + LOG_WARN("get db priv set failed", KR(ret), K(role_priv_set)); + } else { + collected_priv.priv_set_ |= role_priv_set; + } + return ret; +} + +enum class CheckRolePrivMode { + CHECK_PRIV_HAS_NONE, + CHECK_PRIV_HAS_ALL, + CHECK_PRIV_HAS_ANY, + CHECK_PRIV_HAS_OTHER, +}; + +int collect_priv_in_roles(const ObPrivMgr &priv_mgr, + const ObSessionPrivInfo &session_priv, + share::schema::ObSchemaGetterGuard &schema_guard, + const ObNeedPriv &need_priv, + COLLECT_FUNC collect_func, + ObNeedPriv &collected_priv, + bool &priv_succ, + CheckRolePrivMode mode = CheckRolePrivMode::CHECK_PRIV_HAS_ALL) +{ + int ret = OB_SUCCESS; + ObArray role_ids_queue; + const ObUserInfo *cur_user_info = NULL; + priv_succ = false; + + if (OB_ISNULL(cur_user_info = schema_guard.get_user_info(session_priv.tenant_id_, session_priv.user_id_))) { + ret = OB_USER_NOT_EXIST; + LOG_WARN("fail to get user_info", K(ret)); + } else { + LOG_DEBUG("check user info for roles", + K(session_priv.enable_role_id_array_), + K(cur_user_info->get_user_name_str()), K(cur_user_info->get_role_id_array())); + } + + + for (int i = 0; OB_SUCC(ret) && i < session_priv.enable_role_id_array_.count(); ++i) { + uint64_t cur_role_id = session_priv.enable_role_id_array_.at(i); + if (has_exist_in_array(cur_user_info->get_role_id_array(), cur_role_id)) { + //enabled role can be revoked from the current user by other session + //only check the granted roles + if (OB_FAIL(role_ids_queue.push_back(cur_role_id))) { + LOG_WARN("fail to push back", K(ret)); + } + } + } + + for (int i = 0; OB_SUCC(ret) && i < role_ids_queue.count() && !priv_succ; i++) { + const uint64_t role_id = role_ids_queue.at(i); + const ObUserInfo *role_info = NULL; + if (OB_ISNULL(role_info = schema_guard.get_user_info(session_priv.tenant_id_, role_id))) { + ret = OB_ERR_USER_NOT_EXIST; + LOG_WARN("user not exist", K(ret)); + } else if (OB_FAIL(collect_func(priv_mgr, *role_info, need_priv, collected_priv))) { + LOG_WARN("fail to collect priv", K(ret)); + } else { + switch (mode) { + case CheckRolePrivMode::CHECK_PRIV_HAS_ALL: + priv_succ = OB_TEST_PRIVS(collected_priv.priv_set_, need_priv.priv_set_); + break; + case CheckRolePrivMode::CHECK_PRIV_HAS_ANY: + priv_succ = OB_PRIV_HAS_ANY(collected_priv.priv_set_, need_priv.priv_set_); + break; + case CheckRolePrivMode::CHECK_PRIV_HAS_OTHER: + priv_succ = OB_PRIV_HAS_OTHER(collected_priv.priv_set_, need_priv.priv_set_); + break; + case CheckRolePrivMode::CHECK_PRIV_HAS_NONE: + break; + } + if (need_priv.columns_.count() > 0 + && (need_priv.columns_.count() == collected_priv.columns_.count() + || need_priv.check_any_column_priv_)) { + priv_succ = true; + } + } + + if (OB_SUCC(ret) && !priv_succ) { + for (int j = 0; OB_SUCC(ret) && j < role_info->get_role_id_array().count(); j++) { + OZ (role_ids_queue.push_back(role_info->get_role_id_array().at(j))); + } + } + } + + return ret; +} + + int ObSchemaGetterGuard::add_role_id_recursively( const uint64_t tenant_id, uint64_t role_id, @@ -2597,6 +2842,27 @@ int ObSchemaGetterGuard::add_role_id_recursively( return ret; } +int ObSchemaGetterGuard::check_activate_all_role_var(const uint64_t tenant_id, bool &activate_all_role) { + int ret = OB_SUCCESS; + const ObSysVarSchema *session_var = NULL; + ObObj session_obj; + ObArenaAllocator alloc(ObModIds::OB_TEMP_VARIABLES); + activate_all_role = false; + if (OB_FAIL(get_tenant_system_variable(tenant_id, + SYS_VAR_ACTIVATE_ALL_ROLES_ON_LOGIN, + session_var))) { + LOG_WARN("fail to get tenant var schema", K(ret)); + } else if (OB_ISNULL(session_var)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get charset_var or collation_var", K(ret)); + } else if (OB_FAIL(session_var->get_value(&alloc, NULL, session_obj))) { + LOG_WARN("fail to get charset var value", K(ret)); + } else { + activate_all_role = !!(session_obj.get_int()); + } + return ret; +} + // for privilege int ObSchemaGetterGuard::check_user_access( const ObUserLoginInfo &login_info, @@ -2605,11 +2871,14 @@ int ObSchemaGetterGuard::check_user_access( const ObUserInfo *&sel_user_info) { int ret = OB_SUCCESS; + lib::Worker::CompatMode compat_mode = lib::Worker::CompatMode::INVALID; sel_user_info = NULL; if (OB_FAIL(get_tenant_id(login_info.tenant_name_, s_priv.tenant_id_))) { LOG_WARN("Invalid tenant", "tenant_name", login_info.tenant_name_, KR(ret)); } else if (OB_FAIL(check_tenant_schema_guard(s_priv.tenant_id_))) { LOG_WARN("fail to check tenant schema guard", KR(ret), K(s_priv), K_(tenant_id)); + } else if (OB_FAIL(get_tenant_compat_mode(s_priv.tenant_id_, compat_mode))) { + LOG_WARN("fail to get tenant compat mode", K(ret)); } else { const int64_t DEFAULT_SAME_USERNAME_COUNT = 4; ObSEArray users_info; @@ -2627,7 +2896,7 @@ int ObSchemaGetterGuard::check_user_access( if (NULL == user_info) { ret = OB_ERR_UNEXPECTED; LOG_WARN("user info is null", K(login_info), KR(ret)); - } else if (user_info->is_role()) { + } else if (user_info->is_role() && lib::Worker::CompatMode::ORACLE == compat_mode) { ret = OB_PASSWORD_WRONG; LOG_INFO("password error", "tenant_name", login_info.tenant_name_, "user_name", login_info.user_name_, @@ -2714,8 +2983,16 @@ int ObSchemaGetterGuard::check_user_access( // load role priv if (OB_SUCC(ret)) { const ObSEArray &role_id_array = user_info->get_role_id_array(); + bool activate_all_role = false; CK (user_info->get_role_id_array().count() == user_info->get_role_id_option_array().count()); + + if (OB_SUCC(ret) && lib::Worker::CompatMode::MYSQL == compat_mode) { + if (OB_FAIL(check_activate_all_role_var(user_info->get_tenant_id(), activate_all_role))) { + LOG_WARN("fail to check activate all role", K(ret)); + } + } + for (int i = 0; OB_SUCC(ret) && i < role_id_array.count(); ++i) { const ObUserInfo *role_info = NULL; if (OB_FAIL(get_user_info(s_priv.tenant_id_, role_id_array.at(i), role_info))) { @@ -2723,7 +3000,7 @@ int ObSchemaGetterGuard::check_user_access( } else if (NULL == role_info) { ret = OB_ERR_UNEXPECTED; LOG_WARN("role info is null", KR(ret), K(role_id_array.at(i))); - } else { + } else if (lib::Worker::CompatMode::ORACLE == compat_mode) { s_priv.user_priv_set_ |= role_info->get_priv_set(); if (user_info->get_disable_option( user_info->get_role_id_option_array().at(i)) == 0) { @@ -2731,11 +3008,18 @@ int ObSchemaGetterGuard::check_user_access( role_id_array.at(i), s_priv)); } + } else { + if (activate_all_role + || user_info->get_disable_option(user_info->get_role_id_option_array().at(i)) == 0) { + OZ (s_priv.enable_role_id_array_.push_back(role_id_array.at(i))); + } } } - OZ (add_role_id_recursively(user_info->get_tenant_id(), - OB_ORA_PUBLIC_ROLE_ID, - s_priv)); + if (lib::Worker::CompatMode::ORACLE == compat_mode) { + OZ (add_role_id_recursively(user_info->get_tenant_id(), + OB_ORA_PUBLIC_ROLE_ID, + s_priv)); + } } //check db access and db existence @@ -2968,6 +3252,36 @@ int ObSchemaGetterGuard::get_session_priv_info(const uint64_t tenant_id, return ret; } +//If column or table or db or user not existed, or correspanding column priv is not existed +//Then priv_id will return OB_INVALID_ID. +int ObSchemaGetterGuard::get_column_priv_id( + const uint64_t tenant_id, + const uint64_t user_id, + const ObString &db, + const ObString &table, + const ObString &column, + uint64_t &priv_id) +{ + int ret = OB_SUCCESS; + const ObSchemaMgr *mgr = NULL; + priv_id = OB_INVALID_ID; + if (0 == db.length() || 0 == table.length() || 0 == column.length() + || OB_INVALID_ID == tenant_id || OB_INVALID_ID == user_id) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("Invalid arguments", KR(ret)); + } else if (OB_FAIL(check_tenant_schema_guard(tenant_id))) { + LOG_WARN("fail to check tenant schema guard", KR(ret), K(tenant_id), K_(tenant_id)); + } else if (OB_FAIL(check_lazy_guard(tenant_id, mgr))) { + LOG_WARN("fail to check lazy guard", KR(ret), K(tenant_id)); + } else { + const ObPrivMgr &priv_mgr = mgr->priv_mgr_; + if (OB_FAIL(priv_mgr.get_column_priv_id(tenant_id, user_id, db, table, column, priv_id))) { + LOG_WARN("get col priv id failed", KR(ret)); + } + } + return ret; +} + int ObSchemaGetterGuard::check_db_access( const ObSessionPrivInfo &session_priv, const ObString &db, @@ -2977,6 +3291,8 @@ int ObSchemaGetterGuard::check_db_access( int ret = OB_SUCCESS; uint64_t tenant_id = session_priv.tenant_id_; const ObSchemaMgr *mgr = NULL; + lib::Worker::CompatMode compat_mode = lib::Worker::CompatMode::INVALID; + if (!session_priv.is_valid() || 0 == db.length()) { ret = OB_INVALID_ARGUMENT; LOG_WARN("Invalid arguments", K(session_priv), KR(ret)); @@ -2984,7 +3300,10 @@ int ObSchemaGetterGuard::check_db_access( LOG_WARN("fail to check tenant schema guard", KR(ret), K(tenant_id), K_(tenant_id)); } else if (OB_FAIL(check_lazy_guard(tenant_id, mgr))) { LOG_WARN("fail to check lazy guard", KR(ret), K(tenant_id)); + } else if (OB_FAIL(get_tenant_compat_mode(tenant_id, compat_mode))) { + LOG_WARN("fail to get compat mode", K(ret)); } else { + bool is_oracle_mode = compat_mode == lib::Worker::CompatMode::ORACLE; const ObPrivMgr &priv_mgr = mgr->priv_mgr_; ObOriginalDBKey db_priv_key(session_priv.tenant_id_, session_priv.user_id_, @@ -2994,12 +3313,29 @@ int ObSchemaGetterGuard::check_db_access( LOG_WARN("get db priv set failed", KR(ret), K(db_priv_key)); } else { bool is_grant = false; + bool is_grant_table = false; + bool is_grant_routine = false; + ObSEArray column_privs; if (OB_FAIL(priv_mgr.table_grant_in_db(db_priv_key.tenant_id_, db_priv_key.user_id_, db_priv_key.db_, - is_grant))) { + is_grant_table))) { LOG_WARN("check table grant in db failed", K(db_priv_key), KR(ret)); + } else if (OB_FAIL(priv_mgr.routine_grant_in_db(db_priv_key.tenant_id_, + db_priv_key.user_id_, + db_priv_key.db_, + is_grant_routine))) { + LOG_WARN("check routine grant in db failed", K(db_priv_key), KR(ret)); + } else if (is_grant) { + } else if (OB_FAIL(priv_mgr.get_column_priv_in_db(db_priv_key.tenant_id_, + db_priv_key.user_id_, + db_priv_key.db_, + column_privs))) { + LOG_WARN("check column grant in db failed", K(db_priv_key), KR(ret)); + } else if (!column_privs.empty()) { + is_grant = true; } else { + is_grant = (is_grant_table || is_grant_routine); // load db level prvilege from roles const ObUserInfo *user_info = NULL; if (OB_FAIL(get_user_info(tenant_id, session_priv.user_id_, user_info))) { @@ -3008,9 +3344,14 @@ int ObSchemaGetterGuard::check_db_access( ret = OB_ERR_UNEXPECTED; LOG_WARN("user info is null", KR(ret), K(session_priv.user_id_)); } else { - const ObSEArray &role_id_array = user_info->get_role_id_array(); bool is_grant_role = false; ObPrivSet total_db_priv_set_role = OB_PRIV_SET_EMPTY; + ObArray role_id_array; + + if (OB_FAIL(role_id_array.assign(is_oracle_mode ? user_info->get_role_id_array() + : session_priv.enable_role_id_array_))) { + LOG_WARN("fail to assign role ids", K(ret)); + } for (int i = 0; OB_SUCC(ret) && i < role_id_array.count(); ++i) { const ObUserInfo *role_info = NULL; if (OB_FAIL(get_user_info(tenant_id, role_id_array.at(i), role_info))) { @@ -3034,6 +3375,27 @@ int ObSchemaGetterGuard::check_db_access( // append db level privilege total_db_priv_set_role |= db_priv_set_role; } + if (OB_SUCC(ret) && !is_oracle_mode) { + column_privs.reuse(); + if (!is_grant_role && OB_FAIL(priv_mgr.get_column_priv_in_db(db_priv_key_role.tenant_id_, + db_priv_key_role.user_id_, + db_priv_key_role.db_, + column_privs))) { + LOG_WARN("check column grant in db failed", K(db_priv_key), KR(ret)); + } else if (!column_privs.empty()) { + is_grant_role = true; + } + if (OB_SUCC(ret) && !is_grant_role) { + is_grant_role = !!(role_info->get_priv_set() & OB_PRIV_DB_ACC); + } + if (OB_SUCC(ret) && !is_grant_role + && !((session_priv.user_priv_set_ | db_priv_set | total_db_priv_set_role) & OB_PRIV_DB_ACC)) { + //continue for roles recursively + if (OB_FAIL(common::append(role_id_array, role_info->get_role_id_array()))) { + LOG_WARN("fail to append array", K(ret)); + } + } + } } } if (OB_SUCC(ret)) { @@ -3044,9 +3406,7 @@ int ObSchemaGetterGuard::check_db_access( } } // check db level privilege - lib::Worker::CompatMode compat_mode; - OZ (get_tenant_compat_mode(session_priv.tenant_id_, compat_mode)); - if (OB_SUCC(ret) && compat_mode == lib::Worker::CompatMode::ORACLE) { + if (OB_SUCC(ret) && is_oracle_mode) { /* For compatibility_mode, check if user has been granted all privileges first */ if (((session_priv.user_priv_set_ | db_priv_set) & OB_PRIV_DB_ACC) || is_grant) { @@ -3146,9 +3506,23 @@ int ObSchemaGetterGuard::check_table_show(const ObSessionPrivInfo &session_priv, } } } + + if (OB_SUCC(ret) && !allow_show) { + ObNeedPriv need_priv(db, table, OB_PRIV_TABLE_LEVEL, OB_PRIV_TABLE_ACC, false); + ObNeedPriv collected_priv; + if (OB_FAIL(collect_priv_in_roles(mgr->priv_mgr_, session_priv, *this, + need_priv, collect_user_db_tb_level_priv_in_roles, + collected_priv, allow_show, + CheckRolePrivMode::CHECK_PRIV_HAS_ANY))) { + LOG_WARN("fail to collect priv in roles", K(ret)); + } + } + return ret; } + + int ObSchemaGetterGuard::check_user_priv(const ObSessionPrivInfo &session_priv, const ObPrivSet priv_set) { @@ -3156,6 +3530,7 @@ int ObSchemaGetterGuard::check_user_priv(const ObSessionPrivInfo &session_priv, uint64_t tenant_id = session_priv.tenant_id_; const ObSchemaMgr *mgr = NULL; ObPrivSet user_priv_set = session_priv.user_priv_set_; + bool is_oracle_mode = false; if (OB_FAIL(check_tenant_schema_guard(tenant_id))) { LOG_WARN("fail to check tenant schema guard", KR(ret), K(tenant_id), K_(tenant_id)); @@ -3167,8 +3542,21 @@ int ObSchemaGetterGuard::check_user_priv(const ObSessionPrivInfo &session_priv, || priv_set == OB_PRIV_CREATE_RESOURCE_POOL || priv_set == OB_PRIV_CREATE_RESOURCE_UNIT) && (OB_TEST_PRIVS(user_priv_set, OB_PRIV_SUPER))) { - } else { - ret = OB_ERR_NO_PRIVILEGE; + } else if (OB_FAIL(ObCompatModeGetter::check_is_oracle_mode_with_tenant_id(tenant_id, is_oracle_mode))) { + LOG_WARN("fail to get compat mode", K(ret)); + } else if (!is_oracle_mode) { + ObNeedPriv need_priv("", "", OB_PRIV_USER_LEVEL, priv_set, false); + ObNeedPriv collected_privs("", "", OB_PRIV_USER_LEVEL, OB_PRIV_SET_EMPTY, false); + bool check_succ = false; + if (OB_FAIL(collect_priv_in_roles(mgr->priv_mgr_, session_priv, *this, need_priv, + collect_user_level_priv_in_roles, collected_privs, check_succ))) { + LOG_WARN("fail to collect privs in roles", K(ret)); + } else { + user_priv_set |= collected_privs.priv_set_; + if (!check_succ) { + ret = OB_ERR_NO_PRIVILEGE; + } + } } } if (OB_ERR_NO_PRIVILEGE == ret) { @@ -3223,7 +3611,7 @@ int ObSchemaGetterGuard::check_single_table_priv_or(const ObSessionPrivInfo &ses LOG_WARN("failed to check priv db or", K(ret)); } else if (pass) { /* check success */ - } else if (OB_FAIL(check_priv_table_or_(table_need_priv, priv_mgr, tenant_id, user_id, pass))) { + } else if (OB_FAIL(check_priv_table_or_(session_priv, table_need_priv, priv_mgr, tenant_id, user_id, pass))) { LOG_WARN("fail to check priv table or", K(ret)); } else if (pass) { /* check success */ @@ -3245,6 +3633,7 @@ int ObSchemaGetterGuard::check_single_table_priv(const ObSessionPrivInfo &sessio int ret = OB_SUCCESS; uint64_t tenant_id = session_priv.tenant_id_; const ObSchemaMgr *mgr = NULL; + bool is_oracle_mode = false; if (OB_INVALID_ID == session_priv.tenant_id_ || OB_INVALID_ID == session_priv.user_id_) { ret = OB_INVALID_ARGUMENT; LOG_WARN("Invalid arguments", "tenant_id", session_priv.tenant_id_, @@ -3254,6 +3643,8 @@ int ObSchemaGetterGuard::check_single_table_priv(const ObSessionPrivInfo &sessio LOG_WARN("fail to check tenant schema guard", KR(ret), K(tenant_id), K_(tenant_id)); } else if (OB_FAIL(check_lazy_guard(tenant_id, mgr))) { LOG_WARN("fail to check lazy guard", KR(ret), K(tenant_id)); + } else if (OB_FAIL(ObCompatModeGetter::check_is_oracle_mode_with_tenant_id(tenant_id, is_oracle_mode))) { + LOG_WARN("fail to get compat mode", K(ret)); } else { //first:check user and db priv. //second:If user_db_priv_set has no enough privileges, check table priv. @@ -3277,7 +3668,7 @@ int ObSchemaGetterGuard::check_single_table_priv(const ObSessionPrivInfo &sessio is_table_priv_empty = false; } - if (OB_SUCC(ret)) { + if (OB_SUCC(ret) && is_oracle_mode) { //2. fetch roles privs const ObUserInfo *user_info = NULL; if (OB_FAIL(get_user_info(tenant_id, session_priv.user_id_, user_info))) { @@ -3312,13 +3703,26 @@ int ObSchemaGetterGuard::check_single_table_priv(const ObSessionPrivInfo &sessio } } + if (OB_SUCC(ret) && !is_oracle_mode) { + is_table_priv_empty = false; + ObNeedPriv collected_tb_privs(table_need_priv.db_, table_need_priv.table_, + OB_PRIV_TABLE_LEVEL, OB_PRIV_SET_EMPTY, false); + bool check_succ = false; + if (OB_FAIL(collect_priv_in_roles(mgr->priv_mgr_, session_priv, *this, table_need_priv, + collect_user_db_tb_level_priv_in_roles, collected_tb_privs, check_succ))) { + LOG_WARN("fail to collect privs in roles", K(ret)); + } else { + table_priv_set |= collected_tb_privs.priv_set_; + } + } + //3. check privs if (OB_SUCC(ret)) { if (is_table_priv_empty) { ret = OB_ERR_NO_TABLE_PRIVILEGE; LOG_WARN("No privilege, cannot find table priv info", "tenant_id", session_priv.tenant_id_, - "user_id", session_priv.user_id_, K(table_need_priv)); + "user_id", session_priv.user_id_, K(table_need_priv), K(lbt())); } else if (!OB_TEST_PRIVS(table_priv_set | user_db_priv_set, table_need_priv.priv_set_)) { ret = OB_ERR_NO_TABLE_PRIVILEGE; LOG_WARN("No privilege", "tenant_id", session_priv.tenant_id_, @@ -3329,15 +3733,138 @@ int ObSchemaGetterGuard::check_single_table_priv(const ObSessionPrivInfo &sessio } if (OB_ERR_NO_TABLE_PRIVILEGE == ret) { ObPrivSet lack_priv_set = table_need_priv.priv_set_ & (~(table_priv_set | user_db_priv_set)); - const char *priv_name = priv_mgr.get_first_priv_name(lack_priv_set); - if (OB_ISNULL(priv_name)) { - ret = OB_INVALID_ARGUMENT; - LOG_WARN("Invalid priv type", "priv_set", table_need_priv.priv_set_); + if (table_need_priv.columns_.empty()) { + if (table_need_priv.check_any_column_priv_) { + ret = OB_SUCCESS; + ObArray column_privs; + if (OB_FAIL(priv_mgr.get_column_priv_in_table(table_priv_key.tenant_id_, table_priv_key.user_id_, + table_priv_key.db_, table_priv_key.table_, + column_privs))) { + LOG_WARN("get column priv in table failed", K(ret)); + } else { + bool pass = false; + for (int64_t i = 0; OB_SUCC(ret) && !pass && i < column_privs.count(); i++) { + if (OB_ISNULL(column_privs.at(i))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected error", K(ret)); + } else if ((column_privs.at(i)->get_priv_set() & table_need_priv.priv_set_) + == table_need_priv.priv_set_) { + pass = true; + } + } + if (OB_SUCC(ret) && !pass) { + ret = OB_ERR_NO_TABLE_PRIVILEGE; + } + } + } + + if (OB_ERR_NO_COLUMN_PRIVILEGE == ret && !is_oracle_mode) { + ret = OB_SUCCESS; + ObNeedPriv collected_privs(table_need_priv.db_, table_need_priv.table_, + OB_PRIV_TABLE_LEVEL, OB_PRIV_SET_EMPTY, false); + bool check_succ = false; + if (OB_FAIL(collect_priv_in_roles(mgr->priv_mgr_, session_priv, *this, table_need_priv, + collect_column_level_priv_in_roles, collected_privs, check_succ))) { + LOG_WARN("fail to collect privs in roles", K(ret)); + } else { + if (!check_succ) { + ret = OB_ERR_NO_COLUMN_PRIVILEGE; + } + } + } + + if (OB_ERR_NO_TABLE_PRIVILEGE == ret) { + const char *priv_name = priv_mgr.get_first_priv_name(lack_priv_set); + if (OB_ISNULL(priv_name)) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("Invalid priv type", "priv_set", table_need_priv.priv_set_); + } else { + ret = OB_ERR_NO_TABLE_PRIVILEGE; + LOG_USER_ERROR(OB_ERR_NO_TABLE_PRIVILEGE, (int)strlen(priv_name), priv_name, + session_priv.user_name_.length(), session_priv.user_name_.ptr(), + session_priv.host_name_.length(), session_priv.host_name_.ptr(), + table_need_priv.table_.length(), table_need_priv.table_.ptr()); + } + } } else { - LOG_USER_ERROR(OB_ERR_NO_TABLE_PRIVILEGE, (int)strlen(priv_name), priv_name, - session_priv.user_name_.length(), session_priv.user_name_.ptr(), - session_priv.host_name_.length(), session_priv.host_name_.ptr(), - table_need_priv.table_.length(), table_need_priv.table_.ptr()); + ret = OB_SUCCESS; + ObString col_name; + ObPrivSet column_priv_set = 0; + for (int64_t i = 0; OB_SUCC(ret) && i < table_need_priv.columns_.count(); i++) { + const ObColumnPriv *column_priv = NULL; + column_priv_set = 0; + ObColumnPrivSortKey column_priv_key(session_priv.tenant_id_, + session_priv.user_id_, + table_need_priv.db_, + table_need_priv.table_, + table_need_priv.columns_.at(i)); + + if (OB_FAIL(priv_mgr.get_column_priv(column_priv_key, column_priv))) { + LOG_WARN("get table priv failed", KR(ret), K(table_priv_key) ); + } else if (NULL != column_priv) { + column_priv_set = column_priv->get_priv_set(); + if (!OB_TEST_PRIVS(column_priv_set | table_priv_set | user_db_priv_set, table_need_priv.priv_set_)) { + ret = OB_ERR_NO_COLUMN_PRIVILEGE; + col_name = table_need_priv.columns_.at(i); + } + } else { + ret = OB_ERR_NO_COLUMN_PRIVILEGE; + col_name = table_need_priv.columns_.at(i); + } + } + + if (OB_ERR_NO_COLUMN_PRIVILEGE == ret && !is_oracle_mode) { + ret = OB_SUCCESS; + ObNeedPriv collected_privs(table_need_priv.db_, table_need_priv.table_, + OB_PRIV_TABLE_LEVEL, OB_PRIV_SET_EMPTY, false); + bool check_succ = false; + if (OB_FAIL(collect_priv_in_roles(mgr->priv_mgr_, session_priv, *this, table_need_priv, + collect_column_level_priv_in_roles, collected_privs, check_succ))) { + LOG_WARN("fail to collect privs in roles", K(ret)); + } else { + if (!check_succ) { + ret = OB_ERR_NO_COLUMN_PRIVILEGE; + } + } + } + + if (ret == OB_ERR_NO_COLUMN_PRIVILEGE) { + ret = OB_SUCCESS; + ObArray column_privs; + bool found = false; + if (OB_FAIL(priv_mgr.get_column_priv_in_table(table_priv_key.tenant_id_, table_priv_key.user_id_, + table_priv_key.db_, table_priv_key.table_, + column_privs))) { + LOG_WARN("get column priv in table failed", K(ret)); + } else { + for (int64_t i = 0; OB_SUCC(ret) && !found && i < column_privs.count(); i++) { + if (OB_ISNULL(column_privs.at(i))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected error", K(ret)); + } else if ((column_privs.at(i)->get_priv_set() & table_need_priv.priv_set_) != 0) { + found = true; + } + } + } + ObPrivSet lack_priv_set = table_need_priv.priv_set_ & (~(column_priv_set | table_priv_set | user_db_priv_set)); + const char *priv_name = priv_mgr.get_first_priv_name(lack_priv_set); + if (OB_FAIL(ret)) { + LOG_WARN("other errors occur", K(ret)); + } else if (found) { + ret = OB_ERR_NO_COLUMN_PRIVILEGE; + LOG_USER_ERROR(OB_ERR_NO_COLUMN_PRIVILEGE, (int)strlen(priv_name), priv_name, + session_priv.user_name_.length(), session_priv.user_name_.ptr(), + session_priv.host_name_.length(), session_priv.host_name_.ptr(), + col_name.length(), col_name.ptr(), + table_need_priv.table_.length(), table_need_priv.table_.ptr()); + } else { + ret = OB_ERR_NO_TABLE_PRIVILEGE; + LOG_USER_ERROR(OB_ERR_NO_TABLE_PRIVILEGE, (int)strlen(priv_name), priv_name, + session_priv.user_name_.length(), session_priv.user_name_.ptr(), + session_priv.host_name_.length(), session_priv.host_name_.ptr(), + table_need_priv.table_.length(), table_need_priv.table_.ptr()); + } + } } } } @@ -3372,7 +3899,7 @@ int ObSchemaGetterGuard::check_single_table_priv_for_update_(const ObSessionPriv /* check ok */ } else if (OB_FAIL(check_priv_db_or_(session_priv, need_priv, priv_mgr, tenant_id, user_id, pass))) { LOG_WARN("failed to check priv db or", K(ret)); - } else if (!pass && OB_FAIL(check_priv_table_or_(need_priv, priv_mgr, tenant_id, user_id, pass))) { + } else if (!pass && OB_FAIL(check_priv_table_or_(session_priv, need_priv, priv_mgr, tenant_id, user_id, pass))) { LOG_WARN("fail to check priv table or", K(ret)); } else if (!pass) { ret = OB_ERR_NO_TABLE_PRIVILEGE; @@ -3385,15 +3912,129 @@ int ObSchemaGetterGuard::check_single_table_priv_for_update_(const ObSessionPriv return ret; } +int ObSchemaGetterGuard::check_routine_priv(const ObSessionPrivInfo &session_priv, + const ObNeedPriv &routine_need_priv) +{ + int ret = OB_SUCCESS; + uint64_t tenant_id = session_priv.tenant_id_; + const ObSchemaMgr *mgr = NULL; + if (OB_INVALID_ID == session_priv.tenant_id_ || OB_INVALID_ID == session_priv.user_id_) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("Invalid arguments", "tenant_id", session_priv.tenant_id_, + "user_id", session_priv.user_id_, + KR(ret)); + } else if (OB_FAIL(check_tenant_schema_guard(tenant_id))) { + LOG_WARN("fail to check tenant schema guard", KR(ret), K(tenant_id), K_(tenant_id)); + } else if (OB_FAIL(check_lazy_guard(tenant_id, mgr))) { + LOG_WARN("fail to check lazy guard", KR(ret), K(tenant_id)); + } else { + //first:check user and db priv. + //second:If user_db_priv_set has no enough privileges, check routine priv. + const ObPrivMgr &priv_mgr = mgr->priv_mgr_; + if (!OB_TEST_PRIVS(session_priv.user_priv_set_, routine_need_priv.priv_set_)) { + ObPrivSet user_db_priv_set = 0; + if (OB_SUCCESS != check_db_priv(session_priv, routine_need_priv.db_, + routine_need_priv.priv_set_, user_db_priv_set)) { + //1. fetch routine priv + const ObRoutinePriv *routine_priv = NULL; + ObPrivSet routine_priv_set = 0; + bool is_routine_priv_empty = true; + ObRoutinePrivSortKey routine_priv_key(session_priv.tenant_id_, + session_priv.user_id_, + routine_need_priv.db_, + routine_need_priv.table_, + routine_need_priv.obj_type_ == ObObjectType::PROCEDURE ? ObRoutineType::ROUTINE_PROCEDURE_TYPE : + routine_need_priv.obj_type_ == ObObjectType::FUNCTION ? ObRoutineType::ROUTINE_FUNCTION_TYPE : + ObRoutineType::INVALID_ROUTINE_TYPE); + if (OB_FAIL(priv_mgr.get_routine_priv(routine_priv_key, routine_priv))) { + LOG_WARN("get routine priv failed", KR(ret), K(routine_priv_key) ); + } else if (NULL != routine_priv) { + routine_priv_set = routine_priv->get_priv_set(); + is_routine_priv_empty = false; + } + + if (OB_SUCC(ret)) { + //2. fetch roles privs + const ObUserInfo *user_info = NULL; + if (OB_FAIL(get_user_info(tenant_id, session_priv.user_id_, user_info))) { + LOG_WARN("failed to get user info", KR(ret), K(tenant_id), K(session_priv.user_id_)); + } else if (NULL == user_info) { + ret = OB_USER_NOT_EXIST; + LOG_WARN("user info is null", KR(ret), K(session_priv.user_id_)); + } else { + const ObSEArray &role_id_array = user_info->get_role_id_array(); + for (int i = 0; OB_SUCC(ret) && i < role_id_array.count(); ++i) { + const ObUserInfo *role_info = NULL; + const ObRoutinePriv *role_routine_priv = NULL; + if (OB_FAIL(get_user_info(tenant_id, role_id_array.at(i), role_info))) { + LOG_WARN("failed to get role ids", KR(ret), K(tenant_id), K(role_id_array.at(i))); + } else if (NULL == role_info) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("role info is null", KR(ret), K(role_id_array.at(i))); + } else { + ObRoutinePrivSortKey role_routine_priv_key(session_priv.tenant_id_, + role_info->get_user_id(), + routine_need_priv.db_, + routine_need_priv.table_, + routine_need_priv.obj_type_ == ObObjectType::PROCEDURE ? ObRoutineType::ROUTINE_PROCEDURE_TYPE : + routine_need_priv.obj_type_ == ObObjectType::FUNCTION ? ObRoutineType::ROUTINE_FUNCTION_TYPE : + ObRoutineType::INVALID_ROUTINE_TYPE); + if (OB_FAIL(priv_mgr.get_routine_priv(role_routine_priv_key, role_routine_priv))) { + LOG_WARN("get routine priv failed", KR(ret), K(role_routine_priv_key) ); + } else if (NULL != role_routine_priv) { + is_routine_priv_empty = false; + // append additional role + routine_priv_set |= role_routine_priv->get_priv_set(); + } + } + } + } + } + + //3. check privs + if (OB_SUCC(ret)) { + if (is_routine_priv_empty) { + ret = OB_ERR_NO_ROUTINE_PRIVILEGE; + LOG_WARN("No privilege, cannot find routine priv info", + "tenant_id", session_priv.tenant_id_, + "user_id", session_priv.user_id_, K(routine_need_priv)); + } else if (!OB_TEST_PRIVS(routine_priv_set | user_db_priv_set, routine_need_priv.priv_set_)) { + ret = OB_ERR_NO_ROUTINE_PRIVILEGE; + LOG_WARN("No privilege", "tenant_id", session_priv.tenant_id_, + "user_id", session_priv.user_id_, + K(routine_need_priv), + K(routine_priv_set | user_db_priv_set)); + } + } + if (OB_ERR_NO_ROUTINE_PRIVILEGE == ret) { + ObPrivSet lack_priv_set = routine_need_priv.priv_set_ & (~(routine_priv_set | user_db_priv_set)); + const char *priv_name = priv_mgr.get_first_priv_name(lack_priv_set); + if (OB_ISNULL(priv_name)) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("Invalid priv type", "priv_set", routine_need_priv.priv_set_); + } else { + LOG_USER_ERROR(OB_ERR_NO_ROUTINE_PRIVILEGE, (int)strlen(priv_name), priv_name, + session_priv.user_name_.length(), session_priv.user_name_.ptr(), + session_priv.host_name_.length(), session_priv.host_name_.ptr(), + routine_need_priv.table_.length(), routine_need_priv.table_.ptr()); + } + } + } + } + } + return ret; +} + int ObSchemaGetterGuard::check_db_priv(const ObSessionPrivInfo &session_priv, const ObString &db, - const ObPrivSet need_priv, + const ObPrivSet need_priv_set, ObPrivSet &user_db_priv_set) { int ret = OB_SUCCESS; uint64_t tenant_id = session_priv.tenant_id_; const ObSchemaMgr *mgr = NULL; ObPrivSet total_db_priv_set_role = OB_PRIV_SET_EMPTY; + bool is_oracle_mode = false; if (OB_INVALID_ID == session_priv.tenant_id_ || OB_INVALID_ID == session_priv.user_id_) { ret = OB_INVALID_ARGUMENT; LOG_WARN("Invalid arguments", "tenant_id", session_priv.tenant_id_, @@ -3403,6 +4044,8 @@ int ObSchemaGetterGuard::check_db_priv(const ObSessionPrivInfo &session_priv, LOG_WARN("fail to check tenant schema guard", KR(ret), K(tenant_id), K_(tenant_id)); } else if (OB_FAIL(check_lazy_guard(tenant_id, mgr))) { LOG_WARN("fail to check lazy guard", KR(ret), K(tenant_id)); + } else if (OB_FAIL(ObCompatModeGetter::check_is_oracle_mode_with_tenant_id(tenant_id, is_oracle_mode))) { + LOG_WARN("fail to get compat mode", K(ret)); } else { ObPrivSet db_priv_set = 0; if (session_priv.db_.length() != 0 && (session_priv.db_ == db || 0 == db.length())) { @@ -3415,7 +4058,7 @@ int ObSchemaGetterGuard::check_db_priv(const ObSessionPrivInfo &session_priv, } } /* load role db privs */ - if (OB_SUCC(ret)) { + if (OB_SUCC(ret) && is_oracle_mode) { const ObUserInfo *user_info = NULL; //bool is_grant_role = false; OZ (get_user_info(tenant_id, session_priv.user_id_, user_info), session_priv.user_id_); @@ -3450,9 +4093,21 @@ int ObSchemaGetterGuard::check_db_priv(const ObSessionPrivInfo &session_priv, } } + if (OB_SUCC(ret) && !is_oracle_mode) { + ObNeedPriv need_priv(db, "", OB_PRIV_DB_LEVEL, OB_PRIV_SET_EMPTY, false); + ObNeedPriv collected_privs(db, "", OB_PRIV_DB_LEVEL, OB_PRIV_SET_EMPTY, false); + bool check_succ = false; + if (OB_FAIL(collect_priv_in_roles(mgr->priv_mgr_, session_priv, *this, need_priv, + collect_user_db_level_priv_in_roles, collected_privs, check_succ))) { + LOG_WARN("fail to collect privs in roles", K(ret)); + } else { + total_db_priv_set_role |= collected_privs.priv_set_; + } + } + if (OB_SUCC(ret)) { user_db_priv_set = session_priv.user_priv_set_ | db_priv_set | total_db_priv_set_role; - if (!OB_TEST_PRIVS(user_db_priv_set, need_priv)) { + if (!OB_TEST_PRIVS(user_db_priv_set, need_priv_set)) { ret = OB_ERR_NO_DB_PRIVILEGE; } } @@ -3462,15 +4117,15 @@ int ObSchemaGetterGuard::check_db_priv(const ObSessionPrivInfo &session_priv, int ObSchemaGetterGuard::check_db_priv(const ObSessionPrivInfo &session_priv, const common::ObString &db, - const ObPrivSet need_priv) + const ObPrivSet need_priv_set) { int ret = OB_SUCCESS; uint64_t tenant_id = session_priv.tenant_id_; if (OB_FAIL(check_tenant_schema_guard(tenant_id))) { LOG_WARN("fail to check tenant schema guard", KR(ret), K(tenant_id), K_(tenant_id)); - } else if (!OB_TEST_PRIVS(session_priv.user_priv_set_, need_priv)) { + } else if (!OB_TEST_PRIVS(session_priv.user_priv_set_, need_priv_set)) { ObPrivSet user_db_priv_set = 0; - if (OB_FAIL(check_db_priv(session_priv, db, need_priv, user_db_priv_set))) { + if (OB_FAIL(check_db_priv(session_priv, db, need_priv_set, user_db_priv_set))) { LOG_WARN("No db priv", "tenant_id", session_priv.tenant_id_, "user_id", session_priv.user_id_, K(db), KR(ret)); @@ -3662,6 +4317,23 @@ int ObSchemaGetterGuard::check_priv(const ObSessionPrivInfo &session_priv, } break; } + case OB_PRIV_ROUTINE_LEVEL: { + if (OB_ISNULL(this)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("schema guard is null", K(ret)); + } else if (!sql::ObSchemaChecker::enable_mysql_pl_priv_check(tenant_id, *this)) { + //do nothing + } else if (OB_FAIL(check_routine_priv(session_priv, need_priv))) { + LOG_WARN("No privilege", "tenant_id", session_priv.tenant_id_, + "user_id", session_priv.user_id_, + "need_priv", need_priv.priv_set_, + "table", need_priv.table_, + "db", need_priv.db_, + "user_priv", session_priv.user_priv_set_, + KR(ret));//need print priv + } + break; + } case OB_PRIV_DB_ACCESS_LEVEL: { ret = OB_ERR_UNEXPECTED; LOG_WARN("Privilege checking of database access should not use this function", KR(ret)); @@ -3697,34 +4369,20 @@ int ObSchemaGetterGuard::check_priv_db_or_(const ObSessionPrivInfo &session_priv } } - /* load role db privs */ if (OB_SUCC(ret)) { - const ObUserInfo *user_info = NULL; - //bool is_grant_role = false; - if (OB_FAIL(get_user_info(tenant_id, user_id, user_info))) { - LOG_WARN("failed to get user info", KR(ret), K(tenant_id), K(user_id)); - } else if (OB_ISNULL(user_info)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("user info is null", KR(ret), K(tenant_id), K(user_id)); + pass = OB_PRIV_HAS_ANY(db_priv_set, need_priv.priv_set_); + } + + /* load role db privs */ + if (OB_SUCC(ret) && !pass) { + //2. fetch roles privs + bool check_succ = false; + ObNeedPriv collected_privs(db, "", OB_PRIV_DB_LEVEL, OB_PRIV_SET_EMPTY, false); + if (OB_FAIL(collect_priv_in_roles(priv_mgr, session_priv, *this, need_priv, + collect_user_db_level_priv_in_roles, collected_privs, check_succ))) { + LOG_WARN("fail to collect priv in roles", K(ret)); } else { - const ObIArray &role_id_array = user_info->get_role_id_array(); - for (int64_t i = 0; OB_SUCC(ret) && i < role_id_array.count(); ++i) { - const ObUserInfo *role_info = NULL; - if (OB_FAIL(get_user_info(tenant_id, role_id_array.at(i), role_info))) { - LOG_WARN("failed to get role ids", KR(ret), K(tenant_id), K(role_id_array.at(i))); - } else if (OB_ISNULL(role_info)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("role info is null", KR(ret), K(role_id_array.at(i))); - } else { - ObPrivSet db_priv_set_role = OB_PRIV_SET_EMPTY; - ObOriginalDBKey db_priv_key_role(tenant_id, role_info->get_user_id(), db); - if (OB_FAIL(priv_mgr.get_db_priv_set(db_priv_key_role, db_priv_set_role))) { - LOG_WARN("get db priv set failed", KR(ret), K(db_priv_key_role)); - } else { - db_priv_set |= db_priv_set_role; - } - } - } + db_priv_set |= collected_privs.priv_set_; } } @@ -3735,7 +4393,8 @@ int ObSchemaGetterGuard::check_priv_db_or_(const ObSessionPrivInfo &session_priv return ret; } -int ObSchemaGetterGuard::check_priv_table_or_(const ObNeedPriv &need_priv, +int ObSchemaGetterGuard::check_priv_table_or_(const ObSessionPrivInfo &session_priv, + const ObNeedPriv &need_priv, const ObPrivMgr &priv_mgr, const uint64_t tenant_id, const uint64_t user_id, @@ -3755,38 +4414,18 @@ int ObSchemaGetterGuard::check_priv_table_or_(const ObNeedPriv &need_priv, } if (OB_SUCC(ret)) { + pass = OB_PRIV_HAS_ANY(table_priv_set, need_priv.priv_set_); + } + + if (OB_SUCC(ret) && !pass) { //2. fetch roles privs - const ObUserInfo *user_info = NULL; - if (OB_FAIL(get_user_info(tenant_id, user_id, user_info))) { - LOG_WARN("failed to get user info", KR(ret), K(tenant_id), K(user_id)); - } else if (OB_ISNULL(user_info)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("user info is null", KR(ret), K(tenant_id), K(user_id)); + bool check_succ = false; + ObNeedPriv collected_privs(need_priv.db_, need_priv.table_, OB_PRIV_TABLE_LEVEL, OB_PRIV_SET_EMPTY, false); + if (OB_FAIL(collect_priv_in_roles(priv_mgr, session_priv, *this, need_priv, + collect_user_db_tb_level_priv_in_roles, collected_privs, check_succ))) { + LOG_WARN("fail to collect priv in roles", K(ret)); } else { - const ObIArray &role_id_array = user_info->get_role_id_array(); - for (int64_t i = 0; OB_SUCC(ret) && i < role_id_array.count(); ++i) { - const ObUserInfo *role_info = NULL; - const ObTablePriv *role_table_priv = NULL; - if (OB_FAIL(get_user_info(tenant_id, role_id_array.at(i), role_info))) { - LOG_WARN("failed to get role ids", KR(ret), K(tenant_id), K(role_id_array.at(i))); - } else if (OB_ISNULL(role_info)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("role info is null", KR(ret), K(role_id_array.at(i))); - } else { - ObTablePrivSortKey role_table_priv_key(tenant_id, - role_info->get_user_id(), - need_priv.db_, - need_priv.table_); - if (OB_FAIL(priv_mgr.get_table_priv(role_table_priv_key, role_table_priv))) { - LOG_WARN("get table priv failed", KR(ret), K(role_table_priv_key) ); - } else if (OB_ISNULL(role_table_priv)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("role table priv is null", KR(ret), K(role_table_priv_key)); - } else { - table_priv_set |= role_table_priv->get_priv_set(); - } - } - } + table_priv_set |= collected_privs.priv_set_; } } @@ -3798,6 +4437,84 @@ int ObSchemaGetterGuard::check_priv_table_or_(const ObNeedPriv &need_priv, return ret; } +int ObSchemaGetterGuard::collect_all_priv_for_column(const ObSessionPrivInfo &session_priv, + const ObString &db_name, + const ObString &table_name, + const ObString &column_name, + ObPrivSet &col_priv_set) +{ + int ret = OB_SUCCESS; + ObColumnPrivSortKey sort_key(session_priv.tenant_id_, + session_priv.user_id_, + db_name, + table_name, + column_name); + col_priv_set = OB_PRIV_SET_EMPTY; + if (OB_FAIL(get_column_priv_set(sort_key, col_priv_set))) { + LOG_WARN("get column priv failed", K(ret), K(sort_key)); + } else { + bool pass = false; + uint64_t tenant_id = session_priv.tenant_id_; + ObNeedPriv need_priv(db_name, table_name, OB_PRIV_TABLE_LEVEL, OB_PRIV_COLUMN_ACC, false); + ObNeedPriv collected_privs(db_name, table_name, OB_PRIV_TABLE_LEVEL, OB_PRIV_SET_EMPTY, false); + const ObSchemaMgr *mgr = NULL; + if (OB_FAIL(check_tenant_schema_guard(tenant_id))) { + LOG_WARN("fail to check tenant schema guard", KR(ret), K(tenant_id), K_(tenant_id)); + } else if (OB_FAIL(check_lazy_guard(tenant_id, mgr))) { + LOG_WARN("fail to check lazy guard", KR(ret), K(tenant_id)); + } else if (OB_ISNULL(mgr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("mgr is NULL", KR(ret), K(tenant_id)); + } else if (OB_FAIL(need_priv.columns_.push_back(column_name))) { + LOG_WARN("fail to push back", K(ret)); + } else if (OB_FAIL(collect_priv_in_roles(mgr->priv_mgr_, session_priv, *this, need_priv, + collect_column_level_all_priv_in_roles, collected_privs, pass))) { + LOG_WARN("fail to collect priv in roles", K(ret)); + } else { + col_priv_set |= collected_privs.priv_set_; + } + } + + return ret; +} + +int ObSchemaGetterGuard::check_priv_any_column_priv(const ObSessionPrivInfo &session_priv, + const ObString &db_name, + const ObString &table_name, + bool &pass) +{ + int ret = OB_SUCCESS; + pass = false; + ObArray column_privs; + if (OB_FAIL(get_column_priv_in_table( + ObTablePrivSortKey(session_priv.tenant_id_, session_priv.user_id_, db_name, table_name), + column_privs))) { + LOG_WARN("get column priv in table failed", K(ret)); + } else if (!column_privs.empty()) { + pass = true; + } else { + uint64_t tenant_id = session_priv.tenant_id_; + ObNeedPriv need_priv(db_name, table_name, OB_PRIV_TABLE_LEVEL, OB_PRIV_COLUMN_ACC, false); + ObNeedPriv collected_privs(db_name, table_name, OB_PRIV_TABLE_LEVEL, OB_PRIV_SET_EMPTY, false); + need_priv.check_any_column_priv_ = true; + const ObSchemaMgr *mgr = NULL; + if (OB_FAIL(check_tenant_schema_guard(tenant_id))) { + LOG_WARN("fail to check tenant schema guard", KR(ret), K(tenant_id), K_(tenant_id)); + } else if (OB_FAIL(check_lazy_guard(tenant_id, mgr))) { + LOG_WARN("fail to check lazy guard", KR(ret), K(tenant_id)); + } else if (OB_ISNULL(mgr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("mgr is NULL", KR(ret), K(tenant_id)); + } else if (OB_FAIL(need_priv.columns_.push_back(""))) { + LOG_WARN("fail to push back", K(ret)); + } else if (OB_FAIL(collect_priv_in_roles(mgr->priv_mgr_, session_priv, *this, need_priv, + collect_any_column_level_priv_in_roles, collected_privs, pass))) { + LOG_WARN("fail to collect priv in roles", K(ret)); + } + } + return ret; +} + int ObSchemaGetterGuard::check_priv_or(const ObSessionPrivInfo &session_priv, const ObStmtNeedPrivs &stmt_need_privs) { @@ -3826,6 +4543,17 @@ int ObSchemaGetterGuard::check_priv_or(const ObSessionPrivInfo &session_priv, switch (need_priv.priv_level_) { case OB_PRIV_USER_LEVEL: { pass = OB_PRIV_HAS_ANY(session_priv.user_priv_set_, need_priv.priv_set_); + if (!pass) { + bool check_succ = false; + ObNeedPriv collected_privs("", "", OB_PRIV_USER_LEVEL, OB_PRIV_SET_EMPTY, false); + if (OB_FAIL(collect_priv_in_roles(priv_mgr, session_priv, *this, need_priv, + collect_user_level_priv_in_roles, collected_privs, check_succ))) { + LOG_WARN("fail to collect priv in roles", K(ret)); + } else { + ObPrivSet total_set = (session_priv.user_priv_set_ | collected_privs.priv_set_); + pass = OB_PRIV_HAS_ANY(total_set, need_priv.priv_set_); + } + } break; } case OB_PRIV_DB_LEVEL: { @@ -3835,11 +4563,16 @@ int ObSchemaGetterGuard::check_priv_or(const ObSessionPrivInfo &session_priv, break; } case OB_PRIV_TABLE_LEVEL: { - if (OB_FAIL(check_priv_table_or_(need_priv, priv_mgr, tenant_id, user_id, pass))) { + if (OB_FAIL(check_priv_table_or_(session_priv, need_priv, priv_mgr, tenant_id, user_id, pass))) { LOG_WARN("fail to check priv table only", KR(ret), K(tenant_id), K(user_id), K(need_priv.db_), K(need_priv.table_)); } break; } + case OB_PRIV_ROUTINE_LEVEL: { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("should not reach here", KR(ret)); + break; + } case OB_PRIV_DB_ACCESS_LEVEL: { //this should not occur ret = OB_INVALID_ARGUMENT; @@ -3866,6 +4599,10 @@ int ObSchemaGetterGuard::check_priv_or(const ObSessionPrivInfo &session_priv, ret = OB_ERR_NO_TABLE_PRIVILEGE; break; } + case OB_PRIV_ROUTINE_LEVEL: { + ret = OB_ERR_NO_ROUTINE_PRIVILEGE; + break; + } default: { //this should not occur ret = OB_INVALID_ARGUMENT; @@ -3930,6 +4667,56 @@ int ObSchemaGetterGuard::get_table_priv_set(const ObTablePrivSortKey &table_priv return ret; } +int ObSchemaGetterGuard::get_routine_priv_set(const ObRoutinePrivSortKey &routine_priv_key, + ObPrivSet &priv_set) +{ + int ret = OB_SUCCESS; + const ObSchemaMgr *mgr = NULL; + uint64_t tenant_id = routine_priv_key.tenant_id_; + if (OB_FAIL(check_tenant_schema_guard(tenant_id))) { + LOG_WARN("fail to check tenant schema guard", KR(ret), K(tenant_id), K_(tenant_id)); + } else if (OB_FAIL(check_lazy_guard(tenant_id, mgr))) { + LOG_WARN("fail to check lazy guard", KR(ret), K(tenant_id)); + } else if (OB_FAIL(mgr->priv_mgr_.get_routine_priv_set(routine_priv_key, priv_set))) { + LOG_WARN("fail to get routine priv set", KR(ret), K(routine_priv_key)); + } + return ret; +} + +int ObSchemaGetterGuard::get_column_priv(const ObColumnPrivSortKey &column_priv_key, + const ObColumnPriv *&column_priv) +{ + int ret = OB_SUCCESS; + const ObSchemaMgr *mgr = NULL; + column_priv = NULL; + uint64_t tenant_id = column_priv_key.tenant_id_; + if (OB_FAIL(check_tenant_schema_guard(tenant_id))) { + LOG_WARN("fail to check tenant schema guard", KR(ret), K(tenant_id), K_(tenant_id)); + } else if (OB_FAIL(check_lazy_guard(tenant_id, mgr))) { + LOG_WARN("fail to check lazy guard", KR(ret), K(tenant_id)); + } else if (OB_FAIL(mgr->priv_mgr_.get_column_priv(column_priv_key, column_priv))) { + LOG_WARN("fail to get column priv set", KR(ret), K(column_priv_key)); + } + return ret; +} + +int ObSchemaGetterGuard::get_column_priv_set(const ObColumnPrivSortKey &column_priv_key, + ObPrivSet &priv_set) +{ + int ret = OB_SUCCESS; + priv_set = 0; + const ObSchemaMgr *mgr = NULL; + uint64_t tenant_id = column_priv_key.tenant_id_; + if (OB_FAIL(check_tenant_schema_guard(tenant_id))) { + LOG_WARN("fail to check tenant schema guard", KR(ret), K(tenant_id), K_(tenant_id)); + } else if (OB_FAIL(check_lazy_guard(tenant_id, mgr))) { + LOG_WARN("fail to check lazy guard", KR(ret), K(tenant_id)); + } else if (OB_FAIL(mgr->priv_mgr_.get_column_priv_set(column_priv_key, priv_set))) { + LOG_WARN("fail to get column priv set", KR(ret), K(column_priv_key)); + } + return ret; +} + int ObSchemaGetterGuard::get_obj_privs( const ObObjPrivSortKey &obj_priv_key, ObPackedObjPriv &obj_privs) @@ -3994,6 +4781,40 @@ int ObSchemaGetterGuard::get_db_priv_with_tenant_id(const uint64_t tenant_id, return ret; } +int ObSchemaGetterGuard::get_column_priv_in_table(const ObTablePrivSortKey &table_priv_key, + ObIArray &column_privs) +{ + return get_column_priv_in_table(table_priv_key.tenant_id_, table_priv_key.user_id_, + table_priv_key.db_, table_priv_key.table_, column_privs); +} + +int ObSchemaGetterGuard::get_column_priv_in_table(const uint64_t tenant_id, + const uint64_t user_id, + const ObString &db, + const ObString &table, + ObIArray &column_privs) +{ + int ret = OB_SUCCESS; + const ObSchemaMgr *mgr = NULL; + column_privs.reset(); + + if (!check_inner_stat()) { + ret = OB_INNER_STAT_ERROR; + LOG_WARN("inner stat error", KR(ret)); + } else if (OB_INVALID_ID == tenant_id) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid arguments", K(tenant_id)); + } else if (OB_FAIL(check_tenant_schema_guard(tenant_id))) { + LOG_WARN("fail to check tenant schema guard", KR(ret), K(tenant_id), K_(tenant_id)); + } else if (OB_FAIL(check_lazy_guard(tenant_id, mgr))) { + LOG_WARN("fail to check lazy guard", KR(ret), K(tenant_id)); + } else if (OB_FAIL(mgr->priv_mgr_.get_column_priv_in_table(tenant_id, user_id, db, table, column_privs))) { + LOG_WARN("get db priv with tenant_id failed", KR(ret), K(tenant_id)); + } + + return ret; +} + int ObSchemaGetterGuard::get_db_priv_with_user_id(const uint64_t tenant_id, const uint64_t user_id, ObIArray &db_privs) @@ -4078,6 +4899,58 @@ int ObSchemaGetterGuard::get_table_priv_with_user_id(const uint64_t tenant_id, return ret; } +int ObSchemaGetterGuard::get_routine_priv_with_user_id(const uint64_t tenant_id, + const uint64_t user_id, + ObIArray &routine_privs) +{ + int ret = OB_SUCCESS; + const ObSchemaMgr *mgr = NULL; + routine_privs.reset(); + + if (!check_inner_stat()) { + ret = OB_INNER_STAT_ERROR; + LOG_WARN("inner stat error", KR(ret)); + } else if (OB_INVALID_ID == tenant_id + || OB_INVALID_ID == user_id) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid arguments", K(tenant_id), K(user_id)); + } else if (OB_FAIL(check_tenant_schema_guard(tenant_id))) { + LOG_WARN("fail to check tenant schema guard", KR(ret), K(tenant_id), K_(tenant_id)); + } else if (OB_FAIL(check_lazy_guard(tenant_id, mgr))) { + LOG_WARN("fail to check lazy guard", KR(ret), K(tenant_id)); + } else if (OB_FAIL(mgr->priv_mgr_.get_routine_privs_in_user(tenant_id, user_id, routine_privs))) { + LOG_WARN("get routine priv with user_id failed", KR(ret), K(tenant_id), K(user_id)); + } + + return ret; +} + +int ObSchemaGetterGuard::get_column_priv_with_user_id(const uint64_t tenant_id, + const uint64_t user_id, + ObIArray &column_privs) +{ + int ret = OB_SUCCESS; + const ObSchemaMgr *mgr = NULL; + column_privs.reset(); + + if (!check_inner_stat()) { + ret = OB_INNER_STAT_ERROR; + LOG_WARN("inner stat error", KR(ret)); + } else if (OB_INVALID_ID == tenant_id + || OB_INVALID_ID == user_id) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid arguments", K(tenant_id), K(user_id)); + } else if (OB_FAIL(check_tenant_schema_guard(tenant_id))) { + LOG_WARN("fail to check tenant schema guard", KR(ret), K(tenant_id), K_(tenant_id)); + } else if (OB_FAIL(check_lazy_guard(tenant_id, mgr))) { + LOG_WARN("fail to check lazy guard", KR(ret), K(tenant_id)); + } else if (OB_FAIL(mgr->priv_mgr_.get_column_privs_in_user(tenant_id, user_id, column_privs))) { + LOG_WARN("get column priv with user_id failed", KR(ret), K(tenant_id), K(user_id)); + } + + return ret; +} + int ObSchemaGetterGuard::get_obj_priv_with_grantee_id( const uint64_t tenant_id, const uint64_t grantee_id, @@ -6270,6 +7143,28 @@ int ObSchemaGetterGuard::get_routine_id(uint64_t tenant_id, uint64_t database_id return ret; } +int ObSchemaGetterGuard::check_routine_definer_existed(uint64_t tenant_id, const ObString &user_name, bool &existed) +{ + int ret = OB_SUCCESS; + const ObSchemaMgr *mgr = NULL; + + if (!check_inner_stat()) { + ret = OB_INNER_STAT_ERROR; + LOG_WARN("inner stat error", KR(ret)); + } else if (OB_INVALID_ID == tenant_id + || user_name.empty()) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid argument", KR(ret), K(tenant_id), K(user_name)); + } else if (OB_FAIL(check_tenant_schema_guard(tenant_id))) { + LOG_WARN("fail to check tenant schema guard", KR(ret), K(tenant_id), K_(tenant_id)); + } else if (OB_FAIL(check_lazy_guard(tenant_id, mgr))) { + LOG_WARN("fail to check lazy guard", KR(ret), K(tenant_id)); + } else if (OB_FAIL(mgr->routine_mgr_.check_user_reffered_by_definer(user_name, existed))) { + LOG_WARN("check routine definer failed", KR(ret), K(tenant_id), K(user_name)); + } + return ret; +} + int ObSchemaGetterGuard::get_routine_info( const uint64_t tenant_id, const uint64_t database_id, const uint64_t package_id, const ObString &routine_name, uint64_t overload, diff --git a/src/share/schema/ob_schema_getter_guard.h b/src/share/schema/ob_schema_getter_guard.h index 121e038852..5cf233abe6 100644 --- a/src/share/schema/ob_schema_getter_guard.h +++ b/src/share/schema/ob_schema_getter_guard.h @@ -494,6 +494,18 @@ public: const ObNeedPriv &table_need_priv); int check_single_table_priv_or(const ObSessionPrivInfo &session_priv, const ObNeedPriv &table_need_priv); + + int check_priv_any_column_priv(const ObSessionPrivInfo &session_priv, + const common::ObString &db_name, + const common::ObString &table_name, + bool &pass); + + int collect_all_priv_for_column(const ObSessionPrivInfo &session_priv, + const common::ObString &db_name, + const common::ObString &table_name, + const common::ObString &column_name, + ObPrivSet &column_priv_set); + int get_session_priv_info(const uint64_t tenant_id, const uint64_t user_id, const ObString &database_name, @@ -502,9 +514,34 @@ public: common::ObIArray &user_infos); int get_db_priv_with_tenant_id(const uint64_t tenant_id, common::ObIArray &db_privs); + int get_column_priv_in_table(const uint64_t tenant_id, + const uint64_t user_id, + const ObString &db, + const ObString &table, + ObIArray &column_privs); + + int get_column_priv_in_table(const ObTablePrivSortKey &table_priv_key, + ObIArray &column_privs); + int get_column_priv(const ObColumnPrivSortKey &column_priv_key, + const ObColumnPriv *&column_priv); + + int get_column_priv_id(const uint64_t tenant_id, + const uint64_t user_id, + const ObString &db, + const ObString &table, + const ObString &column, + uint64_t &priv_id); + int get_column_priv_with_user_id(const uint64_t tenant_id, + const uint64_t user_id, + common::ObIArray &column_privs); + int get_column_priv_set(const ObColumnPrivSortKey &column_priv_key, ObPrivSet &priv_set); int get_db_priv_with_user_id(const uint64_t tenant_id, const uint64_t user_id, common::ObIArray &db_privs); + + int get_routine_priv_with_user_id(const uint64_t tenant_id, + const uint64_t user_id, + common::ObIArray &routine_privs); int get_table_priv_with_tenant_id(const uint64_t tenant_id, common::ObIArray &table_privs); int get_table_priv_with_user_id(const uint64_t tenant_id, @@ -538,6 +575,7 @@ public: // for compatible int get_db_priv_set(const ObOriginalDBKey &db_priv_key, ObPrivSet &priv_set, bool is_pattern = false); int get_table_priv_set(const ObTablePrivSortKey &table_priv_key, ObPrivSet &priv_set); + int get_routine_priv_set(const ObRoutinePrivSortKey &routine_priv_key, ObPrivSet &priv_set); int get_obj_privs( const ObObjPrivSortKey &obj_priv_key, ObPackedObjPriv &obj_privs); @@ -1044,6 +1082,12 @@ public: GET_SIMPLE_SCHEMAS_IN_DATABASE_FUNC_DECLARE(package, ObSimplePackageSchema); GET_SIMPLE_SCHEMAS_IN_DATABASE_FUNC_DECLARE(routine, ObSimpleRoutineSchema); GET_SIMPLE_SCHEMAS_IN_DATABASE_FUNC_DECLARE(mock_fk_parent_table, ObSimpleMockFKParentTableSchema); + + int check_routine_priv(const ObSessionPrivInfo &session_priv, + const ObNeedPriv &routine_need_priv); + + int check_routine_definer_existed(uint64_t tenant_id, const ObString &user_name, bool &existed); + private: int check_ssl_access(const ObUserInfo &user_info, SSL *ssl_st); @@ -1051,11 +1095,11 @@ private: int check_db_priv(const ObSessionPrivInfo &session_priv, const common::ObString &db, - const ObPrivSet need_priv, + const ObPrivSet need_priv_set, ObPrivSet &user_db_priv_set); int check_db_priv(const ObSessionPrivInfo &session_priv, const common::ObString &db, - const ObPrivSet need_priv); + const ObPrivSet need_priv_set); int check_user_priv(const ObSessionPrivInfo &session_priv, const ObPrivSet priv_set); int verify_db_read_only(const uint64_t tenant_id, @@ -1152,7 +1196,8 @@ private: const uint64_t tenant_id, const uint64_t user_id, bool& pass); - int check_priv_table_or_(const ObNeedPriv &need_priv, + int check_priv_table_or_(const ObSessionPrivInfo &session_priv, + const ObNeedPriv &need_priv, const ObPrivMgr &priv_mgr, const uint64_t tenant_id, const uint64_t user_id, @@ -1163,6 +1208,7 @@ private: int check_single_table_priv_for_update_(const ObSessionPrivInfo &session_priv, const ObNeedPriv &table_need_priv, const ObPrivMgr &priv_mgr); + int check_activate_all_role_var(uint64_t tenant_id, bool &activate_all_role); private: common::ObArenaAllocator local_allocator_; ObMultiVersionSchemaService *schema_service_; diff --git a/src/share/schema/ob_schema_mgr.cpp b/src/share/schema/ob_schema_mgr.cpp index 2e64b113df..20f032739f 100644 --- a/src/share/schema/ob_schema_mgr.cpp +++ b/src/share/schema/ob_schema_mgr.cpp @@ -5262,6 +5262,10 @@ int ObSchemaMgr::get_schema_statistics(common::ObIArray LOG_WARN("fail to get table priv statistics", K(ret)); } else if (OB_FAIL(schema_infos.push_back(schema_info))) { LOG_WARN("fail to push back schema statistics", K(ret), K(schema_info)); + } else if (OB_FAIL(priv_mgr_.get_schema_statistics(ROUTINE_PRIV, schema_info))) { + LOG_WARN("fail to get table priv statistics", K(ret)); + } else if (OB_FAIL(schema_infos.push_back(schema_info))) { + LOG_WARN("fail to push back schema statistics", K(ret), K(schema_info)); } else if (OB_FAIL(priv_mgr_.get_schema_statistics(DATABASE_PRIV, schema_info))) { LOG_WARN("fail to get database priv statistics", K(ret)); } else if (OB_FAIL(schema_infos.push_back(schema_info))) { @@ -5340,6 +5344,10 @@ int ObSchemaMgr::get_schema_statistics(common::ObIArray LOG_WARN("fail to get obj priv statistics", K(ret)); } else if (OB_FAIL(schema_infos.push_back(schema_info))) { LOG_WARN("fail to push back schema statistics", K(ret), K(schema_info)); + } else if (OB_FAIL(priv_mgr_.get_schema_statistics(COLUMN_PRIV, schema_info))) { + LOG_WARN("fail to get column priv statistics", K(ret)); + } else if (OB_FAIL(schema_infos.push_back(schema_info))) { + LOG_WARN("fail to push back schema statistics", K(ret), K(schema_info)); } else if (OB_FAIL(dblink_mgr_.get_schema_statistics(schema_info))) { LOG_WARN("fail to get dblink statistics", K(ret)); } else if (OB_FAIL(schema_infos.push_back(schema_info))) { diff --git a/src/share/schema/ob_schema_printer.cpp b/src/share/schema/ob_schema_printer.cpp index 52303bd923..f356ff67a0 100644 --- a/src/share/schema/ob_schema_printer.cpp +++ b/src/share/schema/ob_schema_printer.cpp @@ -2752,6 +2752,8 @@ int ObSchemaPrinter::print_view_definiton( if (buf && buf_len > 0) { const ObTableSchema *table_schema = NULL; bool is_oracle_mode = false; + bool need_print_column_list = false; + common::ObSEArray column_ids; if (OB_FAIL(schema_guard_.get_table_schema(tenant_id, table_id, table_schema))) { LOG_WARN("fail to get table schema", K(ret), K(tenant_id), K(table_id)); } else if (NULL == table_schema) { @@ -2784,6 +2786,16 @@ int ObSchemaPrinter::print_view_definiton( if (OB_FAIL(ret)) { // pass + } else if (FALSE_IT(need_print_column_list = (is_oracle_mode && !is_inner_table(table_id)))) { + } else if (need_print_column_list && OB_FAIL(databuff_printf(buf, buf_len, pos, " ("))) { + SHARE_SCHEMA_LOG(WARN, "fail to print view definition", K(ret)); + } else if (need_print_column_list && OB_FAIL(table_schema->get_column_ids(column_ids))) { + SHARE_SCHEMA_LOG(WARN, "fail to print view definition", K(ret)); + } else if (need_print_column_list + && OB_FAIL(print_column_list(*table_schema, column_ids, buf, buf_len, pos))) { + SHARE_SCHEMA_LOG(WARN, "fail to print view definition", K(ret)); + } else if (need_print_column_list && OB_FAIL(databuff_printf(buf, buf_len, pos, ") "))) { + SHARE_SCHEMA_LOG(WARN, "fail to print view definition", K(ret)); } else if (OB_FAIL(databuff_printf(buf, buf_len, pos, " AS "))) { SHARE_SCHEMA_LOG(WARN, "fail to print view definition", K(ret)); } else if (OB_FAIL(print_view_define_str(buf, buf_len, pos, is_oracle_mode, diff --git a/src/share/schema/ob_schema_retrieve_utils.h b/src/share/schema/ob_schema_retrieve_utils.h index 01e7f1a47d..d8c12039bf 100644 --- a/src/share/schema/ob_schema_retrieve_utils.h +++ b/src/share/schema/ob_schema_retrieve_utils.h @@ -379,6 +379,9 @@ public: RETRIEVE_SCHEMA_FUNC_DECLARE(outline); RETRIEVE_SCHEMA_FUNC_DECLARE(db_priv); RETRIEVE_SCHEMA_FUNC_DECLARE(table_priv); + RETRIEVE_SCHEMA_FUNC_DECLARE(routine_priv); + + RETRIEVE_SCHEMA_FUNC_DECLARE(column_priv); RETRIEVE_SCHEMA_FUNC_DECLARE(package); RETRIEVE_SCHEMA_FUNC_DECLARE(routine); RETRIEVE_SCHEMA_FUNC_DECLARE(trigger); @@ -496,6 +499,9 @@ public: FILL_SCHEMA_FUNC_DECLARE(outline, ObOutlineInfo); FILL_SCHEMA_FUNC_DECLARE(db_priv, ObDBPriv); FILL_SCHEMA_FUNC_DECLARE(table_priv, ObTablePriv); + FILL_SCHEMA_FUNC_DECLARE(routine_priv, ObRoutinePriv); + + FILL_SCHEMA_FUNC_DECLARE(column_priv, ObColumnPriv); FILL_SCHEMA_FUNC_DECLARE(package, ObPackageInfo); FILL_SCHEMA_FUNC_DECLARE(routine, ObRoutineInfo); FILL_SCHEMA_FUNC_DECLARE(routine_param, ObRoutineParam); diff --git a/src/share/schema/ob_schema_retrieve_utils.ipp b/src/share/schema/ob_schema_retrieve_utils.ipp index ba103b241a..777c29b1c8 100644 --- a/src/share/schema/ob_schema_retrieve_utils.ipp +++ b/src/share/schema/ob_schema_retrieve_utils.ipp @@ -1907,6 +1907,14 @@ int ObSchemaRetrieveUtils::fill_user_schema( ObSchemaService::g_ignore_column_retrieve_error_, 0); EXTRACT_PRIV_FROM_MYSQL_RESULT_IGNORE_NULL_AND_IGNORE_COLUMN_ERROR(result, priv_drop_database_link, user_info, PRIV_DROP_DATABASE_LINK); EXTRACT_PRIV_FROM_MYSQL_RESULT_IGNORE_NULL_AND_IGNORE_COLUMN_ERROR(result, priv_create_database_link, user_info, PRIV_CREATE_DATABASE_LINK); + + bool ignore_column_error = true; + ObPrivSet priv_others = 0; + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(result, "priv_others", priv_others, uint64_t, true /* skip null error*/, + ignore_column_error, 0); + user_info.set_priv((priv_others & 1) != 0 ? OB_PRIV_EXECUTE : 0); + user_info.set_priv((priv_others & 2) != 0 ? OB_PRIV_ALTER_ROUTINE : 0); + user_info.set_priv((priv_others & 4) != 0 ? OB_PRIV_CREATE_ROUTINE : 0); } return ret; } @@ -2052,6 +2060,16 @@ int ObSchemaRetrieveUtils::fill_db_priv_schema( EXTRACT_PRIV_FROM_MYSQL_RESULT(result, priv_create_view, db_priv, PRIV_CREATE_VIEW); EXTRACT_PRIV_FROM_MYSQL_RESULT(result, priv_show_view, db_priv, PRIV_SHOW_VIEW); EXTRACT_INT_FIELD_TO_CLASS_MYSQL(result, schema_version, db_priv, int64_t); + bool ignore_column_error = true; + ObPrivSet priv_others = 0; + EXTRACT_INT_FIELD_MYSQL_WITH_DEFAULT_VALUE(result, "priv_others", priv_others, uint64_t, true /* skip null error*/, + ignore_column_error, 0); + if (OB_FAIL(ret)) { + } else { + db_priv.set_priv((priv_others & 1) != 0 ? OB_PRIV_EXECUTE : 0); + db_priv.set_priv((priv_others & 2) != 0 ? OB_PRIV_ALTER_ROUTINE : 0); + db_priv.set_priv((priv_others & 4) != 0 ? OB_PRIV_CREATE_ROUTINE : 0); + } } return ret; @@ -2110,6 +2128,59 @@ int ObSchemaRetrieveUtils::fill_table_priv_schema( return ret; } +template +int ObSchemaRetrieveUtils::fill_routine_priv_schema( + const uint64_t tenant_id, T &result, ObRoutinePriv &routine_priv, bool &is_deleted) +{ + int ret = common::OB_SUCCESS; + routine_priv.reset(); + is_deleted = false; + + routine_priv.set_tenant_id(tenant_id); + EXTRACT_INT_FIELD_TO_CLASS_MYSQL_WITH_TENANT_ID(result, user_id, routine_priv, tenant_id); + EXTRACT_VARCHAR_FIELD_TO_CLASS_MYSQL(result, database_name, routine_priv); + EXTRACT_VARCHAR_FIELD_TO_CLASS_MYSQL(result, routine_name, routine_priv); + EXTRACT_INT_FIELD_TO_CLASS_MYSQL(result, routine_type, routine_priv, int64_t); + EXTRACT_INT_FIELD_MYSQL(result, "is_deleted", is_deleted, bool); + if (!is_deleted) { + int64_t all_priv = 0; + EXTRACT_INT_FIELD_MYSQL(result, "all_priv", all_priv, int64_t); + if ((all_priv & 1) != 0) { routine_priv.set_priv(OB_PRIV_EXECUTE); } + if ((all_priv & 2) != 0) { routine_priv.set_priv(OB_PRIV_ALTER_ROUTINE); } + if ((all_priv & 4) != 0) { routine_priv.set_priv(OB_PRIV_GRANT); } + EXTRACT_INT_FIELD_TO_CLASS_MYSQL(result, schema_version, routine_priv, int64_t); + } + + return ret; +} + +template +int ObSchemaRetrieveUtils::fill_column_priv_schema( + const uint64_t tenant_id, T &result, ObColumnPriv &column_priv, bool &is_deleted) +{ + int ret = common::OB_SUCCESS; + column_priv.reset(); + is_deleted = false; + column_priv.set_tenant_id(tenant_id); + EXTRACT_INT_FIELD_TO_CLASS_MYSQL(result, priv_id, column_priv, uint64_t); + EXTRACT_INT_FIELD_MYSQL(result, "is_deleted", is_deleted, bool); + if (!is_deleted) { + EXTRACT_INT_FIELD_TO_CLASS_MYSQL_WITH_TENANT_ID(result, user_id, column_priv, tenant_id); + EXTRACT_VARCHAR_FIELD_TO_CLASS_MYSQL(result, database_name, column_priv); + EXTRACT_VARCHAR_FIELD_TO_CLASS_MYSQL(result, table_name, column_priv); + EXTRACT_VARCHAR_FIELD_TO_CLASS_MYSQL(result, column_name, column_priv); + int64_t all_priv = 0; + EXTRACT_INT_FIELD_MYSQL(result, "all_priv", all_priv, int64_t); + if ((all_priv & 1) != 0) { column_priv.set_priv(OB_PRIV_SELECT); } + if ((all_priv & 2) != 0) { column_priv.set_priv(OB_PRIV_INSERT); } + if ((all_priv & 4) != 0) { column_priv.set_priv(OB_PRIV_UPDATE); } + if ((all_priv & 8) != 0) { column_priv.set_priv(OB_PRIV_REFERENCES); } + EXTRACT_INT_FIELD_TO_CLASS_MYSQL(result, schema_version, column_priv, int64_t); + } + + return ret; +} + template int ObSchemaRetrieveUtils::fill_obj_priv_schema( const uint64_t tenant_id, @@ -3724,6 +3795,82 @@ int ObSchemaRetrieveUtils::retrieve_table_priv_schema( return ret; } +template +int ObSchemaRetrieveUtils::retrieve_routine_priv_schema( + const uint64_t tenant_id, + T &result, + ObIArray &routine_priv_array) +{ + int ret = common::OB_SUCCESS; + ObArenaAllocator allocator(ObModIds::OB_TEMP_VARIABLES); + ObArenaAllocator tmp_allocator(ObModIds::OB_TEMP_VARIABLES); + S routine_priv(&allocator); + ObRoutinePrivSortKey pre_routine_sort_key; + while (OB_SUCCESS == ret && common::OB_SUCCESS == (ret = result.next())) { + routine_priv.reset(); + allocator.reuse(); + bool is_deleted = false; + if (OB_FAIL(fill_routine_priv_schema(tenant_id, result, routine_priv, is_deleted))) { + LOG_WARN("Fail to fill routine_priv", K(ret)); + } else if (routine_priv.get_sort_key() == pre_routine_sort_key) { + // ignore it + ret = common::OB_SUCCESS; + } else if (is_deleted) { + LOG_TRACE("routine_priv is is_deleted", K(routine_priv)); + } else if (OB_FAIL(routine_priv_array.push_back(routine_priv))) { + LOG_WARN("Failed to push back", K(ret)); + } + if (OB_SUCC(ret)) { + tmp_allocator.reuse(); + if (OB_FAIL(pre_routine_sort_key.deep_copy(routine_priv.get_sort_key(), tmp_allocator))) { + LOG_WARN("alloc_routine_schema failed", KR(ret)); + } + } + } + if (ret != common::OB_ITER_END) { + LOG_WARN("Fail to get routine privileges. iter quit", K(ret)); + } else { + ret = common::OB_SUCCESS; + } + return ret; +} + +template +int ObSchemaRetrieveUtils::retrieve_column_priv_schema( + const uint64_t tenant_id, + T &result, + ObIArray &column_priv_array) +{ + int ret = common::OB_SUCCESS; + ObArenaAllocator allocator(ObModIds::OB_TEMP_VARIABLES); + S column_priv(&allocator); + ObColumnPrivIdKey pre_column_id_key; + while (OB_SUCCESS == ret && common::OB_SUCCESS == (ret = result.next())) { + column_priv.reset(); + allocator.reuse(); + bool is_deleted = false; + if (OB_FAIL(fill_column_priv_schema(tenant_id, result, column_priv, is_deleted))) { + LOG_WARN("Fail to fill column_priv", K(ret)); + } else if (column_priv.get_id_key() == pre_column_id_key) { + // ignore it + ret = common::OB_SUCCESS; + } else if (is_deleted) { + LOG_TRACE("column_priv is is_deleted", K(column_priv)); + } else if (OB_FAIL(column_priv_array.push_back(column_priv))) { + LOG_WARN("Failed to push back", K(ret)); + } + if (OB_SUCC(ret)) { + pre_column_id_key = column_priv.get_id_key(); + } + } + if (ret != common::OB_ITER_END) { + LOG_WARN("Fail to get column privileges. iter quit", K(ret)); + } else { + ret = common::OB_SUCCESS; + } + return ret; +} + template int ObSchemaRetrieveUtils::retrieve_obj_priv_schema( const uint64_t tenant_id, @@ -4276,6 +4423,9 @@ int ObSchemaRetrieveUtils::fill_routine_schema(const uint64_t tenant_id, T &resu EXTRACT_INT_FIELD_TO_CLASS_MYSQL(result, overload, routine_schema, uint64_t); EXTRACT_INT_FIELD_TO_CLASS_MYSQL(result, routine_type, routine_schema, ObRoutineType); EXTRACT_INT_FIELD_TO_CLASS_MYSQL(result, schema_version, routine_schema, int64_t); + ObString empty_str(""); + EXTRACT_VARCHAR_FIELD_TO_CLASS_MYSQL_WITH_DEFAULT_VALUE( + result, priv_user, routine_schema, true, false, empty_str); } return ret; } diff --git a/src/share/schema/ob_schema_service.h b/src/share/schema/ob_schema_service.h index b2e6adfe06..f000f381fa 100755 --- a/src/share/schema/ob_schema_service.h +++ b/src/share/schema/ob_schema_service.h @@ -337,13 +337,13 @@ enum ObSchemaOperationCategory ACT(OB_DDL_DROP_RLS_CONTEXT, = 2053) \ ACT(OB_DDL_RLS_CONTEXT_OPERATION_END, = 2060) \ ACT(OB_DDL_ROUTINE_PRIV_OPERATION_BEGIN, = 2061) \ - ACT(OB_DDL_GRANT_REVOKE_ROUTINE_PRIV, = 2062) \ + ACT(OB_DDL_GRANT_ROUTINE_PRIV, = 2062) \ ACT(OB_DDL_DEL_ROUTINE_PRIV, = 2063) \ ACT(OB_DDL_ROUTINE_PRIV_OPERATION_END, = 2070) \ - ACT(OB_DDL_COLUMN_PRIV_OPERATION_BEGIN, = 2071) \ - ACT(OB_DDL_GRANT_COLUMN_PRIV, = 2072) \ - ACT(OB_DDL_DEL_COLUMN_PRIV, = 2073) \ - ACT(OB_DDL_COLUMN_PRIV_OPERATION_END, = 2080) \ + ACT(OB_DDL_COLUMN_PRIV_OPERATION_BEGIN, = 2071) \ + ACT(OB_DDL_GRANT_COLUMN_PRIV, = 2072) \ + ACT(OB_DDL_DEL_COLUMN_PRIV, = 2073) \ + ACT(OB_DDL_COLUMN_PRIV_OPERATION_END, = 2080) \ ACT(OB_DDL_MAX_OP,) DECLARE_ENUM(ObSchemaOperationType, op_type, OP_TYPE_DEF); @@ -361,6 +361,8 @@ IS_DDL_TYPE(DATABASE, database) IS_DDL_TYPE(USER, user) IS_DDL_TYPE(DB_PRIV, db_priv) IS_DDL_TYPE(TABLE_PRIV, table_priv) +IS_DDL_TYPE(ROUTINE_PRIV, routine_priv) +IS_DDL_TYPE(COLUMN_PRIV, column_priv) IS_DDL_TYPE(OUTLINE, outline) IS_DDL_TYPE(ZONE, zone) IS_DDL_TYPE(SYNONYM, synonym) @@ -432,6 +434,8 @@ public: uint64_t rls_policy_id_; uint64_t rls_group_id_; uint64_t rls_context_id_; + uint64_t routine_type_; + uint64_t column_priv_id_; }; union { common::ObString table_name_; @@ -441,10 +445,10 @@ public: common::ObString tablespace_name_; common::ObString context_name_; common::ObString mock_fk_parent_table_name_; + common::ObString routine_name_; }; ObSchemaOperationType op_type_; common::ObString ddl_stmt_str_; - bool operator <(const ObSchemaOperation &rv) const { return schema_version_ < rv.schema_version_; } void reset(); bool is_valid() const; @@ -897,6 +901,8 @@ public: GET_ALL_SCHEMA_FUNC_DECLARE_PURE_VIRTUAL(tablegroup, ObSimpleTablegroupSchema); GET_ALL_SCHEMA_FUNC_DECLARE_PURE_VIRTUAL(db_priv, ObDBPriv); GET_ALL_SCHEMA_FUNC_DECLARE_PURE_VIRTUAL(table_priv, ObTablePriv); + GET_ALL_SCHEMA_FUNC_DECLARE_PURE_VIRTUAL(routine_priv, ObRoutinePriv); + GET_ALL_SCHEMA_FUNC_DECLARE_PURE_VIRTUAL(column_priv, ObColumnPriv); GET_ALL_SCHEMA_FUNC_DECLARE_PURE_VIRTUAL(outline, ObSimpleOutlineSchema); GET_ALL_SCHEMA_FUNC_DECLARE_PURE_VIRTUAL(routine, ObSimpleRoutineSchema); GET_ALL_SCHEMA_FUNC_DECLARE_PURE_VIRTUAL(synonym, ObSimpleSynonymSchema); @@ -996,6 +1002,7 @@ public: virtual int fetch_new_rls_policy_id(const uint64_t tenant_id, uint64_t &new_rls_policy_id) = 0; virtual int fetch_new_rls_group_id(const uint64_t tenant_id, uint64_t &new_rls_group_id) = 0; virtual int fetch_new_rls_context_id(const uint64_t tenant_id, uint64_t &new_rls_context_id) = 0; + virtual int fetch_new_priv_id(const uint64_t tenant_id, uint64_t &new_priv_id) = 0; //------------------For managing privileges-----------------------------// #define GET_BATCH_SCHEMAS_WITH_ALLOCATOR_FUNC_DECLARE_PURE_VIRTUAL(SCHEMA, SCHEMA_TYPE) \ @@ -1021,6 +1028,8 @@ public: GET_BATCH_SCHEMAS_WITH_ALLOCATOR_FUNC_DECLARE_PURE_VIRTUAL(table, ObSimpleTableSchemaV2); GET_BATCH_SCHEMAS_FUNC_DECLARE_PURE_VIRTUAL(db_priv, ObDBPriv); GET_BATCH_SCHEMAS_FUNC_DECLARE_PURE_VIRTUAL(table_priv, ObTablePriv); + GET_BATCH_SCHEMAS_FUNC_DECLARE_PURE_VIRTUAL(routine_priv, ObRoutinePriv); + GET_BATCH_SCHEMAS_FUNC_DECLARE_PURE_VIRTUAL(column_priv, ObColumnPriv); GET_BATCH_SCHEMAS_FUNC_DECLARE_PURE_VIRTUAL(outline, ObSimpleOutlineSchema); GET_BATCH_SCHEMAS_FUNC_DECLARE_PURE_VIRTUAL(routine, ObSimpleRoutineSchema); GET_BATCH_SCHEMAS_FUNC_DECLARE_PURE_VIRTUAL(synonym, ObSimpleSynonymSchema); diff --git a/src/share/schema/ob_schema_service_sql_impl.cpp b/src/share/schema/ob_schema_service_sql_impl.cpp index 256914ed35..f21552c2f2 100644 --- a/src/share/schema/ob_schema_service_sql_impl.cpp +++ b/src/share/schema/ob_schema_service_sql_impl.cpp @@ -74,6 +74,9 @@ #define FETCH_ALL_DB_PRIV_HISTORY_SQL COMMON_SQL_WITH_TENANT #define FETCH_ALL_SYS_PRIV_HISTORY_SQL COMMON_SQL_WITH_TENANT #define FETCH_ALL_TABLE_PRIV_HISTORY_SQL COMMON_SQL_WITH_TENANT +#define FETCH_ALL_ROUTINE_PRIV_HISTORY_SQL COMMON_SQL_WITH_TENANT + +#define FETCH_ALL_COLUMN_PRIV_HISTORY_SQL COMMON_SQL_WITH_TENANT #define FETCH_ALL_OBJ_PRIV_HISTORY_SQL COMMON_SQL_WITH_TENANT #define FETCH_ALL_OUTLINE_HISTORY_SQL COMMON_SQL_WITH_TENANT #define FETCH_ALL_SYNONYM_HISTORY_SQL COMMON_SQL_WITH_TENANT @@ -1380,6 +1383,42 @@ int ObSchemaServiceSQLImpl::get_all_table_privs(ObISQLClient &client, return ret; } +int ObSchemaServiceSQLImpl::get_all_routine_privs(ObISQLClient &client, + const ObRefreshSchemaStatus &schema_status, + const int64_t schema_version, + const uint64_t tenant_id, + ObIArray &schema_array) +{ + int ret = OB_SUCCESS; + schema_array.reset(); + + if (!check_inner_stat()) { + ret = OB_NOT_INIT; + LOG_WARN("check inner stat fail", KR(ret)); + } else if (OB_FAIL(fetch_routine_privs(client, schema_status, schema_version, tenant_id, schema_array))) { + LOG_WARN("fetch tenants failed", K(ret)); + } + + return ret; +} + +int ObSchemaServiceSQLImpl::get_all_column_privs(ObISQLClient &client, + const ObRefreshSchemaStatus &schema_status, + const int64_t schema_version, + const uint64_t tenant_id, + ObIArray &schema_array) +{ + int ret = OB_SUCCESS; + schema_array.reset(); + if (!check_inner_stat()) { + ret = OB_NOT_INIT; + LOG_WARN("check inner stat fail", KR(ret)); + } else if (OB_FAIL(fetch_column_privs(client, schema_status, schema_version, tenant_id, schema_array))) { + LOG_WARN("fetch tenants failed", K(ret)); + } + return ret; +} + int ObSchemaServiceSQLImpl::get_sys_variable_schema( ObISQLClient &sql_client, const ObRefreshSchemaStatus &schema_status, @@ -2624,6 +2663,62 @@ int ObSchemaServiceSQLImpl::fetch_all_tenant_info( ret; \ }) +#define SQL_APPEND_ROUTINE_PRIV_ID(schema_keys, tenant_id, schema_key_size, sql) \ + ({ \ + int ret = OB_SUCCESS; \ + if (OB_FAIL(sql.append("("))) { \ + LOG_WARN("append sql failed", K(ret)); \ + } else { \ + for (int64_t i = 0; OB_SUCC(ret) && i < schema_key_size; ++i) { \ + if (OB_FAIL(sql.append_fmt("%s(%lu, %lu, ", 0 == i ? "" : ", ", \ + fill_extract_tenant_id(schema_status, tenant_id), \ + fill_extract_schema_id(schema_status, schema_keys[i].user_id_)))) { \ + LOG_WARN("append sql failed", K(ret)); \ + } else if (OB_FAIL(sql_append_hex_escape_str(schema_keys[i].database_name_, sql))) { \ + LOG_WARN("fail to append database name", K(ret)); \ + } else if (OB_FAIL(sql.append(", "))) { \ + LOG_WARN("append sql failed", K(ret)); \ + } else if (OB_FAIL(sql_append_hex_escape_str(schema_keys[i].routine_name_, sql))) { \ + LOG_WARN("fail to append database name", K(ret)); \ + } else if (OB_FAIL(sql.append(", "))) { \ + LOG_WARN("append sql failed", K(ret)); \ + } else if (OB_FAIL(sql.append_fmt("%lu ", schema_keys[i].get_routine_priv_key().routine_type_))) { \ + LOG_WARN("append sql failed", K(ret)); \ + } else if (OB_FAIL(sql.append(")"))) { \ + LOG_WARN("append sql failed", K(ret)); \ + } \ + } \ + if (OB_SUCC(ret)) { \ + if (OB_FAIL(sql.append(")"))) { \ + LOG_WARN("append sql failed", K(ret)); \ + } \ + } \ + } \ + ret; \ + }) + +#define SQL_APPEND_COLUMN_PRIV_ID(schema_keys, tenant_id, schema_key_size, sql) \ + ({ \ + int ret = OB_SUCCESS; \ + if (OB_FAIL(sql.append("("))) { \ + LOG_WARN("append sql failed", K(ret)); \ + } else { \ + for (int64_t i = 0; OB_SUCC(ret) && i < schema_key_size; ++i) { \ + if (OB_FAIL(sql.append_fmt("%s(%lu, %lu) ", 0 == i ? "" : ", ", \ + fill_extract_tenant_id(schema_status, tenant_id), \ + schema_keys[i].column_priv_id_))) { \ + LOG_WARN("append sql failed", K(ret)); \ + } \ + } \ + if (OB_SUCC(ret)) { \ + if (OB_FAIL(sql.append(")"))) { \ + LOG_WARN("append sql failed", K(ret)); \ + } \ + } \ + } \ + ret; \ + }) + #define SQL_APPEND_OBJ_PRIV_ID(schema_keys, tenant_id, schema_key_size, sql) \ ({ \ int ret = OB_SUCCESS; \ @@ -2984,6 +3079,13 @@ FETCH_NEW_SCHEMA_ID(RLS_CONTEXT, rls_context); #undef FETCH_NEW_SCHEMA_ID +int ObSchemaServiceSQLImpl::fetch_new_priv_id( + const uint64_t tenant_id, + uint64_t &new_priv_id) +{ + return fetch_new_schema_id_(tenant_id, OB_MAX_USED_OBJECT_ID_TYPE, new_priv_id); +} + int ObSchemaServiceSQLImpl::fetch_new_normal_rowid_table_tablet_ids_( const uint64_t tenant_id, const uint64_t size, @@ -3356,6 +3458,8 @@ GET_BATCH_SCHEMAS_FUNC_DEFINE(database, ObSimpleDatabaseSchema); GET_BATCH_SCHEMAS_FUNC_DEFINE(tablegroup, ObSimpleTablegroupSchema); GET_BATCH_SCHEMAS_FUNC_DEFINE(db_priv, ObDBPriv); GET_BATCH_SCHEMAS_FUNC_DEFINE(table_priv, ObTablePriv); +GET_BATCH_SCHEMAS_FUNC_DEFINE(routine_priv, ObRoutinePriv); +GET_BATCH_SCHEMAS_FUNC_DEFINE(column_priv, ObColumnPriv); GET_BATCH_SCHEMAS_FUNC_DEFINE(outline, ObSimpleOutlineSchema); GET_BATCH_SCHEMAS_FUNC_DEFINE(synonym, ObSimpleSynonymSchema); GET_BATCH_SCHEMAS_FUNC_DEFINE(routine, ObSimpleRoutineSchema); @@ -4636,6 +4740,7 @@ int ObSchemaServiceSQLImpl::fetch_role_grantee_map_info( SMART_VAR(ObMySQLProxy::MySQLResult, res) { ObMySQLResult *result = NULL; ObSqlString sql; + bool is_oracle_mode = false; const bool is_full_schema = (NULL != user_keys && users_size > 0) ? false : true; const int64_t snapshot_timestamp = schema_status.snapshot_timestamp_; const uint64_t exec_tenant_id = fill_exec_tenant_id(schema_status); @@ -4643,6 +4748,8 @@ int ObSchemaServiceSQLImpl::fetch_role_grantee_map_info( if (OB_FAIL(sql.append_fmt(FETCH_ALL_ROLE_GRANTEE_MAP_HISTORY_SQL, OB_ALL_TENANT_ROLE_GRANTEE_MAP_HISTORY_TNAME, ObSchemaUtils::get_extract_tenant_id(exec_tenant_id, tenant_id)))) { LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(ObCompatModeGetter::check_is_oracle_mode_with_tenant_id(tenant_id, is_oracle_mode))) { + LOG_WARN("failed to get oracle mode", K(ret)); } else if (!is_full_schema) { for (int64_t i = 0; OB_SUCC(ret) && i < users_size; ++i) { const uint64_t user_id = ObSchemaUtils::get_extract_schema_id(exec_tenant_id, user_keys[i]); @@ -4657,7 +4764,7 @@ int ObSchemaServiceSQLImpl::fetch_role_grantee_map_info( LOG_WARN("append sql failed", K(ret), K(i), K(user_id)); } } else { - if (!user_array.at(i).is_role()) { + if (!user_array.at(i).is_role() && is_oracle_mode) { // skip, user_array.at(i) is user, it's no need to fetch grantee ids } else { if (!is_need_inc_fetch) { @@ -5323,6 +5430,56 @@ int ObSchemaServiceSQLImpl::fetch_table_privs( return ret; } +int ObSchemaServiceSQLImpl::fetch_routine_privs( + ObISQLClient &sql_client, + const ObRefreshSchemaStatus &schema_status, + const int64_t schema_version, + const uint64_t tenant_id, + ObIArray &schema_array, + const SchemaKey *schema_keys, + const int64_t schema_key_size) +{ + int ret = OB_SUCCESS; + + SMART_VAR(ObMySQLProxy::MySQLResult, res) { + ObMySQLResult *result = NULL; + ObSqlString sql; + const int64_t snapshot_timestamp = schema_status.snapshot_timestamp_; + const uint64_t exec_tenant_id = fill_exec_tenant_id(schema_status); + if (OB_FAIL(sql.append_fmt(FETCH_ALL_ROUTINE_PRIV_HISTORY_SQL, OB_ALL_ROUTINE_PRIVILEGE_HISTORY_TNAME, + fill_extract_tenant_id(schema_status, tenant_id)))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql.append_fmt(" AND SCHEMA_VERSION <= %ld", schema_version))) { + LOG_WARN("append sql failed", K(ret)); + } else if (NULL != schema_keys && schema_key_size > 0) { + // database_name/routine_name is case sensitive + if (OB_FAIL(sql.append_fmt(" AND (tenant_id, user_id, BINARY database_name, \ + BINARY routine_name, routine_type) in"))) { + LOG_WARN("append failed", K(ret)); + } else if (OB_FAIL(SQL_APPEND_ROUTINE_PRIV_ID(schema_keys, tenant_id, schema_key_size, sql))) { + LOG_WARN("sql append routine priv id failed", K(ret)); + } + } + if (OB_SUCC(ret)) { + DEFINE_SQL_CLIENT_RETRY_WEAK_WITH_SNAPSHOT(sql_client, snapshot_timestamp); + if (OB_FAIL(sql.append(" ORDER BY tenant_id desc, user_id desc," \ + "BINARY database_name desc, BINARY routine_name desc, " \ + "routine_type desc, schema_version desc"))) { + LOG_WARN("sql append failed", K(ret)); + } else if (OB_FAIL(sql_client_retry_weak.read(res, exec_tenant_id, sql.ptr()))) { + LOG_WARN("execute sql failed", K(ret), K(tenant_id), K(sql)); + } else if (OB_UNLIKELY(NULL == (result = res.get_result()))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get result. ", K(ret)); + } else if (OB_FAIL(ObSchemaRetrieveUtils::retrieve_routine_priv_schema(tenant_id, *result, schema_array))) { + LOG_WARN("failed to retrieve routine priv schema", K(ret)); + } + } + + } + return ret; +} + int ObSchemaServiceSQLImpl::fetch_obj_privs( ObISQLClient &sql_client, const ObRefreshSchemaStatus &schema_status, @@ -5419,6 +5576,50 @@ int ObSchemaServiceSQLImpl::fetch_udfs( return ret; } +int ObSchemaServiceSQLImpl::fetch_column_privs( + ObISQLClient &sql_client, + const ObRefreshSchemaStatus &schema_status, + const int64_t schema_version, + const uint64_t tenant_id, + ObIArray &schema_array, + const SchemaKey *schema_keys, + const int64_t schema_key_size) +{ + int ret = OB_SUCCESS; + SMART_VAR(ObMySQLProxy::MySQLResult, res) { + ObMySQLResult *result = NULL; + ObSqlString sql; + const int64_t snapshot_timestamp = schema_status.snapshot_timestamp_; + const uint64_t exec_tenant_id = fill_exec_tenant_id(schema_status); + if (OB_FAIL(sql.append_fmt(FETCH_ALL_COLUMN_PRIV_HISTORY_SQL, OB_ALL_COLUMN_PRIVILEGE_HISTORY_TNAME, + fill_extract_tenant_id(schema_status, tenant_id)))) { + LOG_WARN("append sql failed", K(ret)); + } else if (OB_FAIL(sql.append_fmt(" AND SCHEMA_VERSION <= %ld", schema_version))) { + LOG_WARN("append sql failed", K(ret)); + } else if (NULL != schema_keys && schema_key_size > 0) { + // database_name/routine_name is case sensitive + if (OB_FAIL(sql.append_fmt(" AND (tenant_id, priv_id) in"))) { + LOG_WARN("append failed", K(ret)); + } else if (OB_FAIL(SQL_APPEND_COLUMN_PRIV_ID(schema_keys, tenant_id, schema_key_size, sql))) { + LOG_WARN("sql append column priv id failed", K(ret)); + } + } + if (OB_SUCC(ret)) { + DEFINE_SQL_CLIENT_RETRY_WEAK_WITH_SNAPSHOT(sql_client, snapshot_timestamp); + if (OB_FAIL(sql.append(" ORDER BY tenant_id desc, priv_id desc, schema_version desc"))) { + LOG_WARN("sql append failed", K(ret)); + } else if (OB_FAIL(sql_client_retry_weak.read(res, exec_tenant_id, sql.ptr()))) { + LOG_WARN("execute sql failed", K(ret), K(tenant_id), K(sql)); + } else if (OB_UNLIKELY(NULL == (result = res.get_result()))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get result. ", K(ret)); + } else if (OB_FAIL(ObSchemaRetrieveUtils::retrieve_column_priv_schema(tenant_id, *result, schema_array))) { + LOG_WARN("failed to retrieve column priv schema", K(ret)); + } + } + } + return ret; +} int ObSchemaServiceSQLImpl::fetch_rls_policys( ObISQLClient &sql_client, const ObRefreshSchemaStatus &schema_status, diff --git a/src/share/schema/ob_schema_service_sql_impl.h b/src/share/schema/ob_schema_service_sql_impl.h index cbaf6ccabe..462b02d4a5 100644 --- a/src/share/schema/ob_schema_service_sql_impl.h +++ b/src/share/schema/ob_schema_service_sql_impl.h @@ -205,6 +205,8 @@ public: GET_ALL_SCHEMA_FUNC_DECLARE(tablegroup, ObSimpleTablegroupSchema); GET_ALL_SCHEMA_FUNC_DECLARE(db_priv, ObDBPriv); GET_ALL_SCHEMA_FUNC_DECLARE(table_priv, ObTablePriv); + GET_ALL_SCHEMA_FUNC_DECLARE(routine_priv, ObRoutinePriv); + GET_ALL_SCHEMA_FUNC_DECLARE(column_priv, ObColumnPriv); GET_ALL_SCHEMA_FUNC_DECLARE(outline, ObSimpleOutlineSchema); GET_ALL_SCHEMA_FUNC_DECLARE(routine, ObSimpleRoutineSchema); GET_ALL_SCHEMA_FUNC_DECLARE(synonym, ObSimpleSynonymSchema); @@ -312,7 +314,7 @@ public: virtual int fetch_new_rls_policy_id(const uint64_t tenant_id, uint64_t &new_rls_policy_id); virtual int fetch_new_rls_group_id(const uint64_t tenant_id, uint64_t &new_rls_group_id); virtual int fetch_new_rls_context_id(const uint64_t tenant_id, uint64_t &new_rls_context_id); - + virtual int fetch_new_priv_id(const uint64_t tenant_id, uint64_t &new_priv_id); // virtual int insert_sys_param(const ObSysParam &sys_param, // common::ObISQLClient *sql_client); @@ -347,6 +349,8 @@ public: GET_BATCH_SCHEMAS_WITH_ALLOCATOR_FUNC_DECLARE(table, ObSimpleTableSchemaV2); GET_BATCH_SCHEMAS_FUNC_DECLARE(db_priv, ObDBPriv); GET_BATCH_SCHEMAS_FUNC_DECLARE(table_priv, ObTablePriv); + GET_BATCH_SCHEMAS_FUNC_DECLARE(routine_priv, ObRoutinePriv); + GET_BATCH_SCHEMAS_FUNC_DECLARE(column_priv, ObColumnPriv); GET_BATCH_SCHEMAS_FUNC_DECLARE(outline, ObSimpleOutlineSchema); GET_BATCH_SCHEMAS_FUNC_DECLARE(routine, ObSimpleRoutineSchema); GET_BATCH_SCHEMAS_FUNC_DECLARE(synonym, ObSimpleSynonymSchema); @@ -437,6 +441,8 @@ public: FETCH_SCHEMAS_FUNC_DECLARE(tablegroup, ObSimpleTablegroupSchema); FETCH_SCHEMAS_FUNC_DECLARE(db_priv, ObDBPriv); FETCH_SCHEMAS_FUNC_DECLARE(table_priv, ObTablePriv); + FETCH_SCHEMAS_FUNC_DECLARE(routine_priv, ObRoutinePriv); + FETCH_SCHEMAS_FUNC_DECLARE(column_priv, ObColumnPriv); FETCH_SCHEMAS_FUNC_DECLARE(outline, ObSimpleOutlineSchema); FETCH_SCHEMAS_FUNC_DECLARE(routine, ObSimpleRoutineSchema); FETCH_SCHEMAS_FUNC_DECLARE(synonym, ObSimpleSynonymSchema); diff --git a/src/share/schema/ob_schema_struct.cpp b/src/share/schema/ob_schema_struct.cpp index 189c7b01f2..782ce2c3f8 100644 --- a/src/share/schema/ob_schema_struct.cpp +++ b/src/share/schema/ob_schema_struct.cpp @@ -2098,7 +2098,7 @@ OB_DEF_SERIALIZE(ObTenantSchema) primary_zone_, locked_, comment_, charset_type_, collation_type_, name_case_mode_, read_only_, locality_str_, previous_locality_str_); - if (!OB_SUCC(ret)) { + if (OB_FAIL(ret)) { LOG_WARN("func_SERIALIZE failed", K(ret)); } else if (OB_FAIL(serialize_string_array(buf, buf_len, pos, zone_list_))) { LOG_WARN("serialize_string_array failed", K(ret)); @@ -2553,7 +2553,7 @@ OB_DEF_SERIALIZE(ObDatabaseSchema) database_id_, schema_version_, database_name_, comment_, charset_type_, collation_type_, name_case_mode_, read_only_, default_tablegroup_id_, default_tablegroup_name_, in_recyclebin_); - if (!OB_SUCC(ret)) { + if (OB_FAIL(ret)) { LOG_WARN("func_SERIALIZE failed", K(ret)); } else {} // no more to do return ret; @@ -2569,7 +2569,7 @@ OB_DEF_DESERIALIZE(ObDatabaseSchema) database_id_, schema_version_, database_name, comment, charset_type_, collation_type_, name_case_mode_, read_only_, default_tablegroup_id_, default_tablegroup_name, in_recyclebin_); - if (!OB_SUCC(ret)) { + if (OB_FAIL(ret)) { LOG_WARN("Fail to deserialize data", K(ret)); } else if (OB_FAIL(set_database_name(database_name))) { LOG_WARN("set_tenant_name failed", K(ret)); @@ -2868,7 +2868,7 @@ OB_DEF_SERIALIZE(ObLocality) { int ret = OB_SUCCESS; LST_DO_CODE(OB_UNIS_ENCODE, locality_str_); - if (!OB_SUCC(ret)) { + if (OB_FAIL(ret)) { LOG_WARN("func_SERIALIZE failed", K(ret)); } else {} // no more to do return ret; @@ -5352,7 +5352,7 @@ OB_DEF_DESERIALIZE(ObPartitionOption) part_func_expr, part_num_, auto_part_, auto_part_size_); - if (!OB_SUCC(ret)) { + if (OB_FAIL(ret)) { LOG_WARN("Fail to deserialize data, ", K(ret)); } else if (OB_FAIL(deep_copy_str(part_func_expr, part_func_expr_))) { LOG_WARN("Fail to deep copy part_func_expr, ", K(ret)); @@ -8154,7 +8154,7 @@ OB_DEF_DESERIALIZE(ObViewSchema) collation_connection_, container_table_id_); - if (!OB_SUCC(ret)) { + if (OB_FAIL(ret)) { LOG_WARN("Fail to deserialize data, ", K(ret)); } else if (OB_FAIL(deep_copy_str(definition, view_definition_))) { LOG_WARN("Fail to deep copy view definition, ", K(ret)); @@ -8299,9 +8299,6 @@ DEF_TO_STRING(ObPrintPrivSet) if ((priv_set_ & OB_PRIV_REFERENCES) && OB_SUCCESS == ret) { ret = BUF_PRINTF("PRIV_REFERENCES,"); } - if ((priv_set_ & OB_PRIV_EXECUTE) && OB_SUCCESS == ret) { - ret = BUF_PRINTF("PRIV_EXECUTE,"); - } if ((priv_set_ & OB_PRIV_FLASHBACK) && OB_SUCCESS == ret) { ret = BUF_PRINTF("PRIV_FLASHBACK,"); } @@ -8338,6 +8335,15 @@ DEF_TO_STRING(ObPrintPrivSet) if ((priv_set_ & OB_PRIV_CREATE_DATABASE_LINK) && OB_SUCCESS == ret) { ret = BUF_PRINTF(" CREATE DATABASE LINK,"); } + if ((priv_set_ & OB_PRIV_EXECUTE) && OB_SUCCESS == ret) { + ret = BUF_PRINTF(" EXECUTE,"); + } + if ((priv_set_ & OB_PRIV_ALTER_ROUTINE) && OB_SUCCESS == ret) { + ret = BUF_PRINTF(" ALTER ROUTINE,"); + } + if ((priv_set_ & OB_PRIV_CREATE_ROUTINE) && OB_SUCCESS == ret) { + ret = BUF_PRINTF(" CREATE ROUTINE,"); + } if (OB_SUCCESS == ret && pos > 1) { pos--; //Delete last ',' } @@ -8377,18 +8383,20 @@ DEF_TO_STRING(ObPrintPackedPrivArray) } //ObPriv - -ObPriv& ObPriv::operator=(const ObPriv &other) +int ObPriv::assign(const ObPriv &other) { + int ret = OB_SUCCESS; if (this != &other) { reset(); tenant_id_ = other.tenant_id_; user_id_ = other.user_id_; schema_version_ = other.schema_version_; priv_set_ = other.priv_set_; - priv_array_ = other.priv_array_; + if (OB_FAIL(set_priv_array(other.priv_array_))) { + LOG_WARN("assgin priv array failed", K(ret)); + } } - return *this; + return ret; } void ObPriv::reset() @@ -8649,11 +8657,11 @@ int ObUserInfo::assign(const ObUserInfo &other) if (this != &other) { reset(); error_ret_ = other.error_ret_; - ObPriv::operator=(other); - locked_ = other.locked_; - ssl_type_ = other.ssl_type_; - - if (OB_FAIL(deep_copy_str(other.user_name_, user_name_))) { + if (OB_FAIL(ObPriv::assign(other))) { + LOG_WARN("assign failed", K(ret)); + } else if (OB_FALSE_IT(locked_ = other.locked_)) { + } else if (OB_FALSE_IT(ssl_type_ = other.ssl_type_)) { + } else if (OB_FAIL(deep_copy_str(other.user_name_, user_name_))) { LOG_WARN("Fail to deep copy user_name", K(ret)); } else if (OB_FAIL(deep_copy_str(other.host_name_, host_name_))) { LOG_WARN("Fail to deep copy host_name", K(ret)); @@ -8879,7 +8887,7 @@ OB_DEF_DESERIALIZE(ObUserInfo) x509_issuer, x509_subject); - if (!OB_SUCC(ret)) { + if (OB_FAIL(ret)) { LOG_WARN("Fail to deserialize data", K(ret)); } else if (OB_FAIL(deep_copy_str(user_name, user_name_))) { LOG_WARN("Fail to deep copy", K(user_name), K(ret)); @@ -9029,11 +9037,12 @@ ObDBPriv& ObDBPriv::operator=(const ObDBPriv &other) reset(); int ret = OB_SUCCESS; error_ret_ = other.error_ret_; - ObPriv::operator=(other); - sort_ = other.sort_; - - if (OB_FAIL(deep_copy_str(other.db_, db_))) { + if (OB_FAIL(ObPriv::assign(other))) { + LOG_WARN("assign failed", K(ret)); + } else if (OB_FAIL(deep_copy_str(other.db_, db_))) { LOG_WARN("Fail to deep copy db", K(ret)); + } else { + sort_ = other.sort_; } if (OB_FAIL(ret)) { error_ret_ = ret; @@ -9078,7 +9087,7 @@ OB_DEF_DESERIALIZE(ObDBPriv) ObString db; BASE_DESER((, ObPriv)); LST_DO_CODE(OB_UNIS_DECODE, db, sort_); - if (!OB_SUCC(ret)) { + if (OB_FAIL(ret)) { LOG_WARN("Fail to deserialize data", K(ret)); } else if (OB_FAIL(deep_copy_str(db, db_))) { LOG_WARN("Fail to deep copy user_name", K(db), K(ret)); @@ -9100,9 +9109,9 @@ ObTablePriv& ObTablePriv::operator=(const ObTablePriv &other) reset(); int ret = OB_SUCCESS; error_ret_ = other.error_ret_; - ObPriv::operator=(other); - - if (OB_FAIL(deep_copy_str(other.db_, db_))) { + if (OB_FAIL(ObPriv::assign(other))) { + LOG_WARN("assign failed", K(ret)); + } else if (OB_FAIL(deep_copy_str(other.db_, db_))) { LOG_WARN("Fail to deep copy db", K(ret)); } else if (OB_FAIL(deep_copy_str(other.table_, table_))) { LOG_WARN("Fail to deep copy table", K(ret)); @@ -9152,7 +9161,7 @@ OB_DEF_DESERIALIZE(ObTablePriv) ObString table; BASE_DESER((, ObPriv)); LST_DO_CODE(OB_UNIS_DECODE, db, table); - if (!OB_SUCC(ret)) { + if (OB_FAIL(ret)) { LOG_WARN("Fail to deserialize data", K(ret)); } else if (OB_FAIL(deep_copy_str(db, db_))) { LOG_WARN("Fail to deep copy user_name", K(db), K(ret)); @@ -9169,19 +9178,195 @@ OB_DEF_SERIALIZE_SIZE(ObTablePriv) return len; } +//ObRoutinePriv + +int ObRoutinePriv::assign(const ObRoutinePriv &other) +{ + int ret = OB_SUCCESS; + if (this != &other) { + reset(); + if (OB_FAIL(ObPriv::assign(other))) { + LOG_WARN("assign failed", K(ret)); + } else if (OB_FAIL(deep_copy_str(other.db_, db_))) { + LOG_WARN("Fail to deep copy db", K(ret)); + } else if (OB_FAIL(deep_copy_str(other.routine_, routine_))) { + LOG_WARN("Fail to deep copy table", K(ret)); + } else { + routine_type_ = other.routine_type_; + error_ret_ = other.error_ret_; + } + if (OB_FAIL(ret)) { + error_ret_ = ret; + } + } + return ret; +} + +bool ObRoutinePriv::is_valid() const +{ + return ObSchema::is_valid() && ObPriv::is_valid() && routine_type_ != 0; +} + +void ObRoutinePriv::reset() +{ + db_.reset(); + routine_.reset(); + routine_type_ = 0; + ObSchema::reset(); + ObPriv::reset(); +} + +int64_t ObRoutinePriv::get_convert_size() const +{ + int64_t convert_size = 0; + convert_size += ObPriv::get_convert_size(); + convert_size += sizeof(ObRoutinePriv) - sizeof(ObPriv); + convert_size += db_.length() + 1; + convert_size += routine_.length() + 1; + return convert_size; +} + +OB_DEF_SERIALIZE(ObRoutinePriv) +{ + int ret = OB_SUCCESS; + BASE_SER((, ObPriv)); + LST_DO_CODE(OB_UNIS_ENCODE, db_, routine_, routine_type_); + return ret; +} + +OB_DEF_DESERIALIZE(ObRoutinePriv) +{ + int ret = OB_SUCCESS; + ObString db; + ObString routine; + int64_t routine_type; + BASE_DESER((, ObPriv)); + LST_DO_CODE(OB_UNIS_DECODE, db, routine, routine_type); + if (OB_FAIL(ret)) { + LOG_WARN("Fail to deserialize data", K(ret)); + } else if (OB_FAIL(deep_copy_str(db, db_))) { + LOG_WARN("Fail to deep copy user_name", K(db), K(ret)); + } else if (OB_FAIL(deep_copy_str(routine, routine_))) { + LOG_WARN("Fail to deep copy user_name", K(routine_), K(ret)); + } else {} + return ret; +} + +OB_DEF_SERIALIZE_SIZE(ObRoutinePriv) +{ + int64_t len = ObPriv::get_serialize_size(); + LST_DO_CODE(OB_UNIS_ADD_LEN, db_, routine_, routine_type_); + return len; +} + +int ObColumnPriv::assign(const ObColumnPriv &other) +{ + int ret = OB_SUCCESS; + if (this != &other) { + reset(); + if (OB_FAIL(ObPriv::assign(other))) { + LOG_WARN("assign failed", K(ret)); + } else if (OB_FAIL(deep_copy_str(other.db_, db_))) { + LOG_WARN("Fail to deep copy db", K(ret)); + } else if (OB_FAIL(deep_copy_str(other.table_, table_))) { + LOG_WARN("Fail to deep copy table", K(ret)); + } else if (OB_FAIL(deep_copy_str(other.column_, column_))) { + LOG_WARN("Fail to deep copy table", K(ret)); + } else { + priv_id_ = other.priv_id_; + error_ret_ = other.error_ret_; + } + if (OB_FAIL(ret)) { + error_ret_ = ret; + } + } + return ret; +} + +bool ObColumnPriv::is_valid() const +{ + return ObSchema::is_valid() && ObPriv::is_valid() && priv_id_ != OB_INVALID_ID; +} + +void ObColumnPriv::reset() +{ + db_.reset(); + table_.reset(); + column_.reset(); + priv_id_ = 0; + ObPriv::reset(); + ObSchema::reset(); +} + +int64_t ObColumnPriv::get_convert_size() const +{ + int64_t convert_size = 0; + convert_size += ObPriv::get_convert_size(); + convert_size += sizeof(ObColumnPriv) - sizeof(ObPriv); + convert_size += db_.length() + 1; + convert_size += table_.length() + 1; + convert_size += column_.length() + 1; + return convert_size; +} + +OB_DEF_SERIALIZE(ObColumnPriv) +{ + int ret = OB_SUCCESS; + BASE_SER((, ObPriv)); + LST_DO_CODE(OB_UNIS_ENCODE, db_, table_, column_, priv_id_); + return ret; +} + +OB_DEF_DESERIALIZE(ObColumnPriv) +{ + int ret = OB_SUCCESS; + ObString db; + ObString table; + ObString column; + uint64_t priv_id; + BASE_DESER((, ObPriv)); + LST_DO_CODE(OB_UNIS_DECODE, db, table, column, priv_id); + if (OB_FAIL(ret)) { + LOG_WARN("Fail to deserialize data", K(ret)); + } else if (OB_FAIL(deep_copy_str(db, db_))) { + LOG_WARN("Fail to deep copy user_name", K(db), K(ret)); + } else if (OB_FAIL(deep_copy_str(table, table_))) { + LOG_WARN("Fail to deep copy user_name", K(table), K(ret)); + } else if (OB_FAIL(deep_copy_str(column, column_))) { + LOG_WARN("Fail to deep copy user_name", K(column), K(ret)); + } else { + priv_id_ = priv_id; + } + return ret; +} + +OB_DEF_SERIALIZE_SIZE(ObColumnPriv) +{ + int64_t len = ObPriv::get_serialize_size(); + LST_DO_CODE(OB_UNIS_ADD_LEN, db_, table_, column_, priv_id_); + return len; +} + //ObObjPriv ObObjPriv& ObObjPriv::operator=(const ObObjPriv &other) { if (this != &other) { reset(); - error_ret_ = other.error_ret_; - ObPriv::operator=(other); + int ret = OB_SUCCESS; + if (OB_FAIL(ObPriv::assign(other))) { + LOG_WARN("assign failed", K(ret)); + } else { + error_ret_ = other.error_ret_; + obj_id_ = other.obj_id_; + obj_type_ = other.obj_type_; + col_id_ = other.col_id_; + grantor_id_ = other.grantor_id_; + grantee_id_ = other.grantee_id_; + } - obj_id_ = other.obj_id_; - obj_type_ = other.obj_type_; - col_id_ = other.col_id_; - grantor_id_ = other.grantor_id_; - grantee_id_ = other.grantee_id_; + if (OB_FAIL(ret)) { + error_ret_ = ret; + } } return *this; } @@ -9237,9 +9422,15 @@ ObSysPriv& ObSysPriv::operator=(const ObSysPriv &other) { if (this != &other) { reset(); + int ret = OB_SUCCESS; + if (OB_FAIL(ObPriv::assign(other))) { + LOG_WARN("assign failed", K(ret)); + } error_ret_ = other.error_ret_; grantee_id_= other.grantee_id_; - ObPriv::operator=(other); + if (OB_FAIL(ret)) { + error_ret_ = ret; + } } return *this; } @@ -9276,7 +9467,7 @@ OB_DEF_DESERIALIZE(ObSysPriv) int ret = OB_SUCCESS; BASE_DESER((, ObPriv)); LST_DO_CODE(OB_UNIS_DECODE, grantee_id_); - if (!OB_SUCC(ret)) { + if (OB_FAIL(ret)) { LOG_WARN("Fail to deserialize data", K(ret)); } return ret; @@ -9297,10 +9488,21 @@ int ObNeedPriv::deep_copy(const ObNeedPriv &other, common::ObIAllocator &allocat is_sys_table_ = other.is_sys_table_; is_for_update_ = other.is_for_update_; priv_check_type_ = other.priv_check_type_; + obj_type_ = other.obj_type_; + check_any_column_priv_ = other.check_any_column_priv_; if (OB_FAIL(ob_write_string(allocator, other.db_, db_))) { LOG_WARN("Fail to deep copy db", K_(db), K(ret)); } else if (OB_FAIL(ob_write_string(allocator, other.table_, table_))) { LOG_WARN("Fail to deep copy table", K_(table), K(ret)); + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < other.columns_.count(); i++) { + ObString tmp_column; + if (OB_FAIL(ob_write_string(allocator, other.columns_.at(i), tmp_column))) { + LOG_WARN("ob write string failed", K(ret)); + } else if (OB_FAIL(columns_.push_back(tmp_column))) { + LOG_WARN("push back failed", K(ret)); + } + } } return ret; } @@ -9653,6 +9855,8 @@ const char *schema_type_str(const ObSchemaType schema_type) str = "database_priv"; } else if (TABLE_PRIV == schema_type) { str = "table_priv"; + } else if (ROUTINE_PRIV == schema_type) { + str = "routine_priv"; } else if (OUTLINE_SCHEMA == schema_type) { str = "outline_schema"; } else if (SYNONYM_SCHEMA == schema_type) { diff --git a/src/share/schema/ob_schema_struct.h b/src/share/schema/ob_schema_struct.h index fca27e20e1..4b80371749 100755 --- a/src/share/schema/ob_schema_struct.h +++ b/src/share/schema/ob_schema_struct.h @@ -1660,6 +1660,7 @@ public: inline uint64_t get_default_tablegroup_id() const { return default_tablegroup_id_; } inline const common::ObString &get_default_tablegroup_name() const { return default_tablegroup_name_; } inline common::ObCompatibilityMode get_compatibility_mode() const { return compatibility_mode_; } + inline bool is_oracle_tenant() const { return common::ObCompatibilityMode::ORACLE_MODE == compatibility_mode_; @@ -4022,7 +4023,7 @@ public: { } virtual ~ObPriv() { } - ObPriv& operator=(const ObPriv &other); + int assign(const ObPriv &other); static bool cmp_tenant_user_id(const ObPriv *lhs, const ObTenantUserId &tenant_user_id) { return (lhs->get_tenant_user_id() < tenant_user_id); } static bool equal_tenant_user_id(const ObPriv *lhs, const ObTenantUserId &tenant_user_id) @@ -4064,6 +4065,8 @@ protected: ObPrivSet priv_set_; //ObPrivSet ora_sys_priv_set_; ObPackedPrivArray priv_array_; + + DISABLE_COPY_ASSIGN(ObPriv); }; // Not used now @@ -4624,6 +4627,223 @@ struct ObTablePrivSortKey common::ObString table_; }; +struct ObRoutinePrivDBKey +{ + ObRoutinePrivDBKey() : tenant_id_(common::OB_INVALID_ID), user_id_(common::OB_INVALID_ID) + {} + ObRoutinePrivDBKey(const uint64_t tenant_id, const uint64_t user_id, const common::ObString &db) + : tenant_id_(tenant_id), user_id_(user_id), db_(db) + {} + bool operator==(const ObRoutinePrivDBKey &rhs) const + { + return (tenant_id_ == rhs.tenant_id_) && (user_id_ == rhs.user_id_) + && (db_ == rhs.db_); + } + bool operator!=(const ObRoutinePrivDBKey &rhs) const + { + return !(*this == rhs); + } + bool operator<(const ObRoutinePrivDBKey &rhs) const + { + bool bret = tenant_id_ < rhs.tenant_id_; + if (false == bret && tenant_id_ == rhs.tenant_id_) { + bret = user_id_ < rhs.user_id_; + if (false == bret && user_id_ == rhs.user_id_) { + bret = db_ < rhs.db_; + } + } + return bret; + } + uint64_t tenant_id_; + uint64_t user_id_; + common::ObString db_; +}; + +struct ObRoutinePrivSortKey +{ + ObRoutinePrivSortKey() : tenant_id_(common::OB_INVALID_ID), user_id_(common::OB_INVALID_ID) + {} + ObRoutinePrivSortKey(const uint64_t tenant_id, const uint64_t user_id, + const common::ObString &db, const common::ObString &routine, int64_t routine_type) + : tenant_id_(tenant_id), user_id_(user_id), db_(db), routine_(routine), routine_type_(routine_type) + {} + bool operator==(const ObRoutinePrivSortKey &rhs) const + { + ObCompareNameWithTenantID name_cmp(tenant_id_); + return (tenant_id_ == rhs.tenant_id_) && (user_id_ == rhs.user_id_) + && (db_ == rhs.db_) && (0 == name_cmp.compare(routine_, rhs.routine_)) && (routine_type_ == rhs.routine_type_); + } + bool operator!=(const ObRoutinePrivSortKey &rhs) const + { + return !(*this == rhs); + } + bool operator<(const ObRoutinePrivSortKey &rhs) const + { + ObCompareNameWithTenantID name_cmp(tenant_id_); + bool bret = tenant_id_ < rhs.tenant_id_; + if (false == bret && tenant_id_ == rhs.tenant_id_) { + bret = user_id_ < rhs.user_id_; + if (false == bret && user_id_ == rhs.user_id_) { + bret = db_ < rhs.db_; + if (false == bret && db_ == rhs.db_) { + int routine_cmp_ret = name_cmp.compare(routine_, rhs.routine_); + if (routine_cmp_ret < 0) { + bret = true; + } else { + bret = false; + } + if (false == bret && 0 == routine_cmp_ret) { + bret = routine_type_ < rhs.routine_type_; + } + } + } + } + return bret; + } + //Not used yet. + inline uint64_t hash() const + { + uint64_t hash_ret = 0; + common::ObCollationType cs_type = common::CS_TYPE_UTF8MB4_GENERAL_CI; + hash_ret = common::murmurhash(&tenant_id_, sizeof(tenant_id_), 0); + hash_ret = common::murmurhash(&user_id_, sizeof(user_id_), hash_ret); + hash_ret = common::murmurhash(db_.ptr(), db_.length(), hash_ret); + hash_ret = common::ObCharset::hash(cs_type, routine_, hash_ret); + hash_ret = common::murmurhash(&routine_type_, sizeof(routine_type_), hash_ret); + return hash_ret; + } + bool is_valid() const + { + return (tenant_id_ != common::OB_INVALID_ID) && (user_id_ != common::OB_INVALID_ID) && routine_type_ != 0; + } + + int deep_copy(const ObRoutinePrivSortKey &src, common::ObIAllocator &allocator) + { + int ret = OB_SUCCESS; + tenant_id_ = src.tenant_id_; + user_id_ = src.user_id_; + routine_type_ = src.routine_type_; + if (OB_FAIL(common::ob_write_string(allocator, src.db_, db_))) { + SHARE_SCHEMA_LOG(WARN, "failed to deep copy db", KR(ret), K(src.db_)); + } else if (OB_FAIL(common::ob_write_string(allocator, src.routine_, routine_))) { + SHARE_SCHEMA_LOG(WARN, "failed to deep copy routine", KR(ret), K(src.routine_)); + } + return ret; + } + + TO_STRING_KV(K_(tenant_id), K_(user_id), K_(db), K_(routine), K_(routine_type)); + uint64_t tenant_id_; + uint64_t user_id_; + common::ObString db_; + common::ObString routine_; + int64_t routine_type_; +}; + +struct ObColumnPrivIdKey +{ + ObColumnPrivIdKey() : tenant_id_(common::OB_INVALID_ID), priv_id_(common::OB_INVALID_ID) {} + + ObColumnPrivIdKey(const uint64_t tenant_id, const uint64_t priv_id) + : tenant_id_(tenant_id), priv_id_(priv_id) {} + + TO_STRING_KV(K_(tenant_id), K_(priv_id)); + + bool operator==(const ObColumnPrivIdKey &rhs) const + { + return (tenant_id_ == rhs.tenant_id_) && (priv_id_ == rhs.priv_id_); + } + uint64_t tenant_id_; + uint64_t priv_id_; +}; + +struct ObColumnPrivSortKey +{ + ObColumnPrivSortKey() : tenant_id_(common::OB_INVALID_ID), user_id_(common::OB_INVALID_ID), + db_(), table_(), column_() + {} + ObColumnPrivSortKey(const uint64_t tenant_id, const uint64_t user_id, + const common::ObString &db, const common::ObString &table, const common::ObString &column) + : tenant_id_(tenant_id), user_id_(user_id), db_(db), table_(table), column_(column) + {} + + //In resolver, ObSQLUtils::cvt_db_name_to_org will make db_name and table_name string user wrotten in the sql the same as the string in the schema. + //So in the schema stage, db and table name can directly binary compare with each other without considering the collation. + bool operator==(const ObColumnPrivSortKey &rhs) const + { + // Only mysql will reach here, and column name character collation is general ci under mysql mode. + // If Oracle mode reach here, the result may be wrong! + common::ObCollationType cs_type = common::CS_TYPE_UTF8MB4_GENERAL_CI; + return (tenant_id_ == rhs.tenant_id_) && (user_id_ == rhs.user_id_) + && (db_ == rhs.db_) && (table_ == rhs.table_) && + (0 == common::ObCharset::strcmp(cs_type, column_, rhs.column_)); + } + bool operator!=(const ObColumnPrivSortKey &rhs) const + { + return !(*this == rhs); + } + bool operator<(const ObColumnPrivSortKey &rhs) const + { + bool bret = tenant_id_ < rhs.tenant_id_; + if (false == bret && tenant_id_ == rhs.tenant_id_) { + bret = user_id_ < rhs.user_id_; + if (false == bret && user_id_ == rhs.user_id_) { + bret = db_ < rhs.db_; + if (false == bret && db_ == rhs.db_) { + bret = table_ < rhs.table_; + if (false == bret && table_ == rhs.table_) { + ObCompareNameWithTenantID name_cmp(tenant_id_); + int cmp_ret = name_cmp.compare(column_, rhs.column_); + if (cmp_ret < 0) { + bret = true; + } else { + bret = false; + } + } + } + } + } + return bret; + } + //Not used yet. + inline uint64_t hash() const + { + common::ObCollationType cs_type = common::CS_TYPE_UTF8MB4_GENERAL_CI; + uint64_t hash_ret = 0; + hash_ret = common::murmurhash(&tenant_id_, sizeof(tenant_id_), 0); + hash_ret = common::murmurhash(&user_id_, sizeof(user_id_), hash_ret); + hash_ret = common::murmurhash(db_.ptr(), db_.length(), hash_ret); + hash_ret = common::murmurhash(table_.ptr(), table_.length(), hash_ret); + hash_ret = common::ObCharset::hash(cs_type, column_, hash_ret); + return hash_ret; + } + bool is_valid() const + { + return (tenant_id_ != common::OB_INVALID_ID) && (user_id_ != common::OB_INVALID_ID); + } + + int deep_copy(const ObColumnPrivSortKey &src, common::ObIAllocator &allocator) + { + int ret = OB_SUCCESS; + tenant_id_ = src.tenant_id_; + user_id_ = src.user_id_; + if (OB_FAIL(common::ob_write_string(allocator, src.db_, db_))) { + SHARE_SCHEMA_LOG(WARN, "failed to deep copy db", KR(ret), K(src.db_)); + } else if (OB_FAIL(common::ob_write_string(allocator, src.table_, table_))) { + SHARE_SCHEMA_LOG(WARN, "failed to deep copy table", KR(ret), K(src.table_)); + } else if (OB_FAIL(common::ob_write_string(allocator, src.column_, column_))) { + SHARE_SCHEMA_LOG(WARN, "failed to deep copy table", KR(ret), K(src.column_)); + } + return ret; + } + + TO_STRING_KV(K_(tenant_id), K_(user_id), K_(db), K_(table), K_(column)); + uint64_t tenant_id_; + uint64_t user_id_; + common::ObString db_; + common::ObString table_; + common::ObString column_; +}; + struct ObObjPrivSortKey { ObObjPrivSortKey() : tenant_id_(common::OB_INVALID_ID), @@ -4763,6 +4983,154 @@ private: common::ObString table_; }; +class ObRoutinePriv : public ObSchema, public ObPriv +{ + OB_UNIS_VERSION(1); + +public: + //constructor and destructor + ObRoutinePriv() + : ObSchema(), ObPriv(), db_(), routine_(), routine_type_(0) + { } + explicit ObRoutinePriv(common::ObIAllocator *allocator) + : ObSchema(allocator), ObPriv(allocator), db_(), routine_(), routine_type_(0) + { } + virtual ~ObRoutinePriv() { } + + int assign(const ObRoutinePriv &other); + + //for sort + ObRoutinePrivSortKey get_sort_key() const + { return ObRoutinePrivSortKey(tenant_id_, user_id_, db_, routine_, routine_type_); } + static bool cmp(const ObRoutinePriv *lhs, const ObRoutinePriv *rhs) + { return (NULL != lhs && NULL != rhs) ? lhs->get_sort_key() < rhs->get_sort_key() : false; } + static bool cmp_sort_key(const ObRoutinePriv *lhs, const ObRoutinePrivSortKey &sort_key) + { return NULL != lhs ? lhs->get_sort_key() < sort_key : false; } + static bool equal(const ObRoutinePriv *lhs, const ObRoutinePriv *rhs) + { return (NULL != lhs && NULL != rhs) ? lhs->get_sort_key() == rhs->get_sort_key() : false; } + static bool equal_sort_key(const ObRoutinePriv *lhs, const ObRoutinePrivSortKey &sort_key) + { return NULL != lhs ? lhs->get_sort_key() == sort_key : false; } + + ObRoutinePrivDBKey get_db_key() const + { return ObRoutinePrivDBKey(tenant_id_, user_id_, db_); } + static bool cmp_db_key(const ObRoutinePriv *lhs, const ObRoutinePrivDBKey &db_key) + { return lhs->get_db_key() < db_key; } + + //set methods + inline int set_database_name(const char *db) { return deep_copy_str(db, db_); } + inline int set_database_name(const common::ObString &db) { return deep_copy_str(db, db_); } + inline int set_routine_name(const char *routine) { return deep_copy_str(routine, routine_); } + inline int set_routine_name(const common::ObString &routine) { return deep_copy_str(routine, routine_); } + inline void set_routine_type(int64_t routine_type) { routine_type_ = routine_type; } + + //get methods + inline const char* get_database_name() const { return extract_str(db_); } + inline const common::ObString& get_database_name_str() const { return db_; } + inline const char* get_routine_name() const { return extract_str(routine_); } + inline const common::ObString& get_routine_name_str() const { return routine_; } + + inline int64_t get_routine_type() const { return routine_type_; } + + TO_STRING_KV(K_(tenant_id), K_(user_id), K_(db), K_(routine), K_(routine_type), + "privileges", ObPrintPrivSet(priv_set_)); + //other methods + virtual bool is_valid() const; + virtual void reset(); + int64_t get_convert_size() const; + +private: + common::ObString db_; + common::ObString routine_; + int64_t routine_type_; + + DISABLE_COPY_ASSIGN(ObRoutinePriv); +}; + +class ObColumnPriv : public ObSchema, public ObPriv +{ + OB_UNIS_VERSION(1); + +public: + //constructor and destructor + ObColumnPriv() + : ObSchema(), ObPriv() + { } + explicit ObColumnPriv(common::ObIAllocator *allocator) + : ObSchema(allocator), ObPriv(allocator) + { } + virtual ~ObColumnPriv() { } + + int assign(const ObColumnPriv &other); + + //for sort + ObColumnPrivSortKey get_sort_key() const + { return ObColumnPrivSortKey(tenant_id_, user_id_, db_, table_, column_); } + + ObColumnPrivIdKey get_id_key() const + { return ObColumnPrivIdKey(tenant_id_, priv_id_); } + static bool cmp_by_sort_key(const ObColumnPriv *lhs, const ObColumnPriv *rhs) + { return (NULL != lhs && NULL != rhs) ? lhs->get_sort_key() < rhs->get_sort_key() : false; } + static bool cmp_by_id(const ObColumnPriv *lhs, const ObColumnPriv *rhs) + { return (NULL != lhs && NULL != rhs) ? (lhs->get_tenant_id() == rhs->get_tenant_id() ? lhs->get_priv_id() < rhs->get_priv_id() : lhs->get_tenant_id() < rhs->get_tenant_id()) : false; } + static bool cmp_sort_key(const ObColumnPriv *lhs, const ObColumnPrivSortKey &sort_key) + { return NULL != lhs ? lhs->get_sort_key() < sort_key : false; } + + static bool cmp_by_id_key(const ObColumnPriv *lhs, const ObColumnPrivIdKey &sort_key) + { return NULL != lhs ? (lhs->get_tenant_id() == sort_key.tenant_id_ ? lhs->get_priv_id() < sort_key.priv_id_ : lhs->get_tenant_id() < sort_key.tenant_id_) : false; } + static bool equal_by_sort_key(const ObColumnPriv *lhs, const ObColumnPriv *rhs) + { return (NULL != lhs && NULL != rhs) ? lhs->get_sort_key() == rhs->get_sort_key() : false; } + + static bool equal_by_id(const ObColumnPriv *lhs, const ObColumnPriv *rhs) + { return (NULL != lhs && NULL != rhs) ? (lhs->get_tenant_id() == rhs->get_tenant_id() + && lhs->get_priv_id() == rhs->get_priv_id()) : false; } + static bool equal_sort_key(const ObColumnPriv *lhs, const ObColumnPrivSortKey &sort_key) + { return NULL != lhs ? lhs->get_sort_key() == sort_key : false; } + + static bool equal_by_id_key(const ObColumnPriv *lhs, const ObColumnPrivIdKey &sort_key) + { return NULL != lhs ? lhs->get_tenant_id() == sort_key.tenant_id_ && lhs->get_priv_id() == sort_key.priv_id_ : false; } + + ObTablePrivSortKey get_table_key() const + { return ObTablePrivSortKey(tenant_id_, user_id_, db_, table_); } + static bool cmp_table_key(const ObColumnPriv *lhs, const ObTablePrivSortKey &table_key) + { return lhs->get_table_key() < table_key; } + + ObTablePrivDBKey get_db_key() const + { return ObTablePrivDBKey(tenant_id_, user_id_, db_); } + static bool cmp_db_key(const ObColumnPriv *lhs, const ObTablePrivDBKey &db_key) + { return lhs->get_db_key() < db_key; } + + //set methods + inline int set_database_name(const char *db) { return deep_copy_str(db, db_); } + inline int set_database_name(const common::ObString &db) { return deep_copy_str(db, db_); } + inline int set_table_name(const char *table) { return deep_copy_str(table, table_); } + inline int set_table_name(const common::ObString &table) { return deep_copy_str(table, table_); } + inline int set_column_name(const char *column) { return deep_copy_str(column, column_); } + inline int set_column_name(const common::ObString &column) { return deep_copy_str(column, column_); } + inline void set_priv_id(uint64_t priv_id) { priv_id_ = priv_id; } + + //get methods + inline const char* get_database_name() const { return extract_str(db_); } + inline const common::ObString& get_database_name_str() const { return db_; } + inline const char* get_table_name() const { return extract_str(table_); } + inline const common::ObString& get_table_name_str() const { return table_; } + inline const char* get_column_name() const { return extract_str(column_); } + inline const common::ObString& get_column_name_str() const { return column_; } + inline uint64_t get_priv_id() const { return priv_id_; } + TO_STRING_KV(K_(tenant_id), K_(priv_id), K_(user_id), K_(db), K_(table), K_(column), + "privileges", ObPrintPrivSet(priv_set_)); + //other methods + virtual bool is_valid() const; + virtual void reset(); + int64_t get_convert_size() const; + +private: + common::ObString db_; + common::ObString table_; + common::ObString column_; + uint64_t priv_id_; + DISABLE_COPY_ASSIGN(ObColumnPriv); +}; + class ObObjPriv : public ObSchema, public ObPriv { OB_UNIS_VERSION(1); @@ -4882,11 +5250,29 @@ struct ObNeedPriv const bool is_for_update = false, ObPrivCheckType priv_check_type = OB_PRIV_CHECK_ALL) : db_(db), table_(table), priv_level_(priv_level), priv_set_(priv_set), - is_sys_table_(is_sys_table), is_for_update_(is_for_update), priv_check_type_(priv_check_type) + is_sys_table_(is_sys_table), obj_type_(share::schema::ObObjectType::INVALID), + is_for_update_(is_for_update), priv_check_type_(priv_check_type), + columns_(), check_any_column_priv_(false) { } + + ObNeedPriv(const common::ObString &db, + const common::ObString &table, + ObPrivLevel priv_level, + ObPrivSet priv_set, + const bool is_sys_table, + const share::schema::ObObjectType obj_type, + const bool is_for_update = false, + ObPrivCheckType priv_check_type = OB_PRIV_CHECK_ALL) + : db_(db), table_(table), priv_level_(priv_level), priv_set_(priv_set), + is_sys_table_(is_sys_table), obj_type_(obj_type), + is_for_update_(is_for_update), priv_check_type_(priv_check_type), + columns_(), check_any_column_priv_(false) + { } + ObNeedPriv() : db_(), table_(), priv_level_(OB_PRIV_INVALID_LEVEL), priv_set_(0), is_sys_table_(false), - is_for_update_(false), priv_check_type_(OB_PRIV_CHECK_ALL) + obj_type_(share::schema::ObObjectType::INVALID), is_for_update_(false), + priv_check_type_(OB_PRIV_CHECK_ALL), columns_(), check_any_column_priv_(false) { } int deep_copy(const ObNeedPriv &other, common::ObIAllocator &allocator); common::ObString db_; @@ -4894,9 +5280,15 @@ struct ObNeedPriv ObPrivLevel priv_level_; ObPrivSet priv_set_; bool is_sys_table_; // May be used to represent the table of schema metadata + share::schema::ObObjectType obj_type_; bool is_for_update_; ObPrivCheckType priv_check_type_; - TO_STRING_KV(K_(db), K_(table), K_(priv_set), K_(priv_level), K_(is_sys_table), K_(is_for_update), + ObSEArray columns_; //used under table level. + // If columns_ empty, then check table level priv_set. + // Else column_ not empty, then table level has not the priv_set, then check if column_ has the priv_set. + bool check_any_column_priv_; //used under table level. + // If check_any_column_priv_ true, then check the table has any column with the priv_set. + TO_STRING_KV(K_(db), K_(table), K_(columns), K_(priv_set), K_(priv_level), K_(is_sys_table), K_(is_for_update), K_(priv_check_type)); }; diff --git a/src/share/schema/ob_server_schema_service.cpp b/src/share/schema/ob_server_schema_service.cpp index 4848a512cf..72ad8ce87b 100644 --- a/src/share/schema/ob_server_schema_service.cpp +++ b/src/share/schema/ob_server_schema_service.cpp @@ -318,6 +318,10 @@ void ObServerSchemaService::AllSchemaKeys::reset() del_db_priv_keys_.clear(); new_table_priv_keys_.clear(); del_table_priv_keys_.clear(); + new_routine_priv_keys_.clear(); + del_routine_priv_keys_.clear(); + new_column_priv_keys_.clear(); + del_column_priv_keys_.clear(); new_synonym_keys_.clear(); del_synonym_keys_.clear(); new_routine_keys_.clear(); @@ -412,6 +416,14 @@ int ObServerSchemaService::AllSchemaKeys::create(int64_t bucket_size) LOG_WARN("failed to create new_table_priv_keys hashset", K(bucket_size), K(ret)); } else if (OB_FAIL(del_table_priv_keys_.create(bucket_size))) { LOG_WARN("failed to create del_table_priv_keys hashset", K(bucket_size), K(ret)); + } else if (OB_FAIL(new_routine_priv_keys_.create(bucket_size))) { + LOG_WARN("failed to create new_routine_keys hashset", K(bucket_size), K(ret)); + } else if (OB_FAIL(del_routine_priv_keys_.create(bucket_size))) { + LOG_WARN("failed to create del_routine_keys hashset", K(bucket_size), K(ret)); + } else if (OB_FAIL(new_column_priv_keys_.create(bucket_size))) { + LOG_WARN("failed to create new_column_priv_keys hashset", K(bucket_size), K(ret)); + } else if (OB_FAIL(del_column_priv_keys_.create(bucket_size))) { + LOG_WARN("failed to create del_column_priv_keys hashset", K(bucket_size), K(ret)); } else if (OB_FAIL(new_routine_keys_.create(bucket_size))) { LOG_WARN("failed to create new_routine_ids hashset", K(bucket_size), K(ret)); } else if (OB_FAIL(del_routine_keys_.create(bucket_size))) { @@ -520,18 +532,6 @@ int ObServerSchemaService::AllSchemaKeys::create(int64_t bucket_size) return ret; } -void ObServerSchemaService::AllIncrementSchema::reset() -{ - table_schema_.reset(); - db_schema_.reset(); - tg_schema_.reset(); - max_used_tids_.reset(); - //For managing privileges - tenant_info_array_.reset(); - user_info_array_.reset(); - db_priv_array_.reset(); - table_priv_array_.reset(); -} ////////////////////////////////////////////////////////////////////////////////////////////// // SCHEMA SERVICE RELATED // @@ -572,6 +572,12 @@ int ObServerSchemaService::del_tenant_operation( } else if (OB_FAIL(del_operation(tenant_id, new_flag ? schema_keys.new_table_priv_keys_ : schema_keys.del_table_priv_keys_))) { LOG_WARN("fail to del table_priv operation", KR(ret), K(tenant_id)); + } else if (OB_FAIL(del_operation(tenant_id, + new_flag ? schema_keys.new_routine_priv_keys_ : schema_keys.del_routine_priv_keys_))) { + LOG_WARN("fail to del routine_priv operation", KR(ret), K(tenant_id)); + } else if (OB_FAIL(del_operation(tenant_id, + new_flag ? schema_keys.new_column_priv_keys_ : schema_keys.del_column_priv_keys_))) { + LOG_WARN("fail to del column_priv operation", KR(ret), K(tenant_id)); } else if (OB_FAIL(del_operation(tenant_id, new_flag ? schema_keys.new_synonym_keys_ : schema_keys.del_synonym_keys_))) { LOG_WARN("fail to del synonym operation", KR(ret), K(tenant_id)); @@ -2100,6 +2106,190 @@ int ObServerSchemaService::get_increment_table_priv_keys_reversely( return ret; } +int ObServerSchemaService::get_increment_routine_priv_keys( + const ObSchemaMgr &schema_mgr, + const ObSchemaOperation &schema_operation, + AllSchemaKeys &schema_keys) +{ + int ret = OB_SUCCESS; + + if (!(schema_operation.op_type_ > OB_DDL_ROUTINE_PRIV_OPERATION_BEGIN + && schema_operation.op_type_ < OB_DDL_ROUTINE_PRIV_OPERATION_END)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid argument", K(schema_operation.op_type_), KR(ret)); + } else { + const uint64_t tenant_id = schema_operation.tenant_id_; + const uint64_t user_id = schema_operation.user_id_; + const ObString &database_name = schema_operation.database_name_; + const ObString &routine_name = schema_operation.routine_name_; + const int64_t routine_type = schema_operation.routine_type_; + const int64_t schema_version = schema_operation.schema_version_; + int hash_ret = OB_SUCCESS; + SchemaKey routine_priv_key; + routine_priv_key.tenant_id_ = tenant_id; + routine_priv_key.user_id_ = user_id; + routine_priv_key.database_name_ = database_name; + routine_priv_key.routine_name_ = routine_name; + routine_priv_key.obj_type_ = routine_type; + routine_priv_key.schema_version_ = schema_version; + if (OB_DDL_DEL_ROUTINE_PRIV == schema_operation.op_type_) { //delete + hash_ret = schema_keys.new_routine_priv_keys_.erase_refactored(routine_priv_key); + if (OB_SUCCESS != hash_ret && OB_HASH_NOT_EXIST != hash_ret) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Failed to del routine_priv_key from new_routine_priv_keys", KR(ret)); + } else { + const ObRoutinePriv *routine_priv = NULL; + if (OB_FAIL(schema_mgr.priv_mgr_.get_routine_priv( + ObRoutinePrivSortKey(tenant_id, user_id, database_name, routine_name, routine_type), routine_priv))) { + LOG_WARN("get routine priv failed", KR(ret)); + } else if (NULL != routine_priv) { + hash_ret = schema_keys.del_routine_priv_keys_.set_refactored_1(routine_priv_key, 1); + if (OB_SUCCESS != hash_ret) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Failed to add routine_priv_key to del_routine_priv_keys", KR(ret)); + } + } + } + } else { + hash_ret = schema_keys.new_routine_priv_keys_.set_refactored_1(routine_priv_key, 1); + if (OB_SUCCESS != hash_ret) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Failed to add new routine_priv_key", KR(ret)); + } + } + } + + return ret; +} + +int ObServerSchemaService::get_increment_routine_priv_keys_reversely( + const ObSchemaMgr &schema_mgr, + const ObSchemaOperation &schema_operation, + AllSchemaKeys &schema_keys) +{ + int ret = OB_SUCCESS; + if (!(schema_operation.op_type_ > OB_DDL_ROUTINE_PRIV_OPERATION_BEGIN + && schema_operation.op_type_ < OB_DDL_ROUTINE_PRIV_OPERATION_END)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid argument", K(schema_operation.op_type_), KR(ret)); + } else { + const uint64_t tenant_id = schema_operation.tenant_id_; + const uint64_t user_id = schema_operation.user_id_; + const ObString &database_name = schema_operation.database_name_; + const ObString &routine_name = schema_operation.routine_name_; + const int64_t routine_type = schema_operation.routine_type_; + const int64_t schema_version = schema_operation.schema_version_; + SchemaKey schema_key; + schema_key.tenant_id_ = tenant_id; + schema_key.user_id_ = user_id; + schema_key.database_name_ = database_name; + schema_key.routine_name_ = routine_name; + schema_key.obj_type_ = routine_type; + schema_key.schema_version_ = schema_version; + bool is_delete = (OB_DDL_GRANT_ROUTINE_PRIV == schema_operation.op_type_); + bool is_exist = false; + const ObRoutinePriv *routine_priv = NULL; + if (OB_FAIL(schema_mgr.priv_mgr_.get_routine_priv(schema_key.get_routine_priv_key(), + routine_priv))) { + LOG_WARN("get routine_priv failed", + "routine_priv_key", schema_key.get_routine_priv_key(), + KR(ret)); + } else if (NULL != routine_priv) { + is_exist = true; + } + if (OB_SUCC(ret)) { + if (OB_FAIL(REPLAY_OP(schema_key, schema_keys.del_routine_priv_keys_, + schema_keys.new_routine_priv_keys_, is_delete, is_exist))) { + LOG_WARN("replay operation failed", KR(ret)); + } + } + } + return ret; +} + +int ObServerSchemaService::get_increment_column_priv_keys( + const ObSchemaMgr &schema_mgr, + const ObSchemaOperation &schema_operation, + AllSchemaKeys &schema_keys) +{ + int ret = OB_SUCCESS; + + if (!(schema_operation.op_type_ > OB_DDL_COLUMN_PRIV_OPERATION_BEGIN + && schema_operation.op_type_ < OB_DDL_COLUMN_PRIV_OPERATION_END)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid argument", K(schema_operation.op_type_), KR(ret)); + } else { + const uint64_t tenant_id = schema_operation.tenant_id_; + const uint64_t column_priv_id = schema_operation.column_priv_id_; + const int64_t schema_version = schema_operation.schema_version_; + int hash_ret = OB_SUCCESS; + SchemaKey column_priv_key; + column_priv_key.tenant_id_ = tenant_id; + column_priv_key.column_priv_id_ = column_priv_id; + column_priv_key.schema_version_ = schema_version; + const ObColumnPriv *column_priv = NULL; + if (OB_FAIL(schema_mgr.priv_mgr_.get_column_priv_by_id(tenant_id, column_priv_id, column_priv))) { + LOG_WARN("get column priv failed", KR(ret)); + } else if (OB_DDL_DEL_COLUMN_PRIV == schema_operation.op_type_) { //delete + hash_ret = schema_keys.new_column_priv_keys_.erase_refactored(column_priv_key); + if (OB_SUCCESS != hash_ret && OB_HASH_NOT_EXIST != hash_ret) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Failed to del column_priv_key from new_column_priv_keys", KR(ret)); + } else { + if (NULL != column_priv) { + hash_ret = schema_keys.del_column_priv_keys_.set_refactored_1(column_priv_key, 1); + if (OB_SUCCESS != hash_ret) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Failed to add column_priv_key to del_column_priv_keys", KR(ret)); + } + } + } + } else { + hash_ret = schema_keys.new_column_priv_keys_.set_refactored_1(column_priv_key, 1); + if (OB_SUCCESS != hash_ret) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Failed to add new column_priv_key", KR(ret)); + } + } + } + + return ret; +} + +int ObServerSchemaService::get_increment_column_priv_keys_reversely( + const ObSchemaMgr &schema_mgr, + const ObSchemaOperation &schema_operation, + AllSchemaKeys &schema_keys) +{ + int ret = OB_SUCCESS; + if (!(schema_operation.op_type_ > OB_DDL_COLUMN_PRIV_OPERATION_BEGIN + && schema_operation.op_type_ < OB_DDL_COLUMN_PRIV_OPERATION_END)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid argument", K(schema_operation.op_type_), KR(ret)); + } else { + const uint64_t tenant_id = schema_operation.tenant_id_; + const uint64_t column_priv_id = schema_operation.column_priv_id_; + const int64_t schema_version = schema_operation.schema_version_; + SchemaKey schema_key; + schema_key.tenant_id_ = tenant_id; + schema_key.column_priv_id_ = column_priv_id; + schema_key.schema_version_ = schema_version; + bool is_delete = (OB_DDL_GRANT_COLUMN_PRIV == schema_operation.op_type_); + bool is_exist = false; + const ObColumnPriv *column_priv = NULL; + if (NULL != column_priv) { + is_exist = true; + } + if (OB_SUCC(ret)) { + if (OB_FAIL(REPLAY_OP(schema_key, schema_keys.del_column_priv_keys_, + schema_keys.new_column_priv_keys_, is_delete, is_exist))) { + LOG_WARN("replay operation failed", KR(ret)); + } + } + } + return ret; +} + int ObServerSchemaService::get_increment_obj_priv_keys( const ObSchemaMgr &schema_mgr, const ObSchemaOperation &schema_operation, @@ -3859,6 +4049,7 @@ int ObServerSchemaService::fetch_increment_schemas( GET_BATCH_SCHEMAS(trigger, ObSimpleTriggerSchema, TriggerKeys); GET_BATCH_SCHEMAS(db_priv, ObDBPriv, DBPrivKeys); GET_BATCH_SCHEMAS(table_priv, ObTablePriv, TablePrivKeys); + GET_BATCH_SCHEMAS(routine_priv, ObRoutinePriv, RoutinePrivKeys); GET_BATCH_SCHEMAS(synonym, ObSimpleSynonymSchema, SynonymKeys); GET_BATCH_SCHEMAS(udf, ObSimpleUDFSchema, UdfKeys); GET_BATCH_SCHEMAS(udt, ObSimpleUDTSchema, UDTKeys); @@ -3873,6 +4064,7 @@ int ObServerSchemaService::fetch_increment_schemas( GET_BATCH_SCHEMAS(audit, ObSAuditSchema, AuditKeys); GET_BATCH_SCHEMAS(sys_priv, ObSysPriv, SysPrivKeys); GET_BATCH_SCHEMAS(obj_priv, ObObjPriv, ObjPrivKeys); + GET_BATCH_SCHEMAS(column_priv, ObColumnPriv, ColumnPrivKeys); // After the schema is split, because the operation_type has not been updated, // the OB_DDL_TENANT_OPERATION is still reused @@ -3966,6 +4158,12 @@ int ObServerSchemaService::apply_increment_schema_to_cache( } else if (OB_FAIL(apply_table_priv_schema_to_cache( tenant_id, all_keys, simple_incre_schemas, schema_mgr.priv_mgr_))) { LOG_WARN("fail to apply table_priv schema to cache", KR(ret), K(tenant_id)); + } else if (OB_FAIL(apply_routine_priv_schema_to_cache( + tenant_id, all_keys, simple_incre_schemas, schema_mgr.priv_mgr_))) { + LOG_WARN("fail to apply routine_priv schema to cache", KR(ret), K(tenant_id)); + } else if (OB_FAIL(apply_column_priv_schema_to_cache( + tenant_id, all_keys, simple_incre_schemas, schema_mgr.priv_mgr_))) { + LOG_WARN("fail to apply table_priv schema to cache", KR(ret), K(tenant_id)); } else if (OB_FAIL(apply_synonym_schema_to_cache( tenant_id, all_keys, simple_incre_schemas, schema_mgr.synonym_mgr_))) { LOG_WARN("fail to apply synonym schema to cache", KR(ret), K(tenant_id)); @@ -4166,6 +4364,8 @@ APPLY_SCHEMA_TO_CACHE_IMPL(ObPackageMgr, package, ObSimplePackageSchema, Package APPLY_SCHEMA_TO_CACHE_IMPL(ObTriggerMgr, trigger, ObSimpleTriggerSchema, TriggerKeys); APPLY_SCHEMA_TO_CACHE_IMPL(ObPrivMgr, db_priv, ObDBPriv, DBPrivKeys); APPLY_SCHEMA_TO_CACHE_IMPL(ObPrivMgr, table_priv, ObTablePriv, TablePrivKeys); +APPLY_SCHEMA_TO_CACHE_IMPL(ObPrivMgr, routine_priv, ObRoutinePriv, RoutinePrivKeys); +APPLY_SCHEMA_TO_CACHE_IMPL(ObPrivMgr, column_priv, ObColumnPriv, ColumnPrivKeys); APPLY_SCHEMA_TO_CACHE_IMPL(ObSynonymMgr, synonym, ObSimpleSynonymSchema, SynonymKeys); APPLY_SCHEMA_TO_CACHE_IMPL(ObUDFMgr, udf, ObSimpleUDFSchema, UdfKeys); APPLY_SCHEMA_TO_CACHE_IMPL(ObUDTMgr, udt, ObSimpleUDTSchema, UDTKeys); @@ -4518,6 +4718,11 @@ int ObServerSchemaService::replay_log( if (OB_FAIL(get_increment_routine_keys(schema_mgr, schema_operation, schema_keys))) { LOG_WARN("fail to get increment routine id", K(ret)); } + } else if (schema_operation.op_type_ > OB_DDL_ROUTINE_PRIV_OPERATION_BEGIN + && schema_operation.op_type_ < OB_DDL_ROUTINE_PRIV_OPERATION_END) { + if (OB_FAIL(get_increment_routine_priv_keys(schema_mgr, schema_operation, schema_keys))) { + LOG_WARN("fail to get increment routine id", K(ret)); + } } else if (schema_operation.op_type_ > OB_DDL_PACKAGE_OPERATION_BEGIN && schema_operation.op_type_ < OB_DDL_PACKAGE_OPERATION_END) { if (OB_FAIL(get_increment_package_keys(schema_mgr, schema_operation, schema_keys))) { @@ -4631,6 +4836,11 @@ int ObServerSchemaService::replay_log( if (OB_FAIL(get_increment_rls_context_keys(schema_mgr, schema_operation, schema_keys))) { LOG_WARN("fail to get increment rls_context id", K(ret)); } + } else if (schema_operation.op_type_ > OB_DDL_COLUMN_PRIV_OPERATION_BEGIN && + schema_operation.op_type_ < OB_DDL_COLUMN_PRIV_OPERATION_END) { + if (OB_FAIL(get_increment_column_priv_keys(schema_mgr, schema_operation, schema_keys))) { + LOG_WARN("fail to get increment column priv id", K(ret)); + } } } } @@ -4704,6 +4914,11 @@ int ObServerSchemaService::replay_log_reversely( if (OB_FAIL(get_increment_routine_keys_reversely(schema_mgr, schema_operation, schema_keys))) { LOG_WARN("fail to get increment routine keys reversely", KR(ret)); } + } else if (schema_operation.op_type_ > OB_DDL_ROUTINE_PRIV_OPERATION_BEGIN + && schema_operation.op_type_ < OB_DDL_ROUTINE_PRIV_OPERATION_END) { + if (OB_FAIL(get_increment_routine_priv_keys_reversely(schema_mgr, schema_operation, schema_keys))) { + LOG_WARN("fail to get increment routine keys reversely", KR(ret)); + } } else if (schema_operation.op_type_ > OB_DDL_UDT_OPERATION_BEGIN && schema_operation.op_type_ < OB_DDL_UDT_OPERATION_END) { if (OB_FAIL(get_increment_udt_keys_reversely(schema_mgr, schema_operation, schema_keys))) { @@ -4824,6 +5039,11 @@ int ObServerSchemaService::replay_log_reversely( if (OB_FAIL(get_increment_rls_context_keys_reversely(schema_mgr, schema_operation, schema_keys))) { LOG_WARN("fail to get increment rls_context keys reversely", KR(ret)); } + } else if (schema_operation.op_type_ > OB_DDL_COLUMN_PRIV_OPERATION_BEGIN && + schema_operation.op_type_ < OB_DDL_COLUMN_PRIV_OPERATION_END) { + if (OB_FAIL(get_increment_column_priv_keys_reversely(schema_mgr, schema_operation, schema_keys))) { + LOG_WARN("fail to get increment column priv keys reversely", KR(ret)); + } } else { // ingore other operaton. } @@ -6098,6 +6318,8 @@ int ObServerSchemaService::refresh_tenant_full_normal_schema( INIT_ARRAY(ObDBPriv, db_privs); INIT_ARRAY(ObSysPriv, sys_privs); INIT_ARRAY(ObTablePriv, table_privs); + INIT_ARRAY(ObRoutinePriv, routine_privs); + INIT_ARRAY(ObColumnPriv, column_privs); INIT_ARRAY(ObObjPriv, obj_privs); INIT_ARRAY(ObSimpleUDFSchema, simple_udfs); INIT_ARRAY(ObSimpleUDTSchema, simple_udts); @@ -6247,6 +6469,30 @@ int ObServerSchemaService::refresh_tenant_full_normal_schema( } } + if (OB_SUCC(ret)) { + const ObSimpleTableSchemaV2 *tmp_table = NULL; + if (OB_FAIL(schema_mgr_for_cache->get_table_schema(tenant_id, OB_ALL_ROUTINE_PRIVILEGE_HISTORY_TID, tmp_table))) { + LOG_WARN("fail to get table schema", KR(ret), K(tenant_id)); + } else if (OB_ISNULL(tmp_table)) { + // for compatibility + } else if (OB_FAIL(schema_service_->get_all_routine_privs( + sql_client, schema_status, schema_version, tenant_id, routine_privs))) { + LOG_WARN("get all table priv failed", K(ret), K(schema_version), K(tenant_id)); + } + } + + if (OB_SUCC(ret)) { + const ObSimpleTableSchemaV2 *tmp_table = NULL; + if (OB_FAIL(schema_mgr_for_cache->get_table_schema(tenant_id, OB_ALL_COLUMN_PRIVILEGE_HISTORY_TID, tmp_table))) { + LOG_WARN("fail to get table schema", KR(ret), K(tenant_id)); + } else if (OB_ISNULL(tmp_table)) { + // for compatibility + } else if (OB_FAIL(schema_service_->get_all_column_privs( + sql_client, schema_status, schema_version, tenant_id, column_privs))) { + LOG_WARN("get all table priv failed", K(ret), K(schema_version), K(tenant_id)); + } + } + const bool refresh_full_schema = true; // add simple schema for cache if (OB_FAIL(ret)) { @@ -6275,6 +6521,8 @@ int ObServerSchemaService::refresh_tenant_full_normal_schema( LOG_WARN("add db privs failed", K(ret)); } else if (OB_FAIL(schema_mgr_for_cache->priv_mgr_.add_table_privs(table_privs))) { LOG_WARN("add table privs failed", K(ret)); + } else if (OB_FAIL(schema_mgr_for_cache->priv_mgr_.add_routine_privs(routine_privs))) { + LOG_WARN("add table privs failed", K(ret)); } else if (OB_FAIL(schema_mgr_for_cache->priv_mgr_.add_obj_privs(obj_privs))) { LOG_WARN("add obj privs failed", K(ret)); } else if (OB_FAIL(schema_mgr_for_cache->udf_mgr_.add_udfs(simple_udfs))) { @@ -6318,6 +6566,8 @@ int ObServerSchemaService::refresh_tenant_full_normal_schema( LOG_WARN("add rls_groups failed", K(ret)); } else if (OB_FAIL(schema_mgr_for_cache->rls_context_mgr_.add_rls_contexts(simple_rls_contexts))) { LOG_WARN("add rls_contexts failed", K(ret)); + } else if (OB_FAIL(schema_mgr_for_cache->priv_mgr_.add_column_privs(column_privs))) { + LOG_WARN("add column privs failed", K(ret)); } LOG_INFO("add schemas for tenant finish", diff --git a/src/share/schema/ob_server_schema_service.h b/src/share/schema/ob_server_schema_service.h index 36a8699604..ed7a2f673f 100644 --- a/src/share/schema/ob_server_schema_service.h +++ b/src/share/schema/ob_server_schema_service.h @@ -102,9 +102,12 @@ struct SchemaKey uint64_t rls_policy_id_; uint64_t rls_group_id_; uint64_t rls_context_id_; + uint64_t routine_type_; + uint64_t column_priv_id_; }; union { common::ObString table_name_; + common::ObString routine_name_; common::ObString udf_name_; common::ObString sequence_name_; common::ObString keystore_name_; @@ -122,6 +125,7 @@ struct SchemaKey K_(tablegroup_id), K_(table_id), K_(outline_id), + K_(routine_name), K_(routine_id), K_(database_name), K_(table_name), @@ -153,7 +157,9 @@ struct SchemaKey K_(mock_fk_parent_table_id), K_(rls_policy_id), K_(rls_group_id), - K_(rls_context_id)); + K_(rls_context_id), + K_(routine_type), + K_(column_priv_id)); SchemaKey() : tenant_id_(common::OB_INVALID_ID), @@ -227,6 +233,10 @@ struct SchemaKey { return ObTablePrivSortKey(tenant_id_, user_id_, database_name_, table_name_); } + ObRoutinePrivSortKey get_routine_priv_key() const + { + return ObRoutinePrivSortKey(tenant_id_, user_id_, database_name_, routine_name_, obj_type_); + } ObTenantUDFId get_udf_key() const { return ObTenantUDFId(tenant_id_, udf_name_); @@ -308,6 +318,10 @@ struct SchemaKey { return ObTenantRlsContextId(tenant_id_, rls_context_id_); } + ObColumnPrivIdKey get_column_priv_key() const + { + return ObColumnPrivIdKey(tenant_id_, column_priv_id_); + } }; struct VersionHisKey @@ -523,6 +537,69 @@ public: a.table_name_ == b.table_name_; } }; + + struct routine_priv_hash_func + { + int operator()(const SchemaKey &schema_key, uint64_t &hash_code) const + { + common::ObCollationType cs_type = common::CS_TYPE_UTF8MB4_GENERAL_CI; + hash_code = 0; + hash_code = common::murmurhash(&schema_key.tenant_id_, + sizeof(schema_key.tenant_id_), + hash_code); + hash_code = common::murmurhash(&schema_key.user_id_, + sizeof(schema_key.user_id_), + hash_code); + hash_code = common::murmurhash(schema_key.database_name_.ptr(), + schema_key.database_name_.length(), + hash_code); + hash_code = common::ObCharset::hash(cs_type, schema_key.routine_name_, hash_code); + hash_code = common::murmurhash(&schema_key.obj_type_, + sizeof(schema_key.obj_type_), + hash_code); + return OB_SUCCESS; + } + }; + + //In dcl resolver, ObSQLUtils::cvt_db_name_to_org will make db_name and table_name string user wrotten in the sql the same as the string in the schema. + //So in the schema stage, db name can directly binary compare with each other without considering the collation. + struct routine_priv_equal_to + { + bool operator()(const SchemaKey &a, const SchemaKey &b) const + { + ObCompareNameWithTenantID name_cmp(a.tenant_id_); + return a.tenant_id_ == b.tenant_id_ && + a.user_id_ == b.user_id_ && + a.database_name_ == b.database_name_ && + 0 == name_cmp.compare(a.routine_name_, b.routine_name_) && + a.obj_type_ == b.obj_type_; + } + }; + + struct column_priv_hash_func + { + int operator()(const SchemaKey &schema_key, uint64_t &hash_code) const + { + hash_code = 0; + hash_code = common::murmurhash(&schema_key.tenant_id_, + sizeof(schema_key.tenant_id_), + hash_code); + hash_code = common::murmurhash(&schema_key.column_priv_id_, + sizeof(schema_key.column_priv_id_), + hash_code); + return OB_SUCCESS; + } + }; + + struct column_priv_equal_to + { + bool operator()(const SchemaKey &a, const SchemaKey &b) const + { + return a.tenant_id_ == b.tenant_id_ && + a.column_priv_id_ == b.column_priv_id_; + } + }; + struct obj_priv_hash_func { int operator()(const SchemaKey &schema_key, uint64_t &hash_code) const @@ -678,7 +755,10 @@ public: db_priv_hash_func, db_priv_equal_to> DBPrivKeys; typedef common::hash::ObHashSet TablePrivKeys; - + typedef common::hash::ObHashSet RoutinePrivKeys; + typedef common::hash::ObHashSet ColumnPrivKeys; typedef common::hash::ObHashSet SysPrivKeys; typedef common::hash::ObHashSet non_sys_table_ids_; // synonym @@ -825,6 +911,8 @@ public: common::ObArray simple_dblink_schemas_; common::ObArray simple_db_priv_schemas_; common::ObArray simple_table_priv_schemas_; + common::ObArray simple_routine_priv_schemas_; + common::ObArray simple_column_priv_schemas_; common::ObArray simple_udt_schemas_; common::ObArray simple_sys_variable_schemas_; common::ObArray simple_keystore_schemas_; @@ -944,24 +1032,6 @@ private: int64_t version_; int64_t combined_id_; }; - //not used now - struct AllIncrementSchema - { - common::ObArenaAllocator allocator_; - common::ObArray table_schema_; - common::ObArray db_schema_; - common::ObArray tg_schema_; - common::ObArray max_used_tids_;//max used table_id of each tenant - //For managing privileges - common::ObArray tenant_info_array_; - common::ObArray user_info_array_; - common::ObArray db_priv_array_; - common::ObArray table_priv_array_; - - AllIncrementSchema(const char *label = common::ObModIds::OB_SCHEMA) : allocator_(label) {} - void reset(); - }; - enum RefreshSchemaType { @@ -993,6 +1063,8 @@ private: GET_INCREMENT_SCHEMA_KEY_FUNC_DECLARE(outline); GET_INCREMENT_SCHEMA_KEY_FUNC_DECLARE(db_priv); GET_INCREMENT_SCHEMA_KEY_FUNC_DECLARE(table_priv); + GET_INCREMENT_SCHEMA_KEY_FUNC_DECLARE(routine_priv); + GET_INCREMENT_SCHEMA_KEY_FUNC_DECLARE(column_priv); GET_INCREMENT_SCHEMA_KEY_FUNC_DECLARE(routine); GET_INCREMENT_SCHEMA_KEY_FUNC_DECLARE(synonym); GET_INCREMENT_SCHEMA_KEY_FUNC_DECLARE(package); @@ -1039,6 +1111,8 @@ private: APPLY_SCHEMA_TO_CACHE(trigger, ObTriggerMgr); APPLY_SCHEMA_TO_CACHE(db_priv, ObPrivMgr); APPLY_SCHEMA_TO_CACHE(table_priv, ObPrivMgr); + APPLY_SCHEMA_TO_CACHE(routine_priv, ObPrivMgr); + APPLY_SCHEMA_TO_CACHE(column_priv, ObPrivMgr); APPLY_SCHEMA_TO_CACHE(synonym, ObSynonymMgr); APPLY_SCHEMA_TO_CACHE(udf, ObUDFMgr); APPLY_SCHEMA_TO_CACHE(udt, ObUDTMgr); diff --git a/src/share/schema/ob_table_schema.cpp b/src/share/schema/ob_table_schema.cpp index d1f77df255..5703dfc41f 100644 --- a/src/share/schema/ob_table_schema.cpp +++ b/src/share/schema/ob_table_schema.cpp @@ -1641,7 +1641,7 @@ int ObTableSchema::assign(const ObTableSchema &src_schema) column = src_schema.column_array_[i]; if (NULL == column) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("The column is NULL."); + LOG_WARN("The column is NULL.", K(ret)); } else if (OB_FAIL(add_column(*column))) { LOG_WARN("Fail to add column, ", K(*column), K(ret)); } @@ -1695,6 +1695,22 @@ int ObTableSchema::assign(const ObTableSchema &src_schema) return ret; } +int ObTableSchema::get_view_column_comment(ObIArray &column_comments) +{ + int ret = OB_SUCCESS; + ObColumnSchemaV2 *column = NULL; + for (int64_t i = 0; OB_SUCC(ret) && i < column_cnt_; ++i) { + column = column_array_[i]; + if (OB_ISNULL(column)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("The column is NULL.", K(ret)); + } else if (OB_FAIL(column_comments.push_back(column->get_comment()))) { + LOG_WARN("Fail to add column comment, ", K(*column), K(ret)); + } + } + return ret; +} + void ObTableSchema::clear_constraint() { cst_cnt_ = 0; @@ -1725,7 +1741,7 @@ int ObTableSchema::assign_constraint(const ObTableSchema &src_schema) ObConstraint *constraint = src_schema.cst_array_[i]; if (NULL == constraint) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("The constraint is NULL."); + LOG_WARN("The constraint is NULL.", K(ret)); } else if (OB_FAIL(add_constraint(*constraint))) { LOG_WARN("Fail to add constraint, ", K(*constraint), K(ret)); } @@ -4804,7 +4820,7 @@ int ObTableSchema::check_alter_column_is_offline(const ObColumnSchemaV2 *src_col LOG_WARN("The column does not belong to this table", K(ret)); } else if (is_external_table()) { is_offline = false; - } else if (!is_user_table() && !is_index_table() && !is_tmp_table() && !is_sys_table()) { + } else if (!is_user_table() && !is_index_table() && !is_tmp_table() && !is_sys_table() && !is_view_table()) { ret = OB_INVALID_ARGUMENT; LOG_WARN("Only NORMAL table and INDEX table and SYSTEM table are allowed", K(ret)); } else if (OB_FAIL(check_if_oracle_compat_mode(is_oracle_mode))) { @@ -4988,7 +5004,7 @@ int ObTableSchema::check_column_can_be_altered_online( LOG_WARN("The column does not belong to this table", K(ret)); } else if (is_external_table()) { // external table canbe altered - } else if (!is_user_table() && !is_index_table() && !is_tmp_table() && !is_sys_table()) { + } else if (!is_user_table() && !is_index_table() && !is_tmp_table() && !is_sys_table() && !is_view_table()) { ret = OB_INVALID_ARGUMENT; LOG_WARN("Only NORMAL table and INDEX table and SYSTEM table are allowed", K(ret)); } else { @@ -7998,7 +8014,8 @@ int ObColumnIterByPrevNextID::next(const ObColumnSchemaV2 *&column_schema) } } else { if (OB_ISNULL(last_column_schema_)) { - if (table_schema_.is_sys_view() && 0 == table_schema_.get_column_count()) { + if ((table_schema_.is_sys_view() || table_schema_.get_object_status() == ObObjectStatus::INVALID) + && 0 == table_schema_.get_column_count()) { is_end_ = true; ret = OB_ITER_END; } else { @@ -8272,8 +8289,7 @@ int ObTableSchema::alter_all_view_columns_type_undefined(bool &already_invalid) if (OB_ISNULL(column_schema)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("failed to get column schema", K(ret)); - } else if (ObObjType::ObExtendType == column_schema->get_data_type() - && ObObjType::ObUserDefinedSQLType == column_schema->get_data_type()) { + } else if (ObObjType::ObExtendType == column_schema->get_data_type()) { already_invalid = true; break; } else if (OB_FAIL(new_column_schema.assign(*column_schema))) { diff --git a/src/share/schema/ob_table_schema.h b/src/share/schema/ob_table_schema.h index 5db974379d..04e0de20ed 100644 --- a/src/share/schema/ob_table_schema.h +++ b/src/share/schema/ob_table_schema.h @@ -1063,6 +1063,7 @@ public: void reset_partition_schema() override; void reset_column_part_key_info(); int assign(const ObTableSchema &src_schema); + int get_view_column_comment(ObIArray &column_comments); //part splitting filter is needed during physical splitting bool need_part_filter() const { diff --git a/src/share/schema/ob_user_sql_service.cpp b/src/share/schema/ob_user_sql_service.cpp index f0e1695378..a0fb9b17be 100644 --- a/src/share/schema/ob_user_sql_service.cpp +++ b/src/share/schema/ob_user_sql_service.cpp @@ -306,13 +306,16 @@ int ObUserSqlService::drop_user( // 1). role: update related grantees' schema version // 2). grantee: update related roles' schema version const ObUserInfo *user = NULL; + lib::Worker::CompatMode cmp_mode = lib::Worker::CompatMode::INVALID; if (FAILEDx(schema_guard.get_user_info(tenant_id, user_id, user))) { LOG_WARN("failed to get user info", K(ret), K(tenant_id), K(user_id)); } else if (NULL == user) { ret = OB_ERR_UNEXPECTED; LOG_WARN("user info is null", K(ret), K(user_id)); + } else if (OB_FAIL(schema_guard.get_tenant_compat_mode(tenant_id, cmp_mode))) { + LOG_WARN("fail to get compat mode", K(ret)); } else { - const bool is_role = user->is_role(); + const bool is_role = user->is_role() || (lib::Worker::CompatMode::MYSQL == cmp_mode); OZ (drop_user_delete_role_grantee_map(tenant_id, is_role, new_schema_version, user, ddl_stmt_str, sql_client, schema_guard)); @@ -811,13 +814,16 @@ int ObUserSqlService::gen_user_dml( const bool is_ssl_support = (user.get_ssl_type() != ObSSLType::SSL_TYPE_NOT_SPECIFIED); LOG_INFO("gen_user_dml", K(is_ssl_support), K(user), K(is_from_inner_sql)); uint64_t compat_version = 0; + bool is_oracle_mode = false; if (OB_FAIL(GET_MIN_DATA_VERSION(user.get_tenant_id(), compat_version))) { LOG_WARN("fail to get data version", KR(ret), K(user.get_tenant_id())); + } else if (OB_FAIL(ObCompatModeGetter::check_is_oracle_mode_with_tenant_id(user.get_tenant_id(), is_oracle_mode))) { + LOG_WARN("fail to check is oracle mode", K(ret)); } else if (OB_FAIL(dml.add_pk_column("tenant_id", ObSchemaUtils::get_extract_tenant_id( exec_tenant_id, user.get_tenant_id()))) || OB_FAIL(dml.add_pk_column("user_id", ObSchemaUtils::get_extract_schema_id( exec_tenant_id,user.get_user_id()))) - || OB_FAIL(dml.add_column("user_name", user.get_user_name())) + || OB_FAIL(dml.add_column("user_name", ObHexEscapeSqlStr(user.get_user_name()))) || OB_FAIL(dml.add_column("host", user.get_host_name())) || OB_FAIL(dml.add_column("passwd", user.get_passwd())) || OB_FAIL(dml.add_column("info", user.get_info())) @@ -870,6 +876,21 @@ int ObUserSqlService::gen_user_dml( } else if (OB_FAIL(dml.add_column("PRIV_CREATE_DATABASE_LINK", user.get_priv(OB_PRIV_CREATE_DATABASE_LINK) ? 1 : 0))) { LOG_WARN("add PRIV_CREATE_DATABASE_LINK column failed", K(user.get_priv(OB_PRIV_CREATE_DATABASE_LINK)), K(ret)); } + int64_t priv_others = 0; + if (OB_SUCC(ret)) { + if ((user.get_priv_set() & OB_PRIV_EXECUTE) != 0) { priv_others |= 1; } + if ((user.get_priv_set() & OB_PRIV_ALTER_ROUTINE) != 0) { priv_others |= 2; } + if ((user.get_priv_set() & OB_PRIV_CREATE_ROUTINE) != 0) { priv_others |= 4; } + } + if (OB_FAIL(ret)) { + } else if (!sql::ObSQLUtils::is_data_version_ge_423_or_431(compat_version)) { + if (priv_others != 0) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("some column of user info is not empty when MIN_DATA_VERSION is below DATA_VERSION_4_3_1_0 or DATA_VERSION_4_2_3_0", K(ret), K(user.get_priv(OB_PRIV_EXECUTE)), K(user.get_priv(OB_PRIV_ALTER_ROUTINE)), K(user.get_priv(OB_PRIV_CREATE_ROUTINE))); + } + } else if (OB_FAIL(dml.add_column("PRIV_OTHERS", priv_others))) { + LOG_WARN("add PRIV_OTHERS column failed", K(priv_others), K(ret)); + } return ret; } diff --git a/src/sql/engine/cmd/ob_dcl_executor.cpp b/src/sql/engine/cmd/ob_dcl_executor.cpp index 887a23e856..64a772e7cd 100644 --- a/src/sql/engine/cmd/ob_dcl_executor.cpp +++ b/src/sql/engine/cmd/ob_dcl_executor.cpp @@ -51,6 +51,9 @@ int ObGrantExecutor::execute(ObExecContext &ctx, ObGrantStmt &stmt) } else if (OB_ISNULL(common_rpc_proxy = task_exec_ctx->get_common_rpc())) { ret = OB_NOT_INIT; LOG_WARN("get common rpc proxy failed", K(ret)); + } else if (OB_ISNULL(GCTX.schema_service_)) { + ret = OB_NOT_INIT; + LOG_WARN("get schema service failed", K(ret)); } else if (!is_role) { ObString user_name; ObString host_name; @@ -124,11 +127,27 @@ int ObGrantExecutor::execute(ObExecContext &ctx, ObGrantStmt &stmt) arg.object_type_ = stmt.get_object_type(); arg.object_id_ = stmt.get_object_id(); arg.grantor_id_ = stmt.get_grantor_id(); - arg.ins_col_ids_ = stmt.get_ins_col_ids(); - arg.upd_col_ids_ = stmt.get_upd_col_ids(); - arg.ref_col_ids_ = stmt.get_ref_col_ids(); arg.is_inner_ = session_info->is_inner(); - if (OB_FAIL(common_rpc_proxy->grant(arg))) { + arg.based_schema_object_infos_.reset(); + if (OB_FAIL(append(arg.column_names_priv_, stmt.get_column_privs())) + || OB_FAIL(append(arg.ins_col_ids_, stmt.get_ins_col_ids())) + || OB_FAIL(append(arg.upd_col_ids_, stmt.get_upd_col_ids())) + || OB_FAIL(append(arg.ref_col_ids_, stmt.get_ref_col_ids()))) { + LOG_WARN("append failed", K(ret)); + } else if (lib::is_mysql_mode() && arg.object_type_ == ObObjectType::TABLE + && arg.column_names_priv_.count() > 0) { + if (arg.object_id_ == OB_INVALID) { + //do nothing + //todo: oracle every object will use id, and should also record the schema version in future. + } else if (stmt.get_table_schema_version() != 0 + && OB_FAIL(arg.based_schema_object_infos_.push_back(ObBasedSchemaObjectInfo(arg.object_id_, + TABLE_SCHEMA, + stmt.get_table_schema_version())))) { + LOG_WARN("push back failed", K(ret)); + } + } + if (OB_FAIL(ret)) { + } else if (OB_FAIL(common_rpc_proxy->grant(arg))) { LOG_WARN("Grant privileges to user error", K(ret), K(arg)); } } @@ -147,6 +166,8 @@ int ObRevokeExecutor::execute(ObExecContext &ctx, ObRevokeStmt &stmt) } else if (OB_ISNULL(common_rpc_proxy = task_exec_ctx->get_common_rpc())) { ret = OB_NOT_INIT; LOG_WARN("get common rpc proxy failed"); + } else if (stmt.get_has_warning()) { + //do nothing } else { switch (stmt.get_grant_level()) { case OB_PRIV_USER_LEVEL: { @@ -166,13 +187,19 @@ int ObRevokeExecutor::execute(ObExecContext &ctx, ObRevokeStmt &stmt) LOG_WARN("grant_revoke_user error", K(ret)); } break; + } + case OB_PRIV_ROUTINE_LEVEL: { + if (OB_FAIL(revoke_routine(common_rpc_proxy, stmt))) { + LOG_WARN("grant_revoke_user error", K(ret)); + } + break; + } case OB_PRIV_SYS_ORACLE_LEVEL: { // Oracle revoke role and sys_priv if (OB_FAIL(revoke_sys_priv(common_rpc_proxy, stmt))) { LOG_WARN("grant_revoke_user error", K(ret)); } break; } - } default: { ret = OB_ERR_UNEXPECTED; LOG_WARN("Resolver may be error, invalid grant_level", @@ -249,7 +276,7 @@ int ObRevokeExecutor::revoke_db(obrpc::ObCommonRpcProxy *rpc_proxy, ObRevokeStmt int ObRevokeExecutor::revoke_table(obrpc::ObCommonRpcProxy *rpc_proxy, ObRevokeStmt &stmt) { int ret = OB_SUCCESS; - if (OB_ISNULL(rpc_proxy)) { + if (OB_ISNULL(rpc_proxy) || OB_ISNULL(GCTX.schema_service_)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("Input argument error", K(rpc_proxy), K(ret)); } else { @@ -258,7 +285,57 @@ int ObRevokeExecutor::revoke_table(obrpc::ObCommonRpcProxy *rpc_proxy, ObRevokeS arg.priv_set_ = stmt.get_priv_set(); arg.db_ = stmt.get_database_name(); arg.table_ = stmt.get_table_name(); - arg.obj_id_ = stmt.get_obj_id(); + arg.obj_id_ = stmt.get_object_id(); + arg.obj_type_ = static_cast(stmt.get_object_type()); + arg.grantor_id_ = stmt.get_grantor_id(); + arg.revoke_all_ora_ = stmt.get_revoke_all_ora(); + arg.based_schema_object_infos_.reset(); + if (OB_FAIL(append(arg.column_names_priv_, stmt.get_column_privs()))) { + LOG_WARN("append failed", K(ret)); + } else if (stmt.get_object_type() == ObObjectType::TABLE + && (arg.column_names_priv_.count() > 0)) { + if (arg.obj_id_ == OB_INVALID) { + //do nothing + //todo: oracle every object will use id, and should also record the schema version in future. + } else if (lib::is_mysql_mode() && stmt.get_table_schema_version()!= 0 && + OB_FAIL(arg.based_schema_object_infos_.push_back(ObBasedSchemaObjectInfo(arg.obj_id_, + TABLE_SCHEMA, + stmt.get_table_schema_version())))) { + LOG_WARN("push back failed", K(ret)); + } + } else { + //todo: pl routine and others + } + const ObIArray &user_ids = stmt.get_users(); + if (OB_FAIL(ret)) { + } else if (0 == user_ids.count()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("User ids is empty, resolver may be error", K(ret)); + } else { + for (int i = 0; OB_SUCC(ret) && i < user_ids.count(); i++) { + arg.user_id_ = user_ids.at(i); + if (OB_FAIL(rpc_proxy->revoke_table(arg))) { + LOG_WARN("revoke user error", K(arg), K(ret)); + } + } + } + } + return ret; +} + +int ObRevokeExecutor::revoke_routine(obrpc::ObCommonRpcProxy *rpc_proxy, ObRevokeStmt &stmt) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(rpc_proxy)) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("Input argument error", K(rpc_proxy), K(ret)); + } else { + obrpc::ObRevokeRoutineArg &arg = static_cast(stmt.get_ddl_arg()); + arg.tenant_id_ = stmt.get_tenant_id(); + arg.priv_set_ = stmt.get_priv_set(); + arg.db_ = stmt.get_database_name(); + arg.routine_ = stmt.get_table_name(); + arg.obj_id_ = stmt.get_object_id(); arg.obj_type_ = static_cast(stmt.get_object_type()); arg.grantor_id_ = stmt.get_grantor_id(); arg.revoke_all_ora_ = stmt.get_revoke_all_ora(); @@ -270,7 +347,7 @@ int ObRevokeExecutor::revoke_table(obrpc::ObCommonRpcProxy *rpc_proxy, ObRevokeS } else { for (int i = 0; OB_SUCC(ret) && i < user_ids.count(); i++) { arg.user_id_ = user_ids.at(i); - if (OB_FAIL(rpc_proxy->revoke_table(arg))) { + if (OB_FAIL(rpc_proxy->revoke_routine(arg))) { LOG_WARN("revoke user error", K(arg), K(ret)); } } diff --git a/src/sql/engine/cmd/ob_dcl_executor.h b/src/sql/engine/cmd/ob_dcl_executor.h index e95315bcf3..66162547b9 100644 --- a/src/sql/engine/cmd/ob_dcl_executor.h +++ b/src/sql/engine/cmd/ob_dcl_executor.h @@ -54,6 +54,8 @@ private: ObRevokeStmt &stmt); int revoke_table(obrpc::ObCommonRpcProxy *rpc_proxy, ObRevokeStmt &stmt); + + int revoke_routine(obrpc::ObCommonRpcProxy *rpc_proxy, ObRevokeStmt &stmt); int revoke_sys_priv(obrpc::ObCommonRpcProxy *rpc_proxy, ObRevokeStmt &stmt); private: diff --git a/src/sql/engine/cmd/ob_role_cmd_executor.cpp b/src/sql/engine/cmd/ob_role_cmd_executor.cpp index f44a9af9fa..41b2e8eaea 100644 --- a/src/sql/engine/cmd/ob_role_cmd_executor.cpp +++ b/src/sql/engine/cmd/ob_role_cmd_executor.cpp @@ -41,6 +41,8 @@ int ObCreateRoleExecutor::execute(ObExecContext &ctx, ObCreateRoleStmt &stmt) const uint64_t tenant_id = stmt.get_tenant_id(); const ObString &role_name = stmt.get_role_name(); const ObString &pwd = stmt.get_password(); + ObCreateUserArg arg; + if (OB_ISNULL(task_exec_ctx = GET_TASK_EXECUTOR_CTX(ctx))) { ret = OB_NOT_INIT; LOG_WARN("get task executor context failed"); @@ -51,10 +53,12 @@ int ObCreateRoleExecutor::execute(ObExecContext &ctx, ObCreateRoleStmt &stmt) ret = OB_ERR_UNEXPECTED; LOG_WARN("failed to get mysession", K(ret)); } else { - ObCreateUserArg arg; arg.tenant_id_ = tenant_id; arg.exec_tenant_id_ = tenant_id; arg.creator_id_ = mysession->get_user_id(); + } + + if (OB_SUCC(ret) && lib::is_oracle_mode()) { ObUserInfo user_info; user_info.set_tenant_id(tenant_id); user_info.set_type(OB_ROLE); @@ -83,6 +87,23 @@ int ObCreateRoleExecutor::execute(ObExecContext &ctx, ObCreateRoleStmt &stmt) LOG_WARN("Create user error", K(ret)); } } + + if (OB_SUCC(ret) && lib::is_mysql_mode()) { + ObSArray failed_index; + arg.if_not_exist_ = stmt.get_if_not_exists(); + arg.is_create_role_ = true; + for (int i = 0; OB_SUCC(ret) && i < stmt.get_user_names().count(); i++) { + ObUserInfo user_info; + user_info.set_tenant_id(tenant_id); + user_info.set_type(OB_ROLE); + user_info.set_user_name(stmt.get_user_names().at(i)); + user_info.set_host(stmt.get_host_names().at(i)); + user_info.set_is_locked(true); + OZ (arg.user_infos_.push_back(user_info)); + } + OZ (common_rpc_proxy->create_user(arg, failed_index)); + } + return ret; } @@ -92,6 +113,7 @@ int ObDropRoleExecutor::execute(ObExecContext &ctx, ObDropRoleStmt &stmt) ObTaskExecutorCtx *task_exec_ctx = NULL; obrpc::ObCommonRpcProxy *common_rpc_proxy = NULL; const uint64_t tenant_id = stmt.get_tenant_id(); + ObDropUserArg &arg = static_cast(stmt.get_ddl_arg()); if (OB_INVALID_ID == tenant_id) { ret = OB_INVALID_ARGUMENT; LOG_WARN("tenant is invalid", K(ret)); @@ -101,8 +123,7 @@ int ObDropRoleExecutor::execute(ObExecContext &ctx, ObDropRoleStmt &stmt) } else if (NULL == (common_rpc_proxy = task_exec_ctx->get_common_rpc())) { ret = OB_NOT_INIT; LOG_WARN("get common rpc proxy failed", K(ret)); - } else { - ObDropUserArg &arg = static_cast(stmt.get_ddl_arg()); + } else if (lib::is_oracle_mode()) { arg.tenant_id_ = tenant_id; arg.exec_tenant_id_ = tenant_id; arg.is_role_ = true; @@ -118,6 +139,15 @@ int ObDropRoleExecutor::execute(ObExecContext &ctx, ObDropRoleStmt &stmt) //ret = OB_CANNOT_USER; //LOG_USER_ERROR(ret, strlen("DROP ROLE"), "DROP ROLE", role_name.length(), role_name.ptr()); } + } else { + arg.tenant_id_ = tenant_id; + arg.exec_tenant_id_ = tenant_id; + arg.is_role_ = true; + for (int i = 0; OB_SUCC(ret) && i < stmt.get_user_names().count(); i++) { + OZ (arg.users_.push_back(stmt.get_user_names().at(i))); + OZ (arg.hosts_.push_back(stmt.get_host_names().at(i))); + } + OZ (ObDropUserExecutor::drop_user(common_rpc_proxy, arg)); } return ret; diff --git a/src/sql/engine/cmd/ob_routine_executor.cpp b/src/sql/engine/cmd/ob_routine_executor.cpp index 4e82d7f954..b13e925be4 100644 --- a/src/sql/engine/cmd/ob_routine_executor.cpp +++ b/src/sql/engine/cmd/ob_routine_executor.cpp @@ -48,6 +48,7 @@ int ObCreateRoutineExecutor::execute(ObExecContext &ctx, ObCreateRoutineStmt &st } else { crt_routine_arg.ddl_stmt_str_ = first_stmt; } + if (OB_FAIL(ret)) { } else if (OB_ISNULL(task_exec_ctx = GET_TASK_EXECUTOR_CTX(ctx))) { ret = OB_NOT_INIT; diff --git a/src/sql/engine/cmd/ob_user_cmd_executor.cpp b/src/sql/engine/cmd/ob_user_cmd_executor.cpp index 442fffd0b4..2fbd3854c4 100644 --- a/src/sql/engine/cmd/ob_user_cmd_executor.cpp +++ b/src/sql/engine/cmd/ob_user_cmd_executor.cpp @@ -54,6 +54,35 @@ int ObCreateUserExecutor::encrypt_passwd(const common::ObString& pwd, return ret; } +int ObCreateUserExecutor::check_user_valid(ObSchemaGetterGuard& schema_guard, + uint64_t priv_set, + int64_t tenant_id, + const ObString &user_name, + const ObString &host_name, + const ObString &opreation_name) +{ + int ret = OB_SUCCESS; + ObSqlString full_user_name; + bool existed = false; + if (!ObSchemaChecker::enable_mysql_pl_priv_check(tenant_id, schema_guard)) { + } else if (OB_FAIL(full_user_name.append_fmt("%.*s@%.*s", user_name.length(), user_name.ptr(), + host_name.length(), host_name.ptr()))) { + LOG_WARN("append fmt failed", K(ret)); + } else if (OB_FAIL(schema_guard.check_routine_definer_existed(tenant_id, full_user_name.string(), existed))) { + LOG_WARN("check routine definer existed failed", K(ret)); + } else if (existed) { + if ((priv_set & OB_PRIV_SUPER) != 0) { + LOG_USER_WARN(OB_ERR_USER_REFFERD_AS_DEFINER, user_name.length(), user_name.ptr(), host_name.length(), host_name.ptr()); + } else { + ret = OB_ERR_OPERATION_ON_USER_REFERRED_AS_DEFINER; + LOG_WARN("create user has definer", K(ret)); + LOG_USER_ERROR(OB_ERR_OPERATION_ON_USER_REFERRED_AS_DEFINER, opreation_name.length(), opreation_name.ptr(), + user_name.length(), user_name.ptr(), host_name.length(), host_name.ptr()); + } + } + LOG_DEBUG("check user valid status", K(priv_set), K(ret)); + return ret; +} int ObCreateUserExecutor::userinfo_extract_user_name( const common::ObIArray &user_infos, @@ -87,7 +116,13 @@ int ObCreateUserExecutor::execute(ObExecContext &ctx, ObCreateUserStmt &stmt) const ObStrings &users = stmt.get_users(); const bool if_not_exist = stmt.get_if_not_exists(); const int64_t FIX_MEMBER_CNT = 4; - if (OB_ISNULL(task_exec_ctx = GET_TASK_EXECUTOR_CTX(ctx))) { + if (OB_ISNULL(GCTX.schema_service_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("schema service is null", K(ret)); + } else if (OB_ISNULL(ctx.get_my_session())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected error", K(ret)); + } else if (OB_ISNULL(task_exec_ctx = GET_TASK_EXECUTOR_CTX(ctx))) { ret = OB_NOT_INIT; LOG_WARN("get task executor context failed"); } else if (OB_ISNULL(common_rpc_proxy = task_exec_ctx->get_common_rpc())) { @@ -157,7 +192,13 @@ int ObCreateUserExecutor::execute(ObExecContext &ctx, ObCreateUserStmt &stmt) } if (OB_SUCC(ret)) { - if (OB_FAIL(user_info.set_user_name(user_name))) { + ObSchemaGetterGuard schema_guard; + if (OB_FAIL(GCTX.schema_service_->get_tenant_schema_guard(tenant_id, schema_guard))) { + LOG_WARN("get tenant schema guard failed", K(ret)); + } else if (OB_FAIL(ObCreateUserExecutor::check_user_valid(schema_guard, ctx.get_my_session()->get_user_priv_set(), tenant_id, + user_name, host_name, "CREATE USER"))) { + LOG_WARN("check user valid failed", K(ret)); + } else if (OB_FAIL(user_info.set_user_name(user_name))) { LOG_WARN("set user name failed", K(ret)); } else if (OB_FAIL(user_info.set_host(host_name))) { LOG_WARN("set host name failed", K(ret)); @@ -243,17 +284,10 @@ int ObDropUserExecutor::build_fail_msg(const common::ObIArray if (OB_SUCC(ret)) { const ObString &user = users.at(i); const ObString &host = hosts.at(i); - if (OB_UNLIKELY(user.empty()) || OB_UNLIKELY(host.empty())) { - ret = OB_INVALID_ARGUMENT; - LOG_WARN("Username is invalid", K(ret), K(user), K(host)); - } else { - if (OB_FAIL(msg.append_fmt("'%.*s'@'%.*s'", - user.length(), user.ptr(), - host.length(), host.ptr()))) { - LOG_WARN("Build msg fail", K(user), K(host), K(ret)); - } else { - //do nothing - } + if (OB_FAIL(msg.append_fmt("'%.*s'@'%.*s'", + user.length(), user.ptr(), + host.length(), host.ptr()))) { + LOG_WARN("Build msg fail", K(user), K(host), K(ret)); } } } @@ -291,7 +325,14 @@ int ObDropUserExecutor::execute(ObExecContext &ctx, ObDropUserStmt &stmt) obrpc::ObCommonRpcProxy *common_rpc_proxy = NULL; const uint64_t tenant_id = stmt.get_tenant_id(); const ObStrings *user_names = NULL; - if (OB_INVALID_ID == tenant_id) { + + if (OB_ISNULL(GCTX.schema_service_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("schema service is null", K(ret)); + } else if (OB_ISNULL(ctx.get_my_session())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected error", K(ret)); + } else if (OB_INVALID_ID == tenant_id) { ret = OB_INVALID_ARGUMENT; LOG_WARN("tenant is invalid", K(ret)); } else if (OB_ISNULL(user_names = stmt.get_users())) { @@ -311,17 +352,24 @@ int ObDropUserExecutor::execute(ObExecContext &ctx, ObDropUserStmt &stmt) ObString host_name; ObDropUserArg &arg = static_cast(stmt.get_ddl_arg()); arg.tenant_id_ = tenant_id; - for (int64_t i = 0; OB_SUCC(ret) && i < user_names->count(); i += 2) { - if (OB_FAIL(user_names->get_string(i, user_name))) { - LOG_WARN("Get user name failed", K(ret)); - } else if (OB_FAIL(user_names->get_string(i + 1, host_name))) { - LOG_WARN("Get host name failed", K(ret)); - } else if (OB_FAIL(arg.users_.push_back(user_name))) { - LOG_WARN("Add user name failed", K(ret)); - } else if (OB_FAIL(arg.hosts_.push_back(host_name))) { - LOG_WARN("Add host name failed", K(ret)); - } else { - //do nothing + { + ObSchemaGetterGuard schema_guard; + if (OB_FAIL(GCTX.schema_service_->get_tenant_schema_guard(tenant_id, schema_guard))) { + LOG_WARN("get schema guard failed", K(ret)); + } + for (int64_t i = 0; OB_SUCC(ret) && i < user_names->count(); i += 2) { + if (OB_FAIL(user_names->get_string(i, user_name))) { + LOG_WARN("Get user name failed", K(ret)); + } else if (OB_FAIL(user_names->get_string(i + 1, host_name))) { + LOG_WARN("Get host name failed", K(ret)); + } else if (OB_FAIL(arg.users_.push_back(user_name))) { + LOG_WARN("Add user name failed", K(ret)); + } else if (OB_FAIL(arg.hosts_.push_back(host_name))) { + LOG_WARN("Add host name failed", K(ret)); + } else if (OB_FAIL(ObCreateUserExecutor::check_user_valid(schema_guard, ctx.get_my_session()->get_user_priv_set(), tenant_id, + user_name, host_name, "DROP USER"))) { + LOG_WARN("check user valid failed", K(ret)); + } } } if (OB_SUCC(ret)) { @@ -353,13 +401,8 @@ int ObDropUserExecutor::drop_user(obrpc::ObCommonRpcProxy *rpc_proxy, ObSqlString fail_msg; if (OB_FAIL(rpc_proxy->drop_user(arg, failed_index))) { LOG_WARN("Lock user failed", K(ret)); - if (OB_FAIL(ObDropUserExecutor::build_fail_msg(arg.users_, arg.hosts_, fail_msg))) { - LOG_WARN("Build fail msg error", K(arg), K(ret)); - } else { - ret = OB_CANNOT_USER; - LOG_USER_ERROR(OB_CANNOT_USER, (int)strlen("DROP USER"), "DROP USER", (int)fail_msg.length(), fail_msg.ptr()); - } - } else if (0 != failed_index.count()) { + } + if (0 != failed_index.count()) { ObSArray failed_users; ObSArray failed_hosts; if (OB_FAIL(ObDropUserExecutor::string_array_index_extract(arg.users_, arg.hosts_, @@ -369,11 +412,10 @@ int ObDropUserExecutor::drop_user(obrpc::ObCommonRpcProxy *rpc_proxy, } else if (OB_FAIL(ObDropUserExecutor::build_fail_msg(failed_users, failed_hosts, fail_msg))) { LOG_WARN("Build fail msg error", K(arg), K(ret)); } else { + const char *ERR_CMD = (arg.is_role_ && lib::is_mysql_mode()) ? "DROP ROLE" : "DROP USER"; ret = OB_CANNOT_USER; - LOG_USER_ERROR(OB_CANNOT_USER, (int)strlen("DROP USER"), "DROP USER", (int)fail_msg.length(), fail_msg.ptr()); + LOG_USER_ERROR(OB_CANNOT_USER, (int)strlen(ERR_CMD), ERR_CMD, (int)fail_msg.length(), fail_msg.ptr()); } - } else { - //do nothing } } return ret; @@ -481,12 +523,13 @@ int ObAlterUserProfileExecutor::set_role_exec(ObExecContext &ctx, ObAlterUserPro int ret = OB_SUCCESS; ObSQLSessionInfo *session = NULL; uint64_t role_id = OB_INVALID_ID; - CK (1 == stmt.get_set_role_flag()); + CK (ObAlterUserProfileStmt::SET_ROLE == stmt.get_set_role_flag()); if (OB_ISNULL(session = ctx.get_my_session())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("session is NULL", K(ret)); } else { const uint64_t tenant_id = session->get_effective_tenant_id(); + const uint64_t user_id = lib::is_mysql_mode() ? session->get_priv_user_id() : session->get_user_id(); const ObUserInfo * user_info = NULL; common::ObIArray &enable_role_id_array = session->get_enable_role_array(); @@ -496,7 +539,7 @@ int ObAlterUserProfileExecutor::set_role_exec(ObExecContext &ctx, ObAlterUserPro OZ (GCTX.schema_service_->get_tenant_schema_guard( tenant_id, schema_guard)); - OZ (schema_guard.get_user_info(tenant_id, session->get_user_id(), user_info)); + OZ (schema_guard.get_user_info(tenant_id, user_id, user_info)); if (OB_SUCC(ret) && NULL == user_info) { ret = OB_ERR_UNEXPECTED; LOG_WARN("user info is null", K(ret)); @@ -527,8 +570,18 @@ int ObAlterUserProfileExecutor::set_role_exec(ObExecContext &ctx, ObAlterUserPro } } break; + case OB_DEFAULT_ROLE_DEFAULT: + OX (enable_role_id_array.reset()); + for (int i = 0; OB_SUCC(ret) && i < user_info->get_role_id_array().count(); i++) { + if (user_info->get_disable_option(user_info->get_role_id_option_array().at(i)) == 0) { + OZ (enable_role_id_array.push_back(user_info->get_role_id_array().at(i))); + } + } + break; + } + if (lib::is_oracle_mode()) { + OZ (enable_role_id_array.push_back(OB_ORA_PUBLIC_ROLE_ID)); } - OZ (enable_role_id_array.push_back(OB_ORA_PUBLIC_ROLE_ID)); } } return ret; @@ -543,7 +596,7 @@ int ObAlterUserProfileExecutor::execute(ObExecContext &ctx, ObAlterUserProfileSt if (OB_ISNULL(task_exec_ctx = GET_TASK_EXECUTOR_CTX(ctx))) { ret = OB_NOT_INIT; LOG_WARN("get task executor context failed", K(ret)); - } else if (1 == stmt.get_set_role_flag()) { + } else if (ObAlterUserProfileStmt::SET_ROLE == stmt.get_set_role_flag()) { OZ (set_role_exec(ctx, stmt)); } else if (OB_ISNULL(common_rpc_proxy = task_exec_ctx->get_common_rpc())) { ret = OB_NOT_INIT; @@ -561,7 +614,13 @@ int ObRenameUserExecutor::execute(ObExecContext &ctx, ObRenameUserStmt &stmt) obrpc::ObCommonRpcProxy *common_rpc_proxy = NULL; const uint64_t tenant_id = stmt.get_tenant_id(); const ObStrings *rename_infos = NULL; - if (OB_INVALID_ID == tenant_id) { + if (OB_ISNULL(GCTX.schema_service_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("schema service is null", K(ret)); + } else if (OB_ISNULL(ctx.get_my_session())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected error", K(ret)); + } else if (OB_INVALID_ID == tenant_id) { ret = OB_INVALID_ARGUMENT; LOG_WARN("tenant is invalid", K(ret)); } else if (OB_ISNULL(rename_infos = stmt.get_rename_infos())) { @@ -586,24 +645,36 @@ int ObRenameUserExecutor::execute(ObExecContext &ctx, ObRenameUserStmt &stmt) ObString new_hostname; ObRenameUserArg &arg = static_cast(stmt.get_ddl_arg()); arg.tenant_id_ = tenant_id; - //rename_infos arr contains old names and new names in pairs, so step is 2 - for (int64_t i = 0; OB_SUCC(ret) && i < rename_infos->count(); i += 4) { - if (OB_FAIL(rename_infos->get_string(i, old_username))) { - LOG_WARN("Get origin name failed", K(ret)); - } else if (OB_FAIL(rename_infos->get_string(i + 1, old_hostname))) { - LOG_WARN("Get to name failed", K(ret)); - } else if (OB_FAIL(rename_infos->get_string(i + 2, new_username))) { - LOG_WARN("Get to name failed", K(ret)); - } else if (OB_FAIL(rename_infos->get_string(i + 3, new_hostname))) { - LOG_WARN("Get to name failed", K(ret)); - } else if (OB_FAIL(arg.old_users_.push_back(old_username))) { - LOG_WARN("Add origin user name failed", K(ret)); - } else if (OB_FAIL(arg.old_hosts_.push_back(old_hostname))) { - LOG_WARN("Add origin host name failed", K(ret)); - } else if (OB_FAIL(arg.new_users_.push_back(new_username))) { - LOG_WARN("Add new user name failed", K(ret)); - } else if (OB_FAIL(arg.new_hosts_.push_back(new_hostname))) { - LOG_WARN("Add new host name failed", K(ret)); + { + ObSchemaGetterGuard schema_guard; + if (OB_FAIL(GCTX.schema_service_->get_tenant_schema_guard(tenant_id, schema_guard))) { + LOG_WARN("get schema guard failed", K(ret)); + } + //rename_infos arr contains old names and new names in pairs, so step is 2 + for (int64_t i = 0; OB_SUCC(ret) && i < rename_infos->count(); i += 4) { + if (OB_FAIL(rename_infos->get_string(i, old_username))) { + LOG_WARN("Get origin name failed", K(ret)); + } else if (OB_FAIL(rename_infos->get_string(i + 1, old_hostname))) { + LOG_WARN("Get to name failed", K(ret)); + } else if (OB_FAIL(rename_infos->get_string(i + 2, new_username))) { + LOG_WARN("Get to name failed", K(ret)); + } else if (OB_FAIL(rename_infos->get_string(i + 3, new_hostname))) { + LOG_WARN("Get to name failed", K(ret)); + } else if (OB_FAIL(arg.old_users_.push_back(old_username))) { + LOG_WARN("Add origin user name failed", K(ret)); + } else if (OB_FAIL(arg.old_hosts_.push_back(old_hostname))) { + LOG_WARN("Add origin host name failed", K(ret)); + } else if (OB_FAIL(arg.new_users_.push_back(new_username))) { + LOG_WARN("Add new user name failed", K(ret)); + } else if (OB_FAIL(arg.new_hosts_.push_back(new_hostname))) { + LOG_WARN("Add new host name failed", K(ret)); + } else if (OB_FAIL(ObCreateUserExecutor::check_user_valid(schema_guard, ctx.get_my_session()->get_user_priv_set(), tenant_id, + old_username, old_hostname, "RENAME USER"))) { + LOG_WARN("check user valid failed", K(ret)); + } else if (OB_FAIL(ObCreateUserExecutor::check_user_valid(schema_guard, ctx.get_my_session()->get_user_priv_set(), tenant_id, + new_username, new_hostname, "RENAME USER"))) { + LOG_WARN("check user valid failed", K(ret)); + } } } if (OB_SUCC(ret)) { diff --git a/src/sql/engine/cmd/ob_user_cmd_executor.h b/src/sql/engine/cmd/ob_user_cmd_executor.h index e6b5411910..faccf81a7f 100644 --- a/src/sql/engine/cmd/ob_user_cmd_executor.h +++ b/src/sql/engine/cmd/ob_user_cmd_executor.h @@ -47,6 +47,13 @@ public: const common::ObIArray &index, common::ObIArray &users, common::ObIArray &hosts); + + static int check_user_valid(share::schema::ObSchemaGetterGuard& schema_guard, + uint64_t priv_set, + int64_t tenant_id, + const common::ObString &user_name, + const common::ObString &host_name, + const common::ObString &opreation_name); private: int create_user(obrpc::ObCommonRpcProxy *rpc_proxy, const obrpc::ObCreateUserArg &arg) const; @@ -68,11 +75,11 @@ public: const common::ObIArray &index, common::ObIArray &dst_users, common::ObIArray &dst_hosts); + static int drop_user(obrpc::ObCommonRpcProxy *rpc_proxy, + const obrpc::ObDropUserArg &arg); int execute(ObExecContext &ctx, ObDropUserStmt &stmt); private: - int drop_user(obrpc::ObCommonRpcProxy *rpc_proxy, - const obrpc::ObDropUserArg &arg); DISALLOW_COPY_AND_ASSIGN(ObDropUserExecutor); }; diff --git a/src/sql/engine/cmd/ob_variable_set_executor.cpp b/src/sql/engine/cmd/ob_variable_set_executor.cpp index 46a207bd95..b8a1d30744 100644 --- a/src/sql/engine/cmd/ob_variable_set_executor.cpp +++ b/src/sql/engine/cmd/ob_variable_set_executor.cpp @@ -712,6 +712,10 @@ int ObVariableSetExecutor::update_global_variables(ObExecContext &ctx, if (OB_FAIL(ObBasicSessionInfo::check_optimizer_features_enable_valid(val))) { LOG_WARN("fail check optimizer_features_enable valid", K(val), K(ret)); } + } else if (set_var.var_name_ == OB_SV_PRIVILEGE_FEATURES_ENABLE) { + if (OB_FAIL(ObBasicSessionInfo::check_optimizer_features_enable_valid(val))) { + LOG_WARN("fail check privilege_features_enable valid", K(val), K(ret)); + } } if (OB_SUCC(ret) && should_update_extra_var) { diff --git a/src/sql/engine/expr/ob_expr_current_user_priv.cpp b/src/sql/engine/expr/ob_expr_current_user_priv.cpp index 429fef914e..cd30e9d1b1 100644 --- a/src/sql/engine/expr/ob_expr_current_user_priv.cpp +++ b/src/sql/engine/expr/ob_expr_current_user_priv.cpp @@ -19,6 +19,7 @@ #include "lib/mysqlclient/ob_mysql_proxy.h" #include "lib/oblog/ob_log_module.h" #include "sql/engine/ob_exec_context.h" +#include "sql/engine/expr/ob_expr_lob_utils.h" using namespace oceanbase::common; using namespace oceanbase::sql; @@ -69,5 +70,87 @@ int ObExprCurrentUserPriv::cg_expr(ObExprCGCtx &op_cg_ctx, const ObRawExpr &raw_ return OB_SUCCESS; } +ObExprCurrentRole::ObExprCurrentRole(ObIAllocator &alloc) + : ObFuncExprOperator(alloc, T_FUN_SYS_CURRENT_ROLE, + N_CURRENT_ROLE, 0, + NOT_VALID_FOR_GENERATED_COL, NOT_ROW_DIMENSION) { +} + +ObExprCurrentRole::~ObExprCurrentRole() { +} + +int ObExprCurrentRole::cg_expr(ObExprCGCtx &op_cg_ctx, const ObRawExpr &raw_expr, + ObExpr &rt_expr) const +{ + UNUSED(raw_expr); + UNUSED(op_cg_ctx); + rt_expr.eval_func_ = ObExprCurrentRole::eval_current_role; + return OB_SUCCESS; +} + +int ObExprCurrentRole::calc_result_type0(ObExprResType &type, ObExprTypeCtx &type_ctx) const +{ + int ret = OB_SUCCESS; + UNUSED(type_ctx); + type.set_type(ObLongTextType); + type.set_collation_type(CS_TYPE_UTF8MB4_GENERAL_CI); + type.set_collation_level(CS_LEVEL_SYSCONST); + return ret; +} + +int ObExprCurrentRole::eval_current_role(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &expr_datum) +{ + int ret = OB_SUCCESS; + uint64_t tenant_id = MTL_ID(); + ObSchemaGetterGuard schema_guard; + ObSQLSessionInfo *session_info = NULL; + ObSqlString data; + lib::ObMemAttr attr(tenant_id, ObModIds::OB_SQL_STRING); + data.set_attr(attr); + + if (OB_ISNULL(session_info = ctx.exec_ctx_.get_my_session())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("session info is null", K(ret)); + } else if (OB_ISNULL(GCTX.schema_service_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed to get schema_service", K(ret)); + } else if (OB_FAIL(GCTX.schema_service_->get_tenant_schema_guard(tenant_id, schema_guard))) { + LOG_WARN("failed to get schema guard", K(ret)); + } else { + const ObIArray &roles = session_info->get_enable_role_array(); + + for (int i = 0; OB_SUCC(ret) && i < roles.count(); i++) { + const ObUserInfo *user_info = NULL; + OZ (schema_guard.get_user_info(tenant_id, roles.at(i), user_info)); + if (OB_ISNULL(user_info)) { + //ignored + } else { + OZ (data.append_fmt("`%.*s`@`%.*s`,", + user_info->get_user_name_str().length(), + user_info->get_user_name_str().ptr(), + user_info->get_host_name_str().length(), + user_info->get_host_name_str().ptr())); + } + } + + if (OB_SUCC(ret)) { + if (data.empty()) { + OZ (data.append("NONE")); + } else { + data.set_length(data.length() - 1); + } + } + } + + if (OB_SUCC(ret)) { + ObTextStringDatumResult output_result(expr.datum_meta_.type_, &expr, &ctx, &expr_datum); + OZ (output_result.init(data.length())); + OZ (output_result.append(data.string())); + OX (output_result.set_result()); + } + + return ret; +} + }/* ns sql*/ }/* ns oceanbase */ diff --git a/src/sql/engine/expr/ob_expr_current_user_priv.h b/src/sql/engine/expr/ob_expr_current_user_priv.h index 85f7d19ba4..541fbd5510 100644 --- a/src/sql/engine/expr/ob_expr_current_user_priv.h +++ b/src/sql/engine/expr/ob_expr_current_user_priv.h @@ -33,6 +33,21 @@ public: private: DISALLOW_COPY_AND_ASSIGN(ObExprCurrentUserPriv); }; + +class ObExprCurrentRole : public ObFuncExprOperator +{ +public: + explicit ObExprCurrentRole(common::ObIAllocator &alloc); + virtual ~ObExprCurrentRole(); + virtual int calc_result_type0(ObExprResType &type, + common::ObExprTypeCtx &type_ctx) const; + static int eval_current_role(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &expr_datum); + virtual int cg_expr(ObExprCGCtx &op_cg_ctx, + const ObRawExpr &raw_expr, + ObExpr &rt_expr) const override; +private: + DISALLOW_COPY_AND_ASSIGN(ObExprCurrentRole); +}; } } #endif /* OCEANBASE_SQL_ENGINE_EXPR_OB_EXPR_CURRENT_USER_PRIV_ */ diff --git a/src/sql/engine/expr/ob_expr_eval_functions.cpp b/src/sql/engine/expr/ob_expr_eval_functions.cpp index 887d0f898c..69af54624e 100644 --- a/src/sql/engine/expr/ob_expr_eval_functions.cpp +++ b/src/sql/engine/expr/ob_expr_eval_functions.cpp @@ -1146,7 +1146,7 @@ static ObExpr::EvalFunc g_expr_eval_functions[] = { ObExprInnerRowCmpVal::eval_inner_row_cmp_val, /* 674 */ ObExprIs::json_is_true, /* 675 */ ObExprIs::json_is_false, /* 676 */ - NULL, //ObExprCurrentRole::eval_current_role /* 677 */ + ObExprCurrentRole::eval_current_role, /* 677 */ ObExprMod::mod_decimalint, /* 678 */ NULL, // ObExprPrivSTGeoHash::eval_priv_st_geohash, /* 679 */ NULL, // ObExprPrivSTMakePoint::eval_priv_st_makepoint, /* 680 */ diff --git a/src/sql/engine/expr/ob_expr_operator_factory.cpp b/src/sql/engine/expr/ob_expr_operator_factory.cpp index e9a92b3447..5df5d1bb5e 100644 --- a/src/sql/engine/expr/ob_expr_operator_factory.cpp +++ b/src/sql/engine/expr/ob_expr_operator_factory.cpp @@ -1055,6 +1055,7 @@ void ObExprOperatorFactory::register_expr_operators() REG_OP(ObExprSTSymDifference); REG_OP(ObExprPrivSTAsMVTGeom); REG_OP(ObExprPrivSTMakeValid); + REG_OP(ObExprCurrentRole); }(); // 注册oracle系统函数 REG_OP_ORCL(ObExprSysConnectByPath); diff --git a/src/sql/ob_sql_utils.cpp b/src/sql/ob_sql_utils.cpp index 7b28d5ca61..54009f21b2 100644 --- a/src/sql/ob_sql_utils.cpp +++ b/src/sql/ob_sql_utils.cpp @@ -59,6 +59,7 @@ #include "observer/omt/ob_tenant_srs.h" #include "sql/executor/ob_maintain_dependency_info_task.h" #include "sql/resolver/ddl/ob_create_view_resolver.h" +#include "sql/resolver/dcl/ob_dcl_resolver.h" extern "C" { #include "sql/parser/ob_non_reserved_keywords.h" } @@ -1148,7 +1149,7 @@ int ObSQLUtils::cvt_db_name_to_org(share::schema::ObSchemaGetterGuard &schema_gu ObNameCaseMode case_mode = OB_NAME_CASE_INVALID; if (OB_FAIL(session->get_name_case_mode(case_mode))) { LOG_WARN("fail to get name case mode", K(ret)); - } else if (case_mode == OB_ORIGIN_AND_INSENSITIVE) { + } else if (case_mode == OB_ORIGIN_AND_INSENSITIVE || case_mode == OB_LOWERCASE_AND_INSENSITIVE) { const ObDatabaseSchema *db_schema = NULL; if (OB_FAIL(schema_guard.get_database_schema(session->get_effective_tenant_id(), name, @@ -1597,7 +1598,8 @@ bool ObSQLUtils::is_readonly_stmt(ParseResult &result) || T_SHOW_RECYCLEBIN == type || T_SHOW_TENANT == type || T_SHOW_RESTORE_PREVIEW == type - || T_SHOW_SEQUENCES == type) { + || T_SHOW_SEQUENCES == type + || (T_SET_ROLE == type && lib::is_mysql_mode())) { ret = true; } } @@ -5402,7 +5404,34 @@ int ObSQLUtils::async_recompile_view(const share::schema::ObTableSchema &old_vie ObTableSchema new_view_schema(&alloc); uint64_t data_version = 0; bool changed = false; - if (OB_FAIL(new_view_schema.assign(old_view_schema))) { + if (reset_column_infos) { + // failed to resolve view definition, do nothing + } else if (OB_ISNULL(select_stmt)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed to get select stmt", K(ret)); + } else if (is_oracle_mode() && !old_view_schema.is_sys_view()) { + // column name in column schema should be the same as select item alias name in view definition + // when view definition is not rebuilt and column list grammar is used, overwrite alias name + // sys view can not use column list grammar and column count of sys view may be changed + const ObColumnSchemaV2 *column_schema; + uint64_t column_id; + bool is_column_schema_null = false; + for (int64_t i = 0; OB_SUCC(ret) && !is_column_schema_null + && i < select_stmt->get_select_item_size(); ++i) { + column_id = i + OB_APP_MIN_COLUMN_ID; + column_schema = old_view_schema.get_column_schema(column_id); + if (OB_ISNULL(column_schema)) { + is_column_schema_null = true; // column schema of sys view can be null + } else if (OB_ISNULL(column_schema->get_column_name())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("column name is null", K(ret)); + } else { + select_stmt->get_select_item(i).alias_name_ = column_schema->get_column_name(); + } + } + } + if (OB_FAIL(ret)) { + } else if (OB_FAIL(new_view_schema.assign(old_view_schema))) { LOG_WARN("failed to assign table schema", K(ret)); } else if (OB_FAIL(GET_MIN_DATA_VERSION(old_view_schema.get_tenant_id(), data_version))) { LOG_WARN("failed to get data version", K(ret)); @@ -5422,15 +5451,25 @@ int ObSQLUtils::async_recompile_view(const share::schema::ObTableSchema &old_vie //do not recompile sys view until upgrade finish } else if (!reset_column_infos) { ObArray dummy_column_list; + ObArray column_comments; + bool resolve_succ = true; if (OB_ISNULL(select_stmt)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("failed to get select stmt", K(ret)); + } else if (OB_FAIL(new_view_schema.get_view_column_comment(column_comments))) { + LOG_WARN("failed to get view column comment", K(ret)); } else if (OB_FAIL(new_view_schema.delete_all_view_columns())) { LOG_WARN("failed to delete all columns", K(ret)); } else if (OB_ISNULL(select_stmt->get_ref_obj_table())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("ref obj is null", K(ret)); - } else if (OB_FAIL(ObCreateViewResolver::add_column_infos(old_view_schema.get_tenant_id(), *select_stmt, new_view_schema, alloc, session_info, dummy_column_list))) { + } else if (OB_FAIL(ObCreateViewResolver::add_column_infos(old_view_schema.get_tenant_id(), + *select_stmt, + new_view_schema, + alloc, + session_info, + dummy_column_list, + column_comments))) { LOG_WARN("failed to update view column info", K(ret)); } else if (!new_view_schema.is_view_table() || new_view_schema.get_column_count() <= 0) { ret = OB_ERR_UNEXPECTED; @@ -5738,3 +5777,22 @@ bool ObSQLUtils::check_json_expr(ObItemType type) } return res; } + +int ObSQLUtils::compatibility_check_for_mysql_role_and_column_priv(uint64_t tenant_id) +{ + int ret = OB_SUCCESS; + uint64_t data_version = 0; + OZ (GET_MIN_DATA_VERSION(tenant_id, data_version)); + OV ((MOCK_DATA_VERSION_4_2_3_0 <= data_version && data_version < DATA_VERSION_4_3_0_0) || data_version >= DATA_VERSION_4_3_1_0 , OB_NOT_SUPPORTED, data_version); + return ret; +} + +bool ObSQLUtils::is_data_version_ge_422_or_431(uint64_t data_version) +{ + return ((DATA_VERSION_4_2_2_0 <= data_version && data_version < DATA_VERSION_4_3_0_0) || data_version >= DATA_VERSION_4_3_1_0); +} + +bool ObSQLUtils::is_data_version_ge_423_or_431(uint64_t data_version) +{ + return ((MOCK_DATA_VERSION_4_2_3_0 <= data_version && data_version < DATA_VERSION_4_3_0_0) || data_version >= DATA_VERSION_4_3_1_0); +} diff --git a/src/sql/ob_sql_utils.h b/src/sql/ob_sql_utils.h index c56f55da2a..bf5be4f926 100644 --- a/src/sql/ob_sql_utils.h +++ b/src/sql/ob_sql_utils.h @@ -706,6 +706,10 @@ public: } static int check_ident_name(const common::ObCollationType cs_type, common::ObString &name, const bool check_for_path_char, const int64_t max_ident_len); + + static int compatibility_check_for_mysql_role_and_column_priv(uint64_t tenant_id); + static bool is_data_version_ge_422_or_431(uint64_t data_version); + static bool is_data_version_ge_423_or_431(uint64_t data_version); private: static bool check_mysql50_prefix(common::ObString &db_name); static bool part_expr_has_virtual_column(const ObExpr *part_expr); diff --git a/src/sql/parser/non_reserved_keywords_mysql_mode.c b/src/sql/parser/non_reserved_keywords_mysql_mode.c index 84adfdb25e..21bf2eade1 100644 --- a/src/sql/parser/non_reserved_keywords_mysql_mode.c +++ b/src/sql/parser/non_reserved_keywords_mysql_mode.c @@ -32,6 +32,7 @@ static const NonReservedKeyword Mysql_none_reserved_keywords[] = {"active", ACTIVE}, {"add", ADD}, {"adddate", ADDDATE}, + {"admin", ADMIN}, {"after", AFTER}, {"against", AGAINST}, {"aggregate", AGGREGATE}, @@ -721,6 +722,7 @@ static const NonReservedKeyword Mysql_none_reserved_keywords[] = {"revoke", REVOKE}, {"right", RIGHT}, {"rlike", REGEXP}, + {"role", ROLE}, {"rollback", ROLLBACK}, {"rolling", ROLLING}, {"rollup", ROLLUP}, diff --git a/src/sql/parser/ob_parser.cpp b/src/sql/parser/ob_parser.cpp index 54397588f8..690d33de87 100644 --- a/src/sql/parser/ob_parser.cpp +++ b/src/sql/parser/ob_parser.cpp @@ -1062,6 +1062,7 @@ int ObParser::parse(const ObString &query, parse_result.is_not_utf8_connection_ = ObCharset::is_valid_collation(charsets4parser_.string_collation_) ? (ObCharset::charset_type_by_coll(charsets4parser_.string_collation_) != CHARSET_UTF8MB4) : false; parse_result.malloc_pool_ = allocator_; + parse_result.semicolon_start_col_ = INT32_MAX; if (lib::is_oracle_mode()) { parse_result.sql_mode_ = sql_mode_ | SMO_ORACLE; } else { diff --git a/src/sql/parser/parse_node.h b/src/sql/parser/parse_node.h index dd3d118337..fa7023883e 100644 --- a/src/sql/parser/parse_node.h +++ b/src/sql/parser/parse_node.h @@ -342,6 +342,7 @@ typedef struct int connection_collation_;//connection collation bool mysql_compatible_comment_; //whether the parser is parsing "/*! xxxx */" bool enable_compatible_comment_; + int semicolon_start_col_; InsMultiValuesResult *ins_multi_value_res_; diff --git a/src/sql/parser/sql_parser_mysql_mode.y b/src/sql/parser/sql_parser_mysql_mode.y index f50ac789e1..3052fa9e33 100644 --- a/src/sql/parser/sql_parser_mysql_mode.y +++ b/src/sql/parser/sql_parser_mysql_mode.y @@ -210,7 +210,6 @@ SELECT_HINT_BEGIN UPDATE_HINT_BEGIN DELETE_HINT_BEGIN INSERT_HINT_BEGIN REPLACE_ LOAD_DATA_HINT_BEGIN CREATE_HINT_BEGIN ALTER_HINT_BEGIN END_P SET_VAR DELIMITER -/*reserved keyword*/ %token /* * MySQL 5.7 Reserved Keywords(mysql5.7一共有235个保留关键字,这里兼容mysql5.7的229个,NULL关键字在 @@ -220,6 +219,7 @@ END_P SET_VAR DELIMITER * https://dev.mysql.com/doc/refman/5.7/en/keywords.html * 注意!!!非特殊情况,禁止将关键字放到该区域 * */ +//-----------------------------reserved keyword begin----------------------------------------------- ACCESSIBLE ADD ALL ALTER ANALYZE AND AS ASC ASENSITIVE BEFORE BETWEEN BIGINT BINARY BLOB BOTH BY CALL CASCADE CASE CHANGE CHAR CHARACTER CHECK COLLATE COLUMN CONDITION CONSTRAINT CONTINUE @@ -256,12 +256,13 @@ END_P SET_VAR DELIMITER /*OB 特有的保留关键字*/ TABLEGROUP - +//-----------------------------reserved keyword end------------------------------------------------- %token +//-----------------------------non_reserved keyword begin------------------------------------------- ACCESS ACCOUNT ACTION ACTIVE ADDDATE AFTER AGAINST AGGREGATE ALGORITHM ALL_META ALL_USER ALWAYS ANALYSE ANY APPROX_COUNT_DISTINCT APPROX_COUNT_DISTINCT_SYNOPSIS APPROX_COUNT_DISTINCT_SYNOPSIS_MERGE ARBITRATION ASCII AT AUTHORS AUTO AUTOEXTEND_SIZE AUTO_INCREMENT AUTO_INCREMENT_MODE AVG AVG_ROW_LENGTH - ACTIVATE AVAILABILITY ARCHIVELOG ASYNCHRONOUS AUDIT + ACTIVATE AVAILABILITY ARCHIVELOG ASYNCHRONOUS AUDIT ADMIN BACKUP BACKUP_COPIES BALANCE BANDWIDTH BASE BASELINE BASELINE_ID BASIC BEGI BINDING SHARDING BINLOG BIT BIT_AND BIT_OR BIT_XOR BLOCK BLOCK_INDEX BLOCK_SIZE BLOOM_FILTER BOOL BOOLEAN BOOTSTRAP BTREE BYTE @@ -338,7 +339,7 @@ END_P SET_VAR DELIMITER RESTORE RESUME RETURNED_SQLSTATE RETURNS RETURNING REVERSE ROLLBACK ROLLUP ROOT ROOTTABLE ROOTSERVICE ROOTSERVICE_LIST ROUTINE ROW ROLLING ROWID ROW_COUNT ROW_FORMAT ROWS RTREE RUN RECYCLEBIN ROTATE ROW_NUMBER RUDUNDANT RECURSIVE RANDOM REDO_TRANSPORT_OPTIONS REMOTE_OSS RT - RANK READ_ONLY RECOVERY REJECT + RANK READ_ONLY RECOVERY REJECT ROLE SAMPLE SAVEPOINT SCHEDULE SCHEMA_NAME SCN SCOPE SECOND SECURITY SEED SEQUENCES SERIAL SERIALIZABLE SERVER SERVER_IP SERVER_PORT SERVER_TYPE SERVICE SESSION SESSION_USER SET_MASTER_CLUSTER SET_SLAVE_CLUSTER @@ -439,17 +440,18 @@ END_P SET_VAR DELIMITER %type opt_scope opt_drop_behavior opt_integer scope_or_scope_alias global_or_session_alias %type int_type_i float_type_i datetime_type_i date_year_type_i cast_datetime_type_i text_type_i blob_type_i %type create_user_stmt user_specification user_specification_list user password opt_host_name user_with_host_name opt_auth_plugin -%type drop_user_stmt user_list +%type drop_user_stmt user_list user_specification_without_password user_specification_with_password +%type create_role_stmt drop_role_stmt role_list role_with_host role user_specification_without_password_list %type set_password_stmt opt_for_user %type rename_user_stmt rename_info rename_list %type rename_table_stmt rename_table_actions rename_table_action %type truncate_table_stmt %type lock_user_stmt lock_spec_mysql57 -%type grant_stmt grant_privileges priv_type_list priv_type priv_level opt_privilege grant_options -%type revoke_stmt -%type opt_limit opt_for_grant_user +%type grant_stmt grant_privileges role_or_priv_list role_or_priv priv_level opt_privilege grant_options object_type +%type revoke_stmt opt_with_admin_option opt_ignore_unknown_user set_role_stmt default_set_role_clause set_role_clause +%type opt_limit opt_for_grant_user opt_using_role %type parameterized_trim -%type opt_with_consistent_snapshot opt_config_scope opt_index_keyname opt_full +%type opt_with_consistent_snapshot opt_config_scope opt_index_keyname opt_full opt_extended opt_extended_or_full %type opt_work begin_stmt commit_stmt rollback_stmt opt_ignore xa_begin_stmt xa_end_stmt xa_prepare_stmt xa_commit_stmt xa_rollback_stmt %type alter_table_stmt alter_table_actions alter_table_action_list alter_table_action alter_column_option alter_index_option alter_constraint_option standalone_alter_action alter_partition_option opt_to alter_tablegroup_option opt_table opt_tablegroup_option_list alter_tg_partition_option alter_column_group_option %type tablegroup_option_list tablegroup_option alter_tablegroup_actions alter_tablegroup_action tablegroup_option_list_space_seperated @@ -464,7 +466,7 @@ END_P SET_VAR DELIMITER %type opt_when check_state constraint_definition %type create_mlog_stmt opt_mlog_option_list opt_mlog_options mlog_option opt_mlog_with mlog_with_values mlog_with_special_columns mlog_with_reference_columns mlog_with_special_column_list mlog_with_reference_column_list mlog_with_special_column mlog_with_reference_column opt_mlog_new_values mlog_including_or_excluding opt_mlog_purge mlog_purge_values mlog_purge_immediate_sync_or_async mlog_purge_start mlog_purge_next %type drop_mlog_stmt -%type unreserved_keyword unreserved_keyword_normal unreserved_keyword_special unreserved_keyword_extra +%type unreserved_keyword unreserved_keyword_normal unreserved_keyword_special unreserved_keyword_extra unreserved_keyword_ambiguous_roles unreserved_keyword_for_role_name %type mysql_reserved_keyword %type set_type_other set_type_union audit_by_session_access_option audit_whenever_option audit_or_noaudit %type consistency_level use_plan_cache_type @@ -618,6 +620,9 @@ stmt: | deallocate_prepare_stmt { $$ = $1; check_question_mark($$, result); } | create_user_stmt { $$ = $1; check_question_mark($$, result); } | drop_user_stmt { $$ = $1; check_question_mark($$, result); } + | create_role_stmt { $$ = $1; check_question_mark($$, result); } + | drop_role_stmt { $$ = $1; check_question_mark($$, result); } + | set_role_stmt { $$ = $1; check_question_mark($$, result); } | set_password_stmt { $$ = $1; check_question_mark($$, result); } | rename_user_stmt { $$ = $1; check_question_mark($$, result); } | lock_user_stmt { $$ = $1; check_question_mark($$, result); } @@ -13330,7 +13335,7 @@ CLASS_ORIGIN * *****************************************************************************/ show_stmt: -SHOW opt_full TABLES opt_from_or_in_database_clause opt_show_condition +SHOW opt_extended_or_full TABLES opt_from_or_in_database_clause opt_show_condition { ParseNode *value = NULL; malloc_terminal_node(value, result->malloc_pool_, T_INT); @@ -13343,7 +13348,7 @@ SHOW opt_full TABLES opt_from_or_in_database_clause opt_show_condition //(void)$3; malloc_non_terminal_node($$, result->malloc_pool_, T_SHOW_DATABASES, 2, $4, $3); } -| SHOW opt_full columns_or_fields from_or_in relation_factor opt_from_or_in_database_clause opt_show_condition +| SHOW opt_extended_or_full columns_or_fields from_or_in relation_factor opt_from_or_in_database_clause opt_show_condition { (void)$3; (void)$4; @@ -13424,9 +13429,13 @@ SHOW opt_full TABLES opt_from_or_in_database_clause opt_show_condition malloc_non_terminal_node(fun, result->malloc_pool_, T_FUN_COUNT, 1, node); malloc_non_terminal_node($$, result->malloc_pool_, T_SHOW_ERRORS, 1, fun); } -| SHOW GRANTS opt_for_grant_user +| SHOW GRANTS opt_for_grant_user opt_using_role { - malloc_non_terminal_node($$, result->malloc_pool_, T_SHOW_GRANTS, 1, $3); + if (NULL != $4 && NULL == $3) { + yyerror(&@4, result, ""); + YYERROR; + } + malloc_non_terminal_node($$, result->malloc_pool_, T_SHOW_GRANTS, 2, $3, $4); } | SHOW charset_key opt_show_condition { @@ -13489,11 +13498,14 @@ SHOW opt_full TABLES opt_from_or_in_database_clause opt_show_condition { malloc_non_terminal_node($$, result->malloc_pool_, T_SHOW_PARAMETERS, 2, $3, $4); } -| SHOW index_or_indexes_or_keys from_or_in relation_factor opt_from_or_in_database_clause opt_where +| SHOW opt_extended index_or_indexes_or_keys from_or_in relation_factor opt_from_or_in_database_clause opt_where { - (void)$2;//useless (void)$3;//useless - malloc_non_terminal_node($$, result->malloc_pool_, T_SHOW_INDEXES, 3, $4, $5, $6); + (void)$4;//useless + ParseNode *value = NULL; + malloc_terminal_node(value, result->malloc_pool_, T_INT); + value->value_ = $2[0]; + malloc_non_terminal_node($$, result->malloc_pool_, T_SHOW_INDEXES, 4, $5, $6, $7, value); } | SHOW opt_full PROCESSLIST { @@ -13584,6 +13596,15 @@ opt_for_user { $$ = NULL; } ; +opt_using_role: +USING role_list +{ + merge_nodes($$, result, T_USERS, $2); +} +| /* EMPTY */ +{ $$ = NULL; } +; + opt_status: STATUS { malloc_terminal_node($$, result->malloc_pool_, T_SHOW_STATUS); } | /* EMPTY */ { $$ = NULL; } @@ -13888,6 +13909,17 @@ WITH STRING_VALUE ; user_specification: +user_specification_without_password +{ + $$ = $1; +} +| +user_specification_with_password +{ + $$ = $1; +} +; +user_specification_without_password: user opt_host_name { ParseNode *need_enc_node = NULL; @@ -13895,7 +13927,10 @@ user opt_host_name need_enc_node->value_ = 0; malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_USER_SPEC, 5, $1, NULL, need_enc_node, $2, NULL); } -| user opt_host_name IDENTIFIED opt_auth_plugin BY password +; + +user_specification_with_password: +user opt_host_name IDENTIFIED opt_auth_plugin BY password { ParseNode *need_enc_node = NULL; malloc_terminal_node(need_enc_node, result->malloc_pool_, T_BOOL); @@ -14080,6 +14115,78 @@ user_with_host_name } ; +/***************************************************************************** + * + * role grammar + * + *****************************************************************************/ +create_role_stmt: +create_with_opt_hint ROLE opt_if_not_exists role_list +{ + ParseNode *role_list_node = NULL; + (void)($1); + merge_nodes(role_list_node, result, T_USERS, $4); + malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_ROLE, 2, role_list_node, $3); +} +; + +role_list: +role_with_host +{ + $$ = $1; +} +| role_list ',' role_with_host +{ + malloc_non_terminal_node($$, result->malloc_pool_, T_LINK_NODE, 2, $1, $3); +} +; + +user_specification_without_password_list: +user_specification_without_password +{ + $$ = $1; +} +| user_specification_without_password_list ',' user_specification_without_password +{ + malloc_non_terminal_node($$, result->malloc_pool_, T_LINK_NODE, 2, $1, $3); +} +; + +drop_role_stmt: +DROP ROLE opt_if_not_exists user_list +{ + ParseNode *user_list_node = NULL; + merge_nodes(user_list_node, result, T_USERS, $4); + malloc_non_terminal_node($$, result->malloc_pool_, T_DROP_ROLE, 2, user_list_node, $3); +} +; + +role_with_host: +role opt_host_name +{ + ParseNode *need_enc_node = NULL; + malloc_terminal_node(need_enc_node, result->malloc_pool_, T_BOOL); + need_enc_node->value_ = 0; + malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_USER_SPEC, 5, $1, NULL, need_enc_node, $2, NULL); +} +; + +role: +STRING_VALUE +{ + $$ = $1; +} +| NAME_OB +{ + $$ = $1; +} +| unreserved_keyword_for_role_name +{ + get_non_reserved_node($$, result->malloc_pool_, @1.first_column, @1.last_column); +} +; + + /***************************************************************************** * * set password grammar @@ -14692,12 +14799,53 @@ GRANT grant_privileges ON priv_level TO user_specification_list grant_options merge_nodes(privileges_node, result, T_PRIVILEGES, privileges_list_node); merge_nodes(users_node, result, T_USERS, $6); malloc_non_terminal_node($$, result->malloc_pool_, T_GRANT, - 3, privileges_node, $4, users_node); + 4, privileges_node, NULL, $4, users_node); +} +| GRANT grant_privileges ON object_type priv_level TO user_specification_list grant_options +{ + ParseNode *privileges_list_node = NULL; + ParseNode *privileges_node = NULL; + ParseNode *users_node = NULL; + malloc_non_terminal_node(privileges_list_node, result->malloc_pool_, + T_LINK_NODE, 2, $2, $8); + merge_nodes(privileges_node, result, T_PRIVILEGES, privileges_list_node); + merge_nodes(users_node, result, T_USERS, $7); + malloc_non_terminal_node($$, result->malloc_pool_, T_GRANT, + 4, privileges_node, $4, $5, users_node); +} +| GRANT role_or_priv_list TO user_specification_without_password_list opt_with_admin_option +{ + ParseNode *roles_node = NULL; + ParseNode *grantees_node = NULL; + ParseNode *grantees_list = NULL; + + merge_nodes(roles_node, result, T_USERS, $2); + merge_nodes(grantees_list, result, T_USERS, $4); + malloc_non_terminal_node(grantees_node, result->malloc_pool_, T_USERS, 1, grantees_list); + + for (int i = 0; i < roles_node->num_child_; i++) { + if (T_PRIV_TYPE == roles_node->children_[i]->type_) { + yyerror(&@2, result, ""); + YYERROR; + } + } + malloc_non_terminal_node($$, result->malloc_pool_, T_GRANT_ROLE, 3, roles_node, grantees_node, $5); +} +; + +opt_with_admin_option: +WITH ADMIN OPTION +{ + malloc_terminal_node($$, result->malloc_pool_, T_WITH_ADMIN_OPTION); +} +| /*empty*/ +{ + $$ = NULL; } ; grant_privileges: -priv_type_list +role_or_priv_list { $$ = $1; } @@ -14709,25 +14857,29 @@ priv_type_list } ; -priv_type_list: -priv_type +role_or_priv_list: +role_or_priv { $$ = $1; } -| priv_type_list ',' priv_type +| role_or_priv_list ',' role_or_priv { malloc_non_terminal_node($$, result->malloc_pool_, T_LINK_NODE, 2, $1, $3); } ; -priv_type: -alter_with_opt_hint +role_or_priv: +role_with_host +{ + $$ = $1; +} +| alter_with_opt_hint { (void)($1); malloc_terminal_node($$, result->malloc_pool_, T_PRIV_TYPE); $$->value_ = OB_PRIV_ALTER; } -|create_with_opt_hint +| create_with_opt_hint { (void)($1); malloc_terminal_node($$, result->malloc_pool_, T_PRIV_TYPE); @@ -14769,6 +14921,27 @@ alter_with_opt_hint malloc_terminal_node($$, result->malloc_pool_, T_PRIV_TYPE); $$->value_ = OB_PRIV_SELECT; } +| INSERT '(' column_name_list ')' +{ + ParseNode *col_list = NULL; + merge_nodes(col_list, result, T_COLUMN_LIST, $3); + malloc_non_terminal_node($$, result->malloc_pool_, T_PRIV_TYPE, 1, col_list); + $$->value_ = OB_PRIV_INSERT; +} +| UPDATE '(' column_name_list ')' +{ + ParseNode *col_list = NULL; + merge_nodes(col_list, result, T_COLUMN_LIST, $3); + malloc_non_terminal_node($$, result->malloc_pool_, T_PRIV_TYPE, 1, col_list); + $$->value_ = OB_PRIV_UPDATE; +} +| SELECT '(' column_name_list ')' +{ + ParseNode *col_list = NULL; + merge_nodes(col_list, result, T_COLUMN_LIST, $3); + malloc_non_terminal_node($$, result->malloc_pool_, T_PRIV_TYPE, 1, col_list); + $$->value_ = OB_PRIV_SELECT; +} | INDEX { malloc_terminal_node($$, result->malloc_pool_, T_PRIV_TYPE); @@ -14854,7 +15027,21 @@ alter_with_opt_hint malloc_terminal_node($$, result->malloc_pool_, T_PRIV_TYPE); $$->value_ = OB_PRIV_CREATE_DATABASE_LINK; } - +| EXECUTE +{ + malloc_terminal_node($$, result->malloc_pool_, T_PRIV_TYPE); + $$->value_ = OB_PRIV_EXECUTE; +} +| ALTER ROUTINE +{ + malloc_terminal_node($$, result->malloc_pool_, T_PRIV_TYPE); + $$->value_ = OB_PRIV_ALTER_ROUTINE; +} +| CREATE ROUTINE +{ + malloc_terminal_node($$, result->malloc_pool_, T_PRIV_TYPE); + $$->value_ = OB_PRIV_CREATE_ROUTINE; +} ; opt_privilege: @@ -14868,6 +15055,24 @@ PRIVILEGES } ; +object_type: +TABLE +{ + malloc_terminal_node($$, result->malloc_pool_, T_PRIV_OBJECT); + $$->value_ = 1; +} +| PROCEDURE +{ + malloc_terminal_node($$, result->malloc_pool_, T_PRIV_OBJECT); + $$->value_ = 2; +} +| FUNCTION +{ + malloc_terminal_node($$, result->malloc_pool_, T_PRIV_OBJECT); + $$->value_ = 3; +} +; + priv_level: '*' { @@ -14922,22 +15127,63 @@ WITH GRANT OPTION * *****************************************************************************/ revoke_stmt: -REVOKE grant_privileges ON priv_level FROM user_list +REVOKE opt_if_exists grant_privileges ON priv_level FROM user_list opt_ignore_unknown_user { ParseNode *privileges_node = NULL; ParseNode *users_node = NULL; - merge_nodes(privileges_node, result, T_PRIVILEGES, $2); - merge_nodes(users_node, result, T_USERS, $6); + merge_nodes(privileges_node, result, T_PRIVILEGES, $3); + merge_nodes(users_node, result, T_USERS, $7); malloc_non_terminal_node($$, result->malloc_pool_, T_REVOKE, - 3, privileges_node, $4, users_node); + 6, privileges_node, NULL, $5, users_node, $2, $8); } -| REVOKE ALL opt_privilege ',' GRANT OPTION FROM user_list +| REVOKE opt_if_exists grant_privileges ON object_type priv_level FROM user_list opt_ignore_unknown_user { - (void)$3;//useless + ParseNode *privileges_node = NULL; ParseNode *users_node = NULL; + merge_nodes(privileges_node, result, T_PRIVILEGES, $3); merge_nodes(users_node, result, T_USERS, $8); + malloc_non_terminal_node($$, result->malloc_pool_, T_REVOKE, + 6, privileges_node, $5, $6, users_node, $2, $9); +} +| REVOKE opt_if_exists ALL opt_privilege ',' GRANT OPTION FROM user_list opt_ignore_unknown_user +{ + (void)$4;//useless + ParseNode *users_node = NULL; + merge_nodes(users_node, result, T_USERS, $9); malloc_non_terminal_node($$, result->malloc_pool_, T_REVOKE_ALL, - 1, users_node); + 3, users_node, $2, $10); +} +| REVOKE opt_if_exists role_or_priv_list FROM user_specification_without_password_list opt_ignore_unknown_user +{ + ParseNode *roles_node = NULL; + ParseNode *grantees_node = NULL; + ParseNode *grantees_list = NULL; + ParseNode *revoke_type_node = NULL; + + merge_nodes(roles_node, result, T_USERS, $3); + merge_nodes(grantees_list, result, T_USERS, $5); + malloc_non_terminal_node(grantees_node, result->malloc_pool_, T_USERS, 1, grantees_list); + + for (int i = 0; i < roles_node->num_child_; i++) { + if (T_PRIV_TYPE == roles_node->children_[i]->type_) { + yyerror(&@3, result, ""); + YYERROR; + } + } + + malloc_non_terminal_node(revoke_type_node, result->malloc_pool_, T_REVOKE_ROLE, 4, roles_node, grantees_node, $2, $6); + malloc_non_terminal_node($$, result->malloc_pool_, T_SYSTEM_REVOKE, 1, revoke_type_node); +} +; + +opt_ignore_unknown_user: +/* empty */ +{ + $$ = NULL; +} +| IGNORE UNKNOWN USER +{ + malloc_terminal_node($$, result->malloc_pool_, T_IGNORE_UNKNOWN_USER); } ; @@ -15130,6 +15376,78 @@ TO { $$ = NULL; } | COMP_EQ { $$ = NULL; } ; +set_role_stmt: +SET ROLE set_role_clause +{ + malloc_non_terminal_node($$, result->malloc_pool_, T_SET_ROLE, 1, $3); +} +| SET DEFAULT ROLE default_set_role_clause TO user_list +{ + ParseNode *user_list = NULL; + merge_nodes(user_list, result, T_USERS, $6); + malloc_non_terminal_node($$, result->malloc_pool_, T_ALTER_USER_DEFAULT_ROLE, 2, user_list, $4); +} +| alter_with_opt_hint USER user_with_host_name DEFAULT ROLE default_set_role_clause +{ + (void)($1); + malloc_non_terminal_node($$, result->malloc_pool_, T_ALTER_USER_DEFAULT_ROLE, 2, $3, $6); +}; +; + +default_set_role_clause: +role_list +{ + ParseNode *type_node = NULL; + malloc_terminal_node(type_node, result->malloc_pool_, T_INT); + type_node->value_ = 0; + + ParseNode *role_list = NULL; + merge_nodes(role_list, result, T_LINK_NODE, $1); + + malloc_non_terminal_node($$, result->malloc_pool_, T_DEFAULT_ROLE, 2, type_node, role_list); +} +| NONE +{ + ParseNode *type_node = NULL; + malloc_terminal_node(type_node, result->malloc_pool_, T_INT); + type_node->value_ = 3; + malloc_non_terminal_node($$, result->malloc_pool_, T_DEFAULT_ROLE, 1, type_node); +} +| ALL +{ + ParseNode *type_node = NULL; + malloc_terminal_node(type_node, result->malloc_pool_, T_INT); + type_node->value_ = 1; + malloc_non_terminal_node($$, result->malloc_pool_, T_DEFAULT_ROLE, 1, type_node); +} +; + +set_role_clause: +default_set_role_clause +{ + $$ = $1; +} +| ALL EXCEPT grant_privileges +{ + ParseNode *type_node = NULL; + malloc_terminal_node(type_node, result->malloc_pool_, T_INT); + type_node->value_ = 2; + + ParseNode *role_list = NULL; + merge_nodes(role_list, result, T_LINK_NODE, $3); + + malloc_non_terminal_node($$, result->malloc_pool_, T_DEFAULT_ROLE, 2, type_node, role_list); +} +| DEFAULT +{ + ParseNode *type_node = NULL; + malloc_terminal_node(type_node, result->malloc_pool_, T_INT); + type_node->value_ = 4; + malloc_non_terminal_node($$, result->malloc_pool_, T_DEFAULT_ROLE, 1, type_node); +} +; + + /***************************************************************************** * * execute grammar @@ -18662,6 +18980,24 @@ FULL {$$[0]=0;} ; +opt_extended: +EXTENDED +{$$[0]=1;} +| /* EMPTY */ +{$$[0]=0;} +; + +opt_extended_or_full: +FULL +{$$[0]=1;} +| EXTENDED +{$$[0]=2;} +| EXTENDED FULL +{$$[0]=3;} +| /* EMPTY */ +{$$[0]=0;} +; + opt_config_scope: SCOPE COMP_EQ MEMORY { $$[0] = 0; } /* same as ObConfigType */ @@ -19966,6 +20302,11 @@ JSON '(' column_name ')' STORE AS '(' lob_storage_parameters ')' ; unreserved_keyword: +unreserved_keyword_for_role_name { $$=$1;} +| unreserved_keyword_ambiguous_roles { $$=$1;} +; + +unreserved_keyword_for_role_name: unreserved_keyword_normal { $$=$1;} | unreserved_keyword_special { $$=$1;} | unreserved_keyword_extra { $$=$1;} @@ -19976,6 +20317,7 @@ ACCOUNT | ACTION | ACTIVE | ADDDATE +| ADMIN | AFTER | AGAINST | AGGREGATE @@ -20155,13 +20497,11 @@ ACCOUNT | ERRORS | ESCAPE | ESTIMATE -| EVENT | EVENTS | EVERY | EXCEPT %prec HIGHER_PARENS | EXCHANGE | EXCLUDING -| EXECUTE | EXPANSION | EXPIRE | EXPIRED @@ -20179,7 +20519,6 @@ ACCOUNT | FIELDS | FIELD_DELIMITER | FIELD_OPTIONALLY_ENCLOSED_BY -| FILEX | FILE_ID | FINAL_COUNT | FIRST @@ -20362,7 +20701,6 @@ ACCOUNT | NODEGROUP | NOMINVALUE | NOMAXVALUE -| NONE | NOORDER | NOPARALLEL | NORMAL @@ -20432,12 +20770,10 @@ ACCOUNT | PREV | PRIMARY_ZONE | PRIVILEGES -| PROCESS | PROCESSLIST | PROFILE | PROFILES | PROGRESSIVE_MERGE_NUM -| PROXY | PS | PUBLIC | PCTFREE @@ -20471,7 +20807,6 @@ ACCOUNT | RELAY_LOG_FILE | RELAY_LOG_POS | RELAY_THREAD -| RELOAD | REMAP | REMOVE | REORGANIZE @@ -20480,10 +20815,8 @@ ACCOUNT | REPLICA | REPLICA_NUM | REPLICA_TYPE -| REPLICATION | REPORT | RESET -| RESOURCE | RESOURCE_POOL | RESOURCE_POOL_LIST | RESPECT @@ -20494,6 +20827,7 @@ ACCOUNT | RETURNING | RETURNS | REVERSE +| ROLE | ROLLBACK | ROLLING | ROLLUP @@ -20602,7 +20936,6 @@ ACCOUNT | SUBSTRING | SUCCESSFUL | SUM -| SUPER | SUSPEND | SWAPS | SWITCH @@ -20612,6 +20945,7 @@ ACCOUNT | SYSTEM | SYSTEM_USER | SYSDATE +| SLOG | TABLE_CHECKSUM | TABLE_MODE | TABLEGROUPS @@ -20747,6 +21081,22 @@ unreserved_keyword_extra: ACCESS ; +/* + These non-reserved keywords cannot be used as unquoted role names: +*/ +unreserved_keyword_ambiguous_roles: + SUPER +| FILEX +| PROCESS +| NONE +| EVENT +| PROXY +| RELOAD +| REPLICATION +| RESOURCE +| EXECUTE +; + /*注释掉的关键字有规约冲突暂时注释了,都是一些sql中常用的关键字,后面按需打开,增加这块代码逻辑是为了支持在mysql中允许以 表名+列名的方式使用关键字,比如"select key.key from test.key"( */ diff --git a/src/sql/printer/ob_insert_stmt_printer.cpp b/src/sql/printer/ob_insert_stmt_printer.cpp index fb8bb4601a..60c8a2961f 100644 --- a/src/sql/printer/ob_insert_stmt_printer.cpp +++ b/src/sql/printer/ob_insert_stmt_printer.cpp @@ -135,10 +135,6 @@ int ObInsertStmtPrinter::print_into() if (OB_ISNULL(column)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("column is NULL", K(ret)); - } else if (column->get_column_id() == OB_HIDDEN_SESSION_ID_COLUMN_ID - || column->get_column_id() == OB_HIDDEN_SESS_CREATE_TIME_COLUMN_ID) { - // 临时表的隐藏列,不需要print。TODO 将临时表insert改写由resolver转移到改写阶段后,可以去掉本分支 - LOG_DEBUG("do not print column", K(*column)); } else { PRINT_IDENT_WITH_QUOT(column->get_column_name()); DATA_PRINTF(","); @@ -189,10 +185,6 @@ int ObInsertStmtPrinter::print_values() if (OB_ISNULL(column)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("column is NULL", K(ret)); - } else if (column->get_column_id() == OB_HIDDEN_SESSION_ID_COLUMN_ID - || column->get_column_id() == OB_HIDDEN_SESS_CREATE_TIME_COLUMN_ID) { - // 临时表的隐藏列,不需要print。TODO 将临时表insert改写由resolver转移到改写阶段后,可以去掉本分支 - LOG_DEBUG("do not print column", K(*column)); } else if (i * column_count + j >= insert_stmt->get_values_vector().count()) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpect values vector", K(ret)); diff --git a/src/sql/privilege_check/ob_ora_priv_check.cpp b/src/sql/privilege_check/ob_ora_priv_check.cpp index 737c6b694d..99b48ae664 100644 --- a/src/sql/privilege_check/ob_ora_priv_check.cpp +++ b/src/sql/privilege_check/ob_ora_priv_check.cpp @@ -2681,9 +2681,9 @@ int ObOraSysChecker::check_ora_grant_obj_priv( const uint64_t obj_id, const uint64_t obj_type, const ObRawObjPrivArray &table_priv_array, - const ObSEArray &ins_col_ids, - const ObSEArray &upd_col_ids, - const ObSEArray &ref_col_ids, + const ObIArray &ins_col_ids, + const ObIArray &upd_col_ids, + const ObIArray &ref_col_ids, uint64_t &grantor_id_out, const ObIArray &role_id_array) { diff --git a/src/sql/privilege_check/ob_ora_priv_check.h b/src/sql/privilege_check/ob_ora_priv_check.h index 46bd56d5e8..36367a565a 100644 --- a/src/sql/privilege_check/ob_ora_priv_check.h +++ b/src/sql/privilege_check/ob_ora_priv_check.h @@ -407,9 +407,9 @@ public: const uint64_t obj_id, const uint64_t obj_type, const share::ObRawObjPrivArray &table_priv_array, - const ObSEArray &ins_col_ids, - const ObSEArray &upd_col_ids, - const ObSEArray &ref_col_ids, + const ObIArray &ins_col_ids, + const ObIArray &upd_col_ids, + const ObIArray &ref_col_ids, uint64_t &grantor_id_out, const ObIArray &role_id_array); diff --git a/src/sql/privilege_check/ob_privilege_check.cpp b/src/sql/privilege_check/ob_privilege_check.cpp index ae95411c14..fe7d7ca95f 100644 --- a/src/sql/privilege_check/ob_privilege_check.cpp +++ b/src/sql/privilege_check/ob_privilege_check.cpp @@ -58,10 +58,15 @@ #include "sql/resolver/ddl/ob_drop_synonym_stmt.h" #include "sql/resolver/cmd/ob_call_procedure_stmt.h" #include "sql/resolver/cmd/ob_load_data_stmt.h" +#include "sql/resolver/ddl/ob_create_routine_stmt.h" +#include "sql/resolver/ddl/ob_alter_routine_stmt.h" +#include "sql/resolver/ddl/ob_drop_routine_stmt.h" #include "rootserver/ob_ddl_service.h" #include "sql/resolver/dml/ob_merge_stmt.h" #include "sql/privilege_check/ob_ora_priv_check.h" +#include "sql/resolver/dcl/ob_alter_user_profile_stmt.h" #include "pl/ob_pl_stmt.h" +#include "sql/resolver/expr/ob_raw_expr_util.h" namespace oceanbase { using namespace share; @@ -355,6 +360,184 @@ int add_col_id_array_to_need_priv( return ret; } +int add_col_priv_to_need_priv( + const ObStmt *basic_stmt, + const TableItem &table_item, + ObIArray &need_privs) +{ + int ret = OB_SUCCESS; + ObStmtExprGetter visitor; + ObNeedPriv need_priv; + need_priv.db_ = table_item.database_name_; + need_priv.table_ = table_item.table_name_; + need_priv.is_sys_table_ = table_item.is_system_table_; + need_priv.is_for_update_ = table_item.for_update_; + need_priv.priv_level_ = OB_PRIV_TABLE_LEVEL; + const uint64_t table_id = table_item.table_id_; + visitor.set_relation_scope(); + visitor.remove_scope(SCOPE_DML_COLUMN); + visitor.remove_scope(SCOPE_DML_CONSTRAINT); + visitor.remove_scope(SCOPE_DMLINFOS); + ObSEArray col_exprs; + if (OB_ISNULL(basic_stmt)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("basic_stmt is NULL", K(ret)); + } else { + stmt::StmtType stmt_type = basic_stmt->get_stmt_type(); + switch (stmt_type) { + case stmt::T_DELETE: { + need_priv.priv_set_ = OB_PRIV_DELETE; + ADD_NEED_PRIV(need_priv); + break; + } + case stmt::T_REPLACE: + case stmt::T_INSERT: { + visitor.remove_scope(SCOPE_INSERT_DESC); + visitor.remove_scope(SCOPE_DML_VALUE); + const ObInsertStmt *insert_stmt = NULL; + insert_stmt = static_cast(basic_stmt); + if (OB_ISNULL(insert_stmt)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("insert_stmt is NULL", K(ret)); + } else { + ObColumnRefRawExpr *value_desc = NULL; + if (insert_stmt->is_replace()) { + need_priv.priv_set_ = OB_PRIV_DELETE; + ADD_NEED_PRIV(need_priv); + need_priv.columns_.reuse(); + } + need_priv.priv_set_ = OB_PRIV_INSERT; + for (int i = 0; OB_SUCC(ret) && i < insert_stmt->get_values_desc().count(); ++i) { + if (OB_ISNULL(value_desc = insert_stmt->get_values_desc().at(i))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("value_desc is null", K(ret)); + } else if (table_id == value_desc->get_table_id() + && value_desc->get_column_id() >= OB_APP_MIN_COLUMN_ID) { + OZ (need_priv.columns_.push_back(value_desc->get_column_name())); + } + } + if (OB_SUCC(ret)) { + ADD_NEED_PRIV(need_priv); + need_priv.columns_.reuse(); + } + + if (OB_FAIL(ret)) { + } else if (insert_stmt->is_insert_up()) { + const ObIArray &assigns = insert_stmt->get_table_assignments(); + need_priv.priv_set_ = OB_PRIV_UPDATE; + for (int j = 0; OB_SUCC(ret) && j < assigns.count(); ++j) { + if (!assigns.at(j).is_implicit_) { + const ObColumnRefRawExpr *col_expr = assigns.at(j).column_expr_; + const ObRawExpr *expr = assigns.at(j).expr_; + if (OB_ISNULL(col_expr) || OB_ISNULL(expr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("col_expr is null"); + } else if (OB_FAIL(ObRawExprUtils::extract_column_exprs(expr, col_exprs))) { + LOG_WARN("extract column exprs failed", K(ret)); + } else if (col_expr->get_table_id() == table_id + && col_expr->get_column_id() >= OB_APP_MIN_COLUMN_ID) { + OZ (need_priv.columns_.push_back(col_expr->get_column_name())); + } + } + } + if (OB_SUCC(ret)) { + ADD_NEED_PRIV(need_priv); + need_priv.columns_.reuse(); + } + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(append(col_exprs, insert_stmt->get_insert_table_info().column_in_values_vector_))) { + LOG_WARN("append failed", K(ret)); + } + } + + break; + } + case stmt::T_UPDATE: { + need_priv.priv_set_ = OB_PRIV_UPDATE; + const ObUpdateStmt *update_stmt = NULL; + update_stmt = static_cast(basic_stmt); + if (OB_ISNULL(update_stmt)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("update_stmt is null", K(ret)); + } else { + for (int i = 0; OB_SUCC(ret) && i < update_stmt->get_update_table_info().count(); ++i) { + ObUpdateTableInfo* table_info = update_stmt->get_update_table_info().at(i); + if (OB_ISNULL(table_info)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get null table info", K(ret)); + } else if (table_info->table_id_ == table_id) { + const ObAssignments &assigns = table_info->assignments_; + for (int j = 0; OB_SUCC(ret) && j < assigns.count(); ++j) { + if (!assigns.at(j).is_implicit_) { + const ObColumnRefRawExpr *col_expr = assigns.at(j).column_expr_; + const ObRawExpr *value_expr = assigns.at(j).expr_; + if (OB_ISNULL(col_expr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("col_expr is null"); + } else if (col_expr->get_table_id() == table_id + && col_expr->get_column_id() >= OB_APP_MIN_COLUMN_ID) { + OZ (need_priv.columns_.push_back(col_expr->get_column_name())); + } else if (OB_FAIL(ObRawExprUtils::extract_column_exprs(value_expr, col_exprs))) { + LOG_WARN("extract column exprs failed", K(ret)); + } + } + } + } + } + } + if (OB_SUCC(ret)) { + ADD_NEED_PRIV(need_priv); + need_priv.columns_.reuse(); + } + break; + } + default : { + break; + } + } + if (OB_SUCC(ret)) { + ObSEArray rel_exprs; + need_priv.priv_set_ = OB_PRIV_SELECT; + if (OB_FAIL(static_cast(basic_stmt)->get_relation_exprs(rel_exprs, visitor))) { + LOG_WARN("get rel exprs failed", K(ret)); + } else if (OB_FAIL(ObRawExprUtils::extract_column_exprs(rel_exprs, col_exprs))) { + LOG_WARN("extract column exprs failed", K(ret)); + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < col_exprs.count(); i++) { + if (OB_ISNULL(col_exprs.at(i)) || OB_UNLIKELY(!col_exprs.at(i)->is_column_ref_expr())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected error", K(ret)); + } else { + ObColumnRefRawExpr *col_expr = static_cast(col_exprs.at(i)); + if (OB_ISNULL(col_expr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected error", K(ret)); + } else if (col_expr->get_table_id() == table_id && col_expr->get_column_id() >= OB_APP_MIN_COLUMN_ID) { + OZ (need_priv.columns_.push_back(col_expr->get_column_name())); + } + } + } + if (OB_SUCC(ret)) { + if (need_priv.columns_.empty()) { + if (basic_stmt->is_select_stmt()) { + need_priv.check_any_column_priv_ = true; + ADD_NEED_PRIV(need_priv); + need_priv.check_any_column_priv_ = false; + } + } else { + ADD_NEED_PRIV(need_priv); + need_priv.columns_.reuse(); + } + } + } + } + } + return ret; +} + int set_privs_by_table_item_recursively( uint64_t user_id, const ObSqlCtx &ctx, @@ -967,7 +1150,16 @@ int get_dml_stmt_need_privs( need_priv.priv_set_ &= ~OB_PRIV_SELECT; } } - ADD_NEED_PRIV(need_priv); + + if (OB_SUCC(ret)) { + if (lib::is_mysql_mode()) { + if (OB_FAIL(add_col_priv_to_need_priv(basic_stmt, *table_item, need_privs))) { + LOG_WARN("add col id array to need priv failed", K(ret)); + } + } else { + ADD_NEED_PRIV(need_priv); + } + } } } break; @@ -1468,12 +1660,56 @@ int get_grant_stmt_need_privs( !(session_priv.user_priv_set_ & OB_PRIV_CREATE_USER)) { ret = OB_ERR_CREATE_USER_WITH_GRANT; LOG_WARN("Need create user priv", K(ret), "user priv", ObPrintPrivSet(session_priv.user_priv_set_)); + } else if (is_root_user(session_priv.user_id_)) { + //not neccessary } else { need_priv.db_ = stmt->get_database_name(); need_priv.table_ = stmt->get_table_name(); need_priv.priv_set_ = stmt->get_priv_set() | OB_PRIV_GRANT; need_priv.priv_level_ = stmt->get_grant_level(); + need_priv.obj_type_ = stmt->get_object_type(); ADD_NEED_PRIV(need_priv); + #define DEF_COLUM_NEED_PRIV(priv_prefix, priv_type) \ + ObNeedPriv priv_prefix##_need_priv; \ + priv_prefix##_need_priv.db_ = stmt->get_database_name(); \ + priv_prefix##_need_priv.table_ = stmt->get_table_name(); \ + priv_prefix##_need_priv.priv_set_ = priv_type | OB_PRIV_GRANT; \ + priv_prefix##_need_priv.priv_level_ = OB_PRIV_TABLE_LEVEL; + + DEF_COLUM_NEED_PRIV(sel, OB_PRIV_SELECT); + DEF_COLUM_NEED_PRIV(ins, OB_PRIV_INSERT); + DEF_COLUM_NEED_PRIV(upd, OB_PRIV_UPDATE); + DEF_COLUM_NEED_PRIV(ref, OB_PRIV_REFERENCES); + + #undef DEF_COLUM_NEED_PRIV + + for (int64_t i = 0; OB_SUCC(ret) && i < stmt->get_column_privs().count(); i++) { + const ObString &column_name = stmt->get_column_privs().at(i).first; + ObPrivSet priv_set = stmt->get_column_privs().at(i).second; + if ((stmt->get_priv_set() & priv_set) != 0) { + //contains in table priv already. + } else if (0 != (priv_set & OB_PRIV_SELECT)) { + ret = sel_need_priv.columns_.push_back(column_name); + } else if (0 != (priv_set & OB_PRIV_INSERT)) { + ret = ins_need_priv.columns_.push_back(column_name); + } else if (0 != (priv_set & OB_PRIV_UPDATE)) { + ret = upd_need_priv.columns_.push_back(column_name); + } else if (0 != (priv_set & OB_PRIV_REFERENCES)) { + ret = ref_need_priv.columns_.push_back(column_name); + } + } + + #define ADD_COLUMN_NEED_PRIV(priv_prefix) \ + if (OB_FAIL(ret)) { \ + } else if (priv_prefix##_need_priv.columns_.count() != 0) { \ + ADD_NEED_PRIV(priv_prefix##_need_priv); \ + } + + ADD_COLUMN_NEED_PRIV(sel); + ADD_COLUMN_NEED_PRIV(ins); + ADD_COLUMN_NEED_PRIV(upd); + ADD_COLUMN_NEED_PRIV(ref); + #undef ADD_COLUMN_NEED_PRIV } } return ret; @@ -1506,7 +1742,49 @@ int get_revoke_stmt_need_privs( need_priv.table_ = stmt->get_table_name(); need_priv.priv_set_ = stmt->get_priv_set() | OB_PRIV_GRANT; need_priv.priv_level_ = stmt->get_grant_level(); + need_priv.obj_type_ = stmt->get_object_type(); ADD_NEED_PRIV(need_priv); + #define DEF_COLUM_NEED_PRIV(priv_prefix, priv_type) \ + ObNeedPriv priv_prefix##_need_priv; \ + priv_prefix##_need_priv.db_ = stmt->get_database_name(); \ + priv_prefix##_need_priv.table_ = stmt->get_table_name(); \ + priv_prefix##_need_priv.priv_set_ = priv_type | OB_PRIV_GRANT; \ + priv_prefix##_need_priv.priv_level_ = OB_PRIV_TABLE_LEVEL; + + DEF_COLUM_NEED_PRIV(sel, OB_PRIV_SELECT); + DEF_COLUM_NEED_PRIV(ins, OB_PRIV_INSERT); + DEF_COLUM_NEED_PRIV(upd, OB_PRIV_UPDATE); + DEF_COLUM_NEED_PRIV(ref, OB_PRIV_REFERENCES); + + #undef DEF_COLUM_NEED_PRIV + + for (int64_t i = 0; OB_SUCC(ret) && i < stmt->get_column_privs().count(); i++) { + const ObString &column_name = stmt->get_column_privs().at(i).first; + ObPrivSet priv_set = stmt->get_column_privs().at(i).second; + if ((stmt->get_priv_set() & priv_set) != 0) { + //contains in table priv already. + } else if (0 != (priv_set & OB_PRIV_SELECT)) { + ret = sel_need_priv.columns_.push_back(column_name); + } else if (0 != (priv_set & OB_PRIV_INSERT)) { + ret = ins_need_priv.columns_.push_back(column_name); + } else if (0 != (priv_set & OB_PRIV_UPDATE)) { + ret = upd_need_priv.columns_.push_back(column_name); + } else if (0 != (priv_set & OB_PRIV_REFERENCES)) { + ret = ref_need_priv.columns_.push_back(column_name); + } + } + + #define ADD_COLUMN_NEED_PRIV(priv_prefix) \ + if (OB_FAIL(ret)) { \ + } else if (priv_prefix##_need_priv.columns_.count() != 0) { \ + ADD_NEED_PRIV(priv_prefix##_need_priv); \ + } + + ADD_COLUMN_NEED_PRIV(sel); + ADD_COLUMN_NEED_PRIV(ins); + ADD_COLUMN_NEED_PRIV(upd); + ADD_COLUMN_NEED_PRIV(ref); + #undef ADD_COLUMN_NEED_PRIV } } return ret; @@ -1536,6 +1814,9 @@ int get_create_user_privs( case stmt::T_CREATE_USER : { if (stmt::T_SET_PASSWORD == stmt_type && static_cast(basic_stmt)->get_for_current_user()) { + } else if (stmt::T_ALTER_USER_PROFILE == stmt_type + && lib::is_mysql_mode() + && !!static_cast(basic_stmt)->get_set_role_flag()) { } else { need_priv.priv_set_ = OB_PRIV_CREATE_USER; need_priv.priv_level_ = OB_PRIV_USER_LEVEL; @@ -1553,6 +1834,56 @@ int get_create_user_privs( return ret; } +int get_role_privs( + const ObSessionPrivInfo &session_priv, + const ObStmt *basic_stmt, + ObIArray &need_privs) +{ + UNUSED(session_priv); + int ret = OB_SUCCESS; + if (OB_ISNULL(basic_stmt)) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("Basic stmt should be not be NULL", K(ret)); + } else if (lib::is_oracle_mode()) { + ret = no_priv_needed(session_priv, basic_stmt, need_privs); + } else { + ObNeedPriv need_priv; + stmt::StmtType stmt_type = basic_stmt->get_stmt_type(); + switch (stmt_type) { + case stmt::T_CREATE_ROLE: { + need_priv.priv_set_ = OB_PRIV_CREATE_USER; //[TODO ROLE] + need_priv.priv_level_ = OB_PRIV_USER_LEVEL; + ADD_NEED_PRIV(need_priv); + break; + } + case stmt::T_DROP_ROLE: { + need_priv.priv_set_ = OB_PRIV_CREATE_USER; + need_priv.priv_level_ = OB_PRIV_USER_LEVEL; + ADD_NEED_PRIV(need_priv); + break; + } + case stmt::T_GRANT_ROLE: { + need_priv.priv_set_ = OB_PRIV_SUPER; + need_priv.priv_level_ = OB_PRIV_USER_LEVEL; + ADD_NEED_PRIV(need_priv); + break; + } + case stmt::T_REVOKE_ROLE: { + need_priv.priv_set_ = OB_PRIV_SUPER; + need_priv.priv_level_ = OB_PRIV_USER_LEVEL; + ADD_NEED_PRIV(need_priv); + break; + } + default: { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("Stmt type not in types dealt in this function", K(ret), K(stmt_type)); + break; + } + } + } + return ret; +} + int get_variable_set_stmt_need_privs( const ObSessionPrivInfo &session_priv, const ObStmt *basic_stmt, @@ -1650,6 +1981,63 @@ int get_lock_tenant_stmt_need_privs( return ret; } +int get_routine_stmt_need_privs( + const ObSessionPrivInfo &session_priv, + const ObStmt *basic_stmt, + ObIArray &need_privs) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(basic_stmt)) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("Basic stmt should be not be NULL", K(ret)); + } else if (OB_UNLIKELY(stmt::T_CREATE_ROUTINE != basic_stmt->get_stmt_type() + && stmt::T_DROP_ROUTINE != basic_stmt->get_stmt_type() + && stmt::T_ALTER_ROUTINE != basic_stmt->get_stmt_type())) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("Stmt type should be routine stmt", + K(ret), "stmt type", basic_stmt->get_stmt_type()); + } else if (lib::is_oracle_mode()) { + //do nothing + } else if (stmt::T_CREATE_ROUTINE == basic_stmt->get_stmt_type()) { + const ObCreateRoutineStmt *stmt = static_cast(basic_stmt); + if (stmt->get_routine_arg().routine_info_.get_routine_type() == ObRoutineType::ROUTINE_PROCEDURE_TYPE + || stmt->get_routine_arg().routine_info_.get_routine_type() == ObRoutineType::ROUTINE_FUNCTION_TYPE) { + ObNeedPriv need_priv; + need_priv.table_ = stmt->get_routine_arg().routine_info_.get_routine_name(); + need_priv.db_ = stmt->get_routine_arg().db_name_; + need_priv.obj_type_ = stmt->get_routine_arg().routine_info_.get_routine_type() == ObRoutineType::ROUTINE_PROCEDURE_TYPE ? ObObjectType::PROCEDURE : ObObjectType::FUNCTION; + need_priv.priv_level_ = OB_PRIV_ROUTINE_LEVEL; + need_priv.priv_set_ = OB_PRIV_CREATE_ROUTINE; + ADD_NEED_PRIV(need_priv); + } + } else if (stmt::T_ALTER_ROUTINE == basic_stmt->get_stmt_type()) { + const ObAlterRoutineStmt *stmt = static_cast(basic_stmt); + if (stmt->get_routine_arg().routine_info_.get_routine_type() == ObRoutineType::ROUTINE_PROCEDURE_TYPE + || stmt->get_routine_arg().routine_info_.get_routine_type() == ObRoutineType::ROUTINE_FUNCTION_TYPE) { + ObNeedPriv need_priv; + need_priv.table_ = stmt->get_routine_arg().routine_info_.get_routine_name(); + need_priv.db_ = stmt->get_routine_arg().db_name_; + need_priv.obj_type_ = stmt->get_routine_arg().routine_info_.get_routine_type() == ObRoutineType::ROUTINE_PROCEDURE_TYPE ? ObObjectType::PROCEDURE : ObObjectType::FUNCTION; + need_priv.priv_level_ = OB_PRIV_ROUTINE_LEVEL; + need_priv.priv_set_ = OB_PRIV_ALTER_ROUTINE; + ADD_NEED_PRIV(need_priv); + } + } else if (stmt::T_DROP_ROUTINE == basic_stmt->get_stmt_type()) { + const ObDropRoutineStmt *stmt = static_cast(basic_stmt); + if (stmt->get_routine_arg().routine_type_ == ObRoutineType::ROUTINE_PROCEDURE_TYPE + || stmt->get_routine_arg().routine_type_ == ObRoutineType::ROUTINE_FUNCTION_TYPE) { + ObNeedPriv need_priv; + need_priv.table_ = stmt->get_routine_arg().routine_name_; + need_priv.db_ = stmt->get_routine_arg().db_name_; + need_priv.obj_type_ = stmt->get_routine_arg().routine_type_ == ObRoutineType::ROUTINE_PROCEDURE_TYPE ? ObObjectType::PROCEDURE : ObObjectType::FUNCTION; + need_priv.priv_level_ = OB_PRIV_ROUTINE_LEVEL; + need_priv.priv_set_ = OB_PRIV_ALTER_ROUTINE; + ADD_NEED_PRIV(need_priv); + } + } + return ret; +} + int get_drop_tenant_stmt_need_privs( const ObSessionPrivInfo &session_priv, const ObStmt *basic_stmt, @@ -2493,6 +2881,20 @@ int ObPrivilegeCheck::check_privilege( return ret; } +int adjust_session_priv(ObSchemaGetterGuard &schema_guard, + ObSessionPrivInfo &session_priv) { + int ret = OB_SUCCESS; + const ObUserInfo *user_info = NULL; + if (OB_ISNULL(user_info = schema_guard.get_user_info(session_priv.tenant_id_, session_priv.user_id_))) { + ret = OB_USER_NOT_EXIST; + LOG_WARN("fail to get user_info", K(ret)); + } else { + session_priv.user_name_ = user_info->get_user_name_str(); + session_priv.host_name_ = user_info->get_host_name_str(); + } + return ret; +} + int ObPrivilegeCheck::check_privilege( const ObSqlCtx &ctx, const ObStmtNeedPrivs &stmt_need_priv) @@ -2502,20 +2904,14 @@ int ObPrivilegeCheck::check_privilege( //do not check privilege } else { ObSessionPrivInfo session_priv; - if (OB_ISNULL(ctx.session_info_)) { + if (OB_ISNULL(ctx.session_info_) || OB_ISNULL(ctx.schema_guard_)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("Session is NULL"); } else { - if (ctx.session_info_->get_user_id() == ctx.session_info_->get_priv_user_id()) { - ctx.session_info_->get_session_priv_info(session_priv); - } else if (OB_FAIL(const_cast(ctx.schema_guard_)->get_session_priv_info( - ctx.session_info_->get_priv_tenant_id(), - ctx.session_info_->get_priv_user_id(), - ctx.session_info_->get_database_name(), - session_priv))) { - LOG_WARN("fail to get_session_priv_info", K(ret)); - } - if (OB_FAIL(ret)) { + ctx.session_info_->get_session_priv_info(session_priv); + if (ctx.session_info_->get_user_id() != ctx.session_info_->get_priv_user_id() + && OB_FAIL(adjust_session_priv(*ctx.schema_guard_, session_priv))) { + LOG_WARN("fail to assign enable role id array", K(ret)); } else if (OB_UNLIKELY(!session_priv.is_valid())) { ret = OB_INVALID_ARGUMENT; LOG_WARN("Session priv is invalid", "tenant_id", session_priv.tenant_id_, @@ -2527,6 +2923,9 @@ int ObPrivilegeCheck::check_privilege( } else { //do nothing } + LOG_DEBUG("check priv", + K(session_priv), + "enable_roles", ctx.session_info_->get_enable_role_array()); } } return ret; @@ -3343,6 +3742,64 @@ int ObPrivilegeCheck::check_password_life_time_oracle( return ret; } +int ObPrivilegeCheck::check_priv_in_roles( + const uint64_t tenant_id, + const uint64_t user_id, + ObSchemaGetterGuard &schema_guard, + const ObIArray &role_ids, + const ObStmtNeedPrivs &stmt_need_priv) +{ + int ret = OB_SUCCESS; + bool check_succ = false; + ObArray role_ids_queue; + const ObUserInfo *user_info = NULL; + if (OB_ISNULL(user_info = schema_guard.get_user_info(tenant_id, user_id))) { + ret = OB_USER_NOT_EXIST; + LOG_WARN("fail to get user_info", K(ret)); + } + for (int i = 0; OB_SUCC(ret) && i < role_ids.count(); ++i) { + uint64_t cur_role_id = role_ids.at(i); + if (has_exist_in_array(user_info->get_role_id_array(), cur_role_id)) { + //enabled role can be revoked from the current user by other session + //only check the granted roles + if (OB_FAIL(role_ids_queue.push_back(cur_role_id))) { + LOG_WARN("fail to push back", K(ret)); + } + } + } + + for (int i = 0; OB_SUCC(ret) && i < role_ids_queue.count() && !check_succ; i++) { + ObSessionPrivInfo session_priv; + //for print correct error info + session_priv.user_name_ = user_info->get_user_name_str(); + session_priv.host_name_ = user_info->get_host_name_str(); + OZ (schema_guard.get_session_priv_info(tenant_id, role_ids_queue.at(i), "", session_priv)); + + if (OB_SUCC(ret)) { + if (OB_SUCCESS == schema_guard.check_priv(session_priv, stmt_need_priv)) { + check_succ = true; + } + } + if (OB_SUCC(ret) && !check_succ) { + const ObUserInfo *user_info = NULL; + OZ (schema_guard.get_user_info(tenant_id, role_ids_queue.at(i), user_info)); + if (OB_SUCC(ret) && OB_ISNULL(user_info)) { + ret = OB_USER_NOT_EXIST; + LOG_WARN("user not exist", K(ret)); + } + for (int j = 0; OB_SUCC(ret) && j < user_info->get_role_id_array().count(); j++) { + OZ (role_ids_queue.push_back(user_info->get_role_id_array().at(j))); + } + } + } + + if (OB_SUCC(ret) && !check_succ) { + ret = OB_ERR_NO_PRIVILEGE; + } + return ret; +} + + #undef ADD_NEED_PRIV } diff --git a/src/sql/privilege_check/ob_privilege_check.h b/src/sql/privilege_check/ob_privilege_check.h index aa0e3e38e2..40f4325286 100644 --- a/src/sql/privilege_check/ob_privilege_check.h +++ b/src/sql/privilege_check/ob_privilege_check.h @@ -86,6 +86,13 @@ public: static int get_stmt_need_privs(const share::schema::ObSessionPrivInfo &session_priv, const ObStmt *basic_stmt, common::ObIArray &stmt_need_priv); + + + static int check_priv_in_roles(const uint64_t tenant_id, + const uint64_t user_id, + share::schema::ObSchemaGetterGuard &schema_guard, + const common::ObIArray &role_ids, + const share::schema::ObStmtNeedPrivs &stmt_need_priv); private: ///Extract priv info needed by a single stmt, may be sub-query. ///called by recursive_stmt_need_priv diff --git a/src/sql/resolver/cmd/ob_show_resolver.cpp b/src/sql/resolver/cmd/ob_show_resolver.cpp index 22feaa27b1..38a005ff2d 100644 --- a/src/sql/resolver/cmd/ob_show_resolver.cpp +++ b/src/sql/resolver/cmd/ob_show_resolver.cpp @@ -20,6 +20,7 @@ #include "sql/parser/ob_parser.h" #include "lib/charset/ob_charset.h" #include "observer/ob_server_struct.h" +#include "sql/resolver/dcl/ob_grant_resolver.h" using namespace oceanbase::common; using namespace oceanbase::share; using namespace oceanbase::share::schema; @@ -94,7 +95,8 @@ int ObShowResolver::resolve(const ParseNode &parse_tree) ObShowResolverContext show_resv_ctx; if (OB_UNLIKELY(NULL == session_info_ || NULL == params_.allocator_ - || NULL == schema_checker_)) { + || NULL == schema_checker_ + || NULL == schema_checker_->get_schema_guard())) { ret = OB_NOT_INIT; LOG_WARN("data member is not init", K(ret), @@ -170,7 +172,26 @@ int ObShowResolver::resolve(const ParseNode &parse_tree) LOG_WARN("fail to check priv", K(ret)); } } else { - if (0 == parse_tree.children_[2]->value_) { + /* (parse_tree.children_[2]->value_)&1 -> FULL + * ((parse_tree.children_[2]->value_)>>1)&1 -> EXTENDED + * ObServer does not have hidden tables created by failed ALTER TABLE + * statements, hence we do nothing for "EXTENDED" + */ + bool is_full = (1 == ((parse_tree.children_[2]->value_)&1)); + bool is_extended = (1 == (((parse_tree.children_[2]->value_)>>1)&1)); + bool is_compat; // compatible mode for version lower than 4.2.2 which does not support SHOW EXTENDED + uint64_t min_data_version; + if (OB_UNLIKELY(((parse_tree.children_[2]->value_)>>2) != 0)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("node value unexpected", K(ret), K(parse_tree.children_[2]->value_)); + break; + } else if (OB_FAIL(GET_MIN_DATA_VERSION(real_tenant_id, min_data_version))) { + LOG_WARN("get min data version failed", K(ret), K(real_tenant_id)); + } else if (OB_FALSE_IT(is_compat = !sql::ObSQLUtils::is_data_version_ge_422_or_431(min_data_version))) { + } else if (OB_UNLIKELY(is_compat && is_extended)) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("version lower than 4.2.2 or 4.3.1 does not support show extended", K(ret)); + } else if (!is_full) { if (NULL != condition_node && T_LIKE_CLAUSE == condition_node->type_) { if (OB_UNLIKELY(condition_node->num_child_ != 2 || NULL == condition_node->children_)) { @@ -201,7 +222,7 @@ int ObShowResolver::resolve(const ParseNode &parse_tree) show_resv_ctx.show_database_name_.ptr()); GEN_SQL_STEP_2(ObShowSqlSet::SHOW_TABLES, OB_SYS_DATABASE_NAME, OB_TENANT_VIRTUAL_SHOW_TABLES_TNAME, show_db_id); } - } else if (1 == parse_tree.children_[2]->value_) { + } else { if (NULL != condition_node && T_LIKE_CLAUSE == condition_node->type_) { if (OB_UNLIKELY(condition_node->num_child_ != 2 || NULL == condition_node->children_[0] @@ -225,10 +246,6 @@ int ObShowResolver::resolve(const ParseNode &parse_tree) show_resv_ctx.show_database_name_.ptr()); GEN_SQL_STEP_2(ObShowSqlSet::SHOW_FULL_TABLES, OB_SYS_DATABASE_NAME, OB_TENANT_VIRTUAL_SHOW_TABLES_TNAME, show_db_id); } - } else { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("node value unexpected", K(parse_tree.value_)); - break; } } @@ -381,43 +398,45 @@ int ObShowResolver::resolve(const ParseNode &parse_tree) if (OB_FAIL(stmt_need_privs.need_privs_.init(3))) { LOG_WARN("fail to init need privs array", K(ret)); } else { - ObNeedPriv need_priv; - //Priv check: global select || db select || table acc - need_priv.priv_level_ = OB_PRIV_USER_LEVEL; - need_priv.priv_set_ = OB_PRIV_SELECT; - stmt_need_privs.need_privs_.push_back(need_priv); - need_priv.priv_level_ = OB_PRIV_DB_LEVEL; - need_priv.priv_set_ = OB_PRIV_SELECT; - need_priv.db_ = show_db_name; - stmt_need_privs.need_privs_.push_back(need_priv); - - need_priv.priv_level_ = OB_PRIV_TABLE_LEVEL; - need_priv.priv_set_ = OB_PRIV_TABLE_ACC; - need_priv.db_ = show_db_name; - need_priv.table_ = show_table_name; - stmt_need_privs.need_privs_.push_back(need_priv); - - if (OB_FAIL(schema_checker_->check_priv_or(session_priv, stmt_need_privs))) { - if (OB_ERR_NO_TABLE_PRIVILEGE == ret) { - LOG_USER_ERROR(OB_ERR_NO_TABLE_PRIVILEGE, (int)strlen("SELECT"), "SELECT", - session_priv.user_name_.length(), session_priv.user_name_.ptr(), - session_priv.host_name_.length(),session_priv.host_name_.ptr(), - show_table_name.length(), show_table_name.ptr()); - } else { - LOG_WARN("fail to check priv", K(ret)); - } - } } } if (OB_SUCC(ret)) { - if (1 == parse_tree.children_[0]->value_) { - GEN_SQL_STEP_1(ObShowSqlSet::SHOW_FULL_COLUMNS); - GEN_SQL_STEP_2(ObShowSqlSet::SHOW_FULL_COLUMNS, REAL_NAME(OB_SYS_DATABASE_NAME, OB_ORA_SYS_SCHEMA_NAME), REAL_NAME(OB_TENANT_VIRTUAL_TABLE_COLUMN_TNAME, OB_TENANT_VIRTUAL_TABLE_COLUMN_ORA_TNAME), show_table_id); + /* (parse_tree.children_[0]->value_)&1 -> FULL + * ((parse_tree.children_[0]->value_)>>1)&1 -> EXTENDED + */ + bool is_full = (1 == ((parse_tree.children_[0]->value_)&1)); + bool is_extended = (1 == (((parse_tree.children_[0]->value_)>>1)&1)); + bool is_compat; // compatible mode for version lower than 4.2.2 which does not support SHOW EXTENDED + uint64_t min_data_version; + if (OB_UNLIKELY(((parse_tree.children_[0]->value_)>>2) != 0)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("node value unexpected", K(ret), K(parse_tree.children_[0]->value_)); + } else if (OB_FAIL(GET_MIN_DATA_VERSION(real_tenant_id, min_data_version))) { + LOG_WARN("get min data version failed", K(ret), K(real_tenant_id)); + } else if (OB_FALSE_IT(is_compat = !sql::ObSQLUtils::is_data_version_ge_422_or_431(min_data_version))) { + } else if (OB_UNLIKELY(is_compat && is_extended)) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("version lower than 4.2.2 or 4.3.1 does not support show extended", K(ret)); + } else if (OB_FALSE_IT(is_extended |= is_compat)) { + // is_extended SQL is same as normal SQL in version lower than 4.2.2 or 4.3.1 + } else if (is_full) { + if (is_extended) { + GEN_SQL_STEP_1(ObShowSqlSet::SHOW_EXTENDED_FULL_COLUMNS); + GEN_SQL_STEP_2(ObShowSqlSet::SHOW_EXTENDED_FULL_COLUMNS, REAL_NAME(OB_SYS_DATABASE_NAME, OB_ORA_SYS_SCHEMA_NAME), REAL_NAME(OB_TENANT_VIRTUAL_TABLE_COLUMN_TNAME, OB_TENANT_VIRTUAL_TABLE_COLUMN_ORA_TNAME), show_table_id); + } else { + GEN_SQL_STEP_1(ObShowSqlSet::SHOW_FULL_COLUMNS); + GEN_SQL_STEP_2(ObShowSqlSet::SHOW_FULL_COLUMNS, REAL_NAME(OB_SYS_DATABASE_NAME, OB_ORA_SYS_SCHEMA_NAME), REAL_NAME(OB_TENANT_VIRTUAL_TABLE_COLUMN_TNAME, OB_TENANT_VIRTUAL_TABLE_COLUMN_ORA_TNAME), show_table_id); + } } else { - GEN_SQL_STEP_1(ObShowSqlSet::SHOW_COLUMNS); - GEN_SQL_STEP_2(ObShowSqlSet::SHOW_COLUMNS, REAL_NAME(OB_SYS_DATABASE_NAME, OB_ORA_SYS_SCHEMA_NAME), REAL_NAME(OB_TENANT_VIRTUAL_TABLE_COLUMN_TNAME, OB_TENANT_VIRTUAL_TABLE_COLUMN_ORA_TNAME), show_table_id); + if (is_extended) { + GEN_SQL_STEP_1(ObShowSqlSet::SHOW_EXTENDED_COLUMNS); + GEN_SQL_STEP_2(ObShowSqlSet::SHOW_EXTENDED_COLUMNS, REAL_NAME(OB_SYS_DATABASE_NAME, OB_ORA_SYS_SCHEMA_NAME), REAL_NAME(OB_TENANT_VIRTUAL_TABLE_COLUMN_TNAME, OB_TENANT_VIRTUAL_TABLE_COLUMN_ORA_TNAME), show_table_id); + } else { + GEN_SQL_STEP_1(ObShowSqlSet::SHOW_COLUMNS); + GEN_SQL_STEP_2(ObShowSqlSet::SHOW_COLUMNS, REAL_NAME(OB_SYS_DATABASE_NAME, OB_ORA_SYS_SCHEMA_NAME), REAL_NAME(OB_TENANT_VIRTUAL_TABLE_COLUMN_TNAME, OB_TENANT_VIRTUAL_TABLE_COLUMN_ORA_TNAME), show_table_id); + } } } } @@ -614,7 +633,7 @@ int ObShowResolver::resolve(const ParseNode &parse_tree) if (is_oracle_mode) { ret = OB_NOT_SUPPORTED; LOG_USER_ERROR(OB_NOT_SUPPORTED, "show indexes in oracle mode is"); - } else if (OB_UNLIKELY(parse_tree.num_child_ != 3 || NULL == parse_tree.children_)) { + } else if (OB_UNLIKELY(parse_tree.num_child_ != 4 || 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 { @@ -624,9 +643,20 @@ int ObShowResolver::resolve(const ParseNode &parse_tree) uint64_t show_table_id = OB_INVALID_ID; ObObj show_table_id_obj; bool is_view; + bool is_extended = (1 == parse_tree.children_[3]->value_); + bool is_compat; // compatible mode for version lower than 4.2.2 which does not support SHOW EXTENDED + uint64_t min_data_version; show_resv_ctx.condition_node_ = parse_tree.children_[2]; show_resv_ctx.stmt_type_ = stmt::T_SHOW_INDEXES; - if (OB_FAIL(resolve_show_from_table(parse_tree.children_[0], parse_tree.children_[1], database_name.empty(), + if (OB_FAIL(GET_MIN_DATA_VERSION(real_tenant_id, min_data_version))) { + LOG_WARN("get min data version failed", K(ret), K(real_tenant_id)); + } else if (OB_FALSE_IT(is_compat = !sql::ObSQLUtils::is_data_version_ge_422_or_431(min_data_version))) { + } else if (OB_UNLIKELY(is_compat && is_extended)) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("version lower than 4.2.2 does not support show extended", K(ret)); + } else if (OB_FALSE_IT(is_extended |= is_compat)) { + // is_extended SQL is same as normal SQL in version lower than 4.2.2 + } else if (OB_FAIL(resolve_show_from_table(parse_tree.children_[0], parse_tree.children_[1], database_name.empty(), T_SHOW_INDEXES, real_tenant_id, show_db_name, show_db_id, show_table_name, show_table_id, is_view, synonym_checker))) { LOG_WARN("fail to resolve show from table", K(ret)); @@ -653,20 +683,31 @@ int ObShowResolver::resolve(const ParseNode &parse_tree) if (OB_FAIL(schema_checker_->check_priv_or(session_priv, stmt_need_privs))) { if (OB_ERR_NO_TABLE_PRIVILEGE == ret) { - LOG_USER_ERROR(OB_ERR_NO_TABLE_PRIVILEGE, (int)strlen("SELECT"), "SELECT", - session_priv.user_name_.length(), session_priv.user_name_.ptr(), - session_priv.host_name_.length(),session_priv.host_name_.ptr(), - show_table_name.length(), show_table_name.ptr()); - } else { - LOG_WARN("fail to check priv", K(ret)); + ret = OB_SUCCESS; + bool pass = false; + if (OB_FAIL(schema_checker_->get_schema_guard()->check_priv_any_column_priv( + session_priv, show_db_name, show_table_name, pass))) { + LOG_WARN("fail to collect privs in roles", K(ret)); + } else if (!pass) { + ret = OB_ERR_NO_TABLE_PRIVILEGE; + LOG_USER_ERROR(OB_ERR_NO_TABLE_PRIVILEGE, (int)strlen("SELECT"), "SELECT", + session_priv.user_name_.length(), session_priv.user_name_.ptr(), + session_priv.host_name_.length(),session_priv.host_name_.ptr(), + show_table_name.length(), show_table_name.ptr()); + } } } } } if (OB_SUCC(ret)) { - GEN_SQL_STEP_1(ObShowSqlSet::SHOW_INDEXES); - GEN_SQL_STEP_2(ObShowSqlSet::SHOW_INDEXES, OB_SYS_DATABASE_NAME, OB_TENANT_VIRTUAL_TABLE_INDEX_TNAME, show_table_id); + if (is_extended) { + GEN_SQL_STEP_1(ObShowSqlSet::SHOW_EXTENDED_INDEXES); + GEN_SQL_STEP_2(ObShowSqlSet::SHOW_EXTENDED_INDEXES, OB_SYS_DATABASE_NAME, OB_TENANT_VIRTUAL_TABLE_INDEX_TNAME, show_table_id); + } else { + GEN_SQL_STEP_1(ObShowSqlSet::SHOW_INDEXES); + GEN_SQL_STEP_2(ObShowSqlSet::SHOW_INDEXES, OB_SYS_DATABASE_NAME, OB_TENANT_VIRTUAL_TABLE_INDEX_TNAME, show_table_id); + } } } }(); @@ -743,7 +784,8 @@ int ObShowResolver::resolve(const ParseNode &parse_tree) } case T_SHOW_GRANTS: { [&] { - if (OB_UNLIKELY(parse_tree.num_child_ != 1 || NULL == parse_tree.children_)) { + if (OB_UNLIKELY(parse_tree.num_child_ != (lib::is_mysql_mode() ? 2 : 1) + || NULL == parse_tree.children_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("parse tree is wrong", K(ret), @@ -753,6 +795,7 @@ int ObShowResolver::resolve(const ParseNode &parse_tree) uint64_t show_user_id = OB_INVALID_ID; ObString show_user_name; ObString show_host_name; + ObSqlString role_list_str; show_resv_ctx.stmt_type_ = stmt::T_SHOW_GRANTS; if (NULL == parse_tree.children_[0]) { show_user_id = user_id; @@ -786,9 +829,52 @@ int ObShowResolver::resolve(const ParseNode &parse_tree) K(user_name), K(ret)); } } + if (OB_SUCC(ret) + && lib::is_mysql_mode() + && OB_NOT_NULL(parse_tree.children_[1]) + && parse_tree.children_[1]->num_child_ > 0) { + ParseNode *role_list = parse_tree.children_[1]; + ObGrantResolver dcl_resolver(params_); + const ObUserInfo *user_info = NULL; + OZ (role_list_str.append_fmt("%lu", show_user_id)); + OZ (schema_checker_->get_user_info(real_tenant_id, show_user_id, user_info)); + for (int i = 0; OB_SUCC(ret) && i < role_list->num_child_; i++) { + ObString user_name; + ObString host_name; + uint64_t role_id = OB_INVALID_ID; + OZ (dcl_resolver.resolve_user_host(role_list->children_[i], user_name, host_name)); + OZ (schema_checker_->get_user_id(real_tenant_id, user_name, host_name, role_id)); + if (OB_USER_NOT_EXIST == ret) { + ret = OB_ERR_NO_GRANT_DEFINED_FOR_USER; + LOG_USER_ERROR(OB_ERR_NO_GRANT_DEFINED_FOR_USER, + user_name.length(), user_name.ptr(), host_name.length(), host_name.ptr()); + } + if (OB_SUCC(ret) && !has_exist_in_array(user_info->get_role_id_array(), role_id)) { + ret = OB_ERR_ROLE_NOT_GRANTED_TO; + LOG_USER_ERROR(OB_ERR_ROLE_NOT_GRANTED_TO, + user_name.length(), user_name.ptr(), + host_name.length(), host_name.ptr(), + user_info->get_user_name_str().length(), + user_info->get_user_name_str().ptr(), + user_info->get_host_name_str().length(), + user_info->get_host_name_str().ptr()); + } + OZ (role_list_str.append_fmt(",%lu", role_id)); + } + } if (OB_SUCC(ret)) { GEN_SQL_STEP_1(ObShowSqlSet::SHOW_GRANTS, show_user_name.length(), show_user_name.ptr(), show_host_name.length(), show_host_name.ptr()); - GEN_SQL_STEP_2(ObShowSqlSet::SHOW_GRANTS, REAL_NAME(OB_SYS_DATABASE_NAME, OB_ORA_SYS_SCHEMA_NAME), REAL_NAME(OB_TENANT_VIRTUAL_PRIVILEGE_GRANT_TNAME, OB_TENANT_VIRTUAL_PRIVILEGE_GRANT_ORA_TNAME), show_user_id); + if (lib::is_mysql_mode() && role_list_str.length() > 0) { + GEN_SQL_STEP_2(ObShowSqlSet::SHOW_GRANTS_USING_ROLES, + REAL_NAME(OB_SYS_DATABASE_NAME, OB_ORA_SYS_SCHEMA_NAME), + REAL_NAME(OB_TENANT_VIRTUAL_PRIVILEGE_GRANT_TNAME, OB_TENANT_VIRTUAL_PRIVILEGE_GRANT_ORA_TNAME), + role_list_str.string().length(), role_list_str.string().ptr()); + } else { + GEN_SQL_STEP_2(ObShowSqlSet::SHOW_GRANTS, + REAL_NAME(OB_SYS_DATABASE_NAME, OB_ORA_SYS_SCHEMA_NAME), + REAL_NAME(OB_TENANT_VIRTUAL_PRIVILEGE_GRANT_TNAME, OB_TENANT_VIRTUAL_PRIVILEGE_GRANT_ORA_TNAME), + show_user_id); + } } } }(); @@ -2741,13 +2827,27 @@ DEFINE_SHOW_CLAUSE_SET(SHOW_GLOBAL_VARIABLES, R"(SELECT /*+parallel(1)*/ "VARIABLE_NAME" AS "VARIABLE_NAME", "VALUE" AS "VALUE" FROM %s.%s ORDER BY VARIABLE_NAME ASC)", "Variable_name"); DEFINE_SHOW_CLAUSE_SET(SHOW_COLUMNS, + NULL, + "SELECT field AS `Field`, type AS `Type`, `NULL` AS `Null`, `KEY` AS `Key`, `DEFAULT` AS `Default`, extra AS `Extra` \ + FROM %s.%s where table_id = %ld AND is_hidden = False", + R"(SELECT "FIELD" AS "FIELD", "TYPE" AS "TYPE", "NULL" AS "NULL", "KEY" AS "KEY", "DEFAULT" AS "DEFAULT", "EXTRA" AS "EXTRA" )" + R"(FROM %s.%s WHERE TABLE_ID = %ld AND IS_HIDDEN = 0)", + "Field"); +DEFINE_SHOW_CLAUSE_SET(SHOW_FULL_COLUMNS, + NULL, + "SELECT field AS `Field`, type AS `Type`, collation AS `Collation`, `NULL` AS `Null`, `KEY` AS `Key`, `DEFAULT` AS `Default`, extra AS `Extra`, `PRIVILEGES` AS `Privileges`, `COMMENT` AS `Comment` \ + FROM %s.%s where table_id = %ld AND is_hidden = False", + R"(SELECT "FIELD" AS "FIELD", "TYPE" AS "TYPE", "COLLATION" AS "COLLATION", "NULL" AS "NULL", KEY AS "KEY", "DEFAULT" AS "DEFAULT", EXTRA AS "EXTRA", "PRIVILEGES" AS "PRIVILEGES", "COMMENT" AS "COMMENT" )" + R"(FROM %s.%s WHERE TABLE_ID = %ld AND IS_HIDDEN = 0)", + "Field"); +DEFINE_SHOW_CLAUSE_SET(SHOW_EXTENDED_COLUMNS, NULL, "SELECT field AS `Field`, type AS `Type`, `NULL` AS `Null`, `KEY` AS `Key`, `DEFAULT` AS `Default`, extra AS `Extra` \ FROM %s.%s where table_id = %ld", R"(SELECT "FIELD" AS "FIELD", "TYPE" AS "TYPE", "NULL" AS "NULL", "KEY" AS "KEY", "DEFAULT" AS "DEFAULT", "EXTRA" AS "EXTRA" )" R"(FROM %s.%s WHERE TABLE_ID = %ld)", "Field"); -DEFINE_SHOW_CLAUSE_SET(SHOW_FULL_COLUMNS, +DEFINE_SHOW_CLAUSE_SET(SHOW_EXTENDED_FULL_COLUMNS, NULL, "SELECT field AS `Field`, type AS `Type`, collation AS `Collation`, `NULL` AS `Null`, `KEY` AS `Key`, `DEFAULT` AS `Default`, extra AS `Extra`, `PRIVILEGES` AS `Privileges`, `COMMENT` AS `Comment` \ FROM %s.%s where table_id = %ld", @@ -2770,6 +2870,12 @@ DEFINE_SHOW_CLAUSE_SET(SHOW_CREATE_TABLEGROUP, R"(SELECT "TABLEGROUP_NAME" AS "TABLEGROUP", "CREATE_TABLEGROUP" AS "CREATE TABLEGROUP" FROM %s.%s WHERE TABLEGROUP_ID = %ld)", NULL); DEFINE_SHOW_CLAUSE_SET(SHOW_INDEXES, + NULL, + "SELECT `TABLE` AS `Table`, NON_UNIQUE AS Non_unique, KEY_NAME AS Key_name, SEQ_IN_INDEX AS Seq_in_index, COLUMN_NAME AS Column_name, COLLATION AS Collation, CARDINALITY AS Cardinality, SUB_PART AS Sub_part, PACKED AS Packed, `NULL` AS `Null`, INDEX_TYPE AS Index_type, `COMMENT` AS `Comment`, INDEX_COMMENT AS Index_comment, IS_VISIBLE AS Visible, EXPRESSION AS Expression FROM %s.%s where table_id = %ld AND is_column_visible = true", + R"(SELECT "TABLE" AS "TABLE", "NON_UNIQUE" AS "NON_UNIQUE", "KEY_NAME" AS "KEY_NAME", "SEQ_IN_INDEX" AS "SEQ_IN_INDEX", "COLUMN_NAME" AS "COLUMN_NAME", "COLLATION" AS "COLLATION", "CARDINALITY" AS "CARDINALITY", "SUB_PART" AS "SUB_PART", "PACKED" AS "PACKED", "NULL" AS "NULL", "INDEX_TYPE" AS "INDEX_TYPE", "COMMENT" AS "COMMENT", )" + R"(INDEX_COMMENT" AS "INDEX_COMMENT", "IS_VISIBLE" AS "VISIBLE", "EXPRESSION" AS "EXPRESSION" FROM %s.%s WHERE TABLE_ID = %ld AND IS_COLUMN_VISIBLE = 1")", + NULL); +DEFINE_SHOW_CLAUSE_SET(SHOW_EXTENDED_INDEXES, NULL, "SELECT `TABLE` AS `Table`, NON_UNIQUE AS Non_unique, KEY_NAME AS Key_name, SEQ_IN_INDEX AS Seq_in_index, COLUMN_NAME AS Column_name, COLLATION AS Collation, CARDINALITY AS Cardinality, SUB_PART AS Sub_part, PACKED AS Packed, `NULL` AS `Null`, INDEX_TYPE AS Index_type, `COMMENT` AS `Comment`, INDEX_COMMENT AS Index_comment, IS_VISIBLE AS Visible, EXPRESSION AS Expression FROM %s.%s where table_id = %ld", R"(SELECT "TABLE" AS "TABLE", "NON_UNIQUE" AS "NON_UNIQUE", "KEY_NAME" AS "KEY_NAME", "SEQ_IN_INDEX" AS "SEQ_IN_INDEX", "COLUMN_NAME" AS "COLUMN_NAME", "COLLATION" AS "COLLATION", "CARDINALITY" AS "CARDINALITY", "SUB_PART" AS "SUB_PART", "PACKED" AS "PACKED", "NULL" AS "NULL", "INDEX_TYPE" AS "INDEX_TYPE", "COMMENT" AS "COMMENT", )" @@ -2816,6 +2922,11 @@ DEFINE_SHOW_CLAUSE_SET(SHOW_GRANTS, "SELECT grants FROM %s.%s WHERE user_id = %ld", R"(SELECT "GRANTS" AS "GRANTS" FROM %s.%s WHERE USER_ID = %ld)", NULL); +DEFINE_SHOW_CLAUSE_SET(SHOW_GRANTS_USING_ROLES, + "SELECT grants AS `Grants for %.*s@%.*s` ", + "SELECT grants FROM %s.%s WHERE user_id in (%.*s)", + R"(SELECT "GRANTS" AS "GRANTS" FROM %s.%s WHERE USER_ID IN (%.*s))", + NULL); DEFINE_SHOW_CLAUSE_SET(SHOW_PROCESSLIST, NULL, "SELECT id AS `Id`, user AS `User`, host AS `Host`, db AS `db`, command AS `Command`, time AS `Time`, state AS `State`, info AS `Info` FROM %s.%s WHERE is_serving_tenant(svr_ip, svr_port, %ld)=1", diff --git a/src/sql/resolver/cmd/ob_show_resolver.h b/src/sql/resolver/cmd/ob_show_resolver.h index ea06a69718..8c242492ec 100644 --- a/src/sql/resolver/cmd/ob_show_resolver.h +++ b/src/sql/resolver/cmd/ob_show_resolver.h @@ -104,11 +104,14 @@ struct ObShowResolver::ObShowSqlSet DECLARE_SHOW_CLAUSE_SET(SHOW_GLOBAL_VARIABLES); DECLARE_SHOW_CLAUSE_SET(SHOW_COLUMNS); DECLARE_SHOW_CLAUSE_SET(SHOW_FULL_COLUMNS); + DECLARE_SHOW_CLAUSE_SET(SHOW_EXTENDED_COLUMNS); + DECLARE_SHOW_CLAUSE_SET(SHOW_EXTENDED_FULL_COLUMNS); DECLARE_SHOW_CLAUSE_SET(SHOW_CREATE_DATABASE); DECLARE_SHOW_CLAUSE_SET(SHOW_CREATE_DATABASE_EXISTS); DECLARE_SHOW_CLAUSE_SET(SHOW_CREATE_TABLEGROUP); DECLARE_SHOW_CLAUSE_SET(SHOW_CREATE_TABLEGROUP_EXISTS); DECLARE_SHOW_CLAUSE_SET(SHOW_INDEXES); + DECLARE_SHOW_CLAUSE_SET(SHOW_EXTENDED_INDEXES); DECLARE_SHOW_CLAUSE_SET(SHOW_COLLATION); DECLARE_SHOW_CLAUSE_SET(SHOW_TRACE); DECLARE_SHOW_CLAUSE_SET(SHOW_TRACE_JSON); @@ -116,6 +119,7 @@ struct ObShowResolver::ObShowSqlSet DECLARE_SHOW_CLAUSE_SET(SHOW_PRIVILEGES); DECLARE_SHOW_CLAUSE_SET(SHOW_QUERY_RESPONSE_TIME); DECLARE_SHOW_CLAUSE_SET(SHOW_GRANTS); + DECLARE_SHOW_CLAUSE_SET(SHOW_GRANTS_USING_ROLES); DECLARE_SHOW_CLAUSE_SET(SHOW_PROCESSLIST); DECLARE_SHOW_CLAUSE_SET(SHOW_FULL_PROCESSLIST); DECLARE_SHOW_CLAUSE_SET(SHOW_SYS_PROCESSLIST); diff --git a/src/sql/resolver/cmd/ob_variable_set_resolver.cpp b/src/sql/resolver/cmd/ob_variable_set_resolver.cpp index 949ce25d48..e3c74dc2f2 100644 --- a/src/sql/resolver/cmd/ob_variable_set_resolver.cpp +++ b/src/sql/resolver/cmd/ob_variable_set_resolver.cpp @@ -193,6 +193,17 @@ int ObVariableSetResolver::resolve(const ParseNode &parse_tree) LOG_WARN("resolve variable value failed", K(ret)); } } + if (OB_SUCC(ret)) { + if (0 == var_node.variable_name_.case_compare("_enable_mysql_pl_priv_check")) { + if (0 == ObString(value_node.str_len_, value_node.str_value_).case_compare("on") || + 0 == ObString(value_node.str_len_, value_node.str_value_).case_compare("1")) { + //do nothing + } else { + ret = OB_NOT_SUPPORTED; + LOG_USER_ERROR(OB_NOT_SUPPORTED, "turn _enable_mysql_pl_priv_check without on"); + } + } + } } else { // use WARN_ON_FAIL cast_mode if set user_variable const stmt::StmtType session_ori_stmt_type = session_info_->get_stmt_type(); diff --git a/src/sql/resolver/dcl/ob_alter_user_profile_resolver.cpp b/src/sql/resolver/dcl/ob_alter_user_profile_resolver.cpp index 279410e02c..69b7b860d8 100644 --- a/src/sql/resolver/dcl/ob_alter_user_profile_resolver.cpp +++ b/src/sql/resolver/dcl/ob_alter_user_profile_resolver.cpp @@ -19,6 +19,7 @@ #include "sql/resolver/dcl/ob_grant_resolver.h" #include "share/ob_rpc_struct.h" #include "lib/encrypt/ob_encrypted_helper.h" +#include "sql/engine/ob_exec_context.h" using namespace oceanbase::sql; using namespace oceanbase::common; using oceanbase::share::schema::ObUserInfo; @@ -43,6 +44,8 @@ int ObAlterUserProfileResolver::resolve_set_role(const ParseNode &parse_tree) } else if (OB_ISNULL(params_.schema_checker_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("not init", K(ret)); + } else if (lib::is_mysql_mode() && OB_FAIL(ObSQLUtils::compatibility_check_for_mysql_role_and_column_priv(MTL_ID()))) { + LOG_WARN("set role not supported while upgrading", K(ret)); } else if (T_SET_ROLE != parse_tree.type_ || 1 != parse_tree.num_child_) { ret = OB_INVALID_ARGUMENT; @@ -53,10 +56,12 @@ int ObAlterUserProfileResolver::resolve_set_role(const ParseNode &parse_tree) } else { ObString user_name; ObString host_name(OB_DEFAULT_HOST_NAME); + uint64_t session_user_id = lib::is_mysql_mode() ? params_.session_info_->get_priv_user_id() + : params_.session_info_->get_user_id(); const ObUserInfo *user_info = NULL; if (OB_FAIL(params_.schema_checker_->get_user_info( params_.session_info_->get_effective_tenant_id(), - params_.session_info_->get_user_id(), user_info))) { + session_user_id, user_info))) { LOG_WARN("get user info failed", K(ret)); } else if (NULL == user_info) { ret = OB_ERR_UNEXPECTED; @@ -65,7 +70,7 @@ int ObAlterUserProfileResolver::resolve_set_role(const ParseNode &parse_tree) obrpc::ObAlterUserProfileArg &arg = stmt->get_ddl_arg(); arg.tenant_id_ = params_.session_info_->get_effective_tenant_id(); - stmt->set_set_role_flag(1); + stmt->set_set_role_flag(ObAlterUserProfileStmt::SET_ROLE); /* 1. resolve default role */ OZ (resolve_default_role_clause(parse_tree.children_[0], arg, @@ -96,6 +101,7 @@ int ObAlterUserProfileResolver::resolve_role_list( if (NULL == role) { ret = OB_ERR_UNEXPECTED; LOG_WARN("role opt identified by node is null", K(ret)); + } else if (lib::is_mysql_mode()) { } else if (T_IDENT == role->type_) { } else if (T_SET_ROLE_PASSWORD != role->type_) { ret = OB_ERR_UNEXPECTED; @@ -114,17 +120,34 @@ int ObAlterUserProfileResolver::resolve_role_list( } if (OB_SUCC(ret)) { ObString role_name; - const ObUserInfo *role_info = NULL; - role_name.assign_ptr(const_cast(role->str_value_), - static_cast(role->str_len_)); ObString host_name(OB_DEFAULT_HOST_NAME); - if (OB_FAIL(params_.schema_checker_->get_user_info(arg.tenant_id_, role_name, - host_name, role_info))) { - if (OB_USER_NOT_EXIST == ret || OB_ISNULL(role_info) || !role_info->is_role()) { - ret = OB_ROLE_NOT_EXIST; - LOG_USER_ERROR(OB_ROLE_NOT_EXIST, - role_name.length(), role_name.ptr()); - LOG_WARN("role not exists", K(ret), K(role_name)); + const ObUserInfo *role_info = NULL; + if (lib::is_oracle_mode()) { + role_name.assign_ptr(const_cast(role->str_value_), + static_cast(role->str_len_)); + } else { + OZ (resolve_user_host(role, role_name, host_name)); + } + if (OB_FAIL(ret)) { + } else if (OB_FAIL(params_.schema_checker_->get_user_info(arg.tenant_id_, role_name, + host_name, role_info))) { + if (lib::is_oracle_mode()) { + if (OB_USER_NOT_EXIST == ret || OB_ISNULL(role_info) || !role_info->is_role()) { + ret = OB_ROLE_NOT_EXIST; + LOG_USER_ERROR(OB_ROLE_NOT_EXIST, + role_name.length(), role_name.ptr()); + LOG_WARN("role not exists", K(ret), K(role_name)); + } + } else { + if (OB_USER_NOT_EXIST == ret) { + if (obrpc::OB_DEFAULT_ROLE_ALL_EXCEPT == arg.default_role_flag_) { + ret = OB_SUCCESS; //ignore EXCEPTED ROLE not exist + } else { + ret = OB_ERR_UNKNOWN_AUTHID; + LOG_USER_ERROR(OB_ERR_UNKNOWN_AUTHID, role_name.length(), role_name.ptr(), + host_name.length(), host_name.ptr()); + } + } } LOG_WARN("fail to get user id", K(ret), K(role_name), K(host_name)); } else if (role_info == NULL) { @@ -140,26 +163,67 @@ int ObAlterUserProfileResolver::resolve_role_list( LOG_WARN("role not granted or does not exists", K(ret), K(role_name)); } } else { + bool skip = false; role_id = role_info->get_user_id(); - if (is_ora_public_role(role_id)) { + if (lib::is_oracle_mode() && is_ora_public_role(role_id)) { ret = OB_ERR_MISSING_OR_INVALID_ROLE_NAME; } else if (has_exist_in_array(arg.role_id_array_, role_id)) { /* if role duplicate in role list, then raise error */ - ret = OB_PRIV_DUP; - } else if (!has_exist_in_array(role_id_array, role_id)) { - /* if role not granted to user, then raise error */ - if (for_default_role_stmt) { - ret = OB_ERR_DEFAULT_ROLE_NOT_GRANTED_TO_USER; - LOG_USER_ERROR(OB_ERR_DEFAULT_ROLE_NOT_GRANTED_TO_USER, - role_name.length(), role_name.ptr()); - LOG_WARN("role not granted to user", K(ret), K(role_name)); + if (lib::is_mysql_mode()) { + skip = true; } else { - ret = OB_ERR_ROLE_NOT_GRANTED_OR_DOES_NOT_EXIST; - LOG_USER_ERROR(OB_ERR_ROLE_NOT_GRANTED_OR_DOES_NOT_EXIST, - role_name.length(), role_name.ptr()); - LOG_WARN("role not granted or does not exists", K(ret), K(role_name)); + ret = OB_PRIV_DUP; + } + } else if (lib::is_oracle_mode()) { + if (!has_exist_in_array(role_id_array, role_id)) { + /* if role not granted to user, then raise error */ + if (for_default_role_stmt) { + ret = OB_ERR_DEFAULT_ROLE_NOT_GRANTED_TO_USER; + LOG_USER_ERROR(OB_ERR_DEFAULT_ROLE_NOT_GRANTED_TO_USER, + role_name.length(), role_name.ptr()); + LOG_WARN("role not granted to user", K(ret), K(role_name)); + } else { + ret = OB_ERR_ROLE_NOT_GRANTED_OR_DOES_NOT_EXIST; + LOG_USER_ERROR(OB_ERR_ROLE_NOT_GRANTED_OR_DOES_NOT_EXIST, + role_name.length(), role_name.ptr()); + LOG_WARN("role not granted or does not exists", K(ret), K(role_name)); + } } } else { + ObString cur_user_name; + ObString cur_host_name; + if (!for_default_role_stmt) { + if (!has_exist_in_array(role_id_array, role_id)) { + ret = OB_ERR_ROLE_NOT_GRANTED_TO; + cur_user_name = params_.session_info_->get_user_name(); + cur_host_name = params_.session_info_->get_host_name(); + } + } else { + for (int j = 0; OB_SUCC(ret) && j < arg.user_ids_.count(); j++) { + const ObUserInfo *cur_user_info = NULL; + OZ (params_.schema_checker_->get_user_info(arg.tenant_id_, arg.user_ids_.at(j), cur_user_info)); + CK (OB_NOT_NULL(cur_user_info)); + if (OB_SUCC(ret) && !has_exist_in_array(cur_user_info->get_role_id_array(), role_id)) { + ret = OB_ERR_ROLE_NOT_GRANTED_TO; + cur_user_name = cur_user_info->get_user_name_str(); + cur_host_name = cur_user_info->get_host_name_str(); + } + } + } + if (OB_ERR_ROLE_NOT_GRANTED_TO == ret) { + if (obrpc::OB_DEFAULT_ROLE_ALL_EXCEPT == arg.default_role_flag_) { + skip = true; + ret = OB_SUCCESS; //ignore EXCEPTED ROLE not granted to user + } else { + LOG_USER_ERROR(OB_ERR_ROLE_NOT_GRANTED_TO, + role_name.length(), role_name.ptr(), + host_name.length(), host_name.ptr(), + cur_user_name.length(), cur_user_name.ptr(), + cur_host_name.length(), cur_host_name.ptr()); + } + } + } + if (OB_SUCC(ret) && !skip) { OZ (arg.role_id_array_.push_back(role_id)); ObString pwd = ObString::make_string(""); if (NULL != pwd_node) { @@ -172,7 +236,7 @@ int ObAlterUserProfileResolver::resolve_role_list( } } // Check role password for SET ROLE - if (OB_SUCC(ret)) { + if (OB_SUCC(ret) && lib::is_oracle_mode()) { if (for_default_role_stmt) { // do nothing when ALTER USER DEFAULT ROLE } else { @@ -207,6 +271,7 @@ int ObAlterUserProfileResolver::resolve_role_list( } break; } + case obrpc::OB_DEFAULT_ROLE_DEFAULT: case obrpc::OB_DEFAULT_ROLE_NONE: { // No need to check for NONE break; @@ -238,20 +303,30 @@ int ObAlterUserProfileResolver::resolve_default_role_clause( if (1 == parse_tree->num_child_) { CK (OB_NOT_NULL(parse_tree->children_[0])); if (OB_SUCC(ret)) { - if (1 == parse_tree->children_[0]->value_) { - OX (arg.default_role_flag_ = obrpc::OB_DEFAULT_ROLE_ALL); - // Sinc resolve_role_list will not be called in case OB_DEFAULT_ROLE_ALL, - // so we manually do this check here. Only for SET ROLE - if (OB_SUCC(ret)) { + switch (parse_tree->children_[0]->value_) { + case 1: { + arg.default_role_flag_ = obrpc::OB_DEFAULT_ROLE_ALL; + // Sinc resolve_role_list will not be called in case OB_DEFAULT_ROLE_ALL, + // so we manually do this check here. Only for SET ROLE if (false == for_default_role_stmt) { if (OB_FAIL(check_role_password_all(arg.tenant_id_, role_id_array))) { LOG_WARN("Password mismatch for set role all", K(ret), K(arg)); } } + break; + } + case 3: { + arg.default_role_flag_ = obrpc::OB_DEFAULT_ROLE_NONE; + break; + } + case 4: { + arg.default_role_flag_ = obrpc::OB_DEFAULT_ROLE_DEFAULT; + break; + } + default: { + ret = OB_ERR_UNDEFINED; + LOG_WARN("invalid type", K(ret), K(parse_tree->children_[0]->value_)); } - } else { - CK (3 == parse_tree->children_[0]->value_); - OX (arg.default_role_flag_ = obrpc::OB_DEFAULT_ROLE_NONE); } } } else { @@ -283,6 +358,8 @@ int ObAlterUserProfileResolver::resolve_default_role(const ParseNode &parse_tree } else if (OB_ISNULL(params_.schema_checker_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("not init", K(ret)); + } else if (lib::is_mysql_mode() && OB_FAIL(ObSQLUtils::compatibility_check_for_mysql_role_and_column_priv(MTL_ID()))) { + LOG_WARN("set default role not supported while upgrading", K(ret)); } else if (T_ALTER_USER_DEFAULT_ROLE != parse_tree.type_ || 2 != parse_tree.num_child_) { ret = OB_INVALID_ARGUMENT; @@ -295,46 +372,69 @@ int ObAlterUserProfileResolver::resolve_default_role(const ParseNode &parse_tree ObString host_name; const ObUserInfo *user_info = NULL; obrpc::ObAlterUserProfileArg &arg = stmt->get_ddl_arg(); + stmt->set_set_role_flag(ObAlterUserProfileStmt::SET_DEFAULT_ROLE); /* 1. resolve user */ tenant_id = params_.session_info_->get_effective_tenant_id(); arg.tenant_id_ = tenant_id; - ParseNode *user_with_host_name = parse_tree.children_[0]; - // Get user_name and host_name - if (OB_ISNULL(user_with_host_name)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("user_with_host_name is NULL"); - } else { - ParseNode *user_name_node = user_with_host_name->children_[0]; - ParseNode *host_name_node = user_with_host_name->children_[1]; - if (OB_ISNULL(user_name_node)) { + if (T_USER_WITH_HOST_NAME == parse_tree.children_[0]->type_) { + ParseNode *user_with_host_name = parse_tree.children_[0]; + // Get user_name and host_name + if (OB_ISNULL(user_with_host_name)) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("user_name is NULL", K(ret), K(user_name)); + LOG_WARN("user_with_host_name is NULL"); } else { - user_name = ObString(user_name_node->str_len_, user_name_node->str_value_); + ParseNode *user_name_node = user_with_host_name->children_[0]; + ParseNode *host_name_node = user_with_host_name->children_[1]; + if (OB_ISNULL(user_name_node)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("user_name is NULL", K(ret), K(user_name)); + } else { + user_name = ObString(user_name_node->str_len_, user_name_node->str_value_); + } + if (NULL != host_name_node) { + host_name = ObString(host_name_node->str_len_, host_name_node->str_value_); + } else { + host_name = ObString(OB_DEFAULT_HOST_NAME); + } } - if (NULL != host_name_node) { - host_name = ObString(host_name_node->str_len_, host_name_node->str_value_); - } else { - host_name = ObString(OB_DEFAULT_HOST_NAME); + OZ (params_.schema_checker_->get_user_info(tenant_id, user_name, host_name, user_info), + tenant_id, user_name, host_name); + if (ret == OB_USER_NOT_EXIST) { + if (lib::is_oracle_mode()) { + LOG_USER_ERROR(OB_USER_NOT_EXIST, user_name.length(), user_name.ptr()); + } else { + ret = OB_ERR_UNKNOWN_AUTHID; + LOG_USER_ERROR(OB_ERR_UNKNOWN_AUTHID, user_name.length(), user_name.ptr(), host_name.length(), host_name.ptr()); + } } - } - OZ (params_.schema_checker_->get_user_info(tenant_id, user_name, host_name, user_info), - tenant_id, user_name, host_name); - if (ret == OB_USER_NOT_EXIST) { - LOG_USER_ERROR(OB_USER_NOT_EXIST, user_name.length(), user_name.ptr()); - } - if (OB_SUCC(ret)) { - if (user_info == NULL) { - ret = OB_USER_NOT_EXIST; - LOG_USER_ERROR(OB_USER_NOT_EXIST, user_name.length(), user_name.ptr()); - } else if (OB_FAIL(check_dcl_on_inner_user(parse_tree.type_, - session_info_->get_priv_user_id(), - user_info->get_user_id()))) { - LOG_WARN("failed to check dcl on inner-user or unsupport to modify reserved user", K(ret), - K(session_info_->get_user_name()), K(user_name)); - } else { - arg.user_id_ = user_info->get_user_id(); + if (OB_SUCC(ret)) { + if (user_info == NULL) { + ret = OB_USER_NOT_EXIST; + LOG_USER_ERROR(OB_USER_NOT_EXIST, user_name.length(), user_name.ptr()); + } else if (lib::is_mysql_mode()) { + OZ (arg.user_ids_.push_back(user_info->get_user_id())); + } else if (OB_FAIL(check_dcl_on_inner_user(parse_tree.type_, + session_info_->get_priv_user_id(), + user_info->get_user_id()))) { + LOG_WARN("failed to check dcl on inner-user or unsupport to modify reserved user", K(ret), + K(session_info_->get_user_name()), K(user_name)); + } else { + arg.user_id_ = user_info->get_user_id(); + } + } + + } else { + ParseNode *user_list_node = parse_tree.children_[0]; + for (int i = 0; OB_SUCC(ret) && i < user_list_node->num_child_; i++) { + OZ (ObDCLResolver::resolve_user_list_node(user_list_node->children_[i], user_list_node, user_name, host_name)); + OZ (params_.schema_checker_->get_user_info(tenant_id, user_name, host_name, user_info), + tenant_id, user_name, host_name); + if (OB_USER_NOT_EXIST == ret || OB_ISNULL(user_info)) { + ret = OB_ERR_UNKNOWN_AUTHID; + LOG_USER_ERROR(OB_ERR_UNKNOWN_AUTHID, user_name.length(), user_name.ptr(), host_name.length(), host_name.ptr()); + } + OZ (arg.user_ids_.push_back(user_info->get_user_id())); } } @@ -342,6 +442,20 @@ int ObAlterUserProfileResolver::resolve_default_role(const ParseNode &parse_tree OZ (resolve_default_role_clause(parse_tree.children_[1], arg, user_info->get_role_id_array(), true)); + if (OB_SUCC(ret) && lib::is_mysql_mode()) { + ObSqlCtx *sql_ctx = NULL; + if (OB_ISNULL(params_.session_info_->get_cur_exec_ctx()) + || OB_ISNULL(sql_ctx = params_.session_info_->get_cur_exec_ctx()->get_sql_ctx())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected ctx", K(ret), KP(params_.session_info_->get_cur_exec_ctx())); + } + for (int i = 0; OB_SUCC(ret) && i < arg.user_ids_.count(); i++) { + if (arg.user_ids_.at(i) != params_.session_info_->get_priv_user_id()) { + OZ (schema_checker_->check_set_default_role_priv(*sql_ctx)); + } + } + } + } return ret; } diff --git a/src/sql/resolver/dcl/ob_alter_user_profile_stmt.h b/src/sql/resolver/dcl/ob_alter_user_profile_stmt.h index bfd90e6200..7edcd794c8 100644 --- a/src/sql/resolver/dcl/ob_alter_user_profile_stmt.h +++ b/src/sql/resolver/dcl/ob_alter_user_profile_stmt.h @@ -28,8 +28,10 @@ public: obrpc::ObAlterUserProfileArg &get_ddl_arg() { return arg_; } // function members TO_STRING_KV(K_(stmt_type), K_(arg)); + enum {SET_ROLE = 1 << 0, SET_DEFAULT_ROLE = 1 << 1}; void set_set_role_flag(int set_role_flag) { set_role_flag_ = set_role_flag; } - int get_set_role_flag() { return set_role_flag_; } + int get_set_role_flag() const { return set_role_flag_; } + virtual bool cause_implicit_commit() const { return !(lib::is_mysql_mode() && get_set_role_flag() == SET_ROLE); } private: // data members obrpc::ObAlterUserProfileArg arg_; diff --git a/src/sql/resolver/dcl/ob_create_role_resolver.cpp b/src/sql/resolver/dcl/ob_create_role_resolver.cpp index 19025d6c1b..2891bcb4ba 100644 --- a/src/sql/resolver/dcl/ob_create_role_resolver.cpp +++ b/src/sql/resolver/dcl/ob_create_role_resolver.cpp @@ -61,9 +61,44 @@ int ObCreateRoleResolver::resolve(const ParseNode &parse_tree) if (OB_ISNULL(role)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("role should not be NULL", K(ret)); - } else { + } else if (lib::is_oracle_mode()) { ObString role_name(role->str_len_, role->str_value_); create_role_stmt->set_role_name(role_name); + } else { + //mysql mode + OZ (ObSQLUtils::compatibility_check_for_mysql_role_and_column_priv(params_.session_info_->get_effective_tenant_id())); + + if (OB_SUCC(ret) && NULL != parse_tree.children_[1]) { + if (T_IF_NOT_EXISTS != parse_tree.children_[1]->type_) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid argument", K(parse_tree.children_[1]->type_), K(ret)); + } else { + create_role_stmt->set_if_not_exists(); + } + } + + OZ (create_role_stmt->get_user_names().reserve(role->num_child_)); + OZ (create_role_stmt->get_host_names().reserve(role->num_child_)); + + for (int i = 0; OB_SUCC(ret) && i < role->num_child_; i++) { + ParseNode *cur_role = role->children_[i]; + ObString user_name; + ObString host_name; + if (OB_ISNULL(cur_role)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid role", K(ret)); + } else { + OZ (resolve_user_host(cur_role, user_name, host_name)); + user_name = user_name.trim_space_only(); + if (OB_SUCC(ret) && user_name.empty()) { + ret = OB_CANNOT_USER; + LOG_USER_ERROR(OB_CANNOT_USER, (int)strlen("CREATE ROLE"), "CREATE ROLE", + (int)strlen("anonymous user"), "anonymous user"); + } + OZ (create_role_stmt->get_user_names().push_back(user_name)); + OZ (create_role_stmt->get_host_names().push_back(host_name)); + } + } } } // resolve password diff --git a/src/sql/resolver/dcl/ob_create_role_stmt.cpp b/src/sql/resolver/dcl/ob_create_role_stmt.cpp index d6d75ea6f0..dd57986e4b 100644 --- a/src/sql/resolver/dcl/ob_create_role_stmt.cpp +++ b/src/sql/resolver/dcl/ob_create_role_stmt.cpp @@ -27,7 +27,8 @@ ObCreateRoleStmt::ObCreateRoleStmt(ObIAllocator *name_pool) tenant_id_(OB_INVALID_ID), role_name_(), password_(), - need_enc_(false) + need_enc_(false), + if_not_exists_(false) { } @@ -36,7 +37,8 @@ ObCreateRoleStmt::ObCreateRoleStmt() tenant_id_(OB_INVALID_ID), role_name_(), password_(), - need_enc_(false) + need_enc_(false), + if_not_exists_(false) { } diff --git a/src/sql/resolver/dcl/ob_create_role_stmt.h b/src/sql/resolver/dcl/ob_create_role_stmt.h index 8688766127..0cfa9cfa32 100644 --- a/src/sql/resolver/dcl/ob_create_role_stmt.h +++ b/src/sql/resolver/dcl/ob_create_role_stmt.h @@ -40,15 +40,23 @@ public: const common::ObString &get_masked_sql() const { return masked_sql_; } virtual bool cause_implicit_commit() const { return true; } virtual obrpc::ObDDLArg &get_ddl_arg() { return create_role_arg_; } + common::ObIArray &get_user_names() { return user_names_; } + common::ObIArray &get_host_names() { return host_names_; } + void set_if_not_exists() { if_not_exists_ = true; } + bool get_if_not_exists() const { return if_not_exists_; } DECLARE_VIRTUAL_TO_STRING; private: // data members uint64_t tenant_id_; common::ObString role_name_; - common::ObString password_; + common::ObString password_; bool need_enc_; common::ObString masked_sql_; obrpc::ObCreateRoleArg create_role_arg_; + //for mysql role + bool if_not_exists_; + ObArray user_names_; + ObArray host_names_; private: DISALLOW_COPY_AND_ASSIGN(ObCreateRoleStmt); }; diff --git a/src/sql/resolver/dcl/ob_create_user_resolver.cpp b/src/sql/resolver/dcl/ob_create_user_resolver.cpp index 46b1160a99..705fbdd7d7 100644 --- a/src/sql/resolver/dcl/ob_create_user_resolver.cpp +++ b/src/sql/resolver/dcl/ob_create_user_resolver.cpp @@ -97,45 +97,14 @@ int ObCreateUserResolver::resolve(const ParseNode &parse_tree) OB_UNLIKELY(lib::is_mysql_mode() && 5 != user_pass->num_child_ )) { ret = OB_ERR_PARSE_SQL; LOG_WARN("sql_parser parse user_identification error", K(ret)); - } else if (OB_ISNULL(user_pass->children_[0])) { - ret = OB_INVALID_ARGUMENT; - LOG_WARN("Child 0 of user_pass should not be NULL", K(ret)); } else { - ObString user_name(user_pass->children_[0]->str_len_, user_pass->children_[0]->str_value_); + ObString user_name; ObString host_name; - if (user_pass->children_[0]->type_ != T_IDENT - && OB_FAIL(ObSQLUtils::convert_sql_text_to_schema_for_storing( - *allocator_, session_info_->get_dtc_params(), user_name))) { - LOG_WARN("fail to convert user name to utf8", K(ret), K(user_name), - KPHEX(user_name.ptr(), user_name.length())); - } else if (!session_info_->is_inner() && (0 == user_name.case_compare(OB_RESTORE_USER_NAME))) { - ret = OB_ERR_NO_PRIVILEGE; - LOG_WARN("__oceanbase_inner_restore_user is reserved", K(ret)); - } else if (NULL == user_pass->children_[3]) { - host_name.assign_ptr(OB_DEFAULT_HOST_NAME, static_cast(STRLEN(OB_DEFAULT_HOST_NAME))); - } else { - host_name.assign_ptr(user_pass->children_[3]->str_value_, - static_cast(user_pass->children_[3]->str_len_)); - } - if (OB_SUCC(ret) && lib::is_mysql_mode() && NULL != user_pass->children_[4]) { - /* here code is to mock a auth plugin check. */ - ObString auth_plugin(static_cast(user_pass->children_[4]->str_len_), - user_pass->children_[4]->str_value_); - ObString default_auth_plugin; - if (OB_FAIL(session_info_->get_sys_variable(SYS_VAR_DEFAULT_AUTHENTICATION_PLUGIN, - default_auth_plugin))) { - LOG_WARN("fail to get block encryption variable", K(ret)); - } else if (0 != auth_plugin.compare(default_auth_plugin)) { - ret = OB_ERR_PLUGIN_IS_NOT_LOADED; - LOG_USER_ERROR(OB_ERR_PLUGIN_IS_NOT_LOADED, auth_plugin.length(), auth_plugin.ptr()); - } else {/* do nothing */} - } - if (OB_SUCC(ret) && lib::is_oracle_mode() && 0 != host_name.compare(OB_DEFAULT_HOST_NAME)) { - ret = OB_NOT_SUPPORTED; - LOG_USER_ERROR(OB_NOT_SUPPORTED, "create user with hostname"); - LOG_WARN("create user should not use hostname in oracle mode", K(ret)); + if (OB_FAIL(resolve_user_host(user_pass, user_name, host_name))) { + LOG_WARN("fail to resolve user_host"); } + ObString password; ObString need_enc_str = ObString::make_string("NO"); if (OB_SUCC(ret)) { diff --git a/src/sql/resolver/dcl/ob_dcl_resolver.cpp b/src/sql/resolver/dcl/ob_dcl_resolver.cpp index 0e2058926c..0618efaf3f 100644 --- a/src/sql/resolver/dcl/ob_dcl_resolver.cpp +++ b/src/sql/resolver/dcl/ob_dcl_resolver.cpp @@ -388,3 +388,100 @@ int ObDCLResolver::check_dcl_on_inner_user(const ObItemType &type, } return ret; } + +int ObDCLResolver::resolve_user_list_node(ParseNode *user_node, + ParseNode *top_node, + ObString &user_name, + ObString &host_name) +{ + int ret = OB_SUCCESS; + const ObUserInfo *user_info = NULL; + if (OB_ISNULL(user_node)) { + ret = OB_ERR_PARSE_SQL; + LOG_WARN("The child of user_hostname node should not be NULL", K(ret)); + } else if (2 != user_node->num_child_) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("sql_parser parse user error", K(ret)); + } else if (OB_ISNULL(user_node->children_[0])) { + // 0: user, 1: hostname + ret = OB_ERR_PARSE_SQL; + LOG_WARN("The child of user node should not be NULL", K(ret)); + } else { + ParseNode *user_hostname_node = user_node; + user_name = ObString (user_hostname_node->children_[0]->str_len_, user_hostname_node->children_[0]->str_value_); + if (NULL == user_hostname_node->children_[1]) { + host_name.assign_ptr(OB_DEFAULT_HOST_NAME, static_cast(STRLEN(OB_DEFAULT_HOST_NAME))); + } else { + host_name.assign_ptr(user_hostname_node->children_[1]->str_value_, + static_cast(user_hostname_node->children_[1]->str_len_)); + } + if (OB_FAIL(schema_checker_->get_user_info(params_.session_info_->get_effective_tenant_id(), + user_name, host_name, user_info))) { + LOG_WARN("failed to get user info", K(ret), K(user_name)); + if (OB_USER_NOT_EXIST == ret) { + // 跳过, RS统一处理, 兼容MySQL行为 + ret = OB_SUCCESS; + user_info = NULL; + } + } else if (is_inner_user_or_role(user_info->get_user_id())) { + ret = OB_ERR_NO_PRIVILEGE; + SQL_RESV_LOG(WARN, "Can not drop internal user", K(ret)); + } else if (OB_FAIL(check_dcl_on_inner_user(top_node->type_, + params_.session_info_->get_priv_user_id(), + user_info->get_user_id()))) { + LOG_WARN("failed to check dcl on inner-user or unsupport to modify reserved user", + K(ret), K(params_.session_info_->get_user_name()), K(user_name)); + } + } + return ret; +} + +int ObDCLResolver::resolve_user_host(const ParseNode *user_pass, + common::ObString &user_name, + common::ObString &host_name) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(user_pass) || OB_ISNULL(session_info_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid argument", K(ret)); + } else if (OB_ISNULL(user_pass->children_[0])) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("Child 0 of user_pass should not be NULL", K(ret)); + } else { + user_name = ObString(user_pass->children_[0]->str_len_, user_pass->children_[0]->str_value_); + + if (user_pass->children_[0]->type_ != T_IDENT + && OB_FAIL(ObSQLUtils::convert_sql_text_to_schema_for_storing( + *allocator_, session_info_->get_dtc_params(), user_name))) { + LOG_WARN("fail to convert user name to utf8", K(ret), K(user_name), + KPHEX(user_name.ptr(), user_name.length())); + } else if (!session_info_->is_inner() && (0 == user_name.case_compare(OB_RESTORE_USER_NAME))) { + ret = OB_ERR_NO_PRIVILEGE; + LOG_WARN("__oceanbase_inner_restore_user is reserved", K(ret)); + } else if (NULL == user_pass->children_[3]) { + host_name.assign_ptr(OB_DEFAULT_HOST_NAME, static_cast(STRLEN(OB_DEFAULT_HOST_NAME))); + } else { + host_name.assign_ptr(user_pass->children_[3]->str_value_, + static_cast(user_pass->children_[3]->str_len_)); + } + if (OB_SUCC(ret) && lib::is_mysql_mode() && NULL != user_pass->children_[4]) { + /* here code is to mock a auth plugin check. */ + ObString auth_plugin(static_cast(user_pass->children_[4]->str_len_), + user_pass->children_[4]->str_value_); + ObString default_auth_plugin; + if (OB_FAIL(session_info_->get_sys_variable(share::SYS_VAR_DEFAULT_AUTHENTICATION_PLUGIN, + default_auth_plugin))) { + LOG_WARN("fail to get block encryption variable", K(ret)); + } else if (0 != auth_plugin.compare(default_auth_plugin)) { + ret = OB_ERR_PLUGIN_IS_NOT_LOADED; + LOG_USER_ERROR(OB_ERR_PLUGIN_IS_NOT_LOADED, auth_plugin.length(), auth_plugin.ptr()); + } else {/* do nothing */} + } + if (OB_SUCC(ret) && lib::is_oracle_mode() && 0 != host_name.compare(OB_DEFAULT_HOST_NAME)) { + ret = OB_NOT_SUPPORTED; + LOG_USER_ERROR(OB_NOT_SUPPORTED, "create user with hostname"); + LOG_WARN("create user should not use hostname in oracle mode", K(ret)); + } + } + return ret; +} diff --git a/src/sql/resolver/dcl/ob_dcl_resolver.h b/src/sql/resolver/dcl/ob_dcl_resolver.h index e75520042c..29294b2d0b 100644 --- a/src/sql/resolver/dcl/ob_dcl_resolver.h +++ b/src/sql/resolver/dcl/ob_dcl_resolver.h @@ -33,6 +33,15 @@ public: const ParseNode *passwd_node, common::ObString &masked_sql, bool skip_enclosed_char = false); + int resolve_user_list_node(ParseNode *user_node, + ParseNode *top_node, + common::ObString &user_name, + common::ObString &host_name); + + int resolve_user_host(const ParseNode *user_pass, + common::ObString &user_name, + common::ObString &host_name); + protected: int check_and_convert_name(common::ObString &db, common::ObString &table); int check_password_strength(common::ObString &password); @@ -48,6 +57,7 @@ protected: int check_dcl_on_inner_user(const ObItemType &type, const uint64_t &session_user_id, const uint64_t &user_id); + static int mask_password_for_single_user(ObIAllocator *allocator, const common::ObString &src, const ParseNode *user_node, diff --git a/src/sql/resolver/dcl/ob_drop_role_resolver.cpp b/src/sql/resolver/dcl/ob_drop_role_resolver.cpp index 29f99e03d4..3dcf11847f 100644 --- a/src/sql/resolver/dcl/ob_drop_role_resolver.cpp +++ b/src/sql/resolver/dcl/ob_drop_role_resolver.cpp @@ -37,13 +37,14 @@ int ObDropRoleResolver::resolve(const ParseNode &parse_tree) int ret = OB_SUCCESS; CHECK_COMPATIBILITY_MODE(session_info_); ObDropRoleStmt *drop_role_stmt = NULL; - if (1 != parse_tree.num_child_ || T_DROP_ROLE != parse_tree.type_) { + if ((lib::is_oracle_mode() ? 1 : 2) != parse_tree.num_child_ || T_DROP_ROLE != parse_tree.type_) { ret = OB_INVALID_ARGUMENT; LOG_WARN("expect 2 child, drop role type", "actual_num", parse_tree.num_child_, "type", parse_tree.type_, K(ret)); - } else if (OB_ISNULL(params_.session_info_)) { + } else if (OB_ISNULL(params_.session_info_) + || OB_ISNULL(params_.schema_checker_)) { ret = OB_NOT_INIT; LOG_WARN("Session info should not be NULL", K(ret)); } else if (OB_ISNULL(drop_role_stmt = create_stmt())) { @@ -52,13 +53,12 @@ int ObDropRoleResolver::resolve(const ParseNode &parse_tree) } else if (NULL == parse_tree.children_[0]) { ret = OB_ERR_UNEXPECTED; LOG_WARN("role node is null", K(ret)); - } else { + } else if (lib::is_oracle_mode()) { stmt_ = drop_role_stmt; drop_role_stmt->set_tenant_id(params_.session_info_->get_effective_tenant_id()); ParseNode *role = const_cast(parse_tree.children_[0]); const share::schema::ObUserInfo *user_info = NULL; ObString role_name(role->str_len_, role->str_value_); - CK (params_.schema_checker_ != NULL); if (OB_FAIL(schema_checker_->get_user_info(params_.session_info_->get_effective_tenant_id(), role_name, ObString::make_string(OB_DEFAULT_HOST_NAME), @@ -81,6 +81,36 @@ int ObDropRoleResolver::resolve(const ParseNode &parse_tree) stmt::T_DROP_ROLE, session_info_->get_enable_role_array())); } + } else { + //mysql mode + stmt_ = drop_role_stmt; + drop_role_stmt->set_tenant_id(params_.session_info_->get_effective_tenant_id()); + ParseNode *users_node = const_cast(parse_tree.children_[0]); + + OZ (ObSQLUtils::compatibility_check_for_mysql_role_and_column_priv(params_.session_info_->get_effective_tenant_id())); + + if (OB_SUCC(ret) && NULL != parse_tree.children_[1]) { + if (T_IF_NOT_EXISTS != parse_tree.children_[1]->type_) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid argument", K(parse_tree.children_[1]->type_), K(ret)); + } else { + drop_role_stmt->set_if_exists(); + } + } + + for (int i = 0; OB_SUCC(ret) && i < users_node->num_child_; i++) { + ParseNode *cur_role = users_node->children_[i]; + ObString user_name; + ObString host_name; + if (OB_ISNULL(cur_role)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid role", K(ret)); + } else { + OZ (resolve_user_list_node(cur_role, users_node, user_name, host_name)); + OZ (drop_role_stmt->get_user_names().push_back(user_name)); + OZ (drop_role_stmt->get_host_names().push_back(host_name)); + } + } } return ret; } diff --git a/src/sql/resolver/dcl/ob_drop_role_stmt.cpp b/src/sql/resolver/dcl/ob_drop_role_stmt.cpp index 3f63fd7664..57cf5ab902 100644 --- a/src/sql/resolver/dcl/ob_drop_role_stmt.cpp +++ b/src/sql/resolver/dcl/ob_drop_role_stmt.cpp @@ -25,14 +25,16 @@ using namespace oceanbase::sql; ObDropRoleStmt::ObDropRoleStmt(ObIAllocator *name_pool) : ObDDLStmt(name_pool, stmt::T_DROP_ROLE), tenant_id_(OB_INVALID_ID), - role_name_() + role_name_(), + if_exists_(false) { } ObDropRoleStmt::ObDropRoleStmt() : ObDDLStmt(NULL, stmt::T_DROP_ROLE), tenant_id_(OB_INVALID_ID), - role_name_() + role_name_(), + if_exists_(false) { } diff --git a/src/sql/resolver/dcl/ob_drop_role_stmt.h b/src/sql/resolver/dcl/ob_drop_role_stmt.h index c1115b79f7..1e6879ae27 100644 --- a/src/sql/resolver/dcl/ob_drop_role_stmt.h +++ b/src/sql/resolver/dcl/ob_drop_role_stmt.h @@ -34,12 +34,20 @@ public: const common::ObString &get_role_name() const { return role_name_; } virtual bool cause_implicit_commit() const override { return true; } virtual obrpc::ObDDLArg &get_ddl_arg() { return drop_role_arg_; } + common::ObIArray &get_user_names() { return user_names_; } + common::ObIArray &get_host_names() { return host_names_; } + void set_if_exists() { if_exists_ = true; } + bool get_if_exists() const { return if_exists_; } DECLARE_VIRTUAL_TO_STRING; private: // data members uint64_t tenant_id_; common::ObString role_name_; obrpc::ObDropUserArg drop_role_arg_; + // mysql role + common::ObArray user_names_; + common::ObArray host_names_; + bool if_exists_; private: DISALLOW_COPY_AND_ASSIGN(ObDropRoleStmt); }; diff --git a/src/sql/resolver/dcl/ob_drop_user_resolver.cpp b/src/sql/resolver/dcl/ob_drop_user_resolver.cpp index fa32b24db8..aa1935ff6f 100644 --- a/src/sql/resolver/dcl/ob_drop_user_resolver.cpp +++ b/src/sql/resolver/dcl/ob_drop_user_resolver.cpp @@ -97,47 +97,13 @@ int ObDropUserResolver::resolve(const ParseNode &parse_tree) uint64_t tenant_id = params_.session_info_->get_effective_tenant_id(); // resolved user_list_node for (int i = 0; i < user_list_node->num_child_ && OB_SUCCESS == ret; ++i) { - if (OB_ISNULL(user_list_node->children_[i])) { - ret = OB_ERR_PARSE_SQL; - LOG_WARN("The child of user_hostname node should not be NULL", K(ret), K(i)); - } else if (2 != user_list_node->children_[i]->num_child_) { - ret = OB_INVALID_ARGUMENT; - LOG_WARN("sql_parser parse user error", K(ret)); - } else if (OB_ISNULL(user_list_node->children_[i]->children_[0])) { - // 0: user, 1: hostname - ret = OB_ERR_PARSE_SQL; - LOG_WARN("The child of user node should not be NULL", K(ret), K(i)); - } else { - ParseNode *user_hostname_node = user_list_node->children_[i]; - ObString user_name(user_hostname_node->children_[0]->str_len_, user_hostname_node->children_[0]->str_value_); - ObString host_name; - if (NULL == user_hostname_node->children_[1]) { - host_name.assign_ptr(OB_DEFAULT_HOST_NAME, static_cast(STRLEN(OB_DEFAULT_HOST_NAME))); - } else { - host_name.assign_ptr(user_hostname_node->children_[1]->str_value_, - static_cast(user_hostname_node->children_[1]->str_len_)); - } - const ObUserInfo *user_info = NULL; - if (OB_FAIL(schema_checker_->get_user_info(tenant_id, user_name, host_name, user_info))) { - LOG_WARN("failed to get user info", K(ret), K(user_name)); - if (OB_USER_NOT_EXIST == ret) { - // 跳过, RS统一处理, 兼容MySQL行为 - ret = OB_SUCCESS; - } - } else if (is_inner_user_or_role(user_info->get_user_id())) { - ret = OB_ERR_NO_PRIVILEGE; - SQL_RESV_LOG(WARN, "Can not drop internal user", K(ret)); - } else if (OB_FAIL(check_dcl_on_inner_user(top_node->type_, - params_.session_info_->get_priv_user_id(), - user_info->get_user_id()))) { - LOG_WARN("failed to check dcl on inner-user or unsupport to modify reserved user", - K(ret), K(params_.session_info_->get_user_name()), K(user_name)); - } - if (OB_SUCC(ret)) { - if (OB_FAIL(drop_user_stmt->add_user(user_name, host_name))) { - LOG_WARN("Add user error", K(user_name), K(ret)); - } - } + ObString user_name; + ObString host_name; + if (OB_FAIL(resolve_user_list_node(user_list_node->children_[i], top_node, + user_name, host_name))) { + LOG_WARN("fail to resolve user list node", K(ret)); + } else if (OB_FAIL(drop_user_stmt->add_user(user_name, host_name))) { + LOG_WARN("Add user error", K(user_name), K(ret)); } } if (OB_SUCC(ret)) { diff --git a/src/sql/resolver/dcl/ob_grant_resolver.cpp b/src/sql/resolver/dcl/ob_grant_resolver.cpp index 5849f26ee6..321e23e3a5 100644 --- a/src/sql/resolver/dcl/ob_grant_resolver.cpp +++ b/src/sql/resolver/dcl/ob_grant_resolver.cpp @@ -17,6 +17,7 @@ #include "sql/session/ob_sql_session_info.h" #include "sql/resolver/dcl/ob_set_password_resolver.h" #include "share/schema/ob_obj_priv_type.h" +#include "sql/engine/ob_exec_context.h" using namespace oceanbase::sql; using namespace oceanbase::common; @@ -39,29 +40,26 @@ int ObGrantResolver::resolve_grantee_clause( { int ret = OB_SUCCESS; ParseNode *grant_user = NULL; - if (OB_ISNULL(grantee_clause) || OB_ISNULL(grantee_clause->children_[0])) { + if (OB_ISNULL(grantee_clause) || grantee_clause->num_child_ < 1 + || OB_ISNULL(grantee_clause->children_[0])) { ret = OB_INVALID_ARGUMENT; - LOG_ERROR("resolve grantee error", K(ret)); + LOG_WARN("resolve grantee error", K(ret)); } else { // Put every grant_user into grant_user_arry - LOG_INFO("grantee_clause type", K(grantee_clause->type_)); if (grantee_clause->type_ != T_USERS && grantee_clause->type_ != T_GRANT) { ret = OB_INVALID_ARGUMENT; - LOG_ERROR("invalid type", K(ret), K(grantee_clause->type_)); + LOG_WARN("invalid type", K(ret), K(grantee_clause->type_)); } else if (grantee_clause->type_ == T_USERS) { - LOG_INFO("grantee_clause:", K(grantee_clause->str_value_), K(grantee_clause->type_)); const ParseNode *grant_user_list = grantee_clause->children_[0]; - LOG_INFO("grant_user_list", K(grant_user_list->str_value_), K(grant_user_list->type_)); - LOG_INFO("grant_user_list children", K(grant_user_list->num_child_)); for (int i = 0; OB_SUCC(ret) && i < grant_user_list->num_child_; ++i) { grant_user = grant_user_list->children_[i]; - LOG_INFO("grant_user", K(i), K(grant_user->str_value_), K(grant_user->type_)); if (OB_ISNULL(grant_user)) { ret = OB_ERR_PARSE_SQL; LOG_WARN("grant_user is NULL", K(ret)); } else { ObString user_name; ObString host_name(OB_DEFAULT_HOST_NAME); + LOG_DEBUG("grant_user", K(i), K(grant_user->str_value_), K(grant_user->type_)); if (OB_FAIL(resolve_grant_user(grant_user, session_info, user_name, host_name))) { LOG_WARN("failed to resolve grant_user", K(ret), K(grant_user)); } else { @@ -153,105 +151,126 @@ enum GrantParseOffset 从grant_role中解析出grantee和role_list,将grantee和role_list放入grant_stmt的role里面. role[0]:user_name of grantee role[1]: host_name of grantee -role[2..n]: role_list to grant +... */ int ObGrantResolver::resolve_grant_role_to_ur( const ParseNode *grant_role, ObGrantStmt *grant_stmt) { int ret = OB_SUCCESS; - if (OB_ISNULL(grant_role) || OB_ISNULL(grant_stmt)) { + if (OB_ISNULL(grant_role) || OB_ISNULL(grant_stmt) + || OB_ISNULL(params_.schema_checker_) + || OB_ISNULL(params_.session_info_)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("grant_role and grant_stmt should not be NULL", K(grant_role), K(grant_stmt), K(ret)); } else { - // user_name + host_name 放入roles_[0], roles_[1] - ParseNode *grantee_clause = grant_role->children_[PARSE_GRANT_ROLE_GRANTEE]; ObSArray user_name_array; ObSArray host_name_array; ObSEArray role_id_array; - ObString masked_sql; - if (session_info_->is_inner()) { - // do nothing in inner_sql - } else if (OB_FAIL(mask_password_for_single_user(allocator_, - session_info_->get_current_query_string(), grantee_clause, 1, masked_sql))) { - LOG_WARN("fail to mask_password_for_single_user", K(ret)); - } else { - grant_stmt->set_masked_sql(masked_sql); + ParseNode *grantee_clause = grant_role->children_[PARSE_GRANT_ROLE_GRANTEE]; + ParseNode *role_list = grant_role->children_[PARSE_GRANT_ROLE_LIST]; + obrpc::ObGrantArg &args = static_cast(grant_stmt->get_ddl_arg()); + ObSchemaChecker *schema_ck = params_.schema_checker_; + uint64_t tenant_id = params_.session_info_->get_effective_tenant_id(); + ObArray grantee_ids; + + CK (role_list != NULL); + CK (grantee_clause != NULL); + + if (lib::is_mysql_mode()) { + OZ (ObSQLUtils::compatibility_check_for_mysql_role_and_column_priv(tenant_id)); } - if (OB_FAIL(ret)) { - } else if (OB_FAIL(resolve_grantee_clause(grantee_clause, params_.session_info_, - user_name_array, host_name_array))) { - LOG_WARN("resolve grentee fail", K(ret)); - } else { + + OZ (resolve_grantee_clause(grantee_clause, params_.session_info_, + user_name_array, host_name_array)); + if (OB_SUCC(ret)) { if (user_name_array.count() != host_name_array.count()) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("user_name count is not equal to host_name count", - K(ret), + LOG_WARN("user_name count is not equal to host_name count", + K(ret), K(user_name_array.count()), K(host_name_array.count())); } else { for (int i = 0; OB_SUCC(ret) && i < user_name_array.count(); ++i) { + const ObUserInfo *grantee_info = NULL; ObString &user_name = user_name_array.at(i); ObString &host_name = host_name_array.at(i); - if (OB_FAIL(grant_stmt->add_grantee(user_name))) { - LOG_WARN("failed to add grantee", K(ret), K(user_name)); - } else if (OB_FAIL(grant_stmt->add_user(user_name, host_name))) { - LOG_WARN("failed to add user and host name", K(ret), K(user_name), K(host_name)); + OZ (schema_ck->get_user_info(tenant_id, user_name, host_name, grantee_info), user_name, host_name); + if (OB_USER_NOT_EXIST == ret || OB_ISNULL(grantee_info)) { + if (lib::is_oracle_mode()) { + ret = OB_ROLE_NOT_EXIST; + LOG_USER_ERROR(OB_ROLE_NOT_EXIST, user_name.length(), user_name.ptr()); + } else { + ret = OB_ERR_UNKNOWN_AUTHID; + LOG_USER_ERROR(OB_ERR_UNKNOWN_AUTHID, + user_name.length(), user_name.ptr(), + host_name.length(), host_name.ptr()); + } + } + if (OB_SUCC(ret) && !has_exist_in_array(grantee_ids, grantee_info->get_user_id())) { + if (args.roles_.empty()) { + OZ (args.roles_.push_back(user_name)); + OZ (args.roles_.push_back(host_name)); + } else { + OZ (args.remain_roles_.push_back(user_name)); + OZ (args.remain_roles_.push_back(host_name)); + } + OZ (grantee_ids.push_back(grantee_info->get_user_id())); + OZ (grant_stmt->add_grantee(user_name)); } } } - } + } - ParseNode *role_list = grant_role->children_[PARSE_GRANT_ROLE_LIST]; - ParseNode *role = NULL; - if (OB_ISNULL(role_list)) { - ret = OB_ERR_PARSE_SQL; - LOG_WARN("role_list should not be NULL", K(grant_role), K(ret)); - } else { - uint64_t tenant_id = params_.session_info_->get_effective_tenant_id(); + if (OB_SUCC(ret)) { + ObSqlCtx *sql_ctx = NULL; const ObUserInfo *role_info = NULL; - ObSchemaChecker *schema_ck = params_.schema_checker_; uint64_t option = NO_OPTION; - CK (schema_ck != NULL); + if (OB_ISNULL(params_.session_info_->get_cur_exec_ctx()) + || OB_ISNULL(sql_ctx = params_.session_info_->get_cur_exec_ctx()->get_sql_ctx())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected ctx", K(ret), KP(params_.session_info_->get_cur_exec_ctx())); + } + for (int i = 0; OB_SUCC(ret) && i < role_list->num_child_; ++i) { - role = role_list->children_[i]; - if (NULL == role) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("role node is null", K(ret)); - } else { - ObString role_name; - role_name.assign_ptr(const_cast(role->str_value_), - static_cast(role->str_len_)); - if (OB_FAIL(grant_stmt->add_role(role_name))) { - LOG_WARN("failed to add role", K(ret)); + ParseNode *cur_role = role_list->children_[i]; + ObString user_name; + ObString host_name; + OZ (resolve_user_host(cur_role, user_name, host_name)); + OZ (schema_ck->get_user_info(tenant_id, user_name, host_name, role_info), user_name, host_name); + if (OB_USER_NOT_EXIST == ret || OB_ISNULL(role_info)) { + if (lib::is_oracle_mode()) { + ret = OB_ROLE_NOT_EXIST; + LOG_USER_ERROR(OB_ROLE_NOT_EXIST, user_name.length(), user_name.ptr()); } else { - // check roles exists - OZ (schema_ck->get_user_info(tenant_id, - role_name, - // role has fixed host_name '%' - ObString::make_string(OB_DEFAULT_HOST_NAME), - role_info), - tenant_id, role_name); - if (OB_USER_NOT_EXIST == ret || OB_ISNULL(role_info) || !role_info->is_role()) { - ret = OB_ROLE_NOT_EXIST; - LOG_USER_ERROR(OB_ROLE_NOT_EXIST, role_name.length(), role_name.ptr()); - } - if (OB_SUCC(ret) && role_info != NULL) { - OZ (role_id_array.push_back(role_info->get_user_id())); + ret = OB_ERR_UNKNOWN_AUTHID; + LOG_USER_ERROR(OB_ERR_UNKNOWN_AUTHID, + user_name.length(), user_name.ptr(), + host_name.length(), host_name.ptr()); + } + } + if (OB_SUCC(ret)) { + for (int j = 0; OB_SUCC(ret) && j < user_name_array.count(); j++) { + if (user_name_array.at(j) == user_name && host_name_array.at(j) == host_name) { + ret = OB_ERR_CIRCULAR_ROLE_GRANT_DETECTED; + LOG_USER_ERROR(OB_ERR_CIRCULAR_ROLE_GRANT_DETECTED, + user_name.length(), user_name.ptr(), + host_name.length(), host_name.ptr(), + user_name_array.at(j).length(), user_name_array.at(j).ptr(), + host_name_array.at(j).length(), host_name_array.at(j).ptr()); } } } - OZ (resolve_admin_option( - grant_role->children_[PARSE_GRANT_ROLE_OPT_WITH], - option)); - OX (grant_stmt->set_option(option)); + if (OB_SUCC(ret) && !has_exist_in_array(role_id_array, role_info->get_user_id())) { + OZ (role_id_array.push_back(role_info->get_user_id())); + OZ (args.roles_.push_back(user_name)); + OZ (args.roles_.push_back(host_name)); + } } - /* check grant role stmt's priv */ - OZ (schema_ck->check_ora_grant_role_priv(tenant_id, - params_.session_info_->get_priv_user_id(), - role_id_array, - params_.session_info_->get_enable_role_array())); + OZ (resolve_admin_option( grant_role->children_[PARSE_GRANT_ROLE_OPT_WITH], option)); + OX (grant_stmt->set_option(option)); + OZ (schema_ck->check_mysql_grant_role_priv(*sql_ctx, role_id_array)); } } @@ -477,30 +496,19 @@ int ObGrantResolver::resolve_grant_sys_priv_to_ur( } -int ObGrantResolver::resolve_grant_system_privileges_mysql( - const ParseNode *grant_system_privileges, +int ObGrantResolver::resolve_grant_role_mysql( + const ParseNode *grant_role, ObGrantStmt *grant_stmt) { int ret = OB_SUCCESS; // resolve grant role to user - if (NULL == grant_system_privileges - || NULL == grant_system_privileges->children_[0] - || NULL == grant_system_privileges->children_[1]) { + if (OB_ISNULL(grant_role)) { ret = OB_INVALID_ARGUMENT; LOG_ERROR("Grant ParseNode error", K(ret)); } else { - if (grant_system_privileges->type_ == T_GRANT_ROLE) { - grant_stmt->set_stmt_type(stmt::T_GRANT_ROLE); - if (OB_FAIL(resolve_grant_role_to_ur(grant_system_privileges, grant_stmt))) { - LOG_WARN("resolve_grant_role fail", K(ret)); - } - } else if (grant_system_privileges->type_ == T_GRANT_SYS_PRIV_ORACLE) { - if (OB_FAIL(resolve_grant_sys_priv_to_ur(grant_system_privileges, grant_stmt))) { - LOG_WARN("resolve_grant_sys_priv fail", K(ret)); - } - } else { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpected grant system privilege type", K(grant_system_privileges->type_)); + grant_stmt->set_stmt_type(stmt::T_GRANT_ROLE); + if (OB_FAIL(resolve_grant_role_to_ur(grant_role, grant_stmt))) { + LOG_WARN("resolve_grant_role fail", K(ret)); } } return ret; @@ -741,6 +749,54 @@ int ObGrantResolver::resolve(const ParseNode &parse_tree) return ret; } +template +int ObGrantResolver::resolve_col_names_mysql( + T *grant_stmt, + const ObPrivType priv_type, + ParseNode *column_list, + ObSchemaChecker *schema_checker, + ObSQLSessionInfo *session_info, + ObIAllocator &allocator) +{ + int ret = OB_SUCCESS; + + ObString db_name = grant_stmt->get_database_name(); + ObString table_name = grant_stmt->get_table_name(); + + ObObjectType object_type = grant_stmt->get_object_type(); + uint64_t obj_id = grant_stmt->get_object_id(); + ObArray column_names; + if (OB_ISNULL(grant_stmt) || OB_ISNULL(column_list) + || OB_ISNULL(schema_checker) || OB_ISNULL(session_info) + || OB_ISNULL(schema_checker->get_schema_guard())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected error", K(ret)); + } else if (priv_type == OB_PRIV_REFERENCES) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("reference is not supported", K(ret)); + LOG_USER_ERROR(OB_NOT_SUPPORTED, "references privilege"); + } else { + ObString column_name; + for (int32_t i = 0; OB_SUCCESS == ret && i < column_list->num_child_; ++i) { + const ParseNode *child_node = NULL; + if (OB_ISNULL(child_node = column_list->children_[i])) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("child node is null"); + } else { + const share::schema::ObColumnSchemaV2 *column_schema = NULL; + const ObSimpleTableSchemaV2 *table_schema = NULL; + if (OB_FAIL(ob_write_string(allocator, ObString(static_cast(child_node->str_len_), + const_cast(child_node->str_value_)), column_name))) { + LOG_WARN("ob write string failed", K(ret)); + } else if (OB_FAIL(grant_stmt->add_column_privs(column_name, priv_type))) { + LOG_WARN("push back failed", K(ret)); + } + } + } + } + return ret; +} + /* 1. check raw_obj_priv是否为insert,update, references。 2. check dup col_name, resolve col_name --> col_id */ int ObGrantResolver::resolve_col_names( @@ -1220,8 +1276,8 @@ int ObGrantResolver::resolve_mysql(const ParseNode &parse_tree) "session_info", params_.session_info_, K(ret)); } else if (node == NULL - || (T_GRANT != node->type_ && T_SYSTEM_GRANT != node->type_) - || ((1 != node->num_child_) && (3 != node->num_child_))) { + || (T_GRANT != node->type_ && T_SYSTEM_GRANT != node->type_ && T_GRANT_ROLE != node->type_) + || ((1 != node->num_child_) && (4 != node->num_child_) && (3 != node->num_child_))) { ret = OB_INVALID_ARGUMENT; LOG_ERROR("Grant ParseNode error", K(ret)); } else if (OB_ISNULL(grant_stmt = create_stmt())) { @@ -1232,14 +1288,15 @@ int ObGrantResolver::resolve_mysql(const ParseNode &parse_tree) stmt_ = grant_stmt; uint64_t tenant_id = params_.session_info_->get_effective_tenant_id(); grant_stmt->set_tenant_id(tenant_id); - if (T_SYSTEM_GRANT == node->type_) { - if (OB_FAIL(resolve_grant_system_privileges_mysql(node->children_[0], grant_stmt))) { + if (T_GRANT_ROLE == node->type_) { + if (OB_FAIL(resolve_grant_role_mysql(node, grant_stmt))) { LOG_WARN("resolve grant system privileges failed", K(ret)); } } else { ParseNode *privs_node = node->children_[0]; - ParseNode *priv_level_node = node->children_[1]; - ParseNode *users_node = node->children_[2]; + ParseNode *priv_object_node = node->children_[1]; + ParseNode *priv_level_node = node->children_[2]; + ParseNode *users_node = node->children_[3]; if (privs_node != NULL && priv_level_node != NULL && users_node != NULL) { ObPrivLevel grant_level = OB_PRIV_INVALID_LEVEL; //resolve priv_level @@ -1255,17 +1312,70 @@ int ObGrantResolver::resolve_mysql(const ParseNode &parse_tree) grant_level, *allocator_))) { LOG_WARN("Resolve priv_level node error", K(ret)); + } else if (priv_object_node != NULL) { + const uint64_t tenant_id = params_.session_info_->get_effective_tenant_id(); + uint64_t compat_version = 0; + if (grant_level != OB_PRIV_TABLE_LEVEL) { + ret = OB_ILLEGAL_GRANT_FOR_TABLE; + LOG_WARN("illegal grant", K(ret)); + } else if (priv_object_node->value_ == 1) { + grant_level = OB_PRIV_TABLE_LEVEL; + } else if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, compat_version))) { + LOG_WARN("fail to get data version", K(tenant_id)); + } else if (!sql::ObSQLUtils::is_data_version_ge_423_or_431(compat_version)) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("grammar is not support when MIN_DATA_VERSION is below DATA_VERSION_4_3_1_0 or 4_2_3_0", K(ret)); + } else if (priv_object_node->value_ == 2) { + grant_level = OB_PRIV_ROUTINE_LEVEL; + } else if (priv_object_node->value_ == 3) { + grant_level = OB_PRIV_ROUTINE_LEVEL; + } else { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected obj type", K(ret), K(priv_object_node->value_)); + } + } + + if (OB_FAIL(ret)) { } else if (OB_FAIL(check_and_convert_name(db, table))) { LOG_WARN("Check and convert name error", K(db), K(table), K(ret)); } else { + share::schema::ObObjectType object_type = share::schema::ObObjectType::INVALID; + uint64_t object_id = OB_INVALID_ID; grant_stmt->set_grant_level(grant_level); if (OB_FAIL(grant_stmt->set_database_name(db))) { - LOG_WARN("Failed to set database_name to grant_stmt", K(ret)); + LOG_WARN("Failed to set database_name to grant_stmt", K(ret)); } else if (OB_FAIL(grant_stmt->set_table_name(table))) { LOG_WARN("Failed to set table_name to grant_stmt", K(ret)); + } else if (priv_object_node != NULL) { + if (priv_object_node->value_ == 1) { + const share::schema::ObTableSchema *table_schema = NULL; + if (OB_FAIL(params_.schema_checker_->get_table_schema(tenant_id, db, table, false, table_schema))) { + LOG_WARN("get table schema failed", K(ret)); + } else if (table_schema != NULL) { + if (table_schema->is_index_table()) { + object_type = ObObjectType::INDEX; + } else { + object_type = ObObjectType::TABLE; + } + object_id = table_schema->get_table_id(); + } + } else { + uint64_t routine_id = 0; + bool is_proc = false; + if (OB_FAIL(params_.schema_checker_->get_routine_id(tenant_id, db, table, routine_id, is_proc))) { + if (OB_ERR_SP_DOES_NOT_EXIST == ret) { + ret = OB_ERR_SP_DOES_NOT_EXIST; + } + } else { + if (is_proc) { + object_type = ObObjectType::PROCEDURE; + } else { + object_type = ObObjectType::FUNCTION; + } + object_id = routine_id; + } + } } else { - share::schema::ObObjectType object_type = share::schema::ObObjectType::INVALID; - uint64_t object_id = OB_INVALID_ID; ObString object_db_name; if (db.empty() || table.empty()) { object_type = share::schema::ObObjectType::MAX_TYPE; @@ -1277,17 +1387,35 @@ int ObGrantResolver::resolve_mysql(const ParseNode &parse_tree) false, ObString(""), synonym_checker); } - grant_stmt->set_object_type(object_type); - grant_stmt->set_object_id(object_id); } + grant_stmt->set_object_type(object_type); + grant_stmt->set_object_id(object_id); } } //resolve privileges if (OB_SUCC(ret)) { + const uint64_t tenant_id = params_.session_info_->get_effective_tenant_id(); ObPrivSet priv_set = 0; - if (OB_FAIL(resolve_priv_set(privs_node, grant_level, priv_set))) { + uint64_t compat_version = 0; + if (OB_ISNULL(allocator_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected error", K(ret)); + } else if (OB_FAIL(resolve_priv_set(tenant_id, privs_node, grant_level, priv_set, grant_stmt, params_.schema_checker_, + params_.session_info_, + *allocator_))) { LOG_WARN("Resolve priv set error", K(ret)); + } else if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, compat_version))) { + LOG_WARN("fail to get data version", K(tenant_id)); + } else if (!sql::ObSQLUtils::is_data_version_ge_423_or_431(compat_version)) { + if ((priv_set & OB_PRIV_EXECUTE) != 0 || + (priv_set & OB_PRIV_ALTER_ROUTINE) != 0 || + (priv_set & OB_PRIV_CREATE_ROUTINE) != 0) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("grammar is not support when MIN_DATA_VERSION is below DATA_VERSION_4_3_1_0 or 4_2_3_0", K(ret)); + } + } + if (OB_FAIL(ret)) { } else { grant_stmt->set_priv_set(priv_set); } @@ -1604,10 +1732,16 @@ int ObGrantResolver::resolve_obj_ora( return ret; } +template int ObGrantResolver::resolve_priv_set( + const uint64_t tenant_id, const ParseNode *privs_node, ObPrivLevel grant_level, - ObPrivSet &priv_set) + ObPrivSet &priv_set, + T *grant_stmt, + ObSchemaChecker *schema_checker, + ObSQLSessionInfo *session_info, + ObIAllocator &allocator) { int ret = OB_SUCCESS; if (OB_ISNULL(privs_node)) { @@ -1616,6 +1750,9 @@ int ObGrantResolver::resolve_priv_set( } else if (OB_PRIV_INVALID_LEVEL == grant_level) { ret = OB_INVALID_ARGUMENT; LOG_WARN("Invalid argument, grant_level should not be invalid", K(grant_level), K(ret)); + } else if (OB_ISNULL(grant_stmt)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("grant stmt is null", K(ret)); } else { for (int i = 0; i < privs_node->num_child_ && OB_SUCCESS == ret; ++i) { if (OB_NOT_NULL(privs_node->children_[i]) && T_PRIV_TYPE == privs_node->children_[i]->type_) { @@ -1639,6 +1776,24 @@ int ObGrantResolver::resolve_priv_set( ret = OB_ILLEGAL_GRANT_FOR_TABLE; LOG_WARN("Grant/Revoke privilege than can not be used", "priv_type", ObPrintPrivSet(priv_type), K(ret)); + } else if (privs_node->children_[i]->num_child_ == 1) { + if (OB_FAIL(ObSQLUtils::compatibility_check_for_mysql_role_and_column_priv(tenant_id))) { + LOG_WARN("grant or revoke column priv is not suppported", KR(ret)); + } else if (OB_FAIL(resolve_col_names_mysql(grant_stmt, priv_type, + privs_node->children_[i]->children_[0], + schema_checker, session_info, allocator))) { + LOG_WARN("resolve col names failed", K(ret)); + } + } else { + priv_set |= priv_type; + } + } else if (OB_PRIV_ROUTINE_LEVEL == grant_level) { + if (OB_PRIV_ALL == priv_type) { + priv_set |= OB_PRIV_ROUTINE_ACC; + } else if (priv_type & (~(OB_PRIV_ROUTINE_ACC | OB_PRIV_GRANT))) { + ret = OB_ILLEGAL_GRANT_FOR_TABLE; + LOG_WARN("Grant/Revoke privilege than can not be used", + "priv_type", ObPrintPrivSet(priv_type), K(ret)); } else { priv_set |= priv_type; } @@ -1646,7 +1801,7 @@ int ObGrantResolver::resolve_priv_set( //do nothing } } else { - ret = OB_ERR_PARSE_SQL; + ret = OB_ERR_PARSER_SYNTAX; LOG_WARN("sql_parser parse privileges error", K(ret)); } } diff --git a/src/sql/resolver/dcl/ob_grant_resolver.h b/src/sql/resolver/dcl/ob_grant_resolver.h index 16f58b8ec9..fe9c46305b 100644 --- a/src/sql/resolver/dcl/ob_grant_resolver.h +++ b/src/sql/resolver/dcl/ob_grant_resolver.h @@ -66,8 +66,8 @@ public: share::ObRawObjPriv priv, bool &exists); - int resolve_grant_system_privileges_mysql( - const ParseNode *grant_system_privileges, + int resolve_grant_role_mysql( + const ParseNode *grant_role, ObGrantStmt *grant_stmt); int resolve_grant_system_privileges_ora( const ParseNode *grant_system_privileges, @@ -87,10 +87,16 @@ public: share::schema::ObPrivLevel &grant_level, ObIAllocator &allocator); + template static int resolve_priv_set( + const uint64_t tenant_id, const ParseNode *privs_node, share::schema::ObPrivLevel grant_level, - ObPrivSet &priv_set); + ObPrivSet &priv_set, + T *grant_stmt, + ObSchemaChecker *schema_checker, + ObSQLSessionInfo *session_info, + ObIAllocator &allocator); static int map_mysql_priv_type_to_ora_type( const ObPrivType mysql_priv_type, share::ObRawObjPriv &ora_obj_priv, @@ -145,6 +151,14 @@ private: const ParseNode *privs_node, share::schema::ObPrivLevel grant_level, bool is_owner); + template + static int resolve_col_names_mysql( + T *grant_stmt, + const ObPrivType priv_type, + ParseNode *column_list, + ObSchemaChecker *schema_checker, + ObSQLSessionInfo *session_info, + ObIAllocator &allocator); int resolve_col_names( ObGrantStmt *grant_stmt, share::ObRawObjPriv raw_obj_priv, diff --git a/src/sql/resolver/dcl/ob_grant_stmt.cpp b/src/sql/resolver/dcl/ob_grant_stmt.cpp index c0b01bf765..6a38c033d2 100644 --- a/src/sql/resolver/dcl/ob_grant_stmt.cpp +++ b/src/sql/resolver/dcl/ob_grant_stmt.cpp @@ -40,11 +40,13 @@ ObGrantStmt::ObGrantStmt(ObIAllocator *name_pool) option_(0), sys_priv_array_(), obj_priv_array_(), + sel_col_ids_(), ins_col_ids_(), upd_col_ids_(), ref_col_ids_(), ref_query_(NULL), - is_grant_all_tab_priv_(false) + is_grant_all_tab_priv_(false), + table_schema_version_(0) { } @@ -66,11 +68,13 @@ ObGrantStmt::ObGrantStmt() option_(0), sys_priv_array_(), obj_priv_array_(), + sel_col_ids_(), ins_col_ids_(), upd_col_ids_(), ref_col_ids_(), ref_query_(NULL), - is_grant_all_tab_priv_(false) + is_grant_all_tab_priv_(false), + table_schema_version_(0) { } diff --git a/src/sql/resolver/dcl/ob_grant_stmt.h b/src/sql/resolver/dcl/ob_grant_stmt.h index 7739d028de..0ab8a997bc 100644 --- a/src/sql/resolver/dcl/ob_grant_stmt.h +++ b/src/sql/resolver/dcl/ob_grant_stmt.h @@ -57,12 +57,14 @@ public: const common::ObString &get_masked_sql() const { return masked_sql_; } share::schema::ObPrivLevel get_grant_level() const {return grant_level_;} share::schema::ObObjectType get_object_type() const { return object_type_;} - const ObSEArray get_ins_col_ids() const { return ins_col_ids_; } - const ObSEArray get_upd_col_ids() const { return upd_col_ids_; } - const ObSEArray get_ref_col_ids() const { return ref_col_ids_; } + const ObIArray& get_sel_col_ids() const { return sel_col_ids_; } + const ObIArray& get_ins_col_ids() const { return ins_col_ids_; } + const ObIArray& get_upd_col_ids() const { return upd_col_ids_; } + const ObIArray& get_ref_col_ids() const { return ref_col_ids_; } void set_object_type(share::schema::ObObjectType object_type) { object_type_ = object_type; } uint64_t get_object_id() const { return object_id_;} void set_object_id(uint64_t object_id) { object_id_ = object_id; } + int set_sel_col_ids(ObSEArray &col_ids) { return sel_col_ids_.assign(col_ids); } int set_ins_col_ids(ObSEArray &col_ids) { return ins_col_ids_.assign(col_ids); } int set_upd_col_ids(ObSEArray &col_ids) { return upd_col_ids_.assign(col_ids); } int set_ref_col_ids(ObSEArray &col_ids) { return ref_col_ids_.assign(col_ids); } @@ -83,6 +85,12 @@ public: virtual bool cause_implicit_commit() const { return true; } virtual obrpc::ObDDLArg &get_ddl_arg() { return grant_arg_; } + int add_column_privs(const ObString& column_name,const ObPrivSet priv_set) { return column_names_priv_.push_back(std::make_pair(column_name, priv_set)); } + const ObIArray> &get_column_privs() const { return column_names_priv_; } + void set_table_schema_version(int64_t schema_version) { table_schema_version_ = schema_version; } + int64_t get_table_schema_version() { return table_schema_version_; } + + bool is_grant_stmt() const { return true; } DECLARE_VIRTUAL_TO_STRING; private: // data members @@ -105,12 +113,17 @@ private: uint64_t option_; share::ObRawPrivArray sys_priv_array_; share::ObRawObjPrivArray obj_priv_array_; - ObSEArray ins_col_ids_; - ObSEArray upd_col_ids_; - ObSEArray ref_col_ids_; + ObSEArray sel_col_ids_; + ObSEArray ins_col_ids_; + ObSEArray upd_col_ids_; + ObSEArray ref_col_ids_; ObSelectStmt *ref_query_; // 用于grant 视图时,对视图依赖的table,view等做递归权限check. bool is_grant_all_tab_priv_; + ObSEArray, 4> column_names_priv_; + + int64_t table_schema_version_; + private: DISALLOW_COPY_AND_ASSIGN(ObGrantStmt); }; diff --git a/src/sql/resolver/dcl/ob_revoke_resolver.cpp b/src/sql/resolver/dcl/ob_revoke_resolver.cpp index 187906167a..57f10fa2e2 100644 --- a/src/sql/resolver/dcl/ob_revoke_resolver.cpp +++ b/src/sql/resolver/dcl/ob_revoke_resolver.cpp @@ -18,6 +18,7 @@ #include "sql/session/ob_sql_session_info.h" #include "sql/resolver/dcl/ob_grant_resolver.h" #include "sql/resolver/dcl/ob_revoke_stmt.h" +#include "sql/engine/ob_exec_context.h" using namespace oceanbase::sql; @@ -41,12 +42,24 @@ int ObRevokeResolver::resolve_revoke_role_inner( int ret = OB_SUCCESS; uint64_t tenant_id = OB_INVALID_ID; ObSEArray role_id_array; + ObArray role_user_name; + ObArray role_host_name; CK (revoke_role != NULL && revoke_stmt != NULL); - CK (2 == revoke_role->num_child_ && + CK ((2 == revoke_role->num_child_ || 4 == revoke_role->num_child_) && NULL != revoke_role->children_[0] && NULL != revoke_role->children_[1]); + bool ignore_unknown_role = false; + bool ignore_unknown_user = false; + bool ignore_error = false; tenant_id = revoke_stmt->get_tenant_id(); + if (lib::is_mysql_mode() && 4 == revoke_role->num_child_) { + ignore_unknown_role = NULL != revoke_role->children_[2]; + ignore_unknown_user = NULL != revoke_role->children_[3]; + } + if (lib::is_mysql_mode()) { + OZ (ObSQLUtils::compatibility_check_for_mysql_role_and_column_priv(tenant_id)); + } // 1. resolve role list ParseNode *role_list = revoke_role->children_[0]; for (int i = 0; OB_SUCC(ret) && i < role_list->num_child_; ++i) { @@ -58,35 +71,65 @@ int ObRevokeResolver::resolve_revoke_role_inner( LOG_WARN("role node is null", K(ret)); } else { ObString role_name; - role_name.assign_ptr(const_cast(role->str_value_), - static_cast(role->str_len_)); - ObString host_name(OB_DEFAULT_HOST_NAME); + if (lib::is_oracle_mode()) { + role_name.assign_ptr(const_cast(role->str_value_), + static_cast(role->str_len_)); + } else { + OZ (resolve_user_host(role, role_name, host_name)); + } + OZ (params_.schema_checker_->get_user_info(tenant_id, role_name, host_name, role_info), role_name, host_name); - if (OB_USER_NOT_EXIST == ret || OB_ISNULL(role_info) || !role_info->is_role()) { - ret = OB_ROLE_NOT_EXIST; - LOG_USER_ERROR(OB_ROLE_NOT_EXIST, role_name.length(), role_name.ptr()); + if (OB_USER_NOT_EXIST == ret || OB_ISNULL(role_info) || (lib::is_oracle_mode() && !role_info->is_role())) { + if (lib::is_oracle_mode()) { + ret = OB_ROLE_NOT_EXIST; + LOG_USER_ERROR(OB_ROLE_NOT_EXIST, role_name.length(), role_name.ptr()); + } else { + ret = OB_ERR_UNKNOWN_AUTHID; + ignore_error = ignore_unknown_role; + LOG_USER(ignore_unknown_role ? ObLogger::USER_WARN : ObLogger::USER_ERROR, + OB_ERR_UNKNOWN_AUTHID, + role_name.length(), role_name.ptr(), + host_name.length(), host_name.ptr()); + } } else { role_id = role_info->get_user_id(); if (OB_FAIL(revoke_stmt->add_role(role_id))) { - LOG_WARN("failed to add role", K(ret)); + if (OB_PRIV_DUP == ret && lib::is_mysql_mode()) { + //ignored + ret = OB_SUCCESS; + } else { + LOG_WARN("failed to add role", K(ret)); + } } else { OZ (role_id_array.push_back(role_id)); + OZ (role_user_name.push_back(role_name)); + OZ (role_host_name.push_back(host_name)); } } } } // 2. check privilege - if (OB_SUCC(ret) && ObSchemaChecker::is_ora_priv_check()) { - OZ (params_.schema_checker_->check_ora_grant_role_priv( - revoke_stmt->get_tenant_id(), - params_.session_info_->get_priv_user_id(), - role_id_array, - params_.session_info_->get_enable_role_array()), - revoke_stmt->get_tenant_id(), revoke_stmt->get_roles(), role_id_array); + if (OB_SUCC(ret)) { + if (ObSchemaChecker::is_ora_priv_check()) { + OZ (params_.schema_checker_->check_ora_grant_role_priv( + revoke_stmt->get_tenant_id(), + params_.session_info_->get_priv_user_id(), + role_id_array, + params_.session_info_->get_enable_role_array()), + revoke_stmt->get_tenant_id(), revoke_stmt->get_roles(), role_id_array); + } else { + ObSqlCtx *sql_ctx = NULL; + if (OB_ISNULL(params_.session_info_->get_cur_exec_ctx()) + || OB_ISNULL(sql_ctx = params_.session_info_->get_cur_exec_ctx()->get_sql_ctx())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected ctx", K(ret), KP(params_.session_info_->get_cur_exec_ctx())); + } + OZ (params_.schema_checker_->check_mysql_grant_role_priv(*sql_ctx, role_id_array)); + } } // 3. resolve grantee @@ -104,8 +147,17 @@ int ObRevokeResolver::resolve_revoke_role_inner( const ObString &host_name = host_name_array.at(i); if (OB_FAIL(params_.schema_checker_->get_user_id(tenant_id, user_name, host_name, user_id))) { if (OB_USER_NOT_EXIST == ret) { - ret = OB_ERR_USER_OR_ROLE_DOES_NOT_EXIST; - LOG_USER_ERROR(OB_ERR_USER_OR_ROLE_DOES_NOT_EXIST, user_name.length(), user_name.ptr()); + if (lib::is_oracle_mode()) { + ret = OB_ERR_USER_OR_ROLE_DOES_NOT_EXIST; + LOG_USER_ERROR(OB_ERR_USER_OR_ROLE_DOES_NOT_EXIST, user_name.length(), user_name.ptr()); + } else { + ret = OB_ERR_UNKNOWN_AUTHID; + ignore_error = ignore_unknown_user; + LOG_USER(ignore_unknown_user ? ObLogger::USER_WARN : ObLogger::USER_ERROR, + OB_ERR_UNKNOWN_AUTHID, + user_name.length(), user_name.ptr(), + host_name.length(), host_name.ptr()); + } } LOG_WARN("fail to get user id", K(ret), K(user_name), K(host_name)); } else if (OB_FAIL(check_dcl_on_inner_user(revoke_role->type_, @@ -122,13 +174,18 @@ int ObRevokeResolver::resolve_revoke_role_inner( CK (OB_NOT_NULL(user_info)); for (int i = 0; OB_SUCC(ret) && i < role_id_array.count(); i++) { if (!has_exist_in_array(user_info->get_role_id_array(), role_id_array.at(i))) { - ret = OB_ERR_ROLE_NOT_GRANTED_TO; - CK (OB_NOT_NULL(role_list->children_[i])); - LOG_USER_ERROR(OB_ERR_ROLE_NOT_GRANTED_TO, - static_cast(role_list->children_[i]->str_len_), - role_list->children_[i]->str_value_, - user_info->get_user_name_str().length(), - user_info->get_user_name_str().ptr()); + if (lib::is_oracle_mode()) { + ret = OB_ERR_ROLE_NOT_GRANTED_TO; + LOG_USER_ERROR(OB_ERR_ROLE_NOT_GRANTED_TO, + static_cast(role_list->children_[i]->str_len_), + role_list->children_[i]->str_value_, + 0, "", + user_info->get_user_name_str().length(), + user_info->get_user_name_str().ptr(), + 0, ""); + } else { + //ignored + } } } } @@ -145,6 +202,11 @@ int ObRevokeResolver::resolve_revoke_role_inner( } } + if (OB_FAIL(ret) && OB_NOT_NULL(revoke_stmt) && ignore_error) { + revoke_stmt->set_has_warning(); + ret = OB_SUCCESS; + } + return ret; } @@ -232,6 +294,9 @@ int ObRevokeResolver::resolve(const ParseNode &parse_tree) int ObRevokeResolver::resolve_mysql(const ParseNode &parse_tree) { int ret = OB_SUCCESS; + static const int REVOKE_NUM_CHILD = 6; + static const int REVOKE_ALL_NUM_CHILD = 3; + static const int REVOKE_ROLE_NUM_CHILD = 1; ParseNode *node = const_cast(&parse_tree); ObRevokeStmt *revoke_stmt = NULL; if (OB_ISNULL(params_.schema_checker_) || OB_ISNULL(params_.session_info_)) { @@ -239,9 +304,9 @@ int ObRevokeResolver::resolve_mysql(const ParseNode &parse_tree) LOG_WARN("schema_checker or session info not inited", K(ret), "schema checker", params_.schema_checker_, "session info", params_.session_info_); } else if (node != NULL - && ((T_REVOKE == node->type_ && 3 == node->num_child_) - || (T_REVOKE_ALL == node->type_ && 1 == node->num_child_) - || (T_SYSTEM_REVOKE == node->type_ && 1 == node->num_child_))) { + && ((T_REVOKE == node->type_ && REVOKE_NUM_CHILD == node->num_child_) + || (T_REVOKE_ALL == node->type_ && REVOKE_ALL_NUM_CHILD == node->num_child_) + || (T_SYSTEM_REVOKE == node->type_ && REVOKE_ROLE_NUM_CHILD == node->num_child_))) { if (OB_ISNULL(revoke_stmt = create_stmt())) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_ERROR("Failed to create ObCreateUserStmt", K(ret)); @@ -253,7 +318,7 @@ int ObRevokeResolver::resolve_mysql(const ParseNode &parse_tree) ParseNode *users_node = NULL; ParseNode *privs_node = NULL; ObPrivLevel grant_level = OB_PRIV_INVALID_LEVEL; - if (T_SYSTEM_REVOKE == node->type_ && 1 == node->num_child_) { + if (T_SYSTEM_REVOKE == node->type_ && REVOKE_ROLE_NUM_CHILD == node->num_child_) { // resolve oracle revoke // 0: role_list; 1: grantee ParseNode *revoke_role = node->children_[0]; @@ -271,11 +336,17 @@ int ObRevokeResolver::resolve_mysql(const ParseNode &parse_tree) LOG_ERROR("Revoke ParseNode error", K(ret)); } } else { + bool ignore_priv_not_exist = false; + bool ignore_user_not_exist = false; + bool ignore_error = false; // resolve mysql revoke - if (T_REVOKE == node->type_ && 3 == node->num_child_) { + if (T_REVOKE == node->type_ && REVOKE_NUM_CHILD == node->num_child_) { privs_node = node->children_[0]; - ParseNode *priv_level_node = node->children_[1]; - users_node = node->children_[2]; + ParseNode *priv_object_node = node->children_[1]; + ParseNode *priv_level_node = node->children_[2]; + users_node = node->children_[3]; + ignore_priv_not_exist = NULL != node->children_[4]; + ignore_user_not_exist = NULL != node->children_[5]; //resolve priv_level if (OB_ISNULL(priv_level_node) || OB_ISNULL(allocator_)) { ret = OB_ERR_PARSE_SQL; @@ -293,6 +364,9 @@ int ObRevokeResolver::resolve_mysql(const ParseNode &parse_tree) grant_level, *allocator_))) { LOG_WARN("Resolve priv_level node error", K(ret)); + } + + if (OB_FAIL(ret)) { } else if (OB_FAIL(check_and_convert_name(db, table))) { LOG_WARN("Check and convert name error", K(db), K(table), K(ret)); } else { @@ -301,24 +375,54 @@ int ObRevokeResolver::resolve_mysql(const ParseNode &parse_tree) LOG_WARN("Failed to set database_name to revoke_stmt", K(ret)); } else if (OB_FAIL(revoke_stmt->set_table_name(table))) { LOG_WARN("Failed to set table_name to revoke_stmt", K(ret)); - } /*else { + } else { share::schema::ObObjectType object_type = share::schema::ObObjectType::INVALID; uint64_t object_id = OB_INVALID_ID; + ObString object_db_name; if (db.empty() || table.empty()) { object_type = share::schema::ObObjectType::MAX_TYPE; } else { - ObString obj_db_name; - OZ (params_.schema_checker_->get_object_type(tenant_id, db, table, - object_type, object_id, - obj_db_name, false, false, - ObString(""))); - OZ (revoke_stmt->set_database_name(obj_db_name)); + ObSynonymChecker synonym_checker; + (void)params_.schema_checker_->get_object_type(tenant_id, db, table, + object_type, object_id, + object_db_name, false, + false, ObString(""), + synonym_checker); } - revoke_stmt->set_object_type(object_type); - } //do nothing*/ + if (OB_FAIL(ret)) { + } else { + revoke_stmt->set_object_type(object_type); + revoke_stmt->set_object_id(object_id); + } + } } } - } else if (T_REVOKE_ALL == node->type_ && 1 == node->num_child_) { + + if (OB_FAIL(ret)) { + } else if (priv_object_node != NULL) { + uint64_t compat_version = 0; + if (grant_level != OB_PRIV_TABLE_LEVEL) { + ret = OB_ILLEGAL_GRANT_FOR_TABLE; + LOG_WARN("illegal grant", K(ret)); + } else if (priv_object_node->value_ == 1) { + grant_level = OB_PRIV_TABLE_LEVEL; + } else if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, compat_version))) { + LOG_WARN("fail to get data version", K(tenant_id)); + } else if (!sql::ObSQLUtils::is_data_version_ge_423_or_431(compat_version)) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("grammar is not support when MIN_DATA_VERSION is below DATA_VERSION_4_3_1_0 or 4_2_3_0", K(ret)); + } else if (priv_object_node->value_ == 2) { + grant_level = OB_PRIV_ROUTINE_LEVEL; + revoke_stmt->set_object_type(ObObjectType::PROCEDURE); + } else if (priv_object_node->value_ == 3) { + grant_level = OB_PRIV_ROUTINE_LEVEL; + revoke_stmt->set_object_type(ObObjectType::FUNCTION); + } + } + + } else if (T_REVOKE_ALL == node->type_ && REVOKE_ALL_NUM_CHILD == node->num_child_) { + ignore_priv_not_exist = NULL != node->children_[1]; + ignore_user_not_exist = NULL != node->children_[2]; users_node = node->children_[0]; revoke_stmt->set_revoke_all(true); revoke_stmt->set_grant_level(OB_PRIV_USER_LEVEL); @@ -343,8 +447,26 @@ int ObRevokeResolver::resolve_mysql(const ParseNode &parse_tree) //resolve privileges if (OB_SUCC(ret) && (NULL != privs_node)) { ObPrivSet priv_set = 0; - if (OB_FAIL(ObGrantResolver::resolve_priv_set(privs_node, grant_level, priv_set))) { + uint64_t compat_version = 0; + const uint64_t tenant_id = params_.session_info_->get_effective_tenant_id(); + if (OB_ISNULL(allocator_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected error", K(ret)); + } else if (OB_FAIL(ObGrantResolver::resolve_priv_set(tenant_id, privs_node, grant_level, priv_set, revoke_stmt, + params_.schema_checker_, params_.session_info_, + *allocator_))) { LOG_WARN("Resolve priv set error", K(ret)); + } else if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, compat_version))) { + LOG_WARN("fail to get data version", K(tenant_id)); + } else if (!sql::ObSQLUtils::is_data_version_ge_423_or_431(compat_version)) { + if ((priv_set & OB_PRIV_EXECUTE) != 0 || + (priv_set & OB_PRIV_ALTER_ROUTINE) != 0 || + (priv_set & OB_PRIV_CREATE_ROUTINE) != 0) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("grammar is not support when MIN_DATA_VERSION is below DATA_VERSION_4_3_1_0 or 4_2_3_0", K(ret)); + } + } + if (OB_FAIL(ret)) { } else { revoke_stmt->set_priv_set(priv_set); } @@ -389,6 +511,13 @@ int ObRevokeResolver::resolve_mysql(const ParseNode &parse_tree) } else if (OB_FAIL( params_.schema_checker_->get_user_id(tenant_id, user_name, host_name, user_id))) { + if (OB_USER_NOT_EXIST == ret) { + ignore_error = ignore_user_not_exist; + LOG_USER(ignore_user_not_exist ? ObLogger::USER_WARN : ObLogger::USER_ERROR, + OB_ERR_UNKNOWN_AUTHID, + user_name.length(), user_name.ptr(), + host_name.length(), host_name.ptr()); + } SQL_RESV_LOG(WARN, "fail to get user id", K(ret), K(user_name), K(host_name)); } else if (is_root_user(user_id) && OB_PRIV_USER_LEVEL == grant_level) { ret = OB_NOT_SUPPORTED; @@ -408,6 +537,11 @@ int ObRevokeResolver::resolve_mysql(const ParseNode &parse_tree) } //end for } } + + if (OB_FAIL(ret) && OB_NOT_NULL(revoke_stmt) && ignore_error) { + revoke_stmt->set_has_warning(); + ret = OB_SUCCESS; + } } } } else { @@ -662,10 +796,12 @@ int ObRevokeResolver::resolve_revoke_role_and_sysprivs_inner(const ParseNode *no if (!has_exist_in_array(user_info->get_role_id_array(), role_id_array.at(i))) { ret = OB_ERR_ROLE_NOT_GRANTED_TO; LOG_USER_ERROR(OB_ERR_ROLE_NOT_GRANTED_TO, - role_name_array.at(i).length(), - role_name_array.at(i).ptr(), - user_info->get_user_name_str().length(), - user_info->get_user_name_str().ptr()); + role_name_array.at(i).length(), + role_name_array.at(i).ptr(), + 0, "", + user_info->get_user_name_str().length(), + user_info->get_user_name_str().ptr(), + 0, ""); } } } @@ -730,7 +866,7 @@ int ObRevokeResolver::resolve_revoke_obj_priv_inner(const ParseNode *node, OZ (revoke_stmt->set_database_name(obj_db_name)); } revoke_stmt->set_object_type(object_type); - revoke_stmt->set_obj_id(object_id); + revoke_stmt->set_object_id(object_id); } //do nothing } } @@ -750,14 +886,14 @@ int ObRevokeResolver::resolve_revoke_obj_priv_inner(const ParseNode *node, // 3. check revoke object privs for oracle if (OB_SUCC(ret) && ObSchemaChecker::is_ora_priv_check() - && revoke_stmt->get_obj_id() != OB_INVALID_ID) { + && revoke_stmt->get_object_id() != OB_INVALID_ID) { uint64_t grantor_id_out = OB_INVALID_ID; ObSEArray col_id_array; OZ (params_.schema_checker_->check_ora_grant_obj_priv( tenant_id, params_.session_info_->get_priv_user_id(), revoke_stmt->get_database_name(), - revoke_stmt->get_obj_id(), + revoke_stmt->get_object_id(), static_cast(revoke_stmt->get_object_type()), revoke_stmt->get_obj_priv_array(), col_id_array, diff --git a/src/sql/resolver/dcl/ob_revoke_stmt.cpp b/src/sql/resolver/dcl/ob_revoke_stmt.cpp index 0b21668179..9fbbaa6a41 100644 --- a/src/sql/resolver/dcl/ob_revoke_stmt.cpp +++ b/src/sql/resolver/dcl/ob_revoke_stmt.cpp @@ -39,7 +39,10 @@ ObRevokeStmt::ObRevokeStmt(ObIAllocator *name_pool) obj_id_(), obj_type_(), grantor_id_(), - revoke_all_ora_(false) + revoke_all_ora_(false), + has_warning_(false), + column_names_priv_(), + table_schema_version_(0) { } @@ -58,7 +61,10 @@ ObRevokeStmt::ObRevokeStmt() obj_id_(), obj_type_(), grantor_id_(), - revoke_all_ora_(false) + revoke_all_ora_(false), + has_warning_(false), + column_names_priv_(), + table_schema_version_(0) { } diff --git a/src/sql/resolver/dcl/ob_revoke_stmt.h b/src/sql/resolver/dcl/ob_revoke_stmt.h index 2c5d6512c9..13e1fb3784 100644 --- a/src/sql/resolver/dcl/ob_revoke_stmt.h +++ b/src/sql/resolver/dcl/ob_revoke_stmt.h @@ -41,7 +41,7 @@ public: void set_revoke_all(bool revoke_all) { revoke_all_ = revoke_all; } int set_priv_array(const share::ObRawPrivArray &array_in); int set_obj_priv_array(const share::ObRawObjPrivArray &array_in); - void set_obj_id(uint64_t obj_id) { obj_id_ = obj_id; } + void set_object_id(uint64_t obj_id) { obj_id_ = obj_id; } void set_grantor_id(uint64_t grantor_id) { grantor_id_ = grantor_id; } void set_revoke_all_ora(bool flag) { revoke_all_ora_ = flag; } int add_grantee(const common::ObString &grantee); @@ -55,7 +55,7 @@ public: void set_object_type(share::schema::ObObjectType object_type) { object_type_ = object_type; } const share::ObRawPrivArray& get_priv_array() const {return sys_priv_array_;} const share::ObRawObjPrivArray& get_obj_priv_array() const {return obj_priv_array_;} - uint64_t get_obj_id() const { return obj_id_; } + uint64_t get_object_id() const { return obj_id_; } uint64_t get_grantor_id() const { return grantor_id_; } bool get_revoke_all_ora() const { return revoke_all_ora_; } @@ -64,13 +64,22 @@ public: bool get_revoke_all() const { return revoke_all_; } const common::ObStrings& get_grantees() const { return grantees_; } virtual bool cause_implicit_commit() const { return true; } + void set_has_warning() { has_warning_ = true; } + bool get_has_warning() const { return has_warning_; } virtual obrpc::ObDDLArg &get_ddl_arg() { return share::schema::OB_PRIV_USER_LEVEL == grant_level_ ? static_cast(user_arg_) : (share::schema::OB_PRIV_DB_LEVEL == grant_level_ ? static_cast(db_arg_) : (share::schema::OB_PRIV_TABLE_LEVEL == grant_level_ ? static_cast(table_arg_) - : static_cast(syspriv_arg_))); + : (share::schema::OB_PRIV_ROUTINE_LEVEL == grant_level_ ? static_cast(routine_arg_) + : static_cast(syspriv_arg_)))); } + int add_column_privs(const ObString& column_name,const ObPrivSet priv_set) { return column_names_priv_.push_back(std::make_pair(column_name, priv_set)); } + const ObIArray> &get_column_privs() const { return column_names_priv_; } + void set_table_schema_version(int64_t schema_version) { table_schema_version_ = schema_version; } + int64_t get_table_schema_version() { return table_schema_version_; } + + bool is_grant_stmt() const { return false; } DECLARE_VIRTUAL_TO_STRING; private: // data members @@ -85,6 +94,7 @@ private: obrpc::ObRevokeUserArg user_arg_; obrpc::ObRevokeDBArg db_arg_; obrpc::ObRevokeTableArg table_arg_; + obrpc::ObRevokeRoutineArg routine_arg_; obrpc::ObRevokeSysPrivArg syspriv_arg_; common::hash::ObPlacementHashSet role_id_set_; share::schema::ObObjectType object_type_; @@ -94,6 +104,9 @@ private: uint64_t obj_type_; uint64_t grantor_id_; bool revoke_all_ora_; + bool has_warning_; + ObSEArray, 4, common::ModulePageAllocator, true> column_names_priv_; + int64_t table_schema_version_; private: DISALLOW_COPY_AND_ASSIGN(ObRevokeStmt); }; diff --git a/src/sql/resolver/ddl/ob_create_table_resolver.cpp b/src/sql/resolver/ddl/ob_create_table_resolver.cpp index 25de434a62..2f65e143d7 100644 --- a/src/sql/resolver/ddl/ob_create_table_resolver.cpp +++ b/src/sql/resolver/ddl/ob_create_table_resolver.cpp @@ -371,23 +371,25 @@ int ObCreateTableResolver::set_temp_table_info(ObTableSchema &table_schema, Pars meta_int.set_collation_level(CS_LEVEL_NONE); meta_int.set_collation_type(CS_TYPE_BINARY); stat.reset(); - column.set_column_name(OB_HIDDEN_SESSION_ID_COLUMN_NAME); column.set_meta_type(meta_int); column.set_column_id(OB_HIDDEN_SESSION_ID_COLUMN_ID); column.set_is_hidden(true); stat.column_id_ = column.get_column_id(); - if (OB_FAIL(table_schema.add_column(column))) { + if (OB_FAIL(column.set_column_name(OB_HIDDEN_SESSION_ID_COLUMN_NAME))) { + LOG_WARN("failed to set column name", K(ret)); + } else if (OB_FAIL(table_schema.add_column(column))) { SQL_RESV_LOG(WARN, "fail to add column", K(ret)); } else if (OB_FAIL(stats.push_back(stat))) { SQL_RESV_LOG(WARN, "fail to push back stat", K(ret)); } else { stat.reset(); - column.set_column_name(OB_HIDDEN_SESS_CREATE_TIME_COLUMN_NAME); column.set_meta_type(meta_int); column.set_column_id(OB_HIDDEN_SESS_CREATE_TIME_COLUMN_ID); column.set_is_hidden(true); stat.column_id_ = column.get_column_id(); - if (OB_FAIL(table_schema.add_column(column))) { + if (OB_FAIL(column.set_column_name(OB_HIDDEN_SESS_CREATE_TIME_COLUMN_NAME))) { + LOG_WARN("failed to set column name", K(ret)); + } else if (OB_FAIL(table_schema.add_column(column))) { SQL_RESV_LOG(WARN, "fail to add column", K(ret)); } else if (OB_FAIL(stats.push_back(stat))) { SQL_RESV_LOG(WARN, "fail to push back stat", K(ret)); @@ -1828,9 +1830,9 @@ int ObCreateTableResolver::resolve_table_elements_from_select(const ParseNode &p } else { column.reset(); if (!select_item.alias_name_.empty()) { - column.set_column_name(select_item.alias_name_); + OZ(column.set_column_name(select_item.alias_name_)); } else { - column.set_column_name(select_item.expr_name_); + OZ(column.set_column_name(select_item.expr_name_)); } if (OB_SUCC(ret) && is_mysql_mode()) { if (new_table_item != NULL && new_table_item->is_basic_table()) { diff --git a/src/sql/resolver/ddl/ob_create_view_resolver.cpp b/src/sql/resolver/ddl/ob_create_view_resolver.cpp index 5bec025b56..5438131649 100644 --- a/src/sql/resolver/ddl/ob_create_view_resolver.cpp +++ b/src/sql/resolver/ddl/ob_create_view_resolver.cpp @@ -98,6 +98,9 @@ int ObCreateViewResolver::resolve(const ParseNode &parse_tree) char *dblink_name_ptr = NULL; int32_t dblink_name_len = 0; ObString view_define; + ObString expanded_view; + int64_t view_definition_start_pos = 0; + int64_t view_definition_end_pos = 0; const bool is_force_view = NULL != parse_tree.children_[FORCE_VIEW_NODE]; stmt->set_allocator(*allocator_); stmt_ = stmt; @@ -125,8 +128,14 @@ int ObCreateViewResolver::resolve(const ParseNode &parse_tree) ObNameCaseMode mode = OB_NAME_CASE_INVALID; bool perserve_lettercase = false; // lib::is_oracle_mode() ? true : (mode != OB_LOWERCASE_AND_INSENSITIVE); ObArray column_list; + ObArray comment_list; bool has_dblink_node = false; - + share::schema::ObSchemaGetterGuard *schema_guard = NULL; + uint64_t database_id = OB_INVALID_ID; + ObString old_database_name; + uint64_t old_database_id = session_info_->get_database_id(); + bool resolve_succ = true; + bool can_expand_star = true; if (is_materialized_view) { uint64_t tenant_data_version = 0; if (OB_FAIL(GET_MIN_DATA_VERSION(session_info_->get_effective_tenant_id(), tenant_data_version))) { @@ -137,12 +146,13 @@ int ObCreateViewResolver::resolve(const ParseNode &parse_tree) LOG_USER_ERROR(OB_NOT_SUPPORTED, "version is less than 4.3, materialized view is not supported"); } } - + bool add_undefined_columns = false; + ParseNode *select_stmt_node = NULL; if (OB_FAIL(ret)) { // do nothing } else if (OB_FAIL(resolve_table_relation_node(parse_tree.children_[VIEW_NODE], - view_name, db_name, - false, false, &dblink_name_ptr, &dblink_name_len, &has_dblink_node))) { + view_name, db_name, + false, false, &dblink_name_ptr, &dblink_name_len, &has_dblink_node))) { LOG_WARN("failed to resolve table relation node!", K(ret)); } else if (OB_FAIL(set_database_name(db_name))) { SQL_RESV_LOG(WARN, "set database name failes", KR(ret)); @@ -166,10 +176,31 @@ int ObCreateViewResolver::resolve(const ParseNode &parse_tree) || 1 != table_id_node->num_child_))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("fail to resolve table_id", K(ret)); + } else if (OB_ISNULL(schema_checker_) + || OB_ISNULL(schema_guard = schema_checker_->get_schema_guard())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected null", K(ret)); + } else if (OB_FAIL(schema_guard->get_database_id(session_info_->get_effective_tenant_id(), + stmt->get_database_name(), + database_id))) { + LOG_WARN("failed to get database id", K(ret)); + } else if (OB_FALSE_IT(table_schema.set_database_id(database_id))) { + //never reach + } else if (OB_FAIL(ob_write_string(*allocator_, + session_info_->get_database_name(), + old_database_name))) { + LOG_WARN("failed to write string", K(ret)); } else { table_schema.set_table_id(table_id_node ? static_cast(table_id_node->children_[0]->value_) : OB_INVALID_ID); + if (is_oracle_mode()) { + if (OB_FAIL(session_info_->set_default_database(stmt->get_database_name()))) { + LOG_WARN("failed to set default database name", K(ret)); + } else { + session_info_->set_database_id(database_id); + } + } } if (OB_SUCC(ret)) { @@ -180,13 +211,18 @@ int ObCreateViewResolver::resolve(const ParseNode &parse_tree) view_table_resolver.params_.is_from_create_mview_ = is_materialized_view; view_table_resolver.params_.is_specified_col_name_ = parse_tree.children_[VIEW_COLUMNS_NODE] != NULL; view_table_resolver.set_current_view_level(1); + view_table_resolver.set_is_top_stmt(true); + view_table_resolver.set_has_resolved_field_list(false); view_table_resolver.set_is_create_view(true); // set ObViewSchema.materialized_ in RS view_table_resolver.set_materialized(parse_tree.children_[MATERIALIZED_NODE] ? true : false); - ParseNode *select_stmt_node = parse_tree.children_[SELECT_STMT_NODE]; + select_stmt_node = parse_tree.children_[SELECT_STMT_NODE]; ParseNode *view_columns_node = parse_tree.children_[VIEW_COLUMNS_NODE]; ObString sql_str(select_stmt_node->str_len_, select_stmt_node->str_value_); view_define = sql_str; + view_definition_start_pos = select_stmt_node->stmt_loc_.first_column_; + view_definition_end_pos = min(select_stmt_node->stmt_loc_.last_column_, + params_.cur_sql_.length() - 1); if (OB_ISNULL(select_stmt_node)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("select_stmt_node should not be NULL", K(ret)); @@ -194,19 +230,20 @@ int ObCreateViewResolver::resolve(const ParseNode &parse_tree) ret = OB_ERR_UNEXPECTED; LOG_WARN("node type is not T_SELECT", K(select_stmt_node->type_), K(ret)); } else if (OB_FAIL(ObSQLUtils::convert_sql_text_to_schema_for_storing( - *allocator_, session_info_->get_dtc_params(), view_define, - ObCharset::COPY_STRING_ON_SAME_CHARSET))) { + *allocator_, session_info_->get_dtc_params(), view_define, + ObCharset::COPY_STRING_ON_SAME_CHARSET))) { LOG_WARN("write view define failed", K(ret)); } else if (OB_FAIL(view_table_resolver.resolve(*select_stmt_node))) { + resolve_succ = false; if (is_force_view) { // create force view, ignore resolve error if (OB_FAIL(try_add_error_info(ret, create_arg.error_info_))) { LOG_WARN("failed to add error info to for force view", K(ret)); } } else if (is_sync_ddl_user && session_info_->is_inner() - && !session_info_->is_user_session() - && (OB_TABLE_NOT_EXIST == ret || OB_ERR_BAD_FIELD_ERROR == ret - || OB_ERR_KEY_DOES_NOT_EXISTS == ret)) { + && !session_info_->is_user_session() + && (OB_TABLE_NOT_EXIST == ret || OB_ERR_BAD_FIELD_ERROR == ret + || OB_ERR_KEY_DOES_NOT_EXISTS == ret)) { // ret: OB_TABLE_NOT_EXIST || OB_ERR_BAD_FIELD_ERROR // resolve select_stmt_mode可能会出现表或者列不存在,这里做规避 LOG_WARN("resolve select in create view failed", K(ret)); @@ -217,10 +254,19 @@ int ObCreateViewResolver::resolve(const ParseNode &parse_tree) } else if (OB_FAIL(view_table_resolver.check_auto_gen_column_names())) { LOG_WARN("fail to check auto gen column names", K(ret)); } else if (OB_FAIL(params_.query_ctx_->query_hint_.init_query_hint(params_.allocator_, - params_.session_info_, + params_.session_info_, view_table_resolver.get_select_stmt()))) { LOG_WARN("failed to init query hint.", K(ret)); } + if (is_oracle_mode()) { + int tmp_ret = OB_SUCCESS; + if (OB_SUCCESS != (tmp_ret = session_info_->set_default_database(old_database_name))) { + ret = OB_SUCCESS == ret ? tmp_ret : ret; // 不覆盖错误码 + LOG_ERROR("failed to reset default database", K(ret), K(tmp_ret), K(old_database_name)); + } else { + session_info_->set_database_id(old_database_id); + } + } // specify view related flags if (table_schema.is_sys_table()) { table_schema.set_table_type(SYSTEM_VIEW); @@ -232,7 +278,8 @@ int ObCreateViewResolver::resolve(const ParseNode &parse_tree) } } if (OB_FAIL(ret)) { - } else if (!is_force_view && !is_sync_ddl_user && OB_FAIL(resolve_column_list(parse_tree.children_[VIEW_COLUMNS_NODE], column_list))) { + } else if (OB_FAIL(resolve_column_list(view_columns_node, + column_list))) { LOG_WARN("fail to resolve view columns", K(ret)); } else if (OB_ISNULL(select_stmt = view_table_resolver.get_select_stmt())) { ret = OB_ERR_UNEXPECTED; @@ -240,13 +287,35 @@ int ObCreateViewResolver::resolve(const ParseNode &parse_tree) } else if (OB_ISNULL(select_stmt->get_real_stmt())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("failed to get real stmt", K(ret), K(*select_stmt)); - } else if (OB_FAIL(check_view_columns(*select_stmt, view_columns_node, - create_arg.error_info_, is_force_view))) { + } else if (OB_FAIL(check_view_columns(*select_stmt, + view_columns_node, + create_arg.error_info_, + is_force_view, + can_expand_star, + add_undefined_columns))) { LOG_WARN("failed to check view columns", K(ret)); - } else if (OB_FAIL(add_column_infos(session_info_->get_effective_tenant_id(), *select_stmt, table_schema, *allocator_, *session_info_, column_list))) { + } else if ((lib::is_mysql_mode() || (resolve_succ && !add_undefined_columns)) + && OB_FAIL(add_column_infos(session_info_->get_effective_tenant_id(), + *select_stmt, + table_schema, + *allocator_, + *session_info_, + column_list, + comment_list))) { LOG_WARN("failed to add column infos", K(ret)); + } else if ((!resolve_succ || add_undefined_columns) + && is_force_view && lib::is_oracle_mode() + && OB_FAIL(try_add_undefined_column_infos(session_info_->get_effective_tenant_id(), + view_table_resolver.has_resolved_field_list(), + select_stmt_node, + *select_stmt, + table_schema, + column_list))) { + LOG_WARN("failed to add undefined column infos", K(ret)); } else if (OB_FAIL(collect_dependency_infos(params_.query_ctx_, create_arg))) { LOG_WARN("failed to collect dependency infos", K(ret)); + } else if (is_force_view && (!resolve_succ || add_undefined_columns) + && FALSE_IT(table_schema.set_object_status(ObObjectStatus::INVALID))) { } else { bool is_updatable = true; ViewCheckOption check_option = VIEW_CHECK_OPTION_NONE; @@ -369,16 +438,34 @@ int ObCreateViewResolver::resolve(const ParseNode &parse_tree) } } - if (OB_SUCC(ret) && !is_force_view && !is_sync_ddl_user) { - // 前面用建view的sql直接设置过table_schema.set_view_definition - // 基线备份时create view必须都用show create view里面的view definition - // create force view use origin view_define - ObString expanded_view; - if (OB_FAIL(stmt_print(select_stmt, 0 == column_list.count() ? NULL : &column_list, - expanded_view))) { - LOG_WARN("fail to expand view definition", K(ret)); - } else if (OB_FAIL(table_schema.set_view_definition(expanded_view))) { - LOG_WARN("fail to set view definition", K(expanded_view), K(ret)); + if (OB_SUCC(ret)) { + uint64_t compat_version = OB_INVALID_VERSION; + if (OB_FAIL(GET_MIN_DATA_VERSION(session_info_->get_effective_tenant_id(), compat_version))) { + LOG_WARN("get min data_version failed", K(ret), K(session_info_->get_effective_tenant_id())); + } else if (lib::is_oracle_mode() && resolve_succ && can_expand_star && !is_materialized_view + && sql::ObSQLUtils::is_data_version_ge_422_or_431(compat_version)) { + if (OB_FAIL(print_star_expanded_view_stmt(expanded_view, + view_definition_start_pos, + view_definition_end_pos))) { + LOG_WARN("failed to print stmt", K(ret)); + } else if (OB_FAIL(ObSQLUtils::convert_sql_text_to_schema_for_storing( + *allocator_, session_info_->get_dtc_params(), expanded_view, + ObCharset::COPY_STRING_ON_SAME_CHARSET))) { + LOG_WARN("failed to convert expanded view", K(ret)); + } else if (OB_FAIL(table_schema.set_view_definition(expanded_view))) { + LOG_WARN("fail to set view definition", K(expanded_view), K(ret)); + } + } else if (!is_force_view && !is_sync_ddl_user) { + // 前面用建view的sql直接设置过table_schema.set_view_definition + // 基线备份时create view必须都用show create view里面的view definition + // create force view use origin view_define + if (OB_FAIL(print_rebuilt_view_stmt(select_stmt, + 0 == column_list.count() ? NULL : &column_list, + expanded_view))) { + LOG_WARN("fail to expand view definition", K(ret)); + } else if (OB_FAIL(table_schema.set_view_definition(expanded_view))) { + LOG_WARN("fail to set view definition", K(expanded_view), K(ret)); + } } } @@ -418,7 +505,9 @@ int ObCreateViewResolver::try_add_error_info(const uint64_t error_number, int ObCreateViewResolver::check_view_columns(ObSelectStmt &select_stmt, ParseNode *view_columns_node, share::schema::ObErrorInfo &error_info, - const bool is_force_view) + const bool is_force_view, + bool &can_expand_star, + bool &add_undefined_columns) { int ret = OB_SUCCESS; // oracle 模式下, create view时要求每一个select expr有明确的别名 @@ -444,6 +533,8 @@ int ObCreateViewResolver::check_view_columns(ObSelectStmt &select_stmt, if (OB_FAIL(try_add_error_info(OB_ERR_VIEW_WRONG_LIST, error_info))) { LOG_WARN("failed to add error info to for force view", K(ret)); } else { + can_expand_star = false; + add_undefined_columns = true; LOG_TRACE("force view columns is not equal with select columns", K(select_item_size), K(view_columns_node->num_child_)); } @@ -462,6 +553,23 @@ int ObCreateViewResolver::check_view_columns(ObSelectStmt &select_stmt, LOG_WARN("failed to set hashset", K(ret)); } else { /* do nothing */ } } + if (OB_SUCC(ret) && lib::is_oracle_mode() && can_expand_star && select_item_size > 0) { + hash::ObHashSet select_item_names; + if (OB_FAIL(select_item_names.create(select_item_size))) { + LOG_WARN("failed to init hashset", K(ret), K(select_item_size)); + } else { + for (int64_t i = 0; OB_SUCC(ret) && can_expand_star + && i < select_stmt.get_select_items().count(); i++) { + SelectItem &select_item = select_stmt.get_select_items().at(i); + if (OB_HASH_EXIST == (ret = select_item_names.set_refactored(select_item.alias_name_, 0))) { + can_expand_star = false; + ret = OB_SUCCESS; + } else if (OB_FAIL(ret)) { + LOG_WARN("failed to set hashset", K(ret), K(select_item.alias_name_)); + } else { /* do nothing */ } + } + } + } } else if (OB_UNLIKELY(is_force_view && 0 == select_item_size)) { if (OB_FAIL(try_add_error_info(OB_ERR_ONLY_HAVE_INVISIBLE_COL_IN_TABLE, error_info))) { LOG_WARN("failed to add error info to for force view", K(ret)); @@ -826,9 +934,9 @@ int ObCreateViewResolver::check_privilege_needed(ObCreateTableStmt &stmt, } return ret; } -int ObCreateViewResolver::stmt_print(const ObSelectStmt *stmt, - common::ObIArray *column_list, - common::ObString &expanded_view) +int ObCreateViewResolver::print_rebuilt_view_stmt(const ObSelectStmt *stmt, + common::ObIArray *column_list, + common::ObString &expanded_view) { int ret = OB_SUCCESS; char *buf = NULL; @@ -869,6 +977,69 @@ int ObCreateViewResolver::stmt_print(const ObSelectStmt *stmt, return ret; } +int ObCreateViewResolver::print_star_expanded_view_stmt(common::ObString &expanded_view, + const int64_t view_definition_start_pos, + const int64_t view_definition_end_pos) +{ + int ret = OB_SUCCESS; + int64_t count = 0; + int64_t last_end_pos = view_definition_start_pos; + int64_t start_pos = 0; + int64_t end_pos = 0; + ObSqlString expanded_str; + ObString substr; + ObString orig_str = params_.cur_sql_; + ObString table_name; + for (int64_t i = 0; OB_SUCC(ret) && i < params_.star_expansion_infos_.count(); ++i) { + ObArray &column_name_list = params_.star_expansion_infos_.at(i).column_name_list_; + start_pos = params_.star_expansion_infos_.at(i).start_pos_; + end_pos = params_.star_expansion_infos_.at(i).end_pos_; + // from last_end_pos to start_pos + if (OB_FAIL(ob_sub_str(*allocator_, orig_str, last_end_pos, start_pos - 1, substr))) { + LOG_WARN("failed to get sub string", K(ret)); + } else if (OB_FAIL(expanded_str.append(substr))) { + LOG_WARN("failed to append sub string", K(ret)); + } + // from start_pos to end_pos + // * or t.* + if (OB_SUCC(ret) && start_pos != end_pos + && OB_FAIL(ob_sub_str(*allocator_, orig_str, start_pos, end_pos - 1, table_name))) { + LOG_WARN("failed to get table_name", K(ret)); + } + for (int64_t j = 0; OB_SUCC(ret) && j < column_name_list.count(); ++j) { + if (j > 0 && OB_FAIL(expanded_str.append(","))) { + LOG_WARN("failed to append comma", K(ret)); + } else { + ObSqlString column_name; + if (start_pos != end_pos && OB_FAIL(expanded_str.append(table_name))) { + LOG_WARN("failed to append table_name", K(ret)); + } else if (OB_FAIL(column_name.append("\""))) { + LOG_WARN("failed to append quote", K(ret)); + } else if (OB_FAIL(column_name.append(column_name_list.at(j)))) { + LOG_WARN("failed to append column name", K(ret)); + } else if (OB_FAIL(column_name.append("\""))) { + LOG_WARN("failed to append quote", K(ret)); + } else if (OB_FAIL(expanded_str.append(column_name.string()))) { + LOG_WARN("failed to append column name", K(ret)); + } + } + } + last_end_pos = end_pos + 1; + } + // from last_end_pos to sql_end_pos + if (OB_FAIL(ret)) { + } else if (OB_FAIL(ob_sub_str(*allocator_, orig_str, last_end_pos, view_definition_end_pos, substr))) { + LOG_WARN("failed to get sub string", K(ret)); + } else if (OB_FAIL(expanded_str.append(substr))) { + LOG_WARN("failed to append sub string", K(ret)); + } else if (OB_FAIL(ob_write_string(*allocator_, expanded_str.string(), expanded_view, true))) { + LOG_WARN("failed to write string", K(ret)); + } else { + LOG_DEBUG("expanded view definition", K(expanded_view)); + } + return ret; +} + int ObCreateViewResolver::check_view_stmt_col_name( ObSelectStmt &select_stmt, ObArray &index_array, @@ -1211,13 +1382,126 @@ int ObCreateViewResolver::collect_dependency_infos(ObQueryCtx *query_ctx, } return ret; } +int ObCreateViewResolver::try_add_undefined_column_infos(const uint64_t tenant_id, + bool has_resolved_field_list, + ParseNode *select_stmt_node, + ObSelectStmt &select_stmt, + ObTableSchema &table_schema, + const common::ObIArray &column_list) +{ + int ret = OB_SUCCESS; + bool add_undefined_columns = false; + ObArray select_items; + if (has_resolved_field_list) { + if (OB_FAIL(add_undefined_column_infos(tenant_id, + select_stmt.get_select_items(), + table_schema, + column_list))) { + LOG_WARN("failed to add undefined column infos", K(ret)); + } + } else if (column_list.empty() + && OB_FAIL(resolve_select_node_for_force_view(add_undefined_columns, + select_stmt_node, + select_items))) { + LOG_WARN("failed to resolve select node", K(ret)); + } else if ((add_undefined_columns || !column_list.empty()) + && OB_FAIL(add_undefined_column_infos(tenant_id, + select_items, + table_schema, + column_list))) { + LOG_WARN("failed to add undefined column infos", K(ret)); + } + return ret; +} +int ObCreateViewResolver::resolve_select_node_for_force_view(bool &add_undefined_columns, + ParseNode *select_stmt_node, + ObIArray &select_items) +{ + int ret = OB_SUCCESS; + ParseNode *field_list_node = NULL; + bool has_star = false; + ParseNode *project_node = NULL; + SelectItem select_item; + if (OB_ISNULL(select_stmt_node) + || OB_ISNULL(field_list_node = select_stmt_node->children_[PARSE_SELECT_SELECT])) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("parse node is null", K(ret)); + } + for (int32_t i = 0; OB_SUCC(ret) && !has_star && i < field_list_node->num_child_; ++i) { + if (OB_ISNULL(project_node = field_list_node->children_[i]->children_[0])) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("parse node is null", K(ret)); + } else if (project_node->type_ == T_STAR + || (project_node->type_ == T_COLUMN_REF + && project_node->children_[2]->type_ == T_STAR)) { + has_star = true; + } else { + select_item.expr_name_.assign_ptr(field_list_node->children_[i]->str_value_, + static_cast(field_list_node->children_[i]->str_len_)); + if (project_node->type_ == T_ALIAS) { + ParseNode *alias_node = project_node->children_[1]; + select_item.alias_name_.assign_ptr(const_cast(alias_node->str_value_), + static_cast(alias_node->str_len_)); + if (OB_UNLIKELY(alias_node->str_len_ > OB_MAX_COLUMN_NAME_LENGTH)) { + ret = OB_ERR_TOO_LONG_IDENT; + LOG_WARN("alias name too long", K(ret), K(select_item.alias_name_)); + } + } + if (OB_FAIL(ret)) { + } else if (OB_FAIL(select_items.push_back(select_item))) { + LOG_WARN("failed to push back select item"); + } + } + } + if (!has_star && OB_SUCC(ret)) { + add_undefined_columns = true; + } + return ret; +} + +int ObCreateViewResolver::add_undefined_column_infos(const uint64_t tenant_id, + ObIArray &select_items, + ObTableSchema &table_schema, + const common::ObIArray &column_list) +{ + int ret = OB_SUCCESS; + ObColumnSchemaV2 column; + int64_t cur_column_id = OB_APP_MIN_COLUMN_ID; + int64_t column_count = !column_list.empty() ? column_list.count() : select_items.count(); + if (lib::is_oracle_mode()) { + for (int64_t i = 0; OB_SUCC(ret) && i < column_count; ++i) { + column.reset(); + if (!column_list.empty()) { + OZ(column.set_column_name(column_list.at(i))); + } else if (!select_items.at(i).alias_name_.empty()) { + OZ(column.set_column_name(select_items.at(i).alias_name_)); + } else { + OZ(column.set_column_name(select_items.at(i).expr_name_)); + } + if (OB_FAIL(ret)) { + } else { + column.set_column_id(cur_column_id++); + //ObExtendType only used internal, we user it to describe UNDEFINED type + column.set_data_type(ObObjType::ObExtendType); + column.set_data_length(0); + column.set_data_precision(-1); + column.set_data_scale(OB_MIN_NUMBER_SCALE - 1); + if (OB_FAIL(table_schema.add_column(column))) { + LOG_WARN("add column to table_schema failed", K(ret), K(column)); + } + } + } + } + return ret; +} int ObCreateViewResolver::add_column_infos(const uint64_t tenant_id, ObSelectStmt &select_stmt, ObTableSchema &table_schema, ObIAllocator &alloc, ObSQLSessionInfo &session_info, - const ObIArray &column_list) + const ObIArray &column_list, + const ObIArray &comment_list) { int ret = OB_SUCCESS; ObIArray &select_items = select_stmt.get_select_items(); @@ -1225,12 +1509,16 @@ int ObCreateViewResolver::add_column_infos(const uint64_t tenant_id, int64_t cur_column_id = OB_APP_MIN_COLUMN_ID; uint64_t data_version = 0; share::schema::ObSchemaGetterGuard schema_guard; - if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, data_version))) { + if (OB_FAIL(GCTX.schema_service_->get_tenant_schema_guard(tenant_id, schema_guard))) { + LOG_WARN("fail to get schema guard", K(ret)); + } else if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, data_version))) { LOG_WARN("failed to get data version", K(ret)); } else if (data_version >= DATA_VERSION_4_1_0_0) { - if (!column_list.empty() && OB_UNLIKELY(column_list.count() != select_items.count())) { + if ((!column_list.empty() && OB_UNLIKELY(column_list.count() != select_items.count())) + || (!comment_list.empty() && OB_UNLIKELY(comment_list.count() != select_items.count()))) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("get wrong column count", K(ret), K(column_list.count()), K(select_items.count()), K(table_schema), K(select_stmt)); + LOG_WARN("get wrong column count", K(ret), K(column_list.count()), K(comment_list.count()), + K(select_items.count()), K(table_schema), K(select_stmt)); } for (int64_t i = 0; OB_SUCC(ret) && i < select_items.count(); ++i) { const SelectItem &select_item = select_items.at(i); @@ -1238,13 +1526,18 @@ int ObCreateViewResolver::add_column_infos(const uint64_t tenant_id, column.reset(); column.set_column_id(cur_column_id++); if (!column_list.empty()) { - column.set_column_name(column_list.at(i)); + OZ(column.set_column_name(column_list.at(i))); } else if (!select_item.alias_name_.empty()) { - column.set_column_name(select_item.alias_name_); + OZ(column.set_column_name(select_item.alias_name_)); } else { - column.set_column_name(select_item.expr_name_); + OZ(column.set_column_name(select_item.expr_name_)); } - if (OB_UNLIKELY(NULL == expr)) { + if (OB_SUCC(ret) && !comment_list.empty()) { + OZ(column.set_comment(comment_list.at(i))); + } + + if (OB_FAIL(ret)) { + } else if (OB_UNLIKELY(NULL == expr)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("select item expr is null", K(ret), K(i)); } else if (OB_FAIL(fill_column_meta_infos(*expr, @@ -1256,6 +1549,8 @@ int ObCreateViewResolver::add_column_infos(const uint64_t tenant_id, OB_FAIL(resolve_column_default_value(&select_stmt, select_item, column, alloc, session_info))) { // oracle mode has default expr value, not support now LOG_WARN("add column to table_schema failed", K(ret), K(column)); + } else if (OB_FAIL(resolve_columns_nullable_value(&select_stmt, table_schema, select_item, column, alloc, session_info, &schema_guard))){ + LOG_WARN("failed to add column nullable info", K(ret)); } else if (OB_FAIL(table_schema.add_column(column))) { LOG_WARN("add column to table_schema failed", K(ret), K(column)); } else { @@ -1329,6 +1624,7 @@ int ObCreateViewResolver::resolve_column_default_value(const sql::ObSelectStmt * } int ObCreateViewResolver::resolve_columns_nullable_value(const sql::ObSelectStmt *select_stmt, + const ObTableSchema &table_schema, const sql::SelectItem &select_item, ObColumnSchemaV2 &column_schema, ObIAllocator &alloc, @@ -1338,6 +1634,7 @@ int ObCreateViewResolver::resolve_columns_nullable_value(const sql::ObSelectStmt int ret = OB_SUCCESS; observer::ObTableColumns::ColumnAttributes column_attributes; if (OB_FAIL(observer::ObTableColumns::deduce_column_attributes(is_oracle_mode(), + table_schema, select_stmt, select_item, schema_guard, @@ -1345,8 +1642,9 @@ int ObCreateViewResolver::resolve_columns_nullable_value(const sql::ObSelectStmt NULL, 0, column_attributes, - true))) { - LOG_WARN("failed to resolve nullable value", K(ret)); + true, + alloc))) { + LOG_WARN("failed to resolve nullable value", K(ret), K(table_schema)); } else { column_schema.set_nullable(column_attributes.null_ == "YES"); } diff --git a/src/sql/resolver/ddl/ob_create_view_resolver.h b/src/sql/resolver/ddl/ob_create_view_resolver.h index 27c0e69cf6..2c83e7d7d2 100644 --- a/src/sql/resolver/ddl/ob_create_view_resolver.h +++ b/src/sql/resolver/ddl/ob_create_view_resolver.h @@ -52,12 +52,26 @@ public: virtual ~ObCreateViewResolver(); virtual int resolve(const ParseNode &parse_tree); + static int resolve_select_node_for_force_view(bool &add_undefined_columns, + ParseNode *select_stmt_node, + ObIArray &select_items); + static int add_undefined_column_infos(const uint64_t tenant_id, + ObIArray &select_items, + ObTableSchema &table_schema, + const common::ObIArray &column_list); + static int try_add_undefined_column_infos(const uint64_t tenant_id, + bool has_resolved_field_list, + ParseNode *select_stmt_node, + ObSelectStmt &select_stmt, + ObTableSchema &table_schema, + const common::ObIArray &column_list); static int add_column_infos(const uint64_t tenant_id, ObSelectStmt &select_stmt, ObTableSchema &table_schema, common::ObIAllocator &alloc, sql::ObSQLSessionInfo &session_info, - const common::ObIArray &column_list); + const common::ObIArray &column_list, + const common::ObIArray &comment_list); static int fill_column_meta_infos(const ObRawExpr &expr, const ObCharsetType charset_type, const uint64_t table_id, @@ -68,6 +82,7 @@ public: common::ObIAllocator &alloc, sql::ObSQLSessionInfo &session_info); static int resolve_columns_nullable_value(const sql::ObSelectStmt *select_stmt, + const ObTableSchema &table_schema, const sql::SelectItem &select_item, ObColumnSchemaV2 &column_schema, ObIAllocator &alloc, @@ -87,7 +102,9 @@ private: int check_view_columns(ObSelectStmt &select_stmt, ParseNode *view_columns_node, share::schema::ObErrorInfo &error_info, - const bool is_force_view); + const bool is_force_view, + bool &can_expand_star, + bool &add_undefined_columns); int check_privilege_needed(ObCreateTableStmt &stmt, ObSelectStmt &select_stmt, const bool is_force_view); @@ -101,9 +118,12 @@ private: * use stmt_print instead of ObSelectStmtPrinter. When do_print return OB_SIZE_OVERFLOW * and the buf_len is less than OB_MAX_PACKET_LENGTH, stmt_print will expand buf and try again. */ - int stmt_print(const ObSelectStmt *stmt, - common::ObIArray *column_list, - common::ObString &expanded_view); + int print_rebuilt_view_stmt(const ObSelectStmt *stmt, + common::ObIArray *column_list, + common::ObString &expanded_view); + int print_star_expanded_view_stmt(common::ObString &expanded_view, + const int64_t view_definition_start_pos, + const int64_t view_definition_end_pos); int collect_dependency_infos(ObQueryCtx *query_ctx, obrpc::ObCreateTableArg &create_arg); int get_sel_priv_tables_in_subquery(const ObSelectStmt *child_stmt, diff --git a/src/sql/resolver/ddl/ob_ddl_resolver.cpp b/src/sql/resolver/ddl/ob_ddl_resolver.cpp index ca9f711c2d..ac06ac8452 100644 --- a/src/sql/resolver/ddl/ob_ddl_resolver.cpp +++ b/src/sql/resolver/ddl/ob_ddl_resolver.cpp @@ -3420,14 +3420,19 @@ int ObDDLResolver::resolve_normal_column_attribute(ObColumnSchemaV2 &column, SQL_RESV_LOG(WARN, "invalid node!", K(ret)); } else { ObString comment(attr_node->children_[0]->str_len_, attr_node->children_[0]->str_value_); - if (OB_FAIL(ObSQLUtils::convert_sql_text_to_schema_for_storing( - *allocator_, session_info_->get_dtc_params(), comment))) { + if (OB_FAIL(ObSQLUtils::convert_sql_text_to_schema_for_storing(*allocator_, session_info_->get_dtc_params(), comment))) { LOG_WARN("fail to convert comment to utf8", K(ret), K(comment)); - } else if(comment.length() >= MAX_COLUMN_COMMENT_LENGTH){ - ret = OB_ERR_TOO_LONG_FIELD_COMMENT; - LOG_USER_ERROR(OB_ERR_TOO_LONG_FIELD_COMMENT, MAX_COLUMN_COMMENT_LENGTH); - } else{ - column.set_comment(comment); + } else { + int64_t comment_length = comment.length(); + char *comment_ptr = const_cast(comment.ptr()); + if(OB_FAIL(ObResolverUtils::check_comment_length(session_info_, + comment_ptr, + &comment_length, + MAX_COLUMN_COMMENT_CHAR_LENGTH))){ + LOG_WARN("fail to check_comment_length", K(ret)); + } else { + column.set_comment(ObString(comment_length, comment_ptr)); + } } } break; @@ -3726,14 +3731,19 @@ int ObDDLResolver::resolve_generated_column_attribute(ObColumnSchemaV2 &column, SQL_RESV_LOG(WARN, "invalid node!", K(ret)); } else { ObString comment(attr_node->children_[0]->str_len_, attr_node->children_[0]->str_value_); - if (OB_FAIL(ObSQLUtils::convert_sql_text_to_schema_for_storing( - *allocator_, session_info_->get_dtc_params(), comment))) { + if (OB_FAIL(ObSQLUtils::convert_sql_text_to_schema_for_storing(*allocator_, session_info_->get_dtc_params(), comment))) { LOG_WARN("fail to convert comment to utf8", K(ret), K(comment)); - } else if(comment.length() >= MAX_COLUMN_COMMENT_LENGTH){ - ret = OB_ERR_TOO_LONG_FIELD_COMMENT; - LOG_USER_ERROR(OB_ERR_TOO_LONG_FIELD_COMMENT, MAX_COLUMN_COMMENT_LENGTH); - } else{ - column.set_comment(comment); + } else { + int64_t comment_length = comment.length(); + char *comment_ptr = const_cast(comment.ptr()); + if(OB_FAIL(ObResolverUtils::check_comment_length(session_info_, + comment_ptr, + &comment_length, + MAX_COLUMN_COMMENT_CHAR_LENGTH))){ + LOG_WARN("fail to check_comment_length", K(ret)); + } else { + column.set_comment(ObString(comment_length, comment_ptr)); + } } } break; @@ -4332,11 +4342,13 @@ int ObDDLResolver::resolve_identity_column_attribute(ObColumnSchemaV2 &column, SQL_RESV_LOG(WARN, "invalid node!", K(ret)); } else { int64_t comment_length = attr_node->children_[0]->str_len_; - const char * comment_ptr = attr_node->children_[0]->str_value_; - if(comment_length >= MAX_COLUMN_COMMENT_LENGTH){ - ret = OB_ERR_TOO_LONG_FIELD_COMMENT; - LOG_USER_ERROR(OB_ERR_TOO_LONG_FIELD_COMMENT, MAX_COLUMN_COMMENT_LENGTH); - } else{ + char *comment_ptr = const_cast(attr_node->children_[0]->str_value_); + if(OB_FAIL(ObResolverUtils::check_comment_length(session_info_, + comment_ptr, + &comment_length, + MAX_COLUMN_COMMENT_CHAR_LENGTH))){ + LOG_WARN("fail to check_comment_length", K(ret)); + } else { column.set_comment(ObString(comment_length, comment_ptr)); } } diff --git a/src/sql/resolver/ddl/ob_set_comment_resolver.cpp b/src/sql/resolver/ddl/ob_set_comment_resolver.cpp index 5729328d5a..6fe13105fa 100644 --- a/src/sql/resolver/ddl/ob_set_comment_resolver.cpp +++ b/src/sql/resolver/ddl/ob_set_comment_resolver.cpp @@ -103,6 +103,7 @@ int ObSetCommentResolver::resolve(const ParseNode &parse_tree) if (T_SET_TABLE_COMMENT == parse_tree.type_) { // COMMENT ON TABLE bool is_exists = false; + uint64_t compat_version = OB_INVALID_VERSION; if (2 != parse_tree.num_child_) { ret = OB_ERR_UNEXPECTED; SQL_RESV_LOG(WARN, "invalid parse tree num", K(ret), K(parse_tree.num_child_)); @@ -112,16 +113,35 @@ int ObSetCommentResolver::resolve(const ParseNode &parse_tree) } else if (OB_FAIL(resolve_table_relation_node(parse_tree.children_[0], table_name, database_name))) { - LOG_WARN("failed to resolve table name.", K(table_name), K(database_name), K(ret)); - } else if (OB_FAIL(get_table_schema(parse_tree.children_[0]->children_[0], - tenant_id, - database_name, - table_name, - table_schema))) { - SQL_RESV_LOG(WARN, "failed to get table schema", K(table_name), K(database_name), K(ret)); + SQL_RESV_LOG(WARN, "failed to resolve table name.", K(table_name), K(database_name), K(ret)); + } else if (OB_FAIL(schema_checker_->check_table_exists(tenant_id, + database_name, + table_name, + false /*index*/, + false/*is_hidden*/, + is_exists))) { + SQL_RESV_LOG(WARN, "failed to check_table_exist", K(ret), K(tenant_id), + K(database_name), K(table_name)); + } else if (!is_exists) { + ret = OB_TABLE_NOT_EXIST; + SQL_RESV_LOG(WARN, "table not exist", K(ret), K(tenant_id), K(database_name), K(table_name)); + } else if (OB_FAIL(schema_checker_->get_table_schema(tenant_id, + database_name, + table_name, + false/*not index table*/, + table_schema))) { + SQL_RESV_LOG(WARN, "failed to get table schema", K(ret), K(database_name), K(table_name)); } else if (OB_ISNULL(table_schema)) { ret = OB_ERR_UNEXPECTED; SQL_RESV_LOG(WARN, "table schema is null", K(ret), K(database_name)); + } else if (OB_FAIL(GET_MIN_DATA_VERSION(session_info_->get_effective_tenant_id(), + compat_version))) { + LOG_WARN("get min data_version failed", K(ret), K(session_info_->get_effective_tenant_id())); + } else if (!sql::ObSQLUtils::is_data_version_ge_422_or_431(compat_version) && table_schema->is_view_table()) { + ret = OB_ERR_WRONG_OBJECT; + LOG_USER_ERROR(OB_ERR_WRONG_OBJECT, to_cstring(database_name), to_cstring(table_name), + "BASE TABLE"); + LOG_WARN("version before 4.3.1 or 4.2.2 not support comment on view", K(ret)); } else { alter_table_stmt->set_table_id(table_schema->get_table_id()); } @@ -139,6 +159,7 @@ int ObSetCommentResolver::resolve(const ParseNode &parse_tree) ObQualifiedName column_ref; ObNameCaseMode case_mode = OB_NAME_CASE_INVALID; ParseNode *column_ref_node = parse_tree.children_[0]; + uint64_t compat_version = OB_INVALID_VERSION; if (OB_UNLIKELY(T_COLUMN_REF != column_ref_node->type_)) { ret = OB_ERR_UNEXPECTED; SQL_RESV_LOG(WARN, "node type is not T_COLUMN_LIST", K(ret), K(column_ref_node->type_)); @@ -165,15 +186,23 @@ int ObSetCommentResolver::resolve(const ParseNode &parse_tree) } if (OB_FAIL(ret)) { - } else if (OB_FAIL(get_table_schema(column_ref_node->children_[0], - tenant_id, - database_name, - table_name, - table_schema))) { - SQL_RESV_LOG(WARN, "failed to get table schema", K(table_name), K(database_name), K(ret)); + } else if (OB_FAIL(schema_checker_->get_table_schema(tenant_id, + database_name, + table_name, + false/*not index table*/, + table_schema))) { + SQL_RESV_LOG(WARN, "failed to get table schema", K(ret), K(database_name), K(table_name)); } else if (OB_ISNULL(table_schema)) { ret = OB_ERR_UNEXPECTED; SQL_RESV_LOG(WARN, "table schema is null", K(ret), K(database_name)); + } else if (OB_FAIL(GET_MIN_DATA_VERSION(session_info_->get_effective_tenant_id(), + compat_version))) { + LOG_WARN("get min data_version failed", K(ret), K(session_info_->get_effective_tenant_id())); + } else if (!sql::ObSQLUtils::is_data_version_ge_422_or_431(compat_version) && table_schema->is_view_table()) { + ret = OB_ERR_WRONG_OBJECT; + LOG_USER_ERROR(OB_ERR_WRONG_OBJECT, to_cstring(database_name), to_cstring(table_name), + "BASE TABLE"); + LOG_WARN("version before 4.3.1 or 4.2.2 not support comment on column of view", K(ret)); } else if (OB_FAIL(schema_checker_->check_column_exists(tenant_id, table_schema->get_table_id(), col_name, @@ -225,6 +254,7 @@ int ObSetCommentResolver::resolve(const ParseNode &parse_tree) alter_column_schema.set_comment(comment_); alter_table_stmt->set_alter_table_column(); alter_column_schema.alter_type_ = share::schema::OB_DDL_MODIFY_COLUMN; + alter_column_schema.is_set_comment_ = true; if (OB_FAIL(alter_column_schema.set_origin_column_name(col_name))) { SQL_RESV_LOG(WARN, "failed to set origin column name", K(col_name), K(ret)); } else if (OB_FAIL(alter_table_stmt->add_column(alter_column_schema))) { diff --git a/src/sql/resolver/dml/ob_del_upd_resolver.cpp b/src/sql/resolver/dml/ob_del_upd_resolver.cpp index 2a16588acd..9cb3d759c7 100644 --- a/src/sql/resolver/dml/ob_del_upd_resolver.cpp +++ b/src/sql/resolver/dml/ob_del_upd_resolver.cpp @@ -3507,7 +3507,6 @@ int ObDelUpdResolver::resolve_insert_values(const ParseNode *node, } else if (OB_FAIL(append(table_info.values_vector_, value_row))) { LOG_WARN("failed to append value row", K(ret)); } - } } value_row.reset(); @@ -4165,10 +4164,105 @@ int ObDelUpdResolver::add_new_sel_item_for_oracle_temp_table(ObSelectStmt &selec return ret; } +int ObDelUpdResolver::get_session_columns_for_oracle_temp_table(uint64_t ref_table_id, + uint64_t table_id, + ObDMLStmt *stmt, + ObColumnRefRawExpr *&session_id_expr, + ObColumnRefRawExpr *&session_create_time_expr) +{ + int ret = OB_SUCCESS; + if (is_oracle_tmp_table_) { + const share::schema::ObColumnSchemaV2 *column_schema = NULL; + const share::schema::ObColumnSchemaV2 *column_schema2 = NULL; + const ObTableSchema *table_schema = NULL; + common::ObSEArray column_exprs; + TableItem *table_item = NULL; + if (OB_ISNULL(session_info_) || OB_ISNULL(schema_checker_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid session_info_", K(session_info_)); + } else if (OB_FAIL(get_table_schema(table_id, ref_table_id, stmt, table_schema))) { + LOG_WARN("not find table schema", K(ret)); + } else if (OB_ISNULL(table_schema)) { + ret = OB_ERR_UNEXPECTED; + LOG_ERROR("fail to get tale schema", K(ret), K(table_schema)); + } else if (OB_ISNULL(column_schema = (table_schema->get_column_schema(OB_HIDDEN_SESSION_ID_COLUMN_ID)))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed to get column schema", K(ret)); + } else if (OB_ISNULL(column_schema2 = (table_schema->get_column_schema(OB_HIDDEN_SESS_CREATE_TIME_COLUMN_ID)))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed to get column schema", K(ret)); + } else if (OB_ISNULL(table_item = stmt->get_table_item_by_id(table_id))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed to get table item", K(ret)); + } else if (OB_FAIL(add_column_to_stmt(*table_item, *column_schema, column_exprs, stmt))) { + LOG_WARN("failed get column item", K(ret)); + } else if (OB_FAIL(add_column_to_stmt(*table_item, *column_schema2, column_exprs, stmt))) { + LOG_WARN("failed get column exprs", K(ret)); + } else if (column_exprs.count() != 2) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed to get column exprs", K(ret)); + } + if (OB_SUCC(ret)) { + session_id_expr = column_exprs.at(0); + session_create_time_expr = column_exprs.at(1); + if (OB_ISNULL(session_id_expr) || OB_ISNULL(session_create_time_expr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed to get column exprs", K(ret)); + } + } + } + return ret; +} + +int ObDelUpdResolver::add_column_for_oracle_temp_table(uint64_t ref_table_id, + uint64_t table_id, + ObDMLStmt *stmt) +{ + int ret = OB_SUCCESS; + if (is_oracle_tmp_table_) { + ObColumnRefRawExpr *session_id_expr = NULL; + ObColumnRefRawExpr *session_create_time_expr = NULL; + if (OB_FAIL(get_session_columns_for_oracle_temp_table(ref_table_id, + table_id, + stmt, + session_id_expr, + session_create_time_expr))) { + LOG_WARN("failed to get session columns for oracle temp table", K(ret)); + } else if (OB_FAIL(mock_values_column_ref(session_id_expr))) { + LOG_WARN("mock values column reference failed", K(ret)); + } else if (OB_FAIL(mock_values_column_ref(session_create_time_expr))) { + LOG_WARN("mock values column reference failed", K(ret)); + } + } + return ret; +} + +int ObDelUpdResolver::add_column_for_oracle_temp_table(ObInsertTableInfo &table_info, + ObDMLStmt *stmt) +{ + int ret = OB_SUCCESS; + if (is_oracle_tmp_table_) { + ObColumnRefRawExpr *session_id_expr = NULL; + ObColumnRefRawExpr *session_create_time_expr = NULL; + if (OB_FAIL(get_session_columns_for_oracle_temp_table(table_info.ref_table_id_, + table_info.table_id_, + stmt, + session_id_expr, + session_create_time_expr))) { + LOG_WARN("failed to get session columns for oracle temp table", K(ret)); + } else if (OB_FAIL(mock_values_column_ref(session_id_expr, table_info))) { + LOG_WARN("mock values column reference failed", K(ret)); + } else if (OB_FAIL(mock_values_column_ref(session_create_time_expr, table_info))) { + LOG_WARN("mock values column reference failed", K(ret)); + } + } + return ret; +} + // 值插入、查询插入对oracle临时表都要添加__session_id和__sess_create_time字段到目标列 int ObDelUpdResolver::add_new_column_for_oracle_temp_table(uint64_t ref_table_id, - uint64_t table_id /* = OB_INVALID_ID */, - ObDMLStmt *stmt /* = NULL */) + uint64_t table_id, + ObDMLStmt *stmt) { int ret = OB_SUCCESS; if (is_oracle_tmp_table_) { @@ -4210,9 +4304,9 @@ int ObDelUpdResolver::add_new_column_for_oracle_temp_table(uint64_t ref_table_id } else if (OB_FAIL(sess_create_time_expr->formalize(session_info_))) { LOG_WARN("fail to formalize rowkey", KPC(sess_create_time_expr), K(ret)); } else { - session_id_expr->set_ref_id(table_schema->get_table_id(), column_schema->get_column_id()); + session_id_expr->set_ref_id(table_id, column_schema->get_column_id()); session_id_expr->set_column_attr(table_schema->get_table_name(), column_schema->get_column_name_str()); - sess_create_time_expr->set_ref_id(table_schema->get_table_id(), column_schema2->get_column_id()); + sess_create_time_expr->set_ref_id(table_id, column_schema2->get_column_id()); sess_create_time_expr->set_column_attr(table_schema->get_table_name(), column_schema2->get_column_name_str()); LOG_DEBUG("add __session_id & __sess_create_time to target succeed", K(*session_id_expr), K(*sess_create_time_expr)); diff --git a/src/sql/resolver/dml/ob_del_upd_resolver.h b/src/sql/resolver/dml/ob_del_upd_resolver.h index 840f6a4651..141f38ee4a 100644 --- a/src/sql/resolver/dml/ob_del_upd_resolver.h +++ b/src/sql/resolver/dml/ob_del_upd_resolver.h @@ -101,6 +101,14 @@ protected: return common::OB_SUCCESS; } + virtual int mock_values_column_ref(const ObColumnRefRawExpr *column_ref, + ObInsertTableInfo &table_info) + { + UNUSED(column_ref); + UNUSED(table_info); + return common::OB_SUCCESS; + } + // add for error logging int resolve_error_logging(const ParseNode *node); int resolve_err_log_table(const ParseNode *node); @@ -235,7 +243,14 @@ protected: void set_is_oracle_tmp_table(bool is_temp_table) { is_oracle_tmp_table_ = is_temp_table; } void set_oracle_tmp_table_type(int64_t type) { oracle_tmp_table_type_ = type; } int add_new_sel_item_for_oracle_temp_table(ObSelectStmt &select_stmt); - int add_new_column_for_oracle_temp_table(uint64_t ref_table_id, uint64_t table_id = OB_INVALID_ID, ObDMLStmt *stmt = NULL); + int get_session_columns_for_oracle_temp_table(uint64_t ref_table_id, + uint64_t table_id, + ObDMLStmt *stmt, + ObColumnRefRawExpr *&session_id_expr, + ObColumnRefRawExpr *&session_create_time_expr); + int add_column_for_oracle_temp_table(uint64_t ref_table_id, uint64_t table_id, ObDMLStmt *stmt); + int add_column_for_oracle_temp_table(ObInsertTableInfo &table_info, ObDMLStmt *stmt); + int add_new_column_for_oracle_temp_table(uint64_t ref_table_id, uint64_t table_id, ObDMLStmt *stmt); int add_new_value_for_oracle_temp_table(ObIArray &value_row); int add_new_column_for_oracle_label_security_table(ObIArray& the_missing_label_se_columns, uint64_t ref_table_id, diff --git a/src/sql/resolver/dml/ob_del_upd_stmt.cpp b/src/sql/resolver/dml/ob_del_upd_stmt.cpp index ee1d025ea5..c34c86a2d8 100644 --- a/src/sql/resolver/dml/ob_del_upd_stmt.cpp +++ b/src/sql/resolver/dml/ob_del_upd_stmt.cpp @@ -172,6 +172,8 @@ int ObInsertTableInfo::assign(const ObInsertTableInfo &other) LOG_WARN("failed to assign part generated col dep cols", K(ret)); } else if (OB_FAIL(assignments_.assign(other.assignments_))) { LOG_WARN("failed to assign exprs", K(ret)); + } else if (OB_FAIL(column_in_values_vector_.assign(other.column_in_values_vector_))) { + LOG_WARN("failed to assign exprs", K(ret)); } else { is_replace_ = other.is_replace_; } @@ -188,6 +190,8 @@ int ObInsertTableInfo::deep_copy(ObIRawExprCopier &expr_copier, LOG_WARN("failed to copy exprs", K(ret)); } else if (OB_FAIL(expr_copier.copy(other.values_vector_, values_vector_))) { LOG_WARN("failed to copy exprs", K(ret)); + } else if (OB_FAIL(expr_copier.copy(other.column_in_values_vector_, column_in_values_vector_))) { + LOG_WARN("failed to copy exprs", K(ret)); } else if (OB_FAIL(expr_copier.copy(other.column_conv_exprs_, column_conv_exprs_))) { LOG_WARN("failed to copy exprs", K(ret)); } else if (OB_FAIL(expr_copier.copy(other.part_generated_col_dep_cols_, diff --git a/src/sql/resolver/dml/ob_del_upd_stmt.h b/src/sql/resolver/dml/ob_del_upd_stmt.h index 5fc3e7dece..d51a4281ec 100644 --- a/src/sql/resolver/dml/ob_del_upd_stmt.h +++ b/src/sql/resolver/dml/ob_del_upd_stmt.h @@ -196,7 +196,8 @@ public: values_desc_(), values_vector_(), column_conv_exprs_(), - assignments_() + assignments_(), + column_in_values_vector_() { } ObInsertTableInfo(ObDmlTableType dml_type) : @@ -206,7 +207,8 @@ public: values_vector_(), column_conv_exprs_(), part_generated_col_dep_cols_(), - assignments_() + assignments_(), + column_in_values_vector_() { } virtual ~ObInsertTableInfo() @@ -232,7 +234,8 @@ public: K_(values_vector), K_(column_conv_exprs), K_(part_generated_col_dep_cols), - K_(assignments)); + K_(assignments), + K_(column_in_values_vector)); bool is_replace_; // replace semantic for mysql // 下面两个变量组合在一起描述了 INSERT 的 VALUES 结构 // 以 INSERT INTO T1 (i, j, k) VALUES (1,2,3),(4,5,6) 为例: @@ -248,6 +251,7 @@ public: // part_generated_col_dep_cols_ store c1. common::ObSEArray part_generated_col_dep_cols_; ObAssignments assignments_; + common::ObSEArray column_in_values_vector_; }; class ObMergeTableInfo: public ObInsertTableInfo diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index 7b543ef0b7..28e5418b96 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -2690,7 +2690,8 @@ int ObDMLResolver::resolve_basic_column_item(const TableItem &table_item, || OB_ISNULL(session_info_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("schema checker is null", K(stmt), K_(schema_checker), K_(params_.expr_factory)); - } else if (OB_UNLIKELY(!table_item.is_link_table() && !table_item.is_basic_table() && !table_item.is_fake_cte_table())) { + } else if (OB_UNLIKELY(!table_item.is_link_table() && !table_item.is_basic_table() + && !table_item.is_fake_cte_table())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("not base table or alias from base table", K_(table_item.type), K(ret)); } else if (NULL != (col_item = stmt->get_column_item(table_item.table_id_, column_name))) { @@ -3700,9 +3701,6 @@ int ObDMLResolver::resolve_basic_table_without_cte(const ParseNode &parse_tree, LOG_WARN("resolve table partition expr failed", K(ret), K(table_name)); } else if (stmt->is_select_stmt() && OB_FAIL(resolve_geo_mbr_column())) { LOG_WARN("resolve geo mbr column failed", K(ret), K(table_name)); - } else if (table_schema->is_oracle_tmp_table() && stmt::T_MERGE == stmt->get_stmt_type()) { - ret = OB_NOT_SUPPORTED; - LOG_USER_ERROR(OB_NOT_SUPPORTED, "MERGE refers to a temporary table"); } else if (NULL != index_hint_node && OB_FAIL(resolve_index_hint(*table_item, *index_hint_node))) { LOG_WARN("resolve index hint failed", K(ret)); @@ -4523,7 +4521,7 @@ int ObDMLResolver::resolve_table_column_expr(const ObQualifiedName &q_name, ObRa } else { const TableItem *table_item = NULL; if (lib::is_oracle_mode() && 0 == get_stmt()->get_table_size() - && q_name.tbl_name_.empty() && 0 == q_name.col_name_.case_compare("DUMMY")) { + && q_name.tbl_name_.empty() && 0 == q_name.col_name_.compare("DUMMY")) { ObConstRawExpr *c_expr = NULL; const char *ptr_value = "X"; ObString string_value(ptr_value); @@ -5766,18 +5764,30 @@ int ObDMLResolver::expand_view(TableItem &view_item) int ret = OB_SUCCESS; bool is_oracle_mode = lib::is_oracle_mode(); int64_t org_session_id = 0; - if (!is_oracle_mode) { - if (OB_ISNULL(params_.schema_checker_) - || OB_ISNULL(params_.schema_checker_->get_schema_guard())) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("null ptr", K(ret), KP(params_.schema_checker_)); - } else { - //bug19839990, MySQL视图解析时需要忽略临时表, 目前不支持视图包含临时表, - //这里更新sess id防止将视图定义中表按照临时表解析 - org_session_id = params_.schema_checker_->get_schema_guard()->get_session_id(); - params_.schema_checker_->get_schema_guard()->set_session_id(0); - } + share::schema::ObSchemaGetterGuard *schema_guard = NULL; + uint64_t database_id = OB_INVALID_ID; + ObString old_database_name; + uint64_t old_database_id = OB_INVALID_ID; + if (OB_ISNULL(params_.schema_checker_) || OB_ISNULL(session_info_) + || OB_ISNULL(schema_guard = params_.schema_checker_->get_schema_guard())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("null ptr", K(ret), KP(params_.schema_checker_)); + } else if (OB_FAIL(schema_guard->get_database_id(session_info_->get_effective_tenant_id(), + view_item.database_name_, + database_id))) { + LOG_WARN("failed to get database id", K(ret)); + } else if (OB_FAIL(ob_write_string(*allocator_, session_info_->get_database_name(), old_database_name))) { + LOG_WARN("failed to write string", K(ret)); + } else { + old_database_id = session_info_->get_database_id(); } + if (OB_SUCC(ret) && !is_oracle_mode) { + //bug19839990, MySQL视图解析时需要忽略临时表, 目前不支持视图包含临时表, + //这里更新sess id防止将视图定义中表按照临时表解析 + org_session_id = params_.schema_checker_->get_schema_guard()->get_session_id(); + params_.schema_checker_->get_schema_guard()->set_session_id(0); + } + if (OB_SUCC(ret)) { params_.is_expanding_view_ = true; ObViewTableResolver view_resolver(params_, get_view_db_name(), get_view_name()); @@ -5786,12 +5796,27 @@ int ObDMLResolver::expand_view(TableItem &view_item) view_resolver.set_view_ref_id(view_item.ref_id_); view_resolver.set_current_view_item(view_item); view_resolver.set_parent_namespace_resolver(parent_namespace_resolver_); - if (OB_FAIL(do_expand_view(view_item, view_resolver))) { + if (is_oracle_mode) { + if (OB_FAIL(session_info_->set_default_database(view_item.database_name_))) { + LOG_WARN("failed to set default database name", K(ret)); + } else { + session_info_->set_database_id(database_id); + } + } + if (OB_SUCC(ret) && OB_FAIL(do_expand_view(view_item, view_resolver))) { LOG_WARN("do expand view resolve failed", K(ret)); } params_.is_expanding_view_ = false; if (!is_oracle_mode) { params_.schema_checker_->get_schema_guard()->set_session_id(org_session_id); + } else { + int tmp_ret = OB_SUCCESS; + if (OB_SUCCESS != (tmp_ret = session_info_->set_default_database(old_database_name))) { + ret = OB_SUCCESS == ret ? tmp_ret : ret; // 不覆盖错误码 + LOG_ERROR("failed to reset default database", K(ret), K(tmp_ret), K(old_database_name)); + } else { + session_info_->set_database_id(old_database_id); + } } } return ret; @@ -6673,13 +6698,17 @@ int ObDMLResolver::resolve_all_basic_table_columns(const TableItem &table_item, } else if (OB_ISNULL(session_info_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("session_info_ is null", K(ret)); - } else if (OB_UNLIKELY(!table_item.is_link_table()) && OB_UNLIKELY(!table_item.is_basic_table()) && OB_UNLIKELY(!table_item.is_fake_cte_table()) ) { + } else if (OB_UNLIKELY(!table_item.is_link_table() && !table_item.is_basic_table() + && !table_item.is_fake_cte_table())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("table isn't basic table", K_(table_item.type)); } else { const ObTableSchema* table_schema = NULL; //如果select table是index table,那么*展开应该是index table的所有列而不是主表的所有列 - if (OB_FAIL(schema_checker_->get_table_schema(session_info_->get_effective_tenant_id(), table_item.ref_id_, table_schema, table_item.is_link_table()))) { + if (OB_FAIL(schema_checker_->get_table_schema(session_info_->get_effective_tenant_id(), + table_item.ref_id_, + table_schema, + table_item.is_link_table()))) { LOG_WARN("fail to get table schema", K(ret), K(table_item.ref_id_)); } else { ObColumnIterByPrevNextID iter(*table_schema); @@ -6722,7 +6751,7 @@ int ObDMLResolver::resolve_all_generated_table_columns(const TableItem &table_it ObIArray &column_items) { int ret = OB_SUCCESS; - auto stmt = get_stmt(); + ObDMLStmt *stmt = get_stmt(); if (OB_ISNULL(schema_checker_) || OB_ISNULL(stmt)) { ret = OB_NOT_INIT; LOG_WARN("not init", K(ret)); @@ -15937,7 +15966,7 @@ int ObDMLResolver::resolve_basic_table(const ParseNode &parse_tree, TableItem *& LOG_WARN("fail to resolve basic table with cte", K(ret)); } } else if (OB_FAIL(resolve_basic_table_without_cte(parse_tree, table_item))) { - LOG_WARN("fail to resolve basic table with cte", K(ret)); + LOG_WARN("fail to resolve basic table without cte", K(ret)); } return ret; } diff --git a/src/sql/resolver/dml/ob_insert_resolver.cpp b/src/sql/resolver/dml/ob_insert_resolver.cpp index 00ce871079..94ebfcabb1 100644 --- a/src/sql/resolver/dml/ob_insert_resolver.cpp +++ b/src/sql/resolver/dml/ob_insert_resolver.cpp @@ -130,6 +130,8 @@ int ObInsertResolver::resolve(const ParseNode &parse_tree) if (OB_SUCC(ret)) { if (OB_FAIL(insert_stmt->formalize_stmt(session_info_))) { LOG_WARN("pull stmt all expr relation ids failed", K(ret)); + } else { + LOG_DEBUG("check insert table info", K(insert_stmt->get_insert_table_info())); } } @@ -194,9 +196,9 @@ int ObInsertResolver::resolve_insert_clause(const ParseNode &node) //无论哪种插入方式, 都需要向target field中添加列__session_id //非赋值方式插入oracle临时表值中的session_id添加在resolve_insert_values已完成 - if (FAILEDx(add_new_column_for_oracle_temp_table(insert_stmt->get_insert_table_info().ref_table_id_, - insert_stmt->get_insert_table_info().table_id_, - insert_stmt))) { + if (FAILEDx(add_column_for_oracle_temp_table(insert_stmt->get_insert_table_info().ref_table_id_, + insert_stmt->get_insert_table_info().table_id_, + insert_stmt))) { LOG_WARN("failed to add new column for oracle temp table", K(ret)); } else if (!has_tg && OB_FAIL(add_new_column_for_oracle_label_security_table(label_se_columns, @@ -441,21 +443,7 @@ int ObInsertResolver::resolve_insert_field(const ParseNode &insert_into, TableIt OZ(column_namespace_checker_.add_reference_table(table_item)); if (OB_SUCC(ret)) { current_scope_ = T_INSERT_SCOPE; - const ObTableSchema *table_schema = NULL; - uint64_t ref_id = (!OB_ISNULL(table_item->ref_query_) && table_item->ref_query_->is_view_stmt()) - ? table_item->ref_query_->get_view_ref_id() - : table_item->get_base_table_item().ref_id_; - OZ(schema_checker_->get_table_schema(session_info_->get_effective_tenant_id(), ref_id, table_schema, table_item->is_link_table())); OZ (check_need_fired_trigger(table_item)); - - if (OB_SUCC(ret)) { - if (table_schema->is_oracle_tmp_table()) { - //oracle临时表各session不会创建自己的私有对象只能在数据增加时设置标记 - session_info_->set_has_temp_table_flag(); - set_is_oracle_tmp_table(true); - set_oracle_tmp_table_type(table_schema->is_oracle_sess_tmp_table() ? 0 : 1); - } - } } if (OB_SUCC(ret)) { @@ -471,6 +459,22 @@ int ObInsertResolver::resolve_insert_field(const ParseNode &insert_into, TableIt LOG_WARN("failed to resolve insert columns", K(ret)); } + if (OB_SUCC(ret)) { + const ObTableSchema *table_schema = NULL; + OZ(schema_checker_->get_table_schema(session_info_->get_effective_tenant_id(), + table_item->get_base_table_item().ref_id_, + table_schema, + table_item->is_link_table())); + if (OB_SUCC(ret)) { + if (table_schema->is_oracle_tmp_table() && !params_.is_prepare_stage_) { + //oracle临时表各session不会创建自己的私有对象只能在数据增加时设置标记 + session_info_->set_has_temp_table_flag(); + set_is_oracle_tmp_table(true); + set_oracle_tmp_table_type(table_schema->is_oracle_sess_tmp_table() ? 0 : 1); + } + } + } + OZ(remove_dup_dep_cols_for_heap_table(insert_stmt->get_insert_table_info().part_generated_col_dep_cols_, insert_stmt->get_values_desc())); return ret; @@ -1073,6 +1077,8 @@ int ObInsertResolver::replace_column_to_default(ObRawExpr *&origin) if (OB_ISNULL(column_item = insert_stmt->get_column_item_by_id( insert_stmt->get_insert_table_info().table_id_, b_expr->get_column_id()))) { LOG_WARN("fail to get column item", K(ret)); + } else if (OB_FAIL(insert_stmt->get_insert_table_info().column_in_values_vector_.push_back(column_item->expr_))) { + LOG_WARN("fail to push back column expr", K(ret)); } else if (OB_FAIL(utils.resolve_column_ref_in_insert(column_item, origin))) { LOG_WARN("fail to resolve column ref in insert", K(ret)); } diff --git a/src/sql/resolver/dml/ob_merge_resolver.cpp b/src/sql/resolver/dml/ob_merge_resolver.cpp index 00dd4ef5db..827501501e 100644 --- a/src/sql/resolver/dml/ob_merge_resolver.cpp +++ b/src/sql/resolver/dml/ob_merge_resolver.cpp @@ -93,6 +93,8 @@ int ObMergeResolver::resolve(const ParseNode &parse_tree) LOG_WARN("fail to formalize stmt", K(ret)); } else if (OB_FAIL(check_stmt_validity())) { LOG_WARN("failed to check subquery validity", K(ret)); + } else { + LOG_DEBUG("check merge table info", K(merge_stmt->get_merge_table_info())); } return ret; @@ -261,6 +263,19 @@ int ObMergeResolver::resolve_target_relation(const ParseNode *target_node) ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected table item type", K(table_item->type_), K(ret)); } + const ObTableSchema *table_schema = NULL; + if (OB_SUCC(ret)) { + if (OB_FAIL(schema_checker_->get_table_schema(session_info_->get_effective_tenant_id(), + table_item->get_base_table_item().ref_id_, + table_schema, + table_item->is_link_table()))) { + LOG_WARN("failed to get table schema", K(ret)); + } else if (table_schema->is_oracle_tmp_table() && !params_.is_prepare_stage_) { + session_info_->set_has_temp_table_flag(); + set_is_oracle_tmp_table(true); + set_oracle_tmp_table_type(table_schema->is_oracle_sess_tmp_table() ? 0 : 1); + } + } if (OB_SUCC(ret)) { if (OB_FAIL(generate_insert_table_info(*table_item, merge_stmt->get_merge_table_info()))) { LOG_WARN("failed to generate insert table info", K(ret)); @@ -534,6 +549,10 @@ int ObMergeResolver::resolve_insert_clause(const ParseNode *insert_node) LOG_WARN("failed to get label se columns", K(ret)); } else if (OB_FAIL(resolve_insert_values(value_node, merge_stmt->get_merge_table_info(), label_se_columns))) { LOG_WARN("fail to resolve values", K(ret)); + } else if (OB_FAIL(add_column_for_oracle_temp_table(merge_stmt->get_merge_table_info().ref_table_id_, + merge_stmt->get_merge_table_info().table_id_, + merge_stmt))) { + LOG_WARN("failed to add column for oracle temp table", K(ret)); } else if (OB_FAIL(generate_column_conv_function(merge_stmt->get_merge_table_info()))) { LOG_WARN("failed to generate column conv function", K(ret)); } else if (OB_FAIL(replace_gen_col_dependent_col(merge_stmt->get_merge_table_info()))) { diff --git a/src/sql/resolver/dml/ob_multi_table_insert_resolver.cpp b/src/sql/resolver/dml/ob_multi_table_insert_resolver.cpp index 42ad5a907a..84a814ad8d 100644 --- a/src/sql/resolver/dml/ob_multi_table_insert_resolver.cpp +++ b/src/sql/resolver/dml/ob_multi_table_insert_resolver.cpp @@ -83,7 +83,10 @@ int ObMultiTableInsertResolver::resolve(const ParseNode &parse_tree) ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected error", K(ret), K(insert_all_stmt->get_table_items().count() - 1), K(insert_all_stmt->get_insert_all_table_info().count())); + } else { + LOG_DEBUG("check insert all table info", KPC(insert_all_stmt)); } + return ret; } @@ -205,16 +208,26 @@ int ObMultiTableInsertResolver::resolve_multi_table_insert(const ParseNode &node } //4.解析insert values for (int64_t i = 0; OB_SUCC(ret) && i < multi_insert_values_node.count(); ++i) { - set_is_oracle_tmp_table(get_is_oracle_tmp_table_array().at(i)); - ObInsertAllTableInfo* table_info = insert_all_stmt->get_insert_all_table_info().at(i); - if (OB_UNLIKELY(i != multi_insert_values_node.at(i).table_idx_) || OB_ISNULL(table_info)) { + ObInsertAllTableInfo *table_info; + if (OB_UNLIKELY(i >= insert_all_stmt->get_insert_all_table_info().count() + || i >= get_is_oracle_tmp_table_array().count() + || i >= get_oracle_tmp_table_type_array().count())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("array size does not match", K(ret)); + } else { + set_is_oracle_tmp_table(get_is_oracle_tmp_table_array().at(i)); + set_oracle_tmp_table_type(get_oracle_tmp_table_type_array().at(i)); + table_info = insert_all_stmt->get_insert_all_table_info().at(i); + } + if (OB_FAIL(ret)) { + } else if (OB_UNLIKELY(i != multi_insert_values_node.at(i).table_idx_) || OB_ISNULL(table_info)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected error", K(i), K(multi_insert_values_node.at(i).table_idx_)); } else if (OB_FAIL(resolve_insert_values_node( multi_insert_values_node.at(i).insert_value_node_, i))) { LOG_WARN("failed to resolve insert values node", K(ret)); //插入oracle临时表需要添加session_id - } else if (OB_FAIL(add_new_column_for_oracle_temp_table(table_info->ref_table_id_))) { + } else if (OB_FAIL(add_column_for_oracle_temp_table(*table_info, insert_all_stmt))) { LOG_WARN("failed to resolve insert values node", K(ret)); //处理oracle label security } else if (get_the_missing_label_se_columns_array().at(i).count() <= 0) { @@ -224,6 +237,7 @@ int ObMultiTableInsertResolver::resolve_multi_table_insert(const ParseNode &node LOG_WARN("failed to add new column for oracle label securitytable", K(ret)); } set_is_oracle_tmp_table(false); + set_oracle_tmp_table_type(0); } } return ret; @@ -277,11 +291,6 @@ int ObMultiTableInsertResolver::resolve_multi_insert_subquey(const ParseNode &su } else if (select_stmt->has_sequence()) {//多表插入不允许子查询中使用sequence ret = OB_ERR_SEQ_NOT_ALLOWED_HERE; LOG_WARN("sequence number not allowed here", K(ret)); - } else if (is_oracle_tmp_table() && - OB_FAIL(add_new_sel_item_for_oracle_temp_table(*select_stmt))) { - LOG_WARN("add session id value to select item failed", K(ret)); - } else if (OB_FAIL(add_new_sel_item_for_oracle_label_security_table(*select_stmt))) { - LOG_WARN("add label security columns to select item failed", K(ret)); } else if (OB_FAIL(resolve_generate_table_item(select_stmt, view_name, sub_select_table))) { LOG_WARN("failed to resolve generate table item", K(ret)); } else if (OB_FAIL(resolve_all_generated_table_columns(*sub_select_table, column_items))) { @@ -345,6 +354,7 @@ int ObMultiTableInsertResolver::resolve_insert_table_node(const ParseNode &inser const ParseNode *table_node = NULL; TableItem *table_item = NULL; bool is_oracle_tmp_table = false; + int oracle_tmp_table_type = 0; ObInsertAllTableInfo* table_info = nullptr; if (OB_ISNULL(insert_all_stmt) || OB_ISNULL(session_info_) || OB_ISNULL(table_node = insert_table_node.children_[0])) { @@ -375,32 +385,24 @@ int ObMultiTableInsertResolver::resolve_insert_table_node(const ParseNode &inser } else { current_scope_ = T_INSERT_SCOPE; const ObTableSchema *table_schema = NULL; - if (TableItem::ALIAS_TABLE == table_item->type_) { - if (OB_FAIL(schema_checker_->get_table_schema(session_info_->get_effective_tenant_id(), table_item->get_base_table_item().ref_id_, - table_schema))) { - LOG_WARN("failed to get table schema", K(ret)); - } - } else { - if (OB_FAIL(schema_checker_->get_table_schema(session_info_->get_effective_tenant_id(), table_item->get_base_table_item().ref_id_, - table_schema))) { - LOG_WARN("failed to get table schema", K(ret)); - } + if (OB_FAIL(schema_checker_->get_table_schema(session_info_->get_effective_tenant_id(), + table_item->get_base_table_item().ref_id_, + table_schema))) { + LOG_WARN("failed to get table schema", K(ret)); } if (OB_SUCC(ret)) { - if (table_schema->is_oracle_tmp_table()) { + if (table_schema->is_oracle_tmp_table() && !params_.is_prepare_stage_) { //oracle临时表各session不会创建自己的私有对象只能在数据增加时设置标记 session_info_->set_has_temp_table_flag(); - set_is_oracle_tmp_table(true);//这里直接标记在解析子查询时输出行中需要包括sess_id,而不需要去数组中寻找 + set_is_oracle_tmp_table(true); is_oracle_tmp_table = true; - //目前临时表功能有问题,multi dml subplan 子计划插入临时表有问题,显示插入成功,但是查询结果为空,因此 - //暂时禁掉,但所有的主体逻辑保留,等临时表功能完善之后在打开支持(直接移除报错就完成) TODO,@jiangxiu.wt - ret = OB_NOT_SUPPORTED; - LOG_WARN("insert all not support temp table", K(ret)); - LOG_USER_ERROR(OB_NOT_SUPPORTED, "temp table in insert all"); + oracle_tmp_table_type = table_schema->is_oracle_sess_tmp_table() ? 0 : 1; } if (OB_SUCC(ret)) { if (OB_FAIL(get_is_oracle_tmp_table_array().push_back(is_oracle_tmp_table))) { - LOG_WARN("failed to push back value", K(ret)); + LOG_WARN("failed to push back value", K(ret)); + } else if (OB_FAIL(get_oracle_tmp_table_type_array().push_back(oracle_tmp_table_type))) { + LOG_WARN("failed to push back value", K(ret)); } else if (OB_FAIL(remove_dup_dep_cols_for_heap_table(table_info->part_generated_col_dep_cols_, table_info->values_desc_))) { LOG_WARN("failed to remove dup dep cols for heap table", K(ret)); @@ -567,7 +569,7 @@ int ObMultiTableInsertResolver::resolve_insert_table_columns(const ParseNode *no } int ObMultiTableInsertResolver::mock_values_column_ref(const ObColumnRefRawExpr *column_ref, - ObInsertAllTableInfo& table_info) + ObInsertTableInfo &table_info) { int ret = OB_SUCCESS; ObColumnRefRawExpr *value_desc = NULL; @@ -627,11 +629,13 @@ int ObMultiTableInsertResolver::resolve_insert_values_node(const ParseNode *node OB_UNLIKELY(table_offset < 0) || OB_UNLIKELY(table_offset >= insert_all_stmt->get_insert_all_table_info().count() || table_offset >= get_is_oracle_tmp_table_array().count() || + table_offset >= get_oracle_tmp_table_type_array().count() || table_offset >= get_the_missing_label_se_columns_array().count()) || OB_ISNULL(table_info = insert_all_stmt->get_insert_all_table_info().at(table_offset))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null", K(insert_all_stmt), K(table_offset), K(table_info), K(get_is_oracle_tmp_table_array().count()), + K(get_oracle_tmp_table_type_array().count()), K(get_the_missing_label_se_columns_array().count()), K(ret)); } else if (node != NULL) { ObIArray& values_desc = table_info->values_desc_; @@ -731,18 +735,6 @@ int ObMultiTableInsertResolver::resolve_insert_values_node(const ParseNode *node } } //end else } //end for - if (OB_SUCC(ret)) { - set_is_oracle_tmp_table(get_is_oracle_tmp_table_array().at(table_offset)); - if (OB_FAIL(add_new_value_for_oracle_temp_table(value_row))) { - LOG_WARN("failed to add __session_id value", K(ret)); - } else if (OB_FAIL(add_new_value_for_oracle_label_security_table(*table_info, - get_the_missing_label_se_columns_array().at(table_offset), - value_row))) { - LOG_WARN("fail to add new value for oracle label security table", K(ret)); - } else { - set_is_oracle_tmp_table(false); - } - } } else { //未指定value时,默认将subquery输出的所有列做为输出 ObSelectStmt *ref_stmt = NULL; @@ -779,9 +771,14 @@ int ObMultiTableInsertResolver::resolve_insert_values_node(const ParseNode *node } } } - if (OB_SUCC(ret)) { - if (OB_FAIL(table_info->values_vector_.assign(value_row))) { + if (OB_FAIL(add_new_value_for_oracle_temp_table(value_row))) { + LOG_WARN("failed to add __session_id value", K(ret)); + } else if (OB_FAIL(add_new_value_for_oracle_label_security_table(*table_info, + get_the_missing_label_se_columns_array().at(table_offset), + value_row))) { + LOG_WARN("fail to add new value for oracle label security table", K(ret)); + } else if (OB_FAIL(table_info->values_vector_.assign(value_row))) { LOG_WARN("failed to assign vector desc", K(ret)); } } diff --git a/src/sql/resolver/dml/ob_multi_table_insert_resolver.h b/src/sql/resolver/dml/ob_multi_table_insert_resolver.h index 6aa1e4784e..ea01a8ce1c 100644 --- a/src/sql/resolver/dml/ob_multi_table_insert_resolver.h +++ b/src/sql/resolver/dml/ob_multi_table_insert_resolver.h @@ -71,6 +71,9 @@ public: common::ObIArray &get_is_oracle_tmp_table_array() { return is_oracle_tmp_table_array_; } + common::ObIArray &get_oracle_tmp_table_type_array() { + return oracle_tmp_table_type_array_; + } common::ObIArray> &get_the_missing_label_se_columns_array() { return the_missing_label_se_columns_array_; } @@ -78,7 +81,8 @@ public: return the_missing_label_se_columns_; } protected: - int mock_values_column_ref(const ObColumnRefRawExpr *column_ref, ObInsertAllTableInfo& table_info); + virtual int mock_values_column_ref(const ObColumnRefRawExpr *column_ref, + ObInsertTableInfo &table_info) override; virtual int find_value_desc(ObInsertTableInfo &table_info, uint64_t column_id, ObRawExpr *&column_ref) override; private: int resolve_multi_table_insert(const ParseNode &node); @@ -109,6 +113,7 @@ private: int add_new_sel_item_for_oracle_label_security_table(ObSelectStmt &select_stmt); private: common::ObSEArray is_oracle_tmp_table_array_; + common::ObSEArray oracle_tmp_table_type_array_; common::ObSEArray, 4> the_missing_label_se_columns_array_; common::ObSEArray the_missing_label_se_columns_; }; diff --git a/src/sql/resolver/dml/ob_select_resolver.cpp b/src/sql/resolver/dml/ob_select_resolver.cpp index b606491aa0..d1a9905b5c 100644 --- a/src/sql/resolver/dml/ob_select_resolver.cpp +++ b/src/sql/resolver/dml/ob_select_resolver.cpp @@ -59,7 +59,9 @@ ObSelectResolver::ObSelectResolver(ObResolverParams ¶ms) having_has_self_column_(false), has_grouping_(false), has_group_by_clause_(false), - has_nested_aggr_(false) + has_nested_aggr_(false), + is_top_stmt_(false), + has_resolved_field_list_(false) { params_.is_from_create_view_ = params.is_from_create_view_; params_.is_from_create_table_ = params.is_from_create_table_; @@ -1108,6 +1110,9 @@ int ObSelectResolver::resolve_normal_query(const ParseNode &parse_tree) if (is_oracle_mode()) { // oracle resolve: from->where->connect by->group by->having->select_item->order by OZ( resolve_field_list(*(parse_tree.children_[PARSE_SELECT_SELECT])) ); + if (OB_SUCC(ret)) { + set_has_resolved_field_list(true); + } } OZ( resolve_order_clause(parse_tree.children_[PARSE_SELECT_ORDER]) ); OZ( resolve_limit_clause(parse_tree.children_[PARSE_SELECT_LIMIT]) ); @@ -2026,7 +2031,7 @@ int ObSelectResolver::resolve_field_list(const ParseNode &node) if (OB_FAIL(ob_write_string(*allocator_, rowid_name, select_item.alias_name_))) { LOG_WARN("failed to ob write string", K(ret)); } - } else if (T_FUN_SYS_NAME_CONST == sel_expr->get_expr_type()) { + } else if (T_FUN_SYS_NAME_CONST == sel_expr->get_expr_type()) { const ParseNode *expr_list_node = project_node->children_[1]; const ObRawExpr *name_expr = nullptr; if (2 != expr_list_node->num_child_) { @@ -2127,7 +2132,8 @@ int ObSelectResolver::resolve_field_list(const ParseNode &node) } } } else if (is_oracle_mode() && 0 == select_stmt->get_table_size() - && 0 == select_item.expr_name_.case_compare("DUMMY")) { + && (0 == select_item.expr_name_.case_compare("\"DUMMY\"") + || 0 == select_item.expr_name_.case_compare("DUMMY"))) { const char *ptr_name = "DUMMY"; ObString string_name(ptr_name); select_item.alias_name_ = string_name; @@ -2488,12 +2494,13 @@ int ObSelectResolver::find_joined_table_group_for_table( // joined table group: tree of joined table in one table group // join group: short of joined table group // -int ObSelectResolver::resolve_star_for_table_groups() +int ObSelectResolver::resolve_star_for_table_groups(ObStarExpansionInfo &star_expansion_info) { ObSelectStmt *select_stmt = get_select_stmt(); int ret = OB_SUCCESS; int64_t num = 0; int64_t jointable_idx = -1; + bool oracle_star_expand = lib::is_oracle_mode() && is_top_stmt(); if (OB_ISNULL(select_stmt)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("select stmt is null"); @@ -2573,8 +2580,14 @@ int ObSelectResolver::resolve_star_for_table_groups() } } } + if (OB_SUCC(ret) && oracle_star_expand) { + for (int64_t i = 0; OB_SUCC(ret) && i < target_list.count(); ++i) { + if (OB_FAIL(star_expansion_info.column_name_list_.push_back(target_list.at(i).expr_name_))) { + LOG_WARN("failed to push back select item expr name", K(ret)); + } + } + } } - return ret; } @@ -2685,12 +2698,18 @@ int ObSelectResolver::resolve_star(const ParseNode *node) { int ret = OB_SUCCESS; ObSelectStmt *select_stmt = get_select_stmt(); + bool oracle_star_expand = lib::is_oracle_mode() && is_top_stmt(); const share::schema::ObTableSchema *table_schema = NULL; - + ObStarExpansionInfo star_expansion_info; if (OB_ISNULL(node) || OB_ISNULL(session_info_) || OB_ISNULL(select_stmt) || OB_ISNULL(params_.expr_factory_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("invalid status", K(node), K_(session_info), K(select_stmt), K(params_.expr_factory_)); + } else { + star_expansion_info.start_pos_ = node->stmt_loc_.first_column_; + star_expansion_info.end_pos_ = node->stmt_loc_.last_column_; + } + if (OB_FAIL(ret)) { } else if (node->type_ == T_STAR) { int64_t num = select_stmt->get_table_size(); if (num <= 0) { @@ -2744,11 +2763,14 @@ int ObSelectResolver::resolve_star(const ParseNode *node) select_item.is_real_alias_ = true; if (OB_FAIL(select_stmt->add_select_item(select_item))) { LOG_WARN("failed to add select item", K(ret)); + } else if (oracle_star_expand + && OB_FAIL(star_expansion_info.column_name_list_.push_back(string_name))) { + LOG_WARN("failed to push back dummy", K(ret)); } else {/*do nothing*/} } } } - } else if (OB_FAIL(resolve_star_for_table_groups())) { + } else if (OB_FAIL(resolve_star_for_table_groups(star_expansion_info))) { LOG_WARN("resolve star for table groups failed", K(ret)); } } else if (node->type_ == T_COLUMN_REF && node->children_[2]->type_ == T_STAR) { @@ -2809,6 +2831,9 @@ int ObSelectResolver::resolve_star(const ParseNode *node) is_column_name_equal = is_json_wildcard_column & (0 != column_ref.tbl_name_.case_compare(target_list.at(j).alias_name_)); if (!is_column_name_equal && OB_FAIL(select_stmt->add_select_item(target_list.at(j)))) { LOG_WARN("add select item to select stmt failed", K(ret)); + } else if (oracle_star_expand + && OB_FAIL(star_expansion_info.column_name_list_.push_back(target_list.at(j).expr_name_))) { + LOG_WARN("failed to push back select item expr name", K(ret)); } else if (is_only_full_group_by_on(session_info_->get_sql_mode())) { //如果是only full group by,所有target list中的列都必须检查是否满足group约束 if (is_column_name_equal) { // target column not equal with current column without judge @@ -2828,6 +2853,10 @@ int ObSelectResolver::resolve_star(const ParseNode *node) } else { /* won't be here */ } + if (OB_SUCC(ret) && oracle_star_expand + && OB_FAIL(params_.star_expansion_infos_.push_back(star_expansion_info))) { + LOG_WARN("failed to push back star expansion info", K(ret)); + } return ret; } diff --git a/src/sql/resolver/dml/ob_select_resolver.h b/src/sql/resolver/dml/ob_select_resolver.h index 6bcbe3ac67..ab72cbca9c 100644 --- a/src/sql/resolver/dml/ob_select_resolver.h +++ b/src/sql/resolver/dml/ob_select_resolver.h @@ -91,11 +91,17 @@ public: void set_current_cte_involed_stmt(ObSelectStmt *stmt) { current_cte_involed_stmt_ = stmt; } int check_auto_gen_column_names(); + void set_is_top_stmt(bool is_top_stmt) { is_top_stmt_ = is_top_stmt; } + bool is_top_stmt() const { return is_top_stmt_; } + void set_has_resolved_field_list(bool has_resolved_field_list) { has_resolved_field_list_ = has_resolved_field_list; } + bool has_resolved_field_list() const { return has_resolved_field_list_; } // function members TO_STRING_KV(K_(has_calc_found_rows), K_(has_top_limit), K_(in_set_query), - K_(is_sub_stmt)); + K_(is_sub_stmt), + K_(is_top_stmt), + K_(has_resolved_field_list)); protected: int resolve_set_query(const ParseNode &parse_node); @@ -197,7 +203,7 @@ protected: int resolve_into_variable_node(const ParseNode *node, ObSelectIntoItem &into_item); // resolve_star related functions - int resolve_star_for_table_groups(); + int resolve_star_for_table_groups(ObStarExpansionInfo &star_expansion_info); int find_joined_table_group_for_table(const uint64_t table_id, int64_t &jt_idx); int find_select_columns_for_join_group(const int64_t jt_idx, common::ObArray *sorted_select_items); int find_select_columns_for_joined_table_recursive(const JoinedTable *jt, @@ -375,6 +381,10 @@ protected: //用于标识当前的query是否有group by子句 bool has_group_by_clause_; bool has_nested_aggr_; + //当前query是否为最外层select, 仅用于star expansion + bool is_top_stmt_; + //当前query的field list是否解析成功, 用于force view解析失败时的column schema持久化 + bool has_resolved_field_list_; private: // disallow copy DISALLOW_COPY_AND_ASSIGN(ObSelectResolver); diff --git a/src/sql/resolver/dml/ob_view_table_resolver.cpp b/src/sql/resolver/dml/ob_view_table_resolver.cpp index 77e5517e37..03079939ea 100644 --- a/src/sql/resolver/dml/ob_view_table_resolver.cpp +++ b/src/sql/resolver/dml/ob_view_table_resolver.cpp @@ -37,6 +37,7 @@ int ObViewTableResolver::do_resolve_set_query(const ParseNode &parse_tree, child_resolver.set_current_view_item(current_view_item); child_resolver.set_parent_view_resolver(parent_view_resolver_); child_resolver.set_calc_found_rows(is_left_child && has_calc_found_rows_); + child_resolver.set_is_top_stmt(is_top_stmt()); if (OB_FAIL(add_cte_table_to_children(child_resolver))) { LOG_WARN("failed to add cte table to children", K(ret)); @@ -60,9 +61,26 @@ int ObViewTableResolver::expand_view(TableItem &view_item) } else { // expand view as subquery which use view name as alias const ObTableSchema *view_schema = NULL; - - if (OB_FAIL(schema_checker_->get_table_schema(session_info_->get_effective_tenant_id(), view_item.ref_id_, view_schema))) { + share::schema::ObSchemaGetterGuard *schema_guard = NULL; + uint64_t database_id = OB_INVALID_ID; + ObString old_database_name; + uint64_t old_database_id = session_info_->get_database_id(); + if (OB_ISNULL(schema_checker_) + || OB_ISNULL(schema_guard = schema_checker_->get_schema_guard())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected null", K(ret)); + } else if (OB_FAIL(schema_guard->get_database_id(session_info_->get_effective_tenant_id(), + view_item.database_name_, + database_id))) { + LOG_WARN("failed to get database id", K(ret)); + } else if (OB_FAIL(schema_checker_->get_table_schema(session_info_->get_effective_tenant_id(), + view_item.ref_id_, + view_schema))) { LOG_WARN("get table schema failed", K(view_item)); + } else if (OB_FAIL(ob_write_string(*allocator_, + session_info_->get_database_name(), + old_database_name))) { + LOG_WARN("failed to write string", K(ret)); } else { ObViewTableResolver view_resolver(params_, view_db_name_, view_name_); view_resolver.set_current_level(current_level_); @@ -71,9 +89,25 @@ int ObViewTableResolver::expand_view(TableItem &view_item) view_resolver.set_current_view_item(view_item); view_resolver.set_parent_view_resolver(this); view_resolver.set_parent_namespace_resolver(parent_namespace_resolver_); - if (OB_FAIL(do_expand_view(view_item, view_resolver))) { + if (is_oracle_mode()) { + if (OB_FAIL(session_info_->set_default_database(view_item.database_name_))) { + LOG_WARN("failed to set default database name", K(ret)); + } else { + session_info_->set_database_id(database_id); + } + } + if (OB_SUCC(ret) && OB_FAIL(do_expand_view(view_item, view_resolver))) { LOG_WARN("do expand view failed", K(ret)); } + if (is_oracle_mode()) { + int tmp_ret = OB_SUCCESS; + if (OB_SUCCESS != (tmp_ret = session_info_->set_default_database(old_database_name))) { + ret = OB_SUCCESS == ret ? tmp_ret : ret; // 不覆盖错误码 + LOG_ERROR("failed to reset default database", K(ret), K(tmp_ret), K(old_database_name)); + } else { + session_info_->set_database_id(old_database_id); + } + } } } return ret; diff --git a/src/sql/resolver/expr/ob_raw_expr.cpp b/src/sql/resolver/expr/ob_raw_expr.cpp index 333dceb118..b07e4b5a43 100644 --- a/src/sql/resolver/expr/ob_raw_expr.cpp +++ b/src/sql/resolver/expr/ob_raw_expr.cpp @@ -933,7 +933,8 @@ int ObRawExpr::is_non_pure_sys_func_expr(bool &is_non_pure) const || T_FUN_SYS_ROW_COUNT == type_ || T_FUN_SYS_FOUND_ROWS == type_ || T_FUN_SYS_CURRENT_USER_PRIV == type_ - || T_FUN_SYS_TRANSACTION_ID == type_) { + || T_FUN_SYS_TRANSACTION_ID == type_ + || T_FUN_SYS_CURRENT_ROLE == type_) { is_non_pure = true; } } diff --git a/src/sql/resolver/expr/ob_raw_expr.h b/src/sql/resolver/expr/ob_raw_expr.h index bf7d4d8512..7f66fedbff 100644 --- a/src/sql/resolver/expr/ob_raw_expr.h +++ b/src/sql/resolver/expr/ob_raw_expr.h @@ -3929,9 +3929,9 @@ public: { return params_type_.assign(params_type); } - inline void set_database_name(const common::ObString &database_name) + inline int set_database_name(const common::ObString &database_name) { - database_name_ = database_name; + return ob_write_string(*inner_alloc_, database_name, database_name_); } inline void set_package_name(const common::ObString &package_name) { diff --git a/src/sql/resolver/expr/ob_raw_expr_util.cpp b/src/sql/resolver/expr/ob_raw_expr_util.cpp index 6f96035857..98ddc101ac 100644 --- a/src/sql/resolver/expr/ob_raw_expr_util.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_util.cpp @@ -797,7 +797,7 @@ int ObRawExprUtils::resolve_udf_common_info(const ObString &db_name, int ret = OB_SUCCESS; ObUDFRawExpr *udf_raw_expr = udf_info.ref_expr_; CK (OB_NOT_NULL(udf_raw_expr)); - OX (udf_raw_expr->set_database_name(db_name)); + OZ (udf_raw_expr->set_database_name(db_name)); OX (udf_raw_expr->set_package_name(package_name)); OZ (udf_raw_expr->set_subprogram_path(subprogram_path)); OX (udf_raw_expr->set_udf_id(udf_id)); @@ -1507,7 +1507,7 @@ int ObRawExprUtils::parse_default_expr_from_str(const ObString &expr_str, parse_result.is_not_utf8_connection_ = ObCharset::is_valid_collation(expr_str_cs_type.string_collation_) ? (ObCharset::charset_type_by_coll(expr_str_cs_type.string_collation_) != CHARSET_UTF8MB4) : false; parse_result.connection_collation_ = expr_str_cs_type.string_collation_; - + parse_result.semicolon_start_col_ = INT32_MAX; if (OB_FAIL(sql_str.append_fmt("DO %.*s", expr_str.length(), expr_str.ptr()))) { LOG_WARN("failed to concat expr str", K(expr_str), K(ret)); } else if (OB_FAIL(parser.parse( diff --git a/src/sql/resolver/ob_resolver.cpp b/src/sql/resolver/ob_resolver.cpp index 7386725d2a..4d98775f04 100644 --- a/src/sql/resolver/ob_resolver.cpp +++ b/src/sql/resolver/ob_resolver.cpp @@ -747,6 +747,7 @@ int ObResolver::resolve(IsPrepared if_prepared, const ParseNode &parse_tree, ObS break; } + case T_GRANT_ROLE: case T_SYSTEM_GRANT: case T_GRANT: { REGISTER_STMT_RESOLVER(Grant); diff --git a/src/sql/resolver/ob_resolver_define.h b/src/sql/resolver/ob_resolver_define.h index 15ddfd8a03..6899d876e4 100644 --- a/src/sql/resolver/ob_resolver_define.h +++ b/src/sql/resolver/ob_resolver_define.h @@ -293,6 +293,23 @@ public: common::ObSEArray params_; }; +struct ObStarExpansionInfo{ + ObStarExpansionInfo() + :start_pos_(0), + end_pos_(0), + column_name_list_() + {} + + ~ObStarExpansionInfo() {} + +public: + int64_t start_pos_; + int64_t end_pos_; + common::ObArray column_name_list_; + + TO_STRING_KV(K_(start_pos), K_(end_pos), K_(column_name_list)); +}; + struct ObResolverParams { ObResolverParams() @@ -353,7 +370,8 @@ struct ObResolverParams is_in_sys_view_(false), is_expanding_view_(false), is_resolve_lateral_derived_table_(false), - package_guard_(NULL) + package_guard_(NULL), + star_expansion_infos_() {} bool is_force_trace_log() { return force_trace_log_; } @@ -424,6 +442,7 @@ public: bool is_expanding_view_; bool is_resolve_lateral_derived_table_; // used to mark resolve lateral derived table. pl::ObPLPackageGuard *package_guard_; + common::ObArray star_expansion_infos_; }; } // end namespace sql } // end namespace oceanbase diff --git a/src/sql/resolver/ob_resolver_utils.cpp b/src/sql/resolver/ob_resolver_utils.cpp index ab51879c6c..46fc5a4b4d 100644 --- a/src/sql/resolver/ob_resolver_utils.cpp +++ b/src/sql/resolver/ob_resolver_utils.cpp @@ -2387,6 +2387,10 @@ stmt::StmtType ObResolverUtils::get_stmt_type_by_item_type(const ObItemType item type = stmt::T_LOCK_TABLE; } break; + case T_ALTER_USER_DEFAULT_ROLE: { + type = stmt::T_ALTER_USER_PROFILE; + } + break; case T_SP_CALL_STMT: { type = stmt::T_CALL_PROCEDURE; } @@ -5365,6 +5369,35 @@ int ObResolverUtils::resolve_default_expr_v2_column_expr(ObResolverParams ¶m return ret; } +int ObResolverUtils::check_comment_length( + ObSQLSessionInfo *session_info, + char *str, + int64_t *str_len, + const int64_t max_len) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(session_info) || (NULL == str && *str_len != 0)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpect null pointer", K(session_info), K(str), K(ret)); + } else { + size_t tmp_len = ObCharset::charpos(CS_TYPE_UTF8MB4_GENERAL_CI, str, *str_len, max_len); + if (tmp_len < 0) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpect error", K(ret)); + } else if (tmp_len < *str_len) { + if (!is_strict_mode(session_info->get_sql_mode())) { + ret = OB_SUCCESS; + *str_len = tmp_len; + LOG_USER_WARN(OB_ERR_TOO_LONG_FIELD_COMMENT, max_len); + } else { + ret = OB_ERR_TOO_LONG_FIELD_COMMENT; + LOG_USER_ERROR(OB_ERR_TOO_LONG_FIELD_COMMENT, max_len); + } + } + } + return ret; +} + int ObResolverUtils::resolve_check_constraint_expr( ObResolverParams ¶ms, const ParseNode *node, diff --git a/src/sql/resolver/ob_resolver_utils.h b/src/sql/resolver/ob_resolver_utils.h index cf4d4e9d07..ad87d05fdb 100644 --- a/src/sql/resolver/ob_resolver_utils.h +++ b/src/sql/resolver/ob_resolver_utils.h @@ -531,6 +531,10 @@ public: share::schema::ObTableSchema &tbl_schema, share::schema::ObConstraint &constraint, ObRawExpr *&expr); + static int check_comment_length(ObSQLSessionInfo *session_info, + char *str, + int64_t *str_len, + const int64_t max_len); static int resolve_check_constraint_expr( ObResolverParams ¶ms, const ParseNode *node, diff --git a/src/sql/resolver/ob_schema_checker.cpp b/src/sql/resolver/ob_schema_checker.cpp index 64930c3f88..38f267c282 100644 --- a/src/sql/resolver/ob_schema_checker.cpp +++ b/src/sql/resolver/ob_schema_checker.cpp @@ -30,6 +30,8 @@ #include "share/schema/ob_sys_variable_mgr.h" // ObSimpleSysVariableSchema #include "sql/resolver/ob_stmt_resolver.h" #include "pl/ob_pl_stmt.h" +#include "sql/privilege_check/ob_privilege_check.h" +#include "sql/session/ob_sql_session_info.h" using namespace oceanbase::sql; using namespace oceanbase::common; @@ -569,9 +571,12 @@ int ObSchemaChecker::get_user_info(const uint64_t tenant_id, if (IS_NOT_INIT) { ret = OB_NOT_INIT; LOG_WARN("schema checker is not inited", K(is_inited_), K(ret)); - } else if (OB_UNLIKELY(OB_INVALID_ID == tenant_id || user_name.empty())) { + } else if (OB_UNLIKELY(OB_INVALID_ID == tenant_id)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid arguments", K(tenant_id), K(user_name), K(ret)); + } else if (OB_UNLIKELY(user_name.empty())) { + ret = OB_USER_NOT_EXIST; + LOG_WARN("user is not exist", K(tenant_id), K(user_name), K(host_name), K(ret)); } else if (OB_FAIL(schema_mgr_->get_user_id(tenant_id, user_name, host_name, user_id))) { LOG_WARN("get user id failed", K(tenant_id), K(user_name), K(host_name), K(ret)); } else if (OB_FAIL(get_user_info(tenant_id, user_id, user_info))) { @@ -2748,9 +2753,9 @@ int ObSchemaChecker::check_ora_grant_obj_priv( const uint64_t obj_id, const uint64_t obj_type, const share::ObRawObjPrivArray &table_priv_array, - const ObSEArray &ins_col_ids, - const ObSEArray &upd_col_ids, - const ObSEArray &ref_col_ids, + const ObIArray &ins_col_ids, + const ObIArray &upd_col_ids, + const ObIArray &ref_col_ids, uint64_t &grantor_id_out, const ObIArray &role_id_array) { @@ -3137,6 +3142,32 @@ int ObSchemaChecker::get_udt_attribute_id(const uint64_t udt_id, const ObString return ret; } +bool ObSchemaChecker::enable_mysql_pl_priv_check(int64_t tenant_id, ObSchemaGetterGuard &schema_guard) +{ + bool enable = false; + uint64_t compat_version = 0; + int ret = OB_SUCCESS; + if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, compat_version))) { + LOG_WARN("fail to get data version", K(tenant_id)); + } else if (lib::is_mysql_mode() && sql::ObSQLUtils::is_data_version_ge_423_or_431(compat_version)) { + const ObSysVarSchema *sys_var = NULL; + ObMalloc alloc(ObModIds::OB_TEMP_VARIABLES); + ObObj val; + if (OB_FAIL(schema_guard.get_tenant_system_variable(tenant_id, share::SYS_VAR__ENABLE_MYSQL_PL_PRIV_CHECK, sys_var))) { + LOG_WARN("fail to get tenant var schema", K(ret)); + } else if (OB_ISNULL(sys_var)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("sys variable schema is null", KR(ret)); + } else if (OB_FAIL(sys_var->get_value(&alloc, NULL, val))) { + LOG_WARN("fail to get charset var value", K(ret)); + } else { + enable = val.get_bool(); + } + } + LOG_DEBUG("show enabale mysql routine priv enable", K(enable)); + return enable; +} + int ObSchemaChecker::remove_tmp_cte_schemas(const ObString& cte_table_name) { int ret = OB_SUCCESS; @@ -3152,5 +3183,96 @@ int ObSchemaChecker::remove_tmp_cte_schemas(const ObString& cte_table_name) return ret; } +int ObSchemaChecker::check_mysql_grant_role_priv( + const ObSqlCtx &sql_ctx, + const ObIArray &granting_role_ids) +{ + int ret = OB_SUCCESS; + + //check SUPER or ROLE_ADMIN [TODO PRIV] + ObArenaAllocator alloc; + ObStmtNeedPrivs stmt_need_privs(alloc); + ObNeedPriv need_priv("", "", OB_PRIV_USER_LEVEL, OB_PRIV_SUPER, false); + OZ (stmt_need_privs.need_privs_.init(1)); + OZ (stmt_need_privs.need_privs_.push_back(need_priv)); + + if (OB_SUCC(ret) && OB_FAIL(ObPrivilegeCheck::check_privilege(sql_ctx, stmt_need_privs))) { + int ret_bak = ret; + ret = OB_SUCCESS; + const ObUserInfo *user_info = NULL; + uint64_t user_id = sql_ctx.session_info_->get_priv_user_id(); + OZ (get_user_info(sql_ctx.session_info_->get_effective_tenant_id(), user_id, user_info)); + for (int i = 0; OB_SUCC(ret) && i < granting_role_ids.count(); i++) { + int64_t idx = -1; + if (!has_exist_in_array(user_info->get_role_id_array(), granting_role_ids.at(i), &idx) + || ADMIN_OPTION != user_info->get_admin_option(user_info->get_role_id_option_array().at(idx))) { + ret = ret_bak; + } + } + } + + return ret; +} + +int ObSchemaChecker::check_mysql_revoke_role_priv( + const ObSqlCtx &sql_ctx, + const ObIArray &granting_role_ids) +{ + int ret = OB_SUCCESS; + + //check SUPER or ROLE_ADMIN [TODO PRIV] + ObArenaAllocator alloc; + ObStmtNeedPrivs stmt_need_privs(alloc); + ObNeedPriv need_priv("", "", OB_PRIV_USER_LEVEL, OB_PRIV_SUPER, false); + + CK (OB_NOT_NULL(sql_ctx.session_info_)); + OZ (stmt_need_privs.need_privs_.init(1)); + OZ (stmt_need_privs.need_privs_.push_back(need_priv)); + + if (OB_SUCC(ret) && OB_FAIL(ObPrivilegeCheck::check_privilege(sql_ctx, stmt_need_privs))) { + if (sql_ctx.session_info_->is_read_only()) { + //SUPER or CONNECTION_ADMIN [TODO PRIV] + } else { + int ret_bak = ret; + ret = OB_SUCCESS; + const ObUserInfo *user_info = NULL; + uint64_t user_id = sql_ctx.session_info_->get_priv_user_id(); + OZ (get_user_info(sql_ctx.session_info_->get_effective_tenant_id(), user_id, user_info)); + for (int i = 0; OB_SUCC(ret) && i < granting_role_ids.count(); i++) { + int64_t idx = -1; + if (!has_exist_in_array(user_info->get_role_id_array(), granting_role_ids.at(i), &idx) + || ADMIN_OPTION != user_info->get_admin_option(user_info->get_role_id_option_array().at(idx))) { + ret = ret_bak; + } + } + } + } + + return ret; +} + +int ObSchemaChecker::check_set_default_role_priv( + const ObSqlCtx &sql_ctx) +{ + int ret = OB_SUCCESS; + ObArenaAllocator alloc; + ObStmtNeedPrivs stmt_need_privs(alloc); + ObNeedPriv need_priv("mysql", "", OB_PRIV_DB_LEVEL, OB_PRIV_UPDATE, false); + + OZ (stmt_need_privs.need_privs_.init(1)); + OZ (stmt_need_privs.need_privs_.push_back(need_priv)); + + //check CREATE USER or UPDATE privilege on mysql + if (OB_SUCC(ret) && OB_FAIL(ObPrivilegeCheck::check_privilege(sql_ctx, stmt_need_privs))) { + stmt_need_privs.need_privs_.at(0) = + ObNeedPriv("", "", OB_PRIV_USER_LEVEL, OB_PRIV_CREATE_USER, false); + if (OB_FAIL(ObPrivilegeCheck::check_privilege(sql_ctx, stmt_need_privs))) { + LOG_WARN("no priv", K(ret)); + } + } + + return ret; +} + }//end of namespace sql }//end of namespace oceanbase diff --git a/src/sql/resolver/ob_schema_checker.h b/src/sql/resolver/ob_schema_checker.h index cc2ec0f228..f369b4b9a3 100644 --- a/src/sql/resolver/ob_schema_checker.h +++ b/src/sql/resolver/ob_schema_checker.h @@ -490,9 +490,9 @@ public: const uint64_t obj_id, const uint64_t obj_type, const share::ObRawObjPrivArray &table_priv_array, - const ObSEArray &ins_col_ids, - const ObSEArray &upd_col_ids, - const ObSEArray &ref_col_ids, + const ObIArray &ins_col_ids, + const ObIArray &upd_col_ids, + const ObIArray &ref_col_ids, uint64_t &grantor_id_out, const ObIArray &role_id_array); int check_ora_grant_sys_priv(const uint64_t tenant_id, @@ -503,10 +503,16 @@ public: const uint64_t user_id, const ObSEArray &role_granted_id_array, const ObIArray &role_id_array); + int check_mysql_grant_role_priv(const ObSqlCtx &sql_ctx, + const common::ObIArray &granting_role_ids); + int check_mysql_revoke_role_priv(const ObSqlCtx &sql_ctx, + const common::ObIArray &granting_role_ids); + int check_set_default_role_priv(const ObSqlCtx &sql_ctx); int set_lbca_op(); bool is_lbca_op(); static bool is_ora_priv_check(); + static bool enable_mysql_pl_priv_check(int64_t tenant_id, share::schema::ObSchemaGetterGuard &schema_guard); // dblink. int get_dblink_id(uint64_t tenant_id, const common::ObString &dblink_name, uint64_t &dblink_id); diff --git a/src/sql/resolver/ob_stmt_type.h b/src/sql/resolver/ob_stmt_type.h index 0532b9a9f8..8808e0dc0d 100644 --- a/src/sql/resolver/ob_stmt_type.h +++ b/src/sql/resolver/ob_stmt_type.h @@ -149,9 +149,9 @@ OB_STMT_TYPE_DEF(T_PURGE_TABLE, get_purge_table_stmt_need_privs, 137, ACTION_TYP OB_STMT_TYPE_DEF(T_PURGE_INDEX, get_purge_index_stmt_need_privs, 138, ACTION_TYPE_PURGE_INDEX) OB_STMT_TYPE_DEF_UNKNOWN_AT(T_SHOW_RECYCLEBIN, err_stmt_type_priv, 139) OB_STMT_TYPE_DEF_UNKNOWN_AT(T_ADMIN_UPGRADE_CMD, get_sys_tenant_alter_system_priv, 140) -OB_STMT_TYPE_DEF(T_CREATE_ROUTINE, no_priv_needed, 141, ACTION_TYPE_OB_CREATE_ROUTINE) -OB_STMT_TYPE_DEF(T_DROP_ROUTINE, no_priv_needed, 142, ACTION_TYPE_OB_DROP_ROUTINE) -OB_STMT_TYPE_DEF_UNKNOWN_AT(T_ALTER_ROUTINE, no_priv_needed, 143) +OB_STMT_TYPE_DEF(T_CREATE_ROUTINE, get_routine_stmt_need_privs, 141, ACTION_TYPE_OB_CREATE_ROUTINE) +OB_STMT_TYPE_DEF(T_DROP_ROUTINE, get_routine_stmt_need_privs, 142, ACTION_TYPE_OB_DROP_ROUTINE) +OB_STMT_TYPE_DEF_UNKNOWN_AT(T_ALTER_ROUTINE, get_routine_stmt_need_privs, 143) OB_STMT_TYPE_DEF(T_CALL_PROCEDURE, no_priv_needed, 144, ACTION_TYPE_EXECUTE_PROCEDURE) OB_STMT_TYPE_DEF(T_ANONYMOUS_BLOCK, no_priv_needed, 145, ACTION_TYPE_EXECUTE_PROCEDURE) OB_STMT_TYPE_DEF(T_CREATE_PACKAGE, no_priv_needed, 146, ACTION_TYPE_CREATE_PACKAGE) @@ -197,8 +197,8 @@ OB_STMT_TYPE_DEF(T_DROP_TABLESPACE, no_priv_needed, 187, ACTION_TYPE_DROP_TABLES OB_STMT_TYPE_DEF(T_CREATE_TRIGGER, no_priv_needed, 188, ACTION_TYPE_CREATE_TRIGGER) OB_STMT_TYPE_DEF(T_DROP_TRIGGER, no_priv_needed, 189, ACTION_TYPE_DROP_TRIGGER) OB_STMT_TYPE_DEF_UNKNOWN_AT(T_FLASHBACK_TABLE_TO_SCN, get_flashback_table_stmt_need_privs, 190) -OB_STMT_TYPE_DEF(T_CREATE_ROLE, no_priv_needed, 191, ACTION_TYPE_CREATE_ROLE) -OB_STMT_TYPE_DEF(T_DROP_ROLE, no_priv_needed, 192, ACTION_TYPE_DROP_ROLE) +OB_STMT_TYPE_DEF(T_CREATE_ROLE, get_role_privs, 191, ACTION_TYPE_CREATE_ROLE) +OB_STMT_TYPE_DEF(T_DROP_ROLE, get_role_privs, 192, ACTION_TYPE_DROP_ROLE) OB_STMT_TYPE_DEF(T_ALTER_ROLE, no_priv_needed, 193, ACTION_TYPE_ALTER_ROLE) OB_STMT_TYPE_DEF(T_SET_ROLE, no_priv_needed, 194, ACTION_TYPE_SET_ROLE) OB_STMT_TYPE_DEF(T_SYSTEM_GRANT, no_priv_needed, 195, ACTION_TYPE_SYSTEM_GRANT) diff --git a/src/sql/session/ob_basic_session_info.cpp b/src/sql/session/ob_basic_session_info.cpp index 153d64542e..f54663b733 100644 --- a/src/sql/session/ob_basic_session_info.cpp +++ b/src/sql/session/ob_basic_session_info.cpp @@ -5517,6 +5517,11 @@ int ObBasicSessionInfo::get_regexp_session_vars(ObExprRegexpSessionVariables &va return ret; } +int ObBasicSessionInfo::get_activate_all_role_on_login(bool &v) const +{ + return get_bool_sys_var(SYS_VAR_ACTIVATE_ALL_ROLES_ON_LOGIN, v); +} + void ObBasicSessionInfo::reset_tx_variable(bool reset_next_scope) { LOG_DEBUG("reset tx variable", K(lbt())); diff --git a/src/sql/session/ob_basic_session_info.h b/src/sql/session/ob_basic_session_info.h index e5d3d9e49c..7e44a2ab07 100644 --- a/src/sql/session/ob_basic_session_info.h +++ b/src/sql/session/ob_basic_session_info.h @@ -695,6 +695,7 @@ public: int get_regexp_stack_limit(int64_t &v) const; int get_regexp_time_limit(int64_t &v) const; int get_regexp_session_vars(ObExprRegexpSessionVariables &vars) const; + int get_activate_all_role_on_login(bool &v) const; int update_timezone_info(); const common::ObTimeZoneInfo *get_timezone_info() const { return tz_info_wrap_.get_time_zone_info(); } const common::ObTimeZoneInfoWrap &get_tz_info_wrap() const { return tz_info_wrap_; } diff --git a/src/sql/session/ob_sql_session_info.cpp b/src/sql/session/ob_sql_session_info.cpp index 1f3a931a4e..7e6f29abbc 100644 --- a/src/sql/session/ob_sql_session_info.cpp +++ b/src/sql/session/ob_sql_session_info.cpp @@ -1069,7 +1069,7 @@ void ObSQLSessionInfo::update_show_warnings_buf() void ObSQLSessionInfo::get_session_priv_info(share::schema::ObSessionPrivInfo &session_priv) const { session_priv.tenant_id_ = get_priv_tenant_id(); - session_priv.user_id_ = get_user_id(); + session_priv.user_id_ = get_priv_user_id(); session_priv.user_name_ = get_user_name(); session_priv.host_name_ = get_host_name(); session_priv.db_ = get_database_name(); diff --git a/tools/deploy/mysql_test/r/mysql/information_schema.result b/tools/deploy/mysql_test/r/mysql/information_schema.result index ab250f015e..80c1fed58b 100644 --- a/tools/deploy/mysql_test/r/mysql/information_schema.result +++ b/tools/deploy/mysql_test/r/mysql/information_schema.result @@ -192,6 +192,7 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | information_schema | COLUMNS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | information_schema | COLUMN_PRIVILEGES | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | information_schema | CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | information_schema | ENABLED_ROLES | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | information_schema | ENGINES | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | information_schema | FILES | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | information_schema | GLOBAL_STATUS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | @@ -217,12 +218,16 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | information_schema | USER_PRIVILEGES | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | information_schema | VIEWS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | information_schema | VIEW_TABLE_USAGE | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | mysql | columns_priv | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | mysql | db | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | mysql | default_roles | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | mysql | help_category | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | mysql | help_keyword | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | mysql | help_relation | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | mysql | help_topic | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | mysql | proc | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | mysql | procs_priv | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | mysql | role_edges | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | mysql | time_zone | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | mysql | time_zone_name | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | mysql | time_zone_transition | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | @@ -495,6 +500,8 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | __all_column_group_mapping | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_column_group_mapping_history | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_column_history | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | oceanbase | __all_column_privilege | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | oceanbase | __all_column_privilege_history | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_column_stat | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_column_stat_history | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_column_usage | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | @@ -582,6 +589,8 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | __all_routine_history | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_routine_param | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_routine_param_history | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | oceanbase | __all_routine_privilege | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | oceanbase | __all_routine_privilege_history | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_sequence_object | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_sequence_object_history | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_sequence_value | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | @@ -936,6 +945,15 @@ select * from information_schema.statistics where table_schema in ('oceanbase', | def | oceanbase | __all_column_history | 0 | oceanbase | PRIMARY | 2 | table_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_column_history | 0 | oceanbase | PRIMARY | 3 | column_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_column_history | 0 | oceanbase | PRIMARY | 4 | schema_version | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege | 0 | oceanbase | PRIMARY | 2 | priv_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege | 1 | oceanbase | idx_column_privilege_name | 1 | user_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege | 1 | oceanbase | idx_column_privilege_name | 2 | database_name | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege | 1 | oceanbase | idx_column_privilege_name | 3 | table_name | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege | 1 | oceanbase | idx_column_privilege_name | 4 | column_name | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege_history | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege_history | 0 | oceanbase | PRIMARY | 2 | priv_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege_history | 0 | oceanbase | PRIMARY | 3 | schema_version | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_column_stat | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_column_stat | 0 | oceanbase | PRIMARY | 2 | table_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_column_stat | 0 | oceanbase | PRIMARY | 3 | partition_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | @@ -1252,6 +1270,17 @@ select * from information_schema.statistics where table_schema in ('oceanbase', | def | oceanbase | __all_routine_param_history | 0 | oceanbase | PRIMARY | 2 | routine_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_routine_param_history | 0 | oceanbase | PRIMARY | 3 | sequence | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_routine_param_history | 0 | oceanbase | PRIMARY | 4 | schema_version | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege | 0 | oceanbase | PRIMARY | 2 | user_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege | 0 | oceanbase | PRIMARY | 3 | database_name | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege | 0 | oceanbase | PRIMARY | 4 | routine_name | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege | 0 | oceanbase | PRIMARY | 5 | routine_type | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege_history | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege_history | 0 | oceanbase | PRIMARY | 2 | user_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege_history | 0 | oceanbase | PRIMARY | 3 | database_name | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege_history | 0 | oceanbase | PRIMARY | 4 | routine_name | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege_history | 0 | oceanbase | PRIMARY | 5 | routine_type | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege_history | 0 | oceanbase | PRIMARY | 6 | schema_version | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_sequence_object | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_sequence_object | 0 | oceanbase | PRIMARY | 2 | sequence_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_sequence_object | 1 | oceanbase | idx_seq_obj_db_name | 1 | database_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | @@ -1544,14 +1573,18 @@ select * from information_schema.schemata where schema_name in ('oceanbase', 'my | def | oceanbase | utf8mb4 | utf8mb4_general_ci | NULL | NO | +--------------+--------------------+----------------------------+------------------------+----------+--------------------+ select * from information_schema.views where table_schema in ('oceanbase', 'mysql', 'information_schema') order by TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME; -+---------------+--------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ -| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | VIEW_DEFINITION | CHECK_OPTION | IS_UPDATABLE | DEFINER | SECURITY_TYPE | CHARACTER_SET_CLIENT | COLLATION_CONNECTION | -+---------------+--------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ -| def | mysql | time_zone | SELECT time_zone_id as Time_zone_id, use_leap_seconds as Use_leap_seconds FROM oceanbase.__all_tenant_time_zone | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | -| def | mysql | time_zone_name | SELECT name as Name, time_zone_id as Time_zone_id FROM oceanbase.__all_tenant_time_zone_name | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | -| def | mysql | time_zone_transition | SELECT time_zone_id as Time_zone_id, transition_time as Transition_time, transition_type_id as Transition_type_id FROM oceanbase.__all_tenant_time_zone_transition | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | -| def | mysql | time_zone_transition_type | SELECT time_zone_id as Time_zone_id, transition_type_id as Transition_type_id, offset as Offset, is_dst as Is_DST, abbreviation as Abbreviation FROM oceanbase.__all_tenant_time_zone_transition_type | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | -+---------------+--------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ ++---------------+--------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ +| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | VIEW_DEFINITION | CHECK_OPTION | IS_UPDATABLE | DEFINER | SECURITY_TYPE | CHARACTER_SET_CLIENT | COLLATION_CONNECTION | ++---------------+--------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ +| def | mysql | columns_priv | SELECT cast(b.host as char(255)) as Host, cast(a.database_name as char(128)) as Db, cast(b.user_name as char(128)) as User, cast(a.table_name as char(128)) as Table_name, cast(a.column_name as char(128)) as Column_name, substr(concat(case when (a.all_priv & 1) > 0 then ',Select' else '' end, case when (a.all_priv & 2) > 0 then ',Insert' else '' end, case when (a.all_priv & 4) > 0 then ',Update' else '' end, case when (a.all_priv & 8) > 0 then ',References' else '' end), 2) as Column_priv, cast(a.gmt_modified as datetime) as Timestamp FROM oceanbase.__all_column_privilege a, oceanbase.__all_user b WHERE a.tenant_id = 0 and a.tenant_id = b.tenant_id AND a.user_id = b.user_id | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | default_roles | SELECT cast(to_user.host AS char(255)) HOST, cast(to_user.user_name AS char(128)) USER, cast(from_user.host AS char(255)) DEFAULT_ROLE_HOST, cast(from_user.user_name AS char(128)) DEFAULT_ROLE_USER FROM oceanbase.__all_tenant_role_grantee_map role_map, oceanbase.__all_user from_user, oceanbase.__all_user to_user WHERE role_map.tenant_id = from_user.tenant_id AND role_map.tenant_id = to_user.tenant_id AND role_map.grantee_id = to_user.user_id AND role_map.role_id = from_user.user_id AND role_map.disable_flag = 0; | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | procs_priv | SELECT cast(b.host as char(60)) as Host, cast(a.database_name as char(64)) as Db, cast(b.user_name as char(32)) as User, cast(a.routine_name as char(64)) as Routine_name, case when a.routine_type = 1 then 'PROCEDURE' else 'FUNCTION' end as Routine_type, cast(c.priv_user as char(93)) as Grantor, substr(concat(case when (a.all_priv & 1) > 0 then ',Execute' else '' end, case when (a.all_priv & 2) > 0 then ',Alter Routine' else '' end, case when (a.all_priv & 4) > 0 then ',Grant' else '' end), 2) as Proc_priv, cast(a.gmt_modified as date) as Timestamp FROM oceanbase.__all_routine_privilege a, oceanbase.__all_user b, oceanbase.__all_routine c, oceanbase.__all_database d WHERE a.tenant_id = b.tenant_id AND a.user_id = b.user_id AND a.tenant_id = d.tenant_id and a.database_name = d.database_name AND a.tenant_id = c.tenant_id AND a.routine_name = c.routine_name AND a.routine_type = c.routine_type AND c.database_id = d.database_id AND c.package_id = -1; | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | role_edges | SELECT cast(from_user.host AS char(255)) FROM_HOST, cast(from_user.user_name AS char(128)) FROM_USER, cast(to_user.host AS char(255)) TO_HOST, cast(to_user.user_name AS char(128)) TO_USER, cast(CASE role_map.admin_option WHEN 1 THEN 'Y' ELSE 'N' END AS char(1)) WITH_ADMIN_OPTION FROM oceanbase.__all_tenant_role_grantee_map role_map, oceanbase.__all_user from_user, oceanbase.__all_user to_user WHERE role_map.tenant_id = from_user.tenant_id AND role_map.tenant_id = to_user.tenant_id AND role_map.grantee_id = to_user.user_id AND role_map.role_id = from_user.user_id; | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | time_zone | SELECT time_zone_id as Time_zone_id, use_leap_seconds as Use_leap_seconds FROM oceanbase.__all_tenant_time_zone | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | time_zone_name | SELECT name as Name, time_zone_id as Time_zone_id FROM oceanbase.__all_tenant_time_zone_name | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | time_zone_transition | SELECT time_zone_id as Time_zone_id, transition_time as Transition_time, transition_type_id as Transition_type_id FROM oceanbase.__all_tenant_time_zone_transition | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | time_zone_transition_type | SELECT time_zone_id as Time_zone_id, transition_type_id as Transition_type_id, offset as Offset, is_dst as Is_DST, abbreviation as Abbreviation FROM oceanbase.__all_tenant_time_zone_transition_type | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | ++---------------+--------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ select * from information_schema.files; +---------+-----------+-----------+-----------------+---------------+--------------+------------+--------------------+----------------------+--------+---------------+--------------+--------------+--------------+---------------+-------------+--------------+--------------+-----------------+---------------+------------------+------------------+--------------+---------------------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+-------------+-------------+------------+----------+--------+-------+ | FILE_ID | FILE_NAME | FILE_TYPE | TABLESPACE_NAME | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | LOGFILE_GROUP_NAME | LOGFILE_GROUP_NUMBER | ENGINE | FULLTEXT_KEYS | DELETED_ROWS | UPDATE_COUNT | FREE_EXTENTS | TOTAL_EXTENTS | EXTENT_SIZE | INITIAL_SIZE | MAXIMUM_SIZE | AUTOEXTEND_SIZE | CREATION_TIME | LAST_UPDATE_TIME | LAST_ACCESS_TIME | RECOVER_TIME | TRANSACTION_COUNTER | VERSION | ROW_FORMAT | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH | MAX_DATA_LENGTH | INDEX_LENGTH | DATA_FREE | CREATE_TIME | UPDATE_TIME | CHECK_TIME | CHECKSUM | STATUS | EXTRA | @@ -1572,6 +1605,7 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | information_schema | COLUMNS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | information_schema | COLUMN_PRIVILEGES | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | information_schema | CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | information_schema | ENABLED_ROLES | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | information_schema | ENGINES | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | information_schema | FILES | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | information_schema | GLOBAL_STATUS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | @@ -1597,12 +1631,16 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | information_schema | USER_PRIVILEGES | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | information_schema | VIEWS | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | information_schema | VIEW_TABLE_USAGE | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | mysql | columns_priv | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | mysql | db | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | mysql | default_roles | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | mysql | help_category | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | mysql | help_keyword | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | mysql | help_relation | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | mysql | help_topic | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | mysql | proc | SYSTEM TABLE | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | mysql | procs_priv | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | mysql | role_edges | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | mysql | time_zone | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | mysql | time_zone_name | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | mysql | time_zone_transition | SYSTEM VIEW | MEMORY | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | @@ -1874,6 +1912,8 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | __all_column_group_mapping | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_column_group_mapping_history | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_column_history | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | oceanbase | __all_column_privilege | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | oceanbase | __all_column_privilege_history | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_column_stat | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_column_stat_history | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_column_usage | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | @@ -1961,6 +2001,8 @@ select * from information_schema.tables where table_schema in ('oceanbase', 'mys | def | oceanbase | __all_routine_history | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_routine_param | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_routine_param_history | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | oceanbase | __all_routine_privilege | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | +| def | oceanbase | __all_routine_privilege_history | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_sequence_object | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_sequence_object_history | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | | def | oceanbase | __all_sequence_value | SYSTEM TABLE | InnoDB | NULL | DYNAMIC | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | utf8mb4_general_ci | NULL | NULL | | @@ -2271,15 +2313,19 @@ select * from information_schema.schemata where schema_name in ('oceanbase', 'my | def | test1 | utf8mb4 | utf8mb4_general_ci | NULL | NO | +--------------+--------------------+----------------------------+------------------------+----------+--------------------+ select * from information_schema.views where table_schema in ('oceanbase', 'mysql', 'information_schema', 'test1') order by TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME; -+---------------+--------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ -| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | VIEW_DEFINITION | CHECK_OPTION | IS_UPDATABLE | DEFINER | SECURITY_TYPE | CHARACTER_SET_CLIENT | COLLATION_CONNECTION | -+---------------+--------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ -| def | mysql | time_zone | SELECT time_zone_id as Time_zone_id, use_leap_seconds as Use_leap_seconds FROM oceanbase.__all_tenant_time_zone | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | -| def | mysql | time_zone_name | SELECT name as Name, time_zone_id as Time_zone_id FROM oceanbase.__all_tenant_time_zone_name | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | -| def | mysql | time_zone_transition | SELECT time_zone_id as Time_zone_id, transition_time as Transition_time, transition_type_id as Transition_type_id FROM oceanbase.__all_tenant_time_zone_transition | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | -| def | mysql | time_zone_transition_type | SELECT time_zone_id as Time_zone_id, transition_type_id as Transition_type_id, offset as Offset, is_dst as Is_DST, abbreviation as Abbreviation FROM oceanbase.__all_tenant_time_zone_transition_type | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | -| def | test1 | vt1tenant1 | select `test1`.`t1tenant1`.`c1` AS `c1`,`test1`.`t1tenant1`.`c2` AS `c2` from `test1`.`t1tenant1` | NONE | YES | admin@% | NONE | utf8mb4 | utf8mb4_general_ci | -+---------------+--------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ ++---------------+--------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ +| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | VIEW_DEFINITION | CHECK_OPTION | IS_UPDATABLE | DEFINER | SECURITY_TYPE | CHARACTER_SET_CLIENT | COLLATION_CONNECTION | ++---------------+--------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ +| def | mysql | columns_priv | SELECT cast(b.host as char(255)) as Host, cast(a.database_name as char(128)) as Db, cast(b.user_name as char(128)) as User, cast(a.table_name as char(128)) as Table_name, cast(a.column_name as char(128)) as Column_name, substr(concat(case when (a.all_priv & 1) > 0 then ',Select' else '' end, case when (a.all_priv & 2) > 0 then ',Insert' else '' end, case when (a.all_priv & 4) > 0 then ',Update' else '' end, case when (a.all_priv & 8) > 0 then ',References' else '' end), 2) as Column_priv, cast(a.gmt_modified as datetime) as Timestamp FROM oceanbase.__all_column_privilege a, oceanbase.__all_user b WHERE a.tenant_id = 0 and a.tenant_id = b.tenant_id AND a.user_id = b.user_id | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | default_roles | SELECT cast(to_user.host AS char(255)) HOST, cast(to_user.user_name AS char(128)) USER, cast(from_user.host AS char(255)) DEFAULT_ROLE_HOST, cast(from_user.user_name AS char(128)) DEFAULT_ROLE_USER FROM oceanbase.__all_tenant_role_grantee_map role_map, oceanbase.__all_user from_user, oceanbase.__all_user to_user WHERE role_map.tenant_id = from_user.tenant_id AND role_map.tenant_id = to_user.tenant_id AND role_map.grantee_id = to_user.user_id AND role_map.role_id = from_user.user_id AND role_map.disable_flag = 0; | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | procs_priv | SELECT cast(b.host as char(60)) as Host, cast(a.database_name as char(64)) as Db, cast(b.user_name as char(32)) as User, cast(a.routine_name as char(64)) as Routine_name, case when a.routine_type = 1 then 'PROCEDURE' else 'FUNCTION' end as Routine_type, cast(c.priv_user as char(93)) as Grantor, substr(concat(case when (a.all_priv & 1) > 0 then ',Execute' else '' end, case when (a.all_priv & 2) > 0 then ',Alter Routine' else '' end, case when (a.all_priv & 4) > 0 then ',Grant' else '' end), 2) as Proc_priv, cast(a.gmt_modified as date) as Timestamp FROM oceanbase.__all_routine_privilege a, oceanbase.__all_user b, oceanbase.__all_routine c, oceanbase.__all_database d WHERE a.tenant_id = b.tenant_id AND a.user_id = b.user_id AND a.tenant_id = d.tenant_id and a.database_name = d.database_name AND a.tenant_id = c.tenant_id AND a.routine_name = c.routine_name AND a.routine_type = c.routine_type AND c.database_id = d.database_id AND c.package_id = -1; | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | role_edges | SELECT cast(from_user.host AS char(255)) FROM_HOST, cast(from_user.user_name AS char(128)) FROM_USER, cast(to_user.host AS char(255)) TO_HOST, cast(to_user.user_name AS char(128)) TO_USER, cast(CASE role_map.admin_option WHEN 1 THEN 'Y' ELSE 'N' END AS char(1)) WITH_ADMIN_OPTION FROM oceanbase.__all_tenant_role_grantee_map role_map, oceanbase.__all_user from_user, oceanbase.__all_user to_user WHERE role_map.tenant_id = from_user.tenant_id AND role_map.tenant_id = to_user.tenant_id AND role_map.grantee_id = to_user.user_id AND role_map.role_id = from_user.user_id; | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | time_zone | SELECT time_zone_id as Time_zone_id, use_leap_seconds as Use_leap_seconds FROM oceanbase.__all_tenant_time_zone | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | time_zone_name | SELECT name as Name, time_zone_id as Time_zone_id FROM oceanbase.__all_tenant_time_zone_name | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | time_zone_transition | SELECT time_zone_id as Time_zone_id, transition_time as Transition_time, transition_type_id as Transition_type_id FROM oceanbase.__all_tenant_time_zone_transition | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | time_zone_transition_type | SELECT time_zone_id as Time_zone_id, transition_type_id as Transition_type_id, offset as Offset, is_dst as Is_DST, abbreviation as Abbreviation FROM oceanbase.__all_tenant_time_zone_transition_type | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | test1 | vt1tenant1 | select `test1`.`t1tenant1`.`c1` AS `c1`,`test1`.`t1tenant1`.`c2` AS `c2` from `test1`.`t1tenant1` | NONE | YES | admin@% | NONE | utf8mb4 | utf8mb4_general_ci | ++---------------+--------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ set @@session.ob_query_timeout = 60000000; use information_schema; @@ -2430,6 +2476,15 @@ select * from information_schema.statistics where table_schema in ('oceanbase', | def | oceanbase | __all_column_history | 0 | oceanbase | PRIMARY | 2 | table_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_column_history | 0 | oceanbase | PRIMARY | 3 | column_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_column_history | 0 | oceanbase | PRIMARY | 4 | schema_version | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege | 0 | oceanbase | PRIMARY | 2 | priv_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege | 1 | oceanbase | idx_column_privilege_name | 1 | user_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege | 1 | oceanbase | idx_column_privilege_name | 2 | database_name | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege | 1 | oceanbase | idx_column_privilege_name | 3 | table_name | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege | 1 | oceanbase | idx_column_privilege_name | 4 | column_name | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege_history | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege_history | 0 | oceanbase | PRIMARY | 2 | priv_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege_history | 0 | oceanbase | PRIMARY | 3 | schema_version | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_column_stat | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_column_stat | 0 | oceanbase | PRIMARY | 2 | table_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_column_stat | 0 | oceanbase | PRIMARY | 3 | partition_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | @@ -2859,6 +2914,17 @@ select * from information_schema.statistics where table_schema in ('oceanbase', | def | oceanbase | __all_routine_param_history | 0 | oceanbase | PRIMARY | 2 | routine_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_routine_param_history | 0 | oceanbase | PRIMARY | 3 | sequence | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_routine_param_history | 0 | oceanbase | PRIMARY | 4 | schema_version | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege | 0 | oceanbase | PRIMARY | 2 | user_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege | 0 | oceanbase | PRIMARY | 3 | database_name | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege | 0 | oceanbase | PRIMARY | 4 | routine_name | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege | 0 | oceanbase | PRIMARY | 5 | routine_type | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege_history | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege_history | 0 | oceanbase | PRIMARY | 2 | user_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege_history | 0 | oceanbase | PRIMARY | 3 | database_name | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege_history | 0 | oceanbase | PRIMARY | 4 | routine_name | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege_history | 0 | oceanbase | PRIMARY | 5 | routine_type | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege_history | 0 | oceanbase | PRIMARY | 6 | schema_version | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_seed_parameter | 0 | oceanbase | PRIMARY | 1 | zone | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_seed_parameter | 0 | oceanbase | PRIMARY | 2 | svr_type | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_seed_parameter | 0 | oceanbase | PRIMARY | 3 | svr_ip | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | @@ -3260,14 +3326,18 @@ select * from information_schema.statistics where table_schema in ('oceanbase', | def | oceanbase | __wr_sysstat | 0 | oceanbase | PRIMARY | 6 | stat_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +---------------+--------------+-------------------------------------------+------------+--------------+---------------------------------------------+--------------+-------------------------+-----------+-------------+----------+--------+----------+------------+---------+---------------+------------+------------+ select * from information_schema.views where table_schema in ('oceanbase', 'mysql', 'information_schema', 'SYS', 'LBACSYS', 'ORAAUDITOR') order by TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME; -+---------------+--------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ -| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | VIEW_DEFINITION | CHECK_OPTION | IS_UPDATABLE | DEFINER | SECURITY_TYPE | CHARACTER_SET_CLIENT | COLLATION_CONNECTION | -+---------------+--------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ -| def | mysql | time_zone | SELECT time_zone_id as Time_zone_id, use_leap_seconds as Use_leap_seconds FROM oceanbase.__all_tenant_time_zone | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | -| def | mysql | time_zone_name | SELECT name as Name, time_zone_id as Time_zone_id FROM oceanbase.__all_tenant_time_zone_name | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | -| def | mysql | time_zone_transition | SELECT time_zone_id as Time_zone_id, transition_time as Transition_time, transition_type_id as Transition_type_id FROM oceanbase.__all_tenant_time_zone_transition | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | -| def | mysql | time_zone_transition_type | SELECT time_zone_id as Time_zone_id, transition_type_id as Transition_type_id, offset as Offset, is_dst as Is_DST, abbreviation as Abbreviation FROM oceanbase.__all_tenant_time_zone_transition_type | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | -+---------------+--------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ ++---------------+--------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ +| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | VIEW_DEFINITION | CHECK_OPTION | IS_UPDATABLE | DEFINER | SECURITY_TYPE | CHARACTER_SET_CLIENT | COLLATION_CONNECTION | ++---------------+--------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ +| def | mysql | columns_priv | SELECT cast(b.host as char(255)) as Host, cast(a.database_name as char(128)) as Db, cast(b.user_name as char(128)) as User, cast(a.table_name as char(128)) as Table_name, cast(a.column_name as char(128)) as Column_name, substr(concat(case when (a.all_priv & 1) > 0 then ',Select' else '' end, case when (a.all_priv & 2) > 0 then ',Insert' else '' end, case when (a.all_priv & 4) > 0 then ',Update' else '' end, case when (a.all_priv & 8) > 0 then ',References' else '' end), 2) as Column_priv, cast(a.gmt_modified as datetime) as Timestamp FROM oceanbase.__all_column_privilege a, oceanbase.__all_user b WHERE a.tenant_id = 0 and a.tenant_id = b.tenant_id AND a.user_id = b.user_id | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | default_roles | SELECT cast(to_user.host AS char(255)) HOST, cast(to_user.user_name AS char(128)) USER, cast(from_user.host AS char(255)) DEFAULT_ROLE_HOST, cast(from_user.user_name AS char(128)) DEFAULT_ROLE_USER FROM oceanbase.__all_tenant_role_grantee_map role_map, oceanbase.__all_user from_user, oceanbase.__all_user to_user WHERE role_map.tenant_id = from_user.tenant_id AND role_map.tenant_id = to_user.tenant_id AND role_map.grantee_id = to_user.user_id AND role_map.role_id = from_user.user_id AND role_map.disable_flag = 0; | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | procs_priv | SELECT cast(b.host as char(60)) as Host, cast(a.database_name as char(64)) as Db, cast(b.user_name as char(32)) as User, cast(a.routine_name as char(64)) as Routine_name, case when a.routine_type = 1 then 'PROCEDURE' else 'FUNCTION' end as Routine_type, cast(c.priv_user as char(93)) as Grantor, substr(concat(case when (a.all_priv & 1) > 0 then ',Execute' else '' end, case when (a.all_priv & 2) > 0 then ',Alter Routine' else '' end, case when (a.all_priv & 4) > 0 then ',Grant' else '' end), 2) as Proc_priv, cast(a.gmt_modified as date) as Timestamp FROM oceanbase.__all_routine_privilege a, oceanbase.__all_user b, oceanbase.__all_routine c, oceanbase.__all_database d WHERE a.tenant_id = b.tenant_id AND a.user_id = b.user_id AND a.tenant_id = d.tenant_id and a.database_name = d.database_name AND a.tenant_id = c.tenant_id AND a.routine_name = c.routine_name AND a.routine_type = c.routine_type AND c.database_id = d.database_id AND c.package_id = -1; | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | role_edges | SELECT cast(from_user.host AS char(255)) FROM_HOST, cast(from_user.user_name AS char(128)) FROM_USER, cast(to_user.host AS char(255)) TO_HOST, cast(to_user.user_name AS char(128)) TO_USER, cast(CASE role_map.admin_option WHEN 1 THEN 'Y' ELSE 'N' END AS char(1)) WITH_ADMIN_OPTION FROM oceanbase.__all_tenant_role_grantee_map role_map, oceanbase.__all_user from_user, oceanbase.__all_user to_user WHERE role_map.tenant_id = from_user.tenant_id AND role_map.tenant_id = to_user.tenant_id AND role_map.grantee_id = to_user.user_id AND role_map.role_id = from_user.user_id; | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | time_zone | SELECT time_zone_id as Time_zone_id, use_leap_seconds as Use_leap_seconds FROM oceanbase.__all_tenant_time_zone | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | time_zone_name | SELECT name as Name, time_zone_id as Time_zone_id FROM oceanbase.__all_tenant_time_zone_name | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | time_zone_transition | SELECT time_zone_id as Time_zone_id, transition_time as Transition_time, transition_type_id as Transition_type_id FROM oceanbase.__all_tenant_time_zone_transition | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | time_zone_transition_type | SELECT time_zone_id as Time_zone_id, transition_type_id as Transition_type_id, offset as Offset, is_dst as Is_DST, abbreviation as Abbreviation FROM oceanbase.__all_tenant_time_zone_transition_type | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | ++---------------+--------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ use test1; ERROR 42000: Unknown database 'test1' @@ -3331,6 +3401,15 @@ select * from information_schema.statistics where table_schema in ('oceanbase', | def | oceanbase | __all_column_history | 0 | oceanbase | PRIMARY | 2 | table_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_column_history | 0 | oceanbase | PRIMARY | 3 | column_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_column_history | 0 | oceanbase | PRIMARY | 4 | schema_version | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege | 0 | oceanbase | PRIMARY | 2 | priv_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege | 1 | oceanbase | idx_column_privilege_name | 1 | user_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege | 1 | oceanbase | idx_column_privilege_name | 2 | database_name | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege | 1 | oceanbase | idx_column_privilege_name | 3 | table_name | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege | 1 | oceanbase | idx_column_privilege_name | 4 | column_name | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege_history | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege_history | 0 | oceanbase | PRIMARY | 2 | priv_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_column_privilege_history | 0 | oceanbase | PRIMARY | 3 | schema_version | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_column_stat | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_column_stat | 0 | oceanbase | PRIMARY | 2 | table_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_column_stat | 0 | oceanbase | PRIMARY | 3 | partition_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | @@ -3647,6 +3726,17 @@ select * from information_schema.statistics where table_schema in ('oceanbase', | def | oceanbase | __all_routine_param_history | 0 | oceanbase | PRIMARY | 2 | routine_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_routine_param_history | 0 | oceanbase | PRIMARY | 3 | sequence | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_routine_param_history | 0 | oceanbase | PRIMARY | 4 | schema_version | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege | 0 | oceanbase | PRIMARY | 2 | user_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege | 0 | oceanbase | PRIMARY | 3 | database_name | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege | 0 | oceanbase | PRIMARY | 4 | routine_name | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege | 0 | oceanbase | PRIMARY | 5 | routine_type | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege_history | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege_history | 0 | oceanbase | PRIMARY | 2 | user_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege_history | 0 | oceanbase | PRIMARY | 3 | database_name | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege_history | 0 | oceanbase | PRIMARY | 4 | routine_name | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege_history | 0 | oceanbase | PRIMARY | 5 | routine_type | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +| def | oceanbase | __all_routine_privilege_history | 0 | oceanbase | PRIMARY | 6 | schema_version | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_sequence_object | 0 | oceanbase | PRIMARY | 1 | tenant_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_sequence_object | 0 | oceanbase | PRIMARY | 2 | sequence_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | | def | oceanbase | __all_sequence_object | 1 | oceanbase | idx_seq_obj_db_name | 1 | database_id | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | @@ -3935,14 +4025,18 @@ select * from information_schema.statistics where table_schema in ('oceanbase', | def | test1 | t1tenant1 | 1 | test1 | t1tenant1_idx1 | 2 | c1 | A | NULL | NULL | NULL | | BTREE | VALID | | YES | NULL | +---------------+--------------+-------------------------------------------+------------+--------------+---------------------------------------------+--------------+-------------------------+-----------+-------------+----------+--------+----------+------------+---------+---------------+------------+------------+ select * from information_schema.views where table_schema in ('oceanbase', 'mysql', 'information_schema', 'test1') order by TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME; -+---------------+--------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ -| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | VIEW_DEFINITION | CHECK_OPTION | IS_UPDATABLE | DEFINER | SECURITY_TYPE | CHARACTER_SET_CLIENT | COLLATION_CONNECTION | -+---------------+--------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ -| def | mysql | time_zone | SELECT time_zone_id as Time_zone_id, use_leap_seconds as Use_leap_seconds FROM oceanbase.__all_tenant_time_zone | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | -| def | mysql | time_zone_name | SELECT name as Name, time_zone_id as Time_zone_id FROM oceanbase.__all_tenant_time_zone_name | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | -| def | mysql | time_zone_transition | SELECT time_zone_id as Time_zone_id, transition_time as Transition_time, transition_type_id as Transition_type_id FROM oceanbase.__all_tenant_time_zone_transition | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | -| def | mysql | time_zone_transition_type | SELECT time_zone_id as Time_zone_id, transition_type_id as Transition_type_id, offset as Offset, is_dst as Is_DST, abbreviation as Abbreviation FROM oceanbase.__all_tenant_time_zone_transition_type | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | -| def | test1 | vt1tenant1 | select `test1`.`t1tenant1`.`c1` AS `c1`,`test1`.`t1tenant1`.`c2` AS `c2` from `test1`.`t1tenant1` | NONE | YES | admin@% | NONE | utf8mb4 | utf8mb4_general_ci | -+---------------+--------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ ++---------------+--------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ +| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | VIEW_DEFINITION | CHECK_OPTION | IS_UPDATABLE | DEFINER | SECURITY_TYPE | CHARACTER_SET_CLIENT | COLLATION_CONNECTION | ++---------------+--------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ +| def | mysql | columns_priv | SELECT cast(b.host as char(255)) as Host, cast(a.database_name as char(128)) as Db, cast(b.user_name as char(128)) as User, cast(a.table_name as char(128)) as Table_name, cast(a.column_name as char(128)) as Column_name, substr(concat(case when (a.all_priv & 1) > 0 then ',Select' else '' end, case when (a.all_priv & 2) > 0 then ',Insert' else '' end, case when (a.all_priv & 4) > 0 then ',Update' else '' end, case when (a.all_priv & 8) > 0 then ',References' else '' end), 2) as Column_priv, cast(a.gmt_modified as datetime) as Timestamp FROM oceanbase.__all_column_privilege a, oceanbase.__all_user b WHERE a.tenant_id = 0 and a.tenant_id = b.tenant_id AND a.user_id = b.user_id | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | default_roles | SELECT cast(to_user.host AS char(255)) HOST, cast(to_user.user_name AS char(128)) USER, cast(from_user.host AS char(255)) DEFAULT_ROLE_HOST, cast(from_user.user_name AS char(128)) DEFAULT_ROLE_USER FROM oceanbase.__all_tenant_role_grantee_map role_map, oceanbase.__all_user from_user, oceanbase.__all_user to_user WHERE role_map.tenant_id = from_user.tenant_id AND role_map.tenant_id = to_user.tenant_id AND role_map.grantee_id = to_user.user_id AND role_map.role_id = from_user.user_id AND role_map.disable_flag = 0; | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | procs_priv | SELECT cast(b.host as char(60)) as Host, cast(a.database_name as char(64)) as Db, cast(b.user_name as char(32)) as User, cast(a.routine_name as char(64)) as Routine_name, case when a.routine_type = 1 then 'PROCEDURE' else 'FUNCTION' end as Routine_type, cast(c.priv_user as char(93)) as Grantor, substr(concat(case when (a.all_priv & 1) > 0 then ',Execute' else '' end, case when (a.all_priv & 2) > 0 then ',Alter Routine' else '' end, case when (a.all_priv & 4) > 0 then ',Grant' else '' end), 2) as Proc_priv, cast(a.gmt_modified as date) as Timestamp FROM oceanbase.__all_routine_privilege a, oceanbase.__all_user b, oceanbase.__all_routine c, oceanbase.__all_database d WHERE a.tenant_id = b.tenant_id AND a.user_id = b.user_id AND a.tenant_id = d.tenant_id and a.database_name = d.database_name AND a.tenant_id = c.tenant_id AND a.routine_name = c.routine_name AND a.routine_type = c.routine_type AND c.database_id = d.database_id AND c.package_id = -1; | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | role_edges | SELECT cast(from_user.host AS char(255)) FROM_HOST, cast(from_user.user_name AS char(128)) FROM_USER, cast(to_user.host AS char(255)) TO_HOST, cast(to_user.user_name AS char(128)) TO_USER, cast(CASE role_map.admin_option WHEN 1 THEN 'Y' ELSE 'N' END AS char(1)) WITH_ADMIN_OPTION FROM oceanbase.__all_tenant_role_grantee_map role_map, oceanbase.__all_user from_user, oceanbase.__all_user to_user WHERE role_map.tenant_id = from_user.tenant_id AND role_map.tenant_id = to_user.tenant_id AND role_map.grantee_id = to_user.user_id AND role_map.role_id = from_user.user_id; | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | time_zone | SELECT time_zone_id as Time_zone_id, use_leap_seconds as Use_leap_seconds FROM oceanbase.__all_tenant_time_zone | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | time_zone_name | SELECT name as Name, time_zone_id as Time_zone_id FROM oceanbase.__all_tenant_time_zone_name | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | time_zone_transition | SELECT time_zone_id as Time_zone_id, transition_time as Transition_time, transition_type_id as Transition_type_id FROM oceanbase.__all_tenant_time_zone_transition | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | mysql | time_zone_transition_type | SELECT time_zone_id as Time_zone_id, transition_type_id as Transition_type_id, offset as Offset, is_dst as Is_DST, abbreviation as Abbreviation FROM oceanbase.__all_tenant_time_zone_transition_type | NONE | NO | NONE | NONE | utf8mb4 | utf8mb4_general_ci | +| def | test1 | vt1tenant1 | select `test1`.`t1tenant1`.`c1` AS `c1`,`test1`.`t1tenant1`.`c2` AS `c2` from `test1`.`t1tenant1` | NONE | YES | admin@% | NONE | utf8mb4 | utf8mb4_general_ci | ++---------------+--------------+---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+ drop database test1; diff --git a/tools/deploy/mysql_test/test_suite/information_schema/r/mysql/information_schema_desc.result b/tools/deploy/mysql_test/test_suite/information_schema/r/mysql/information_schema_desc.result index 39b0815a73..cb921c5e62 100644 --- a/tools/deploy/mysql_test/test_suite/information_schema/r/mysql/information_schema_desc.result +++ b/tools/deploy/mysql_test/test_suite/information_schema/r/mysql/information_schema_desc.result @@ -254,7 +254,7 @@ View Create View character_set_client collation_connection PROCESSLIST CREATE VIEW `PROCESSLIST` AS SELECT id AS ID, user AS USER, concat(user_client_ip, ':', user_client_port) AS HOST, db AS DB, command AS COMMAND, time AS TIME, state AS STATE, info AS INFO FROM oceanbase.__all_virtual_processlist WHERE is_serving_tenant(svr_ip, svr_port, effective_tenant_id()) utf8mb4 utf8mb4_general_ci show create table schema_privileges; View Create View character_set_client collation_connection -SCHEMA_PRIVILEGES CREATE VIEW `SCHEMA_PRIVILEGES` AS SELECT CAST(CONCAT('''', V.USER_NAME, '''', '@', '''', V.HOST, '''') AS CHAR(81)) AS GRANTEE , CAST('def' AS CHAR(512)) AS TABLE_CATALOG , CAST(V.DATABASE_NAME AS CHAR(128)) collate utf8mb4_name_case AS TABLE_SCHEMA , CAST(V.PRIVILEGE_TYPE AS CHAR(64)) AS PRIVILEGE_TYPE , CAST(V.IS_GRANTABLE AS CHAR(3)) AS IS_GRANTABLE FROM (SELECT DP.DATABASE_NAME DATABASE_NAME, U.USER_NAME AS USER_NAME, U.HOST AS HOST, CASE WHEN V1.C1 = 1 AND DP.PRIV_ALTER = 1 THEN 'ALTER' WHEN V1.C1 = 2 AND DP.PRIV_CREATE = 1 THEN 'CREATE' WHEN V1.C1 = 4 AND DP.PRIV_DELETE = 1 THEN 'DELETE' WHEN V1.C1 = 5 AND DP.PRIV_DROP = 1 THEN 'DROP' WHEN V1.C1 = 7 AND DP.PRIV_INSERT = 1 THEN 'INSERT' WHEN V1.C1 = 8 AND DP.PRIV_UPDATE = 1 THEN 'UPDATE' WHEN V1.C1 = 9 AND DP.PRIV_SELECT = 1 THEN 'SELECT' WHEN V1.C1 = 10 AND DP.PRIV_INDEX = 1 THEN 'INDEX' WHEN V1.C1 = 11 AND DP.PRIV_CREATE_VIEW = 1 THEN 'CREATE VIEW' WHEN V1.C1 = 12 AND DP.PRIV_SHOW_VIEW = 1 THEN 'SHOW VIEW' ELSE NULL END PRIVILEGE_TYPE , CASE WHEN DP.PRIV_GRANT_OPTION = 1 THEN 'YES' WHEN DP.PRIV_GRANT_OPTION = 0 THEN 'NO' END IS_GRANTABLE FROM oceanbase.__all_database_privilege DP, oceanbase.__all_user U, (SELECT 1 AS C1 UNION ALL SELECT 2 AS C1 UNION ALL SELECT 4 AS C1 UNION ALL SELECT 5 AS C1 UNION ALL SELECT 7 AS C1 UNION ALL SELECT 8 AS C1 UNION ALL SELECT 9 AS C1 UNION ALL SELECT 10 AS C1 UNION ALL SELECT 11 AS C1 UNION ALL SELECT 12 AS C1) V1, (SELECT USER_ID FROM oceanbase.__all_user WHERE TENANT_ID= 0 AND CONCAT(USER_NAME, '@', HOST) = CURRENT_USER()) CURR LEFT JOIN (SELECT USER_ID FROM oceanbase.__all_database_privilege WHERE TENANT_ID = 0 AND DATABASE_NAME = 'mysql' AND PRIV_SELECT = 1) DB ON CURR.USER_ID = DB.USER_ID WHERE DP.TENANT_ID = 0 AND DP.TENANT_ID = U.TENANT_ID AND DP.USER_ID = U.USER_ID AND DP.DATABASE_NAME != '__recyclebin' AND DP.DATABASE_NAME != '__public' AND DP.DATABASE_NAME != 'SYS' AND DP.DATABASE_NAME != 'LBACSYS' AND DP.DATABASE_NAME != 'ORAAUDITOR' AND (DB.USER_ID IS NOT NULL OR 512 & CURRENT_USER_PRIV() = 512 OR DP.USER_ID = CURR.USER_ID)) V WHERE V.PRIVILEGE_TYPE IS NOT NULL utf8mb4 utf8mb4_general_ci +SCHEMA_PRIVILEGES CREATE VIEW `SCHEMA_PRIVILEGES` AS SELECT CAST(CONCAT('''', V.USER_NAME, '''', '@', '''', V.HOST, '''') AS CHAR(81)) AS GRANTEE , CAST('def' AS CHAR(512)) AS TABLE_CATALOG , CAST(V.DATABASE_NAME AS CHAR(128)) collate utf8mb4_name_case AS TABLE_SCHEMA , CAST(V.PRIVILEGE_TYPE AS CHAR(64)) AS PRIVILEGE_TYPE , CAST(V.IS_GRANTABLE AS CHAR(3)) AS IS_GRANTABLE FROM (SELECT DP.DATABASE_NAME DATABASE_NAME, U.USER_NAME AS USER_NAME, U.HOST AS HOST, CASE WHEN V1.C1 = 1 AND DP.PRIV_ALTER = 1 THEN 'ALTER' WHEN V1.C1 = 2 AND DP.PRIV_CREATE = 1 THEN 'CREATE' WHEN V1.C1 = 4 AND DP.PRIV_DELETE = 1 THEN 'DELETE' WHEN V1.C1 = 5 AND DP.PRIV_DROP = 1 THEN 'DROP' WHEN V1.C1 = 7 AND DP.PRIV_INSERT = 1 THEN 'INSERT' WHEN V1.C1 = 8 AND DP.PRIV_UPDATE = 1 THEN 'UPDATE' WHEN V1.C1 = 9 AND DP.PRIV_SELECT = 1 THEN 'SELECT' WHEN V1.C1 = 10 AND DP.PRIV_INDEX = 1 THEN 'INDEX' WHEN V1.C1 = 11 AND DP.PRIV_CREATE_VIEW = 1 THEN 'CREATE VIEW' WHEN V1.C1 = 12 AND DP.PRIV_SHOW_VIEW = 1 THEN 'SHOW VIEW' WHEN V1.C1 = 13 AND (U.PRIV_OTHERS & (1 << 0)) != 0 THEN 'EXECUTE' WHEN V1.C1 = 14 AND (U.PRIV_OTHERS & (1 << 1)) != 0 THEN 'ALTER ROUTINE' WHEN V1.C1 = 15 AND (U.PRIV_OTHERS & (1 << 2)) != 0 THEN 'CREATE ROUTINE' ELSE NULL END PRIVILEGE_TYPE , CASE WHEN DP.PRIV_GRANT_OPTION = 1 THEN 'YES' WHEN DP.PRIV_GRANT_OPTION = 0 THEN 'NO' END IS_GRANTABLE FROM oceanbase.__all_database_privilege DP, oceanbase.__all_user U, (SELECT 1 AS C1 UNION ALL SELECT 2 AS C1 UNION ALL SELECT 4 AS C1 UNION ALL SELECT 5 AS C1 UNION ALL SELECT 7 AS C1 UNION ALL SELECT 8 AS C1 UNION ALL SELECT 9 AS C1 UNION ALL SELECT 10 AS C1 UNION ALL SELECT 11 AS C1 UNION ALL SELECT 12 AS C1 UNION ALL SELECT 13 AS C1 UNION ALL SELECT 14 AS C1 UNION ALL SELECT 15 AS C1) V1, (SELECT USER_ID FROM oceanbase.__all_user WHERE TENANT_ID= 0 AND CONCAT(USER_NAME, '@', HOST) = CURRENT_USER()) CURR LEFT JOIN (SELECT USER_ID FROM oceanbase.__all_database_privilege WHERE TENANT_ID = 0 AND DATABASE_NAME = 'mysql' AND PRIV_SELECT = 1) DB ON CURR.USER_ID = DB.USER_ID WHERE DP.TENANT_ID = 0 AND DP.TENANT_ID = U.TENANT_ID AND DP.USER_ID = U.USER_ID AND DP.DATABASE_NAME != '__recyclebin' AND DP.DATABASE_NAME != '__public' AND DP.DATABASE_NAME != 'SYS' AND DP.DATABASE_NAME != 'LBACSYS' AND DP.DATABASE_NAME != 'ORAAUDITOR' AND (DB.USER_ID IS NOT NULL OR 512 & CURRENT_USER_PRIV() = 512 OR DP.USER_ID = CURR.USER_ID)) V WHERE V.PRIVILEGE_TYPE IS NOT NULL utf8mb4 utf8mb4_general_ci show create table schemata; View Create View character_set_client collation_connection SCHEMATA CREATE VIEW `SCHEMATA` AS SELECT 'def' AS CATALOG_NAME, DATABASE_NAME collate utf8mb4_name_case AS SCHEMA_NAME, b.charset AS DEFAULT_CHARACTER_SET_NAME, b.collation AS DEFAULT_COLLATION_NAME, CAST(NULL AS CHAR(512)) as SQL_PATH, 'NO' as DEFAULT_ENCRYPTION FROM oceanbase.__all_database a inner join oceanbase.__tenant_virtual_collation b ON a.collation_type = b.collation_type WHERE a.tenant_id = 0 and in_recyclebin = 0 and a.database_name not in ('__recyclebin', '__public') and 0 = sys_privilege_check('db_acc', 0, a.database_name, '') ORDER BY a.database_id utf8mb4 utf8mb4_general_ci @@ -284,7 +284,7 @@ View Create View character_set_client collation_connection TABLES CREATE VIEW `TABLES` AS select /*+ leading(a) no_use_nl(ts)*/ cast('def' as char(512)) as TABLE_CATALOG, cast(b.database_name as char(64)) collate utf8mb4_name_case as TABLE_SCHEMA, cast(a.table_name as char(64)) collate utf8mb4_name_case as TABLE_NAME, cast(case when (a.database_id = 201002 or a.table_type = 1) then 'SYSTEM VIEW' when a.table_type in (0, 2) then 'SYSTEM TABLE' when a.table_type = 4 then 'VIEW' else 'BASE TABLE' end as char(64)) as TABLE_TYPE, cast(case when a.table_type in (0,3,5,6,7,11,12,13,15) then 'InnoDB' else 'MEMORY' end as char(64)) as ENGINE, cast(NULL as unsigned) as VERSION, cast(a.store_format as char(10)) as ROW_FORMAT, cast( coalesce(ts.row_cnt,0) as unsigned) as TABLE_ROWS, cast( coalesce(ts.avg_row_len,0) as unsigned) as AVG_ROW_LENGTH, cast( coalesce(ts.data_size,0) as unsigned) as DATA_LENGTH, cast(NULL as unsigned) as MAX_DATA_LENGTH, cast(NULL as unsigned) as INDEX_LENGTH, cast(NULL as unsigned) as DATA_FREE, cast(NULL as unsigned) as AUTO_INCREMENT, cast(a.gmt_create as datetime) as CREATE_TIME, cast(a.gmt_modified as datetime) as UPDATE_TIME, cast(NULL as datetime) as CHECK_TIME, cast(d.collation as char(32)) as TABLE_COLLATION, cast(NULL as unsigned) as CHECKSUM, cast(NULL as char(255)) as CREATE_OPTIONS, cast(case when a.table_type = 4 then 'VIEW' else a.comment end as char(2048)) as TABLE_COMMENT from ( select cast(0 as signed) as tenant_id, c.database_id, c.table_id, c.table_name, c.collation_type, c.table_type, usec_to_time(d.schema_version) as gmt_create, usec_to_time(c.schema_version) as gmt_modified, c.comment, c.store_format from oceanbase.__all_virtual_core_all_table c join oceanbase.__all_virtual_core_all_table d on c.tenant_id = d.tenant_id and d.table_name = '__all_core_table' where c.tenant_id = effective_tenant_id() union all select tenant_id, database_id, table_id, table_name, collation_type, table_type, gmt_create, gmt_modified, comment, store_format from oceanbase.__all_table where table_mode >> 12 & 15 in (0,1)) a join oceanbase.__all_database b on a.database_id = b.database_id and a.tenant_id = b.tenant_id join oceanbase.__tenant_virtual_collation d on a.collation_type = d.collation_type left join ( select tenant_id, table_id, row_cnt, avg_row_len, (macro_blk_cnt * 2 * 1024 * 1024) as data_size from oceanbase.__all_table_stat where partition_id = -1 or partition_id = table_id) ts on a.table_id = ts.table_id and a.tenant_id = ts.tenant_id where a.tenant_id = 0 and a.table_type in (0, 1, 2, 3, 4, 14, 15) and b.database_name != '__recyclebin' and b.in_recyclebin = 0 and 0 = sys_privilege_check('table_acc', effective_tenant_id(), b.database_name, a.table_name) utf8mb4 utf8mb4_general_ci show create table user_privileges; View Create View character_set_client collation_connection -USER_PRIVILEGES CREATE VIEW `USER_PRIVILEGES` AS SELECT CAST(CONCAT('''', V.USER_NAME, '''', '@', '''', V.HOST, '''') AS CHAR(81)) AS GRANTEE , CAST('def' AS CHAR(512)) AS TABLE_CATALOG , CAST(V.PRIVILEGE_TYPE AS CHAR(64)) AS PRIVILEGE_TYPE , CAST(V.IS_GRANTABLE AS CHAR(3)) AS IS_GRANTABLE FROM (SELECT U.USER_NAME AS USER_NAME, U.HOST AS HOST, CASE WHEN V1.C1 = 1 AND U.PRIV_ALTER = 1 THEN 'ALTER' WHEN V1.C1 = 2 AND U.PRIV_CREATE = 1 THEN 'CREATE' WHEN V1.C1 = 3 AND U.PRIV_CREATE_USER = 1 THEN 'CREATE USER' WHEN V1.C1 = 4 AND U.PRIV_DELETE = 1 THEN 'DELETE' WHEN V1.C1 = 5 AND U.PRIV_DROP = 1 THEN 'DROP' WHEN V1.C1 = 7 AND U.PRIV_INSERT = 1 THEN 'INSERT' WHEN V1.C1 = 8 AND U.PRIV_UPDATE = 1 THEN 'UPDATE' WHEN V1.C1 = 9 AND U.PRIV_SELECT = 1 THEN 'SELECT' WHEN V1.C1 = 10 AND U.PRIV_INDEX = 1 THEN 'INDEX' WHEN V1.C1 = 11 AND U.PRIV_CREATE_VIEW = 1 THEN 'CREATE VIEW' WHEN V1.C1 = 12 AND U.PRIV_SHOW_VIEW = 1 THEN 'SHOW VIEW' WHEN V1.C1 = 13 AND U.PRIV_SHOW_DB = 1 THEN 'SHOW DATABASES' WHEN V1.C1 = 14 AND U.PRIV_SUPER = 1 THEN 'SUPER' WHEN V1.C1 = 15 AND U.PRIV_PROCESS = 1 THEN 'PROCESS' WHEN V1.C1 = 17 AND U.PRIV_CREATE_SYNONYM = 1 THEN 'CREATE SYNONYM' WHEN V1.C1 = 27 AND U.PRIV_FILE = 1 THEN 'FILE' WHEN V1.C1 = 28 AND U.PRIV_ALTER_TENANT = 1 THEN 'ALTER TENANT' WHEN V1.C1 = 29 AND U.PRIV_ALTER_SYSTEM = 1 THEN 'ALTER SYSTEM' WHEN V1.C1 = 30 AND U.PRIV_CREATE_RESOURCE_POOL = 1 THEN 'CREATE RESOURCE POOL' WHEN V1.C1 = 31 AND U.PRIV_CREATE_RESOURCE_UNIT = 1 THEN 'CREATE RESOURCE UNIT' WHEN V1.C1 = 33 AND U.PRIV_REPL_SLAVE = 1 THEN 'REPLICATION SLAVE' WHEN V1.C1 = 34 AND U.PRIV_REPL_CLIENT = 1 THEN 'REPLICATION CLIENT' WHEN V1.C1 = 35 AND U.PRIV_DROP_DATABASE_LINK = 1 THEN 'DROP DATABASE LINK' WHEN V1.C1 = 36 AND U.PRIV_CREATE_DATABASE_LINK = 1 THEN 'CREATE DATABASE LINK' WHEN V1.C1 = 0 AND U.PRIV_ALTER = 0 AND U.PRIV_CREATE = 0 AND U.PRIV_CREATE_USER = 0 AND U.PRIV_DELETE = 0 AND U.PRIV_DROP = 0 AND U.PRIV_INSERT = 0 AND U.PRIV_UPDATE = 0 AND U.PRIV_SELECT = 0 AND U.PRIV_INDEX = 0 AND U.PRIV_CREATE_VIEW = 0 AND U.PRIV_SHOW_VIEW = 0 AND U.PRIV_SHOW_DB = 0 AND U.PRIV_SUPER = 0 AND U.PRIV_PROCESS = 0 AND U.PRIV_CREATE_SYNONYM = 0 AND U.PRIV_FILE = 0 AND U.PRIV_ALTER_TENANT = 0 AND U.PRIV_ALTER_SYSTEM = 0 AND U.PRIV_CREATE_RESOURCE_POOL = 0 AND U.PRIV_CREATE_RESOURCE_UNIT = 0 AND U.PRIV_REPL_SLAVE = 0 AND U.PRIV_REPL_CLIENT = 0 AND U.PRIV_DROP_DATABASE_LINK = 0 AND U.PRIV_CREATE_DATABASE_LINK = 0 THEN 'USAGE' END PRIVILEGE_TYPE , CASE WHEN U.PRIV_GRANT_OPTION = 0 THEN 'NO' WHEN U.PRIV_ALTER = 0 AND U.PRIV_CREATE = 0 AND U.PRIV_CREATE_USER = 0 AND U.PRIV_DELETE = 0 AND U.PRIV_DROP = 0 AND U.PRIV_INSERT = 0 AND U.PRIV_UPDATE = 0 AND U.PRIV_SELECT = 0 AND U.PRIV_INDEX = 0 AND U.PRIV_CREATE_VIEW = 0 AND U.PRIV_SHOW_VIEW = 0 AND U.PRIV_SHOW_DB = 0 AND U.PRIV_SUPER = 0 AND U.PRIV_PROCESS = 0 AND U.PRIV_CREATE_SYNONYM = 0 AND U.PRIV_FILE = 0 AND U.PRIV_ALTER_TENANT = 0 AND U.PRIV_ALTER_SYSTEM = 0 AND U.PRIV_CREATE_RESOURCE_POOL = 0 AND U.PRIV_CREATE_RESOURCE_UNIT = 0 AND U.PRIV_REPL_SLAVE = 0 AND U.PRIV_REPL_CLIENT = 0 AND U.PRIV_DROP_DATABASE_LINK = 0 AND U.PRIV_CREATE_DATABASE_LINK = 0 THEN 'NO' WHEN U.PRIV_GRANT_OPTION = 1 THEN 'YES' END IS_GRANTABLE FROM oceanbase.__all_user U, (SELECT 0 AS C1 UNION ALL SELECT 1 AS C1 UNION ALL SELECT 2 AS C1 UNION ALL SELECT 3 AS C1 UNION ALL SELECT 4 AS C1 UNION ALL SELECT 5 AS C1 UNION ALL SELECT 7 AS C1 UNION ALL SELECT 8 AS C1 UNION ALL SELECT 9 AS C1 UNION ALL SELECT 10 AS C1 UNION ALL SELECT 11 AS C1 UNION ALL SELECT 12 AS C1 UNION ALL SELECT 13 AS C1 UNION ALL SELECT 14 AS C1 UNION ALL SELECT 15 AS C1 UNION ALL SELECT 17 AS C1 UNION ALL SELECT 27 AS C1 UNION ALL SELECT 28 AS C1 UNION ALL SELECT 29 AS C1 UNION ALL SELECT 30 AS C1 UNION ALL SELECT 31 AS C1 UNION ALL SELECT 33 AS C1 UNION ALL SELECT 34 AS C1 UNION ALL SELECT 35 AS C1 UNION ALL SELECT 36 AS C1) V1, (SELECT USER_ID FROM oceanbase.__all_user WHERE TENANT_ID = 0 AND CONCAT(USER_NAME, '@', HOST) = CURRENT_USER()) CURR LEFT JOIN (SELECT USER_ID FROM oceanbase.__all_database_privilege WHERE TENANT_ID = 0 AND DATABASE_NAME = 'mysql' AND PRIV_SELECT = 1) DB ON CURR.USER_ID = DB.USER_ID WHERE U.TENANT_ID = 0 AND (DB.USER_ID IS NOT NULL OR 512 & CURRENT_USER_PRIV() = 512 OR U.USER_ID = CURR.USER_ID)) V WHERE V.PRIVILEGE_TYPE IS NOT NULL utf8mb4 utf8mb4_general_ci +USER_PRIVILEGES CREATE VIEW `USER_PRIVILEGES` AS SELECT CAST(CONCAT('''', V.USER_NAME, '''', '@', '''', V.HOST, '''') AS CHAR(81)) AS GRANTEE , CAST('def' AS CHAR(512)) AS TABLE_CATALOG , CAST(V.PRIVILEGE_TYPE AS CHAR(64)) AS PRIVILEGE_TYPE , CAST(V.IS_GRANTABLE AS CHAR(3)) AS IS_GRANTABLE FROM (SELECT U.USER_NAME AS USER_NAME, U.HOST AS HOST, CASE WHEN V1.C1 = 1 AND U.PRIV_ALTER = 1 THEN 'ALTER' WHEN V1.C1 = 2 AND U.PRIV_CREATE = 1 THEN 'CREATE' WHEN V1.C1 = 3 AND U.PRIV_CREATE_USER = 1 THEN 'CREATE USER' WHEN V1.C1 = 4 AND U.PRIV_DELETE = 1 THEN 'DELETE' WHEN V1.C1 = 5 AND U.PRIV_DROP = 1 THEN 'DROP' WHEN V1.C1 = 7 AND U.PRIV_INSERT = 1 THEN 'INSERT' WHEN V1.C1 = 8 AND U.PRIV_UPDATE = 1 THEN 'UPDATE' WHEN V1.C1 = 9 AND U.PRIV_SELECT = 1 THEN 'SELECT' WHEN V1.C1 = 10 AND U.PRIV_INDEX = 1 THEN 'INDEX' WHEN V1.C1 = 11 AND U.PRIV_CREATE_VIEW = 1 THEN 'CREATE VIEW' WHEN V1.C1 = 12 AND U.PRIV_SHOW_VIEW = 1 THEN 'SHOW VIEW' WHEN V1.C1 = 13 AND U.PRIV_SHOW_DB = 1 THEN 'SHOW DATABASES' WHEN V1.C1 = 14 AND U.PRIV_SUPER = 1 THEN 'SUPER' WHEN V1.C1 = 15 AND U.PRIV_PROCESS = 1 THEN 'PROCESS' WHEN V1.C1 = 17 AND U.PRIV_CREATE_SYNONYM = 1 THEN 'CREATE SYNONYM' WHEN V1.C1 = 27 AND U.PRIV_FILE = 1 THEN 'FILE' WHEN V1.C1 = 28 AND U.PRIV_ALTER_TENANT = 1 THEN 'ALTER TENANT' WHEN V1.C1 = 29 AND U.PRIV_ALTER_SYSTEM = 1 THEN 'ALTER SYSTEM' WHEN V1.C1 = 30 AND U.PRIV_CREATE_RESOURCE_POOL = 1 THEN 'CREATE RESOURCE POOL' WHEN V1.C1 = 31 AND U.PRIV_CREATE_RESOURCE_UNIT = 1 THEN 'CREATE RESOURCE UNIT' WHEN V1.C1 = 33 AND U.PRIV_REPL_SLAVE = 1 THEN 'REPLICATION SLAVE' WHEN V1.C1 = 34 AND U.PRIV_REPL_CLIENT = 1 THEN 'REPLICATION CLIENT' WHEN V1.C1 = 35 AND U.PRIV_DROP_DATABASE_LINK = 1 THEN 'DROP DATABASE LINK' WHEN V1.C1 = 36 AND U.PRIV_CREATE_DATABASE_LINK = 1 THEN 'CREATE DATABASE LINK' WHEN V1.C1 = 37 AND (U.PRIV_OTHERS & (1 << 0)) != 0 THEN 'EXECUTE' WHEN V1.C1 = 38 AND (U.PRIV_OTHERS & (1 << 1)) != 0 THEN 'ALTER ROUTINE' WHEN V1.C1 = 39 AND (U.PRIV_OTHERS & (1 << 2)) != 0 THEN 'CREATE ROUTINE' WHEN V1.C1 = 0 AND U.PRIV_ALTER = 0 AND U.PRIV_CREATE = 0 AND U.PRIV_CREATE_USER = 0 AND U.PRIV_DELETE = 0 AND U.PRIV_DROP = 0 AND U.PRIV_INSERT = 0 AND U.PRIV_UPDATE = 0 AND U.PRIV_SELECT = 0 AND U.PRIV_INDEX = 0 AND U.PRIV_CREATE_VIEW = 0 AND U.PRIV_SHOW_VIEW = 0 AND U.PRIV_SHOW_DB = 0 AND U.PRIV_SUPER = 0 AND U.PRIV_PROCESS = 0 AND U.PRIV_CREATE_SYNONYM = 0 AND U.PRIV_FILE = 0 AND U.PRIV_ALTER_TENANT = 0 AND U.PRIV_ALTER_SYSTEM = 0 AND U.PRIV_CREATE_RESOURCE_POOL = 0 AND U.PRIV_CREATE_RESOURCE_UNIT = 0 AND U.PRIV_REPL_SLAVE = 0 AND U.PRIV_REPL_CLIENT = 0 AND U.PRIV_DROP_DATABASE_LINK = 0 AND U.PRIV_CREATE_DATABASE_LINK = 0 AND U.PRIV_OTHERS = 0 THEN 'USAGE' END PRIVILEGE_TYPE , CASE WHEN U.PRIV_GRANT_OPTION = 0 THEN 'NO' WHEN U.PRIV_ALTER = 0 AND U.PRIV_CREATE = 0 AND U.PRIV_CREATE_USER = 0 AND U.PRIV_DELETE = 0 AND U.PRIV_DROP = 0 AND U.PRIV_INSERT = 0 AND U.PRIV_UPDATE = 0 AND U.PRIV_SELECT = 0 AND U.PRIV_INDEX = 0 AND U.PRIV_CREATE_VIEW = 0 AND U.PRIV_SHOW_VIEW = 0 AND U.PRIV_SHOW_DB = 0 AND U.PRIV_SUPER = 0 AND U.PRIV_PROCESS = 0 AND U.PRIV_CREATE_SYNONYM = 0 AND U.PRIV_FILE = 0 AND U.PRIV_ALTER_TENANT = 0 AND U.PRIV_ALTER_SYSTEM = 0 AND U.PRIV_CREATE_RESOURCE_POOL = 0 AND U.PRIV_CREATE_RESOURCE_UNIT = 0 AND U.PRIV_REPL_SLAVE = 0 AND U.PRIV_REPL_CLIENT = 0 AND U.PRIV_DROP_DATABASE_LINK = 0 AND U.PRIV_CREATE_DATABASE_LINK = 0 AND U.PRIV_OTHERS = 0 THEN 'NO' WHEN U.PRIV_GRANT_OPTION = 1 THEN 'YES' END IS_GRANTABLE FROM oceanbase.__all_user U, (SELECT 0 AS C1 UNION ALL SELECT 1 AS C1 UNION ALL SELECT 2 AS C1 UNION ALL SELECT 3 AS C1 UNION ALL SELECT 4 AS C1 UNION ALL SELECT 5 AS C1 UNION ALL SELECT 7 AS C1 UNION ALL SELECT 8 AS C1 UNION ALL SELECT 9 AS C1 UNION ALL SELECT 10 AS C1 UNION ALL SELECT 11 AS C1 UNION ALL SELECT 12 AS C1 UNION ALL SELECT 13 AS C1 UNION ALL SELECT 14 AS C1 UNION ALL SELECT 15 AS C1 UNION ALL SELECT 17 AS C1 UNION ALL SELECT 27 AS C1 UNION ALL SELECT 28 AS C1 UNION ALL SELECT 29 AS C1 UNION ALL SELECT 30 AS C1 UNION ALL SELECT 31 AS C1 UNION ALL SELECT 33 AS C1 UNION ALL SELECT 34 AS C1 UNION ALL SELECT 35 AS C1 UNION ALL SELECT 36 AS C1 UNION ALL SELECT 37 AS C1 UNION ALL SELECT 38 AS C1 UNION ALL SELECT 39 AS C1) V1, (SELECT USER_ID FROM oceanbase.__all_user WHERE TENANT_ID = 0 AND CONCAT(USER_NAME, '@', HOST) = CURRENT_USER()) CURR LEFT JOIN (SELECT USER_ID FROM oceanbase.__all_database_privilege WHERE TENANT_ID = 0 AND DATABASE_NAME = 'mysql' AND PRIV_SELECT = 1) DB ON CURR.USER_ID = DB.USER_ID WHERE U.TENANT_ID = 0 AND (DB.USER_ID IS NOT NULL OR 512 & CURRENT_USER_PRIV() = 512 OR U.USER_ID = CURR.USER_ID)) V WHERE V.PRIVILEGE_TYPE IS NOT NULL utf8mb4 utf8mb4_general_ci show create table views; View Create View character_set_client collation_connection VIEWS CREATE VIEW `VIEWS` AS select cast('def' as CHAR(64)) AS TABLE_CATALOG, d.database_name collate utf8mb4_name_case as TABLE_SCHEMA, t.table_name collate utf8mb4_name_case as TABLE_NAME, t.view_definition as VIEW_DEFINITION, case t.view_check_option when 1 then 'LOCAL' when 2 then 'CASCADED' else 'NONE' end as CHECK_OPTION, case t.view_is_updatable when 1 then 'YES' else 'NO' end as IS_UPDATABLE, cast((case t.define_user_id when -1 then 'NONE' else concat(u.user_name, '@', u.host) end) as CHAR(288)) as DEFINER, cast('NONE' as CHAR(7)) AS SECURITY_TYPE, cast((case t.collation_type when 45 then 'utf8mb4' else 'NONE' end) as CHAR(64)) AS CHARACTER_SET_CLIENT, cast((case t.collation_type when 45 then 'utf8mb4_general_ci' else 'NONE' end) as CHAR(64)) AS COLLATION_CONNECTION from oceanbase.__all_table as t join oceanbase.__all_database as d on t.tenant_id = d.tenant_id and t.database_id = d.database_id left join oceanbase.__all_user as u on t.tenant_id = u.tenant_id and t.define_user_id = u.user_id and t.define_user_id != -1 where t.tenant_id = 0 and t.table_type in (1, 4) and t.table_mode >> 12 & 15 in (0,1) and d.in_recyclebin = 0 and d.database_name != '__recyclebin' and d.database_name != 'information_schema' and d.database_name != 'oceanbase' and 0 = sys_privilege_check('table_acc', effective_tenant_id(), d.database_name, t.table_name) utf8mb4 utf8mb4_general_ci diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_mysql.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_mysql.result index d560c4dead..20dabcbc07 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_mysql.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_mysql.result @@ -1900,9 +1900,9 @@ desc information_schema.COLUMN_PRIVILEGES; Field Type Null Key Default Extra GRANTEE varchar(292) NO TABLE_CATALOG varchar(512) NO -TABLE_SCHEMA varchar(64) NO -TABLE_NAME varchar(64) NO -COLUMN_NAME varchar(64) NO +TABLE_SCHEMA varchar(64) NO NULL +TABLE_NAME varchar(64) NO NULL +COLUMN_NAME varchar(64) NO NULL PRIVILEGE_TYPE varchar(64) NO IS_GRANTABLE varchar(3) NO select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from information_schema.COLUMN_PRIVILEGES limit 1); @@ -4366,6 +4366,9 @@ PRIV_REPL_SLAVE varchar(3) NO PRIV_REPL_CLIENT varchar(3) NO PRIV_DROP_DATABASE_LINK varchar(3) NO PRIV_CREATE_DATABASE_LINK varchar(3) NO +PRIV_EXECUTE varchar(3) NO +PRIV_ALTER_ROUTINE varchar(3) NO +PRIV_CREATE_ROUTINE varchar(3) NO select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.DBA_OB_USERS limit 1); cnt 1 @@ -4387,6 +4390,9 @@ PRIV_SELECT varchar(3) NO PRIV_INDEX varchar(3) NO PRIV_CREATE_VIEW varchar(3) NO PRIV_SHOW_VIEW varchar(3) NO +PRIV_EXECUTE varchar(3) NO +PRIV_ALTER_ROUTINE varchar(3) NO +PRIV_CREATE_ROUTINE varchar(3) NO select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.DBA_OB_DATABASE_PRIVILEGE limit 1); cnt 1 @@ -5704,6 +5710,19 @@ CGROUP_PATH varchar(256) NO select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_CGROUP_CONFIG limit 1); cnt 1 +desc mysql.procs_priv; +Field Type Null Key Default Extra +Host varchar(60) NO +Db varchar(64) NO NULL +User varchar(32) NO NULL +Routine_name varchar(64) NO NULL +Routine_type varchar(9) NO +Grantor varchar(93) YES NULL +Proc_priv varchar(27) NO +Timestamp date YES +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from mysql.procs_priv limit 1); +cnt +1 desc oceanbase.DBA_OB_AUX_STATISTICS; Field Type Null Key Default Extra LAST_ANALYZED timestamp(6) NO NULL @@ -5781,6 +5800,37 @@ COMMENT longtext YES NULL select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.DBA_OB_TRANSFER_PARTITION_TASK_HISTORY limit 1); cnt 1 +desc mysql.role_edges; +Field Type Null Key Default Extra +FROM_HOST varchar(255) NO +FROM_USER varchar(128) NO NULL +TO_HOST varchar(255) NO +TO_USER varchar(128) NO NULL +WITH_ADMIN_OPTION varchar(1) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from mysql.role_edges limit 1); +cnt +1 +desc mysql.default_roles; +Field Type Null Key Default Extra +HOST varchar(255) NO +USER varchar(128) NO NULL +DEFAULT_ROLE_HOST varchar(255) NO +DEFAULT_ROLE_USER varchar(128) NO NULL +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from mysql.default_roles limit 1); +cnt +1 +desc mysql.columns_priv; +Field Type Null Key Default Extra +Host varchar(255) NO +Db varchar(128) NO NULL +User varchar(128) NO NULL +Table_name varchar(128) NO NULL +Column_name varchar(128) NO NULL +Column_priv varchar(31) NO +Timestamp datetime YES +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from mysql.columns_priv limit 1); +cnt +1 desc oceanbase.GV$OB_LS_SNAPSHOTS; Field Type Null Key Default Extra TENANT_ID bigint(20) NO NULL diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_sys.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_sys.result index bb34985787..f32168d51a 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_sys.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_sys_views_in_sys.result @@ -2031,9 +2031,9 @@ desc information_schema.COLUMN_PRIVILEGES; Field Type Null Key Default Extra GRANTEE varchar(292) NO TABLE_CATALOG varchar(512) NO -TABLE_SCHEMA varchar(64) NO -TABLE_NAME varchar(64) NO -COLUMN_NAME varchar(64) NO +TABLE_SCHEMA varchar(64) NO NULL +TABLE_NAME varchar(64) NO NULL +COLUMN_NAME varchar(64) NO NULL PRIVILEGE_TYPE varchar(64) NO IS_GRANTABLE varchar(3) NO select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from information_schema.COLUMN_PRIVILEGES limit 1); @@ -6099,6 +6099,9 @@ PRIV_REPL_SLAVE varchar(3) NO PRIV_REPL_CLIENT varchar(3) NO PRIV_DROP_DATABASE_LINK varchar(3) NO PRIV_CREATE_DATABASE_LINK varchar(3) NO +PRIV_EXECUTE varchar(3) NO +PRIV_ALTER_ROUTINE varchar(3) NO +PRIV_CREATE_ROUTINE varchar(3) NO select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.DBA_OB_USERS limit 1); cnt 1 @@ -6144,6 +6147,9 @@ PRIV_REPL_SLAVE varchar(3) NO PRIV_REPL_CLIENT varchar(3) NO PRIV_DROP_DATABASE_LINK varchar(3) NO PRIV_CREATE_DATABASE_LINK varchar(3) NO +PRIV_EXECUTE varchar(3) NO +PRIV_ALTER_ROUTINE varchar(3) NO +PRIV_CREATE_ROUTINE varchar(3) NO select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.CDB_OB_USERS limit 1); cnt 1 @@ -6165,6 +6171,9 @@ PRIV_SELECT varchar(3) NO PRIV_INDEX varchar(3) NO PRIV_CREATE_VIEW varchar(3) NO PRIV_SHOW_VIEW varchar(3) NO +PRIV_EXECUTE varchar(3) NO +PRIV_ALTER_ROUTINE varchar(3) NO +PRIV_CREATE_ROUTINE varchar(3) NO select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.DBA_OB_DATABASE_PRIVILEGE limit 1); cnt 1 @@ -6187,6 +6196,9 @@ PRIV_SELECT varchar(3) NO PRIV_INDEX varchar(3) NO PRIV_CREATE_VIEW varchar(3) NO PRIV_SHOW_VIEW varchar(3) NO +PRIV_EXECUTE varchar(3) NO +PRIV_ALTER_ROUTINE varchar(3) NO +PRIV_CREATE_ROUTINE varchar(3) NO select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.CDB_OB_DATABASE_PRIVILEGE limit 1); cnt 1 @@ -8157,6 +8169,19 @@ CGROUP_PATH varchar(256) NO select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.V$OB_CGROUP_CONFIG limit 1); cnt 1 +desc mysql.procs_priv; +Field Type Null Key Default Extra +Host varchar(60) NO +Db varchar(64) NO NULL +User varchar(32) NO NULL +Routine_name varchar(64) NO NULL +Routine_type varchar(9) NO +Grantor varchar(93) YES NULL +Proc_priv varchar(27) NO +Timestamp date YES +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from mysql.procs_priv limit 1); +cnt +1 desc oceanbase.DBA_OB_AUX_STATISTICS; Field Type Null Key Default Extra LAST_ANALYZED timestamp(6) NO NULL @@ -8308,6 +8333,25 @@ ERROR_MESSAGE varchar(512) YES NULL select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.DBA_OB_CLONE_PROGRESS limit 1); cnt 1 +desc mysql.role_edges; +Field Type Null Key Default Extra +FROM_HOST varchar(255) NO +FROM_USER varchar(128) NO NULL +TO_HOST varchar(255) NO +TO_USER varchar(128) NO NULL +WITH_ADMIN_OPTION varchar(1) NO +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from mysql.role_edges limit 1); +cnt +1 +desc mysql.default_roles; +Field Type Null Key Default Extra +HOST varchar(255) NO +USER varchar(128) NO NULL +DEFAULT_ROLE_HOST varchar(255) NO +DEFAULT_ROLE_USER varchar(128) NO NULL +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from mysql.default_roles limit 1); +cnt +1 desc oceanbase.CDB_INDEX_USAGE; Field Type Null Key Default Extra CON_ID bigint(20) NO NULL @@ -8331,6 +8375,18 @@ LAST_USED varchar(128) NO NULL select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from oceanbase.CDB_INDEX_USAGE limit 1); cnt 1 +desc mysql.columns_priv; +Field Type Null Key Default Extra +Host varchar(255) NO +Db varchar(128) NO NULL +User varchar(128) NO NULL +Table_name varchar(128) NO NULL +Column_name varchar(128) NO NULL +Column_priv varchar(31) NO +Timestamp datetime YES +select /*+QUERY_TIMEOUT(60000000)*/ count(*) as cnt from (select * from mysql.columns_priv limit 1); +cnt +1 desc oceanbase.GV$OB_LS_SNAPSHOTS; Field Type Null Key Default Extra TENANT_ID bigint(20) NO NULL diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_mysql.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_mysql.result index a34d87ced0..0caca5c22a 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_mysql.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_mysql.result @@ -4778,6 +4778,15 @@ ls_meta_package longtext YES NULL select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_tenant_snapshot_ls_replica_history; IF(count(*) >= 0, 1, 0) 1 +desc information_schema.ENABLED_ROLES; +Field Type Null Key Default Extra +ROLE_NAME varchar(128) YES NULL +ROLE_HOST varchar(1024) YES NULL +IS_DEFAULT varchar(1024) YES NULL +IS_MANDATORY varchar(1024) NO +select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from information_schema.ENABLED_ROLES; +IF(count(*) >= 0, 1, 0) +1 desc oceanbase.__all_virtual_nic_info; Field Type Null Key Default Extra svr_ip varchar(46) NO NULL diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_sys.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_sys.result index 9e1a400e04..8a6deea5ae 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_sys.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_sys.result @@ -9162,6 +9162,34 @@ IF(count(*) >= 0, 1, 0) "oceanbase.__all_virtual_checkpoint_diagnose_info runs in single server" IF(count(*) >= 0, 1, 0) 1 +desc oceanbase.__all_virtual_routine_privilege; +Field Type Null Key Default Extra +tenant_id bigint(20) NO PRI NULL +user_id bigint(20) NO PRI NULL +database_name varbinary(2048) NO PRI NULL +routine_name varbinary(2048) NO PRI NULL +routine_type bigint(20) NO PRI NULL +gmt_create timestamp(6) NO NULL +gmt_modified timestamp(6) NO NULL +all_priv bigint(20) NO 0 +select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_routine_privilege; +IF(count(*) >= 0, 1, 0) +1 +desc oceanbase.__all_virtual_routine_privilege_history; +Field Type Null Key Default Extra +tenant_id bigint(20) NO PRI NULL +user_id bigint(20) NO PRI NULL +database_name varbinary(2048) NO PRI NULL +routine_name varbinary(2048) NO PRI NULL +routine_type bigint(20) NO PRI NULL +schema_version bigint(20) NO PRI NULL +gmt_create timestamp(6) NO NULL +gmt_modified timestamp(6) NO NULL +is_deleted bigint(20) NO NULL +all_priv bigint(20) YES 0 +select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_routine_privilege_history; +IF(count(*) >= 0, 1, 0) +1 desc oceanbase.__all_virtual_aux_stat; Field Type Null Key Default Extra tenant_id bigint(20) NO PRI NULL @@ -9279,6 +9307,36 @@ last_flush_time timestamp(6) NO NULL select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_index_usage_info; IF(count(*) >= 0, 1, 0) 1 +desc oceanbase.__all_virtual_column_privilege; +Field Type Null Key Default Extra +tenant_id bigint(20) NO PRI NULL +priv_id bigint(20) NO PRI NULL +gmt_create timestamp(6) NO NULL +gmt_modified timestamp(6) NO NULL +user_id bigint(20) NO NULL +database_name varbinary(1024) NO NULL +table_name varbinary(1024) NO NULL +column_name varbinary(1024) NO NULL +all_priv bigint(20) NO 0 +select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_column_privilege; +IF(count(*) >= 0, 1, 0) +1 +desc oceanbase.__all_virtual_column_privilege_history; +Field Type Null Key Default Extra +tenant_id bigint(20) NO PRI NULL +priv_id bigint(20) NO PRI NULL +schema_version bigint(20) NO PRI NULL +gmt_create timestamp(6) NO NULL +gmt_modified timestamp(6) NO NULL +is_deleted bigint(20) NO NULL +user_id bigint(20) YES NULL +database_name varbinary(1024) YES NULL +table_name varbinary(1024) YES NULL +column_name varbinary(1024) YES NULL +all_priv bigint(20) YES 0 +select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_column_privilege_history; +IF(count(*) >= 0, 1, 0) +1 desc oceanbase.__all_virtual_tenant_snapshot_ls_replica_history; Field Type Null Key Default Extra tenant_id bigint(20) NO PRI NULL @@ -9297,6 +9355,15 @@ ls_meta_package longtext YES NULL select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_tenant_snapshot_ls_replica_history; IF(count(*) >= 0, 1, 0) 1 +desc information_schema.ENABLED_ROLES; +Field Type Null Key Default Extra +ROLE_NAME varchar(128) YES NULL +ROLE_HOST varchar(1024) YES NULL +IS_DEFAULT varchar(1024) YES NULL +IS_MANDATORY varchar(1024) NO +select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from information_schema.ENABLED_ROLES; +IF(count(*) >= 0, 1, 0) +1 desc oceanbase.__all_virtual_nic_info; Field Type Null Key Default Extra svr_ip varchar(46) NO NULL diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/inner_table_overall.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/inner_table_overall.result index 0ae6928389..538361d1b1 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/inner_table_overall.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/inner_table_overall.result @@ -279,6 +279,8 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 484 __all_storage_ha_perf_diagnose_history 0 201001 1 485 __all_clone_job 0 201001 1 486 __all_clone_job_history 0 201001 1 +490 __all_routine_privilege 0 201001 1 +491 __all_routine_privilege_history 0 201001 1 493 __all_ncomp_dll 0 201001 1 494 __all_aux_stat 0 201001 1 495 __all_index_usage_info 0 201001 1 @@ -286,6 +288,8 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 499 __all_transfer_partition_task_history 0 201001 1 500 __all_tenant_snapshot_job 0 201001 1 502 __all_trusted_root_certificate 0 201001 1 +505 __all_column_privilege 0 201001 1 +506 __all_column_privilege_history 0 201001 1 507 __all_tenant_snapshot_ls_replica_history 0 201001 1 10001 __tenant_virtual_all_table 2 201001 1 10002 __tenant_virtual_table_column 2 201001 1 @@ -713,6 +717,8 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 12437 __all_virtual_checkpoint_diagnose_memtable_info 2 201001 1 12438 __all_virtual_checkpoint_diagnose_checkpoint_unit_info 2 201001 1 12439 __all_virtual_checkpoint_diagnose_info 2 201001 1 +12443 __all_virtual_routine_privilege 2 201001 1 +12444 __all_virtual_routine_privilege_history 2 201001 1 12447 __all_virtual_aux_stat 2 201001 1 12450 __all_virtual_sys_variable_default_value 2 201001 1 12451 __all_virtual_transfer_partition_task 2 201001 1 @@ -720,7 +726,10 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 12453 __all_virtual_tenant_snapshot_job 2 201001 1 12458 __all_virtual_ls_snapshot 2 201001 1 12459 __all_virtual_index_usage_info 2 201001 1 +12462 __all_virtual_column_privilege 2 201001 1 +12463 __all_virtual_column_privilege_history 2 201001 1 12464 __all_virtual_tenant_snapshot_ls_replica_history 2 201001 1 +12466 ENABLED_ROLES 2 201002 1 12487 __all_virtual_nic_info 2 201001 1 20001 GV$OB_PLAN_CACHE_STAT 1 201001 1 20002 GV$OB_PLAN_CACHE_PLAN_STAT 1 201001 1 @@ -1093,6 +1102,7 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 21478 V$OB_TENANT_RUNTIME_INFO 1 201001 1 21479 GV$OB_CGROUP_CONFIG 1 201001 1 21480 V$OB_CGROUP_CONFIG 1 201001 1 +21486 procs_priv 1 201003 1 21497 DBA_OB_AUX_STATISTICS 1 201001 1 21498 CDB_OB_AUX_STATISTICS 1 201001 1 21499 DBA_INDEX_USAGE 1 201001 1 @@ -1103,7 +1113,10 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 21504 CDB_OB_TRANSFER_PARTITION_TASK_HISTORY 1 201001 1 21509 DBA_OB_TRUSTED_ROOT_CERTIFICATE 1 201001 1 21510 DBA_OB_CLONE_PROGRESS 1 201001 1 +21511 role_edges 1 201003 1 +21512 default_roles 1 201003 1 21513 CDB_INDEX_USAGE 1 201001 1 +21516 columns_priv 1 201003 1 21517 GV$OB_LS_SNAPSHOTS 1 201001 1 21518 V$OB_LS_SNAPSHOTS 1 201001 1 21519 DBA_OB_CLONE_HISTORY 1 201001 1 diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/user_privileges.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/user_privileges.result index b3d62f504e..c036fb5f58 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/user_privileges.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/user_privileges.result @@ -1,6 +1,6 @@ show create table information_schema.user_privileges; View Create View character_set_client collation_connection -USER_PRIVILEGES CREATE VIEW `USER_PRIVILEGES` AS SELECT CAST(CONCAT('''', V.USER_NAME, '''', '@', '''', V.HOST, '''') AS CHAR(81)) AS GRANTEE , CAST('def' AS CHAR(512)) AS TABLE_CATALOG , CAST(V.PRIVILEGE_TYPE AS CHAR(64)) AS PRIVILEGE_TYPE , CAST(V.IS_GRANTABLE AS CHAR(3)) AS IS_GRANTABLE FROM (SELECT U.USER_NAME AS USER_NAME, U.HOST AS HOST, CASE WHEN V1.C1 = 1 AND U.PRIV_ALTER = 1 THEN 'ALTER' WHEN V1.C1 = 2 AND U.PRIV_CREATE = 1 THEN 'CREATE' WHEN V1.C1 = 3 AND U.PRIV_CREATE_USER = 1 THEN 'CREATE USER' WHEN V1.C1 = 4 AND U.PRIV_DELETE = 1 THEN 'DELETE' WHEN V1.C1 = 5 AND U.PRIV_DROP = 1 THEN 'DROP' WHEN V1.C1 = 7 AND U.PRIV_INSERT = 1 THEN 'INSERT' WHEN V1.C1 = 8 AND U.PRIV_UPDATE = 1 THEN 'UPDATE' WHEN V1.C1 = 9 AND U.PRIV_SELECT = 1 THEN 'SELECT' WHEN V1.C1 = 10 AND U.PRIV_INDEX = 1 THEN 'INDEX' WHEN V1.C1 = 11 AND U.PRIV_CREATE_VIEW = 1 THEN 'CREATE VIEW' WHEN V1.C1 = 12 AND U.PRIV_SHOW_VIEW = 1 THEN 'SHOW VIEW' WHEN V1.C1 = 13 AND U.PRIV_SHOW_DB = 1 THEN 'SHOW DATABASES' WHEN V1.C1 = 14 AND U.PRIV_SUPER = 1 THEN 'SUPER' WHEN V1.C1 = 15 AND U.PRIV_PROCESS = 1 THEN 'PROCESS' WHEN V1.C1 = 17 AND U.PRIV_CREATE_SYNONYM = 1 THEN 'CREATE SYNONYM' WHEN V1.C1 = 27 AND U.PRIV_FILE = 1 THEN 'FILE' WHEN V1.C1 = 28 AND U.PRIV_ALTER_TENANT = 1 THEN 'ALTER TENANT' WHEN V1.C1 = 29 AND U.PRIV_ALTER_SYSTEM = 1 THEN 'ALTER SYSTEM' WHEN V1.C1 = 30 AND U.PRIV_CREATE_RESOURCE_POOL = 1 THEN 'CREATE RESOURCE POOL' WHEN V1.C1 = 31 AND U.PRIV_CREATE_RESOURCE_UNIT = 1 THEN 'CREATE RESOURCE UNIT' WHEN V1.C1 = 33 AND U.PRIV_REPL_SLAVE = 1 THEN 'REPLICATION SLAVE' WHEN V1.C1 = 34 AND U.PRIV_REPL_CLIENT = 1 THEN 'REPLICATION CLIENT' WHEN V1.C1 = 35 AND U.PRIV_DROP_DATABASE_LINK = 1 THEN 'DROP DATABASE LINK' WHEN V1.C1 = 36 AND U.PRIV_CREATE_DATABASE_LINK = 1 THEN 'CREATE DATABASE LINK' WHEN V1.C1 = 0 AND U.PRIV_ALTER = 0 AND U.PRIV_CREATE = 0 AND U.PRIV_CREATE_USER = 0 AND U.PRIV_DELETE = 0 AND U.PRIV_DROP = 0 AND U.PRIV_INSERT = 0 AND U.PRIV_UPDATE = 0 AND U.PRIV_SELECT = 0 AND U.PRIV_INDEX = 0 AND U.PRIV_CREATE_VIEW = 0 AND U.PRIV_SHOW_VIEW = 0 AND U.PRIV_SHOW_DB = 0 AND U.PRIV_SUPER = 0 AND U.PRIV_PROCESS = 0 AND U.PRIV_CREATE_SYNONYM = 0 AND U.PRIV_FILE = 0 AND U.PRIV_ALTER_TENANT = 0 AND U.PRIV_ALTER_SYSTEM = 0 AND U.PRIV_CREATE_RESOURCE_POOL = 0 AND U.PRIV_CREATE_RESOURCE_UNIT = 0 AND U.PRIV_REPL_SLAVE = 0 AND U.PRIV_REPL_CLIENT = 0 AND U.PRIV_DROP_DATABASE_LINK = 0 AND U.PRIV_CREATE_DATABASE_LINK = 0 THEN 'USAGE' END PRIVILEGE_TYPE , CASE WHEN U.PRIV_GRANT_OPTION = 0 THEN 'NO' WHEN U.PRIV_ALTER = 0 AND U.PRIV_CREATE = 0 AND U.PRIV_CREATE_USER = 0 AND U.PRIV_DELETE = 0 AND U.PRIV_DROP = 0 AND U.PRIV_INSERT = 0 AND U.PRIV_UPDATE = 0 AND U.PRIV_SELECT = 0 AND U.PRIV_INDEX = 0 AND U.PRIV_CREATE_VIEW = 0 AND U.PRIV_SHOW_VIEW = 0 AND U.PRIV_SHOW_DB = 0 AND U.PRIV_SUPER = 0 AND U.PRIV_PROCESS = 0 AND U.PRIV_CREATE_SYNONYM = 0 AND U.PRIV_FILE = 0 AND U.PRIV_ALTER_TENANT = 0 AND U.PRIV_ALTER_SYSTEM = 0 AND U.PRIV_CREATE_RESOURCE_POOL = 0 AND U.PRIV_CREATE_RESOURCE_UNIT = 0 AND U.PRIV_REPL_SLAVE = 0 AND U.PRIV_REPL_CLIENT = 0 AND U.PRIV_DROP_DATABASE_LINK = 0 AND U.PRIV_CREATE_DATABASE_LINK = 0 THEN 'NO' WHEN U.PRIV_GRANT_OPTION = 1 THEN 'YES' END IS_GRANTABLE FROM oceanbase.__all_user U, (SELECT 0 AS C1 UNION ALL SELECT 1 AS C1 UNION ALL SELECT 2 AS C1 UNION ALL SELECT 3 AS C1 UNION ALL SELECT 4 AS C1 UNION ALL SELECT 5 AS C1 UNION ALL SELECT 7 AS C1 UNION ALL SELECT 8 AS C1 UNION ALL SELECT 9 AS C1 UNION ALL SELECT 10 AS C1 UNION ALL SELECT 11 AS C1 UNION ALL SELECT 12 AS C1 UNION ALL SELECT 13 AS C1 UNION ALL SELECT 14 AS C1 UNION ALL SELECT 15 AS C1 UNION ALL SELECT 17 AS C1 UNION ALL SELECT 27 AS C1 UNION ALL SELECT 28 AS C1 UNION ALL SELECT 29 AS C1 UNION ALL SELECT 30 AS C1 UNION ALL SELECT 31 AS C1 UNION ALL SELECT 33 AS C1 UNION ALL SELECT 34 AS C1 UNION ALL SELECT 35 AS C1 UNION ALL SELECT 36 AS C1) V1, (SELECT USER_ID FROM oceanbase.__all_user WHERE TENANT_ID = 0 AND CONCAT(USER_NAME, '@', HOST) = CURRENT_USER()) CURR LEFT JOIN (SELECT USER_ID FROM oceanbase.__all_database_privilege WHERE TENANT_ID = 0 AND DATABASE_NAME = 'mysql' AND PRIV_SELECT = 1) DB ON CURR.USER_ID = DB.USER_ID WHERE U.TENANT_ID = 0 AND (DB.USER_ID IS NOT NULL OR 512 & CURRENT_USER_PRIV() = 512 OR U.USER_ID = CURR.USER_ID)) V WHERE V.PRIVILEGE_TYPE IS NOT NULL utf8mb4 utf8mb4_general_ci +USER_PRIVILEGES CREATE VIEW `USER_PRIVILEGES` AS SELECT CAST(CONCAT('''', V.USER_NAME, '''', '@', '''', V.HOST, '''') AS CHAR(81)) AS GRANTEE , CAST('def' AS CHAR(512)) AS TABLE_CATALOG , CAST(V.PRIVILEGE_TYPE AS CHAR(64)) AS PRIVILEGE_TYPE , CAST(V.IS_GRANTABLE AS CHAR(3)) AS IS_GRANTABLE FROM (SELECT U.USER_NAME AS USER_NAME, U.HOST AS HOST, CASE WHEN V1.C1 = 1 AND U.PRIV_ALTER = 1 THEN 'ALTER' WHEN V1.C1 = 2 AND U.PRIV_CREATE = 1 THEN 'CREATE' WHEN V1.C1 = 3 AND U.PRIV_CREATE_USER = 1 THEN 'CREATE USER' WHEN V1.C1 = 4 AND U.PRIV_DELETE = 1 THEN 'DELETE' WHEN V1.C1 = 5 AND U.PRIV_DROP = 1 THEN 'DROP' WHEN V1.C1 = 7 AND U.PRIV_INSERT = 1 THEN 'INSERT' WHEN V1.C1 = 8 AND U.PRIV_UPDATE = 1 THEN 'UPDATE' WHEN V1.C1 = 9 AND U.PRIV_SELECT = 1 THEN 'SELECT' WHEN V1.C1 = 10 AND U.PRIV_INDEX = 1 THEN 'INDEX' WHEN V1.C1 = 11 AND U.PRIV_CREATE_VIEW = 1 THEN 'CREATE VIEW' WHEN V1.C1 = 12 AND U.PRIV_SHOW_VIEW = 1 THEN 'SHOW VIEW' WHEN V1.C1 = 13 AND U.PRIV_SHOW_DB = 1 THEN 'SHOW DATABASES' WHEN V1.C1 = 14 AND U.PRIV_SUPER = 1 THEN 'SUPER' WHEN V1.C1 = 15 AND U.PRIV_PROCESS = 1 THEN 'PROCESS' WHEN V1.C1 = 17 AND U.PRIV_CREATE_SYNONYM = 1 THEN 'CREATE SYNONYM' WHEN V1.C1 = 27 AND U.PRIV_FILE = 1 THEN 'FILE' WHEN V1.C1 = 28 AND U.PRIV_ALTER_TENANT = 1 THEN 'ALTER TENANT' WHEN V1.C1 = 29 AND U.PRIV_ALTER_SYSTEM = 1 THEN 'ALTER SYSTEM' WHEN V1.C1 = 30 AND U.PRIV_CREATE_RESOURCE_POOL = 1 THEN 'CREATE RESOURCE POOL' WHEN V1.C1 = 31 AND U.PRIV_CREATE_RESOURCE_UNIT = 1 THEN 'CREATE RESOURCE UNIT' WHEN V1.C1 = 33 AND U.PRIV_REPL_SLAVE = 1 THEN 'REPLICATION SLAVE' WHEN V1.C1 = 34 AND U.PRIV_REPL_CLIENT = 1 THEN 'REPLICATION CLIENT' WHEN V1.C1 = 35 AND U.PRIV_DROP_DATABASE_LINK = 1 THEN 'DROP DATABASE LINK' WHEN V1.C1 = 36 AND U.PRIV_CREATE_DATABASE_LINK = 1 THEN 'CREATE DATABASE LINK' WHEN V1.C1 = 37 AND (U.PRIV_OTHERS & (1 << 0)) != 0 THEN 'EXECUTE' WHEN V1.C1 = 38 AND (U.PRIV_OTHERS & (1 << 1)) != 0 THEN 'ALTER ROUTINE' WHEN V1.C1 = 39 AND (U.PRIV_OTHERS & (1 << 2)) != 0 THEN 'CREATE ROUTINE' WHEN V1.C1 = 0 AND U.PRIV_ALTER = 0 AND U.PRIV_CREATE = 0 AND U.PRIV_CREATE_USER = 0 AND U.PRIV_DELETE = 0 AND U.PRIV_DROP = 0 AND U.PRIV_INSERT = 0 AND U.PRIV_UPDATE = 0 AND U.PRIV_SELECT = 0 AND U.PRIV_INDEX = 0 AND U.PRIV_CREATE_VIEW = 0 AND U.PRIV_SHOW_VIEW = 0 AND U.PRIV_SHOW_DB = 0 AND U.PRIV_SUPER = 0 AND U.PRIV_PROCESS = 0 AND U.PRIV_CREATE_SYNONYM = 0 AND U.PRIV_FILE = 0 AND U.PRIV_ALTER_TENANT = 0 AND U.PRIV_ALTER_SYSTEM = 0 AND U.PRIV_CREATE_RESOURCE_POOL = 0 AND U.PRIV_CREATE_RESOURCE_UNIT = 0 AND U.PRIV_REPL_SLAVE = 0 AND U.PRIV_REPL_CLIENT = 0 AND U.PRIV_DROP_DATABASE_LINK = 0 AND U.PRIV_CREATE_DATABASE_LINK = 0 AND U.PRIV_OTHERS = 0 THEN 'USAGE' END PRIVILEGE_TYPE , CASE WHEN U.PRIV_GRANT_OPTION = 0 THEN 'NO' WHEN U.PRIV_ALTER = 0 AND U.PRIV_CREATE = 0 AND U.PRIV_CREATE_USER = 0 AND U.PRIV_DELETE = 0 AND U.PRIV_DROP = 0 AND U.PRIV_INSERT = 0 AND U.PRIV_UPDATE = 0 AND U.PRIV_SELECT = 0 AND U.PRIV_INDEX = 0 AND U.PRIV_CREATE_VIEW = 0 AND U.PRIV_SHOW_VIEW = 0 AND U.PRIV_SHOW_DB = 0 AND U.PRIV_SUPER = 0 AND U.PRIV_PROCESS = 0 AND U.PRIV_CREATE_SYNONYM = 0 AND U.PRIV_FILE = 0 AND U.PRIV_ALTER_TENANT = 0 AND U.PRIV_ALTER_SYSTEM = 0 AND U.PRIV_CREATE_RESOURCE_POOL = 0 AND U.PRIV_CREATE_RESOURCE_UNIT = 0 AND U.PRIV_REPL_SLAVE = 0 AND U.PRIV_REPL_CLIENT = 0 AND U.PRIV_DROP_DATABASE_LINK = 0 AND U.PRIV_CREATE_DATABASE_LINK = 0 AND U.PRIV_OTHERS = 0 THEN 'NO' WHEN U.PRIV_GRANT_OPTION = 1 THEN 'YES' END IS_GRANTABLE FROM oceanbase.__all_user U, (SELECT 0 AS C1 UNION ALL SELECT 1 AS C1 UNION ALL SELECT 2 AS C1 UNION ALL SELECT 3 AS C1 UNION ALL SELECT 4 AS C1 UNION ALL SELECT 5 AS C1 UNION ALL SELECT 7 AS C1 UNION ALL SELECT 8 AS C1 UNION ALL SELECT 9 AS C1 UNION ALL SELECT 10 AS C1 UNION ALL SELECT 11 AS C1 UNION ALL SELECT 12 AS C1 UNION ALL SELECT 13 AS C1 UNION ALL SELECT 14 AS C1 UNION ALL SELECT 15 AS C1 UNION ALL SELECT 17 AS C1 UNION ALL SELECT 27 AS C1 UNION ALL SELECT 28 AS C1 UNION ALL SELECT 29 AS C1 UNION ALL SELECT 30 AS C1 UNION ALL SELECT 31 AS C1 UNION ALL SELECT 33 AS C1 UNION ALL SELECT 34 AS C1 UNION ALL SELECT 35 AS C1 UNION ALL SELECT 36 AS C1 UNION ALL SELECT 37 AS C1 UNION ALL SELECT 38 AS C1 UNION ALL SELECT 39 AS C1) V1, (SELECT USER_ID FROM oceanbase.__all_user WHERE TENANT_ID = 0 AND CONCAT(USER_NAME, '@', HOST) = CURRENT_USER()) CURR LEFT JOIN (SELECT USER_ID FROM oceanbase.__all_database_privilege WHERE TENANT_ID = 0 AND DATABASE_NAME = 'mysql' AND PRIV_SELECT = 1) DB ON CURR.USER_ID = DB.USER_ID WHERE U.TENANT_ID = 0 AND (DB.USER_ID IS NOT NULL OR 512 & CURRENT_USER_PRIV() = 512 OR U.USER_ID = CURR.USER_ID)) V WHERE V.PRIVILEGE_TYPE IS NOT NULL utf8mb4 utf8mb4_general_ci desc information_schema.user_privileges; Field Type Null Key Default Extra GRANTEE varchar(81) NO @@ -62,6 +62,9 @@ GRANTEE TABLE_CATALOG PRIVILEGE_TYPE IS_GRANTABLE 'root'@'%' def REPLICATION CLIENT YES 'root'@'%' def DROP DATABASE LINK YES 'root'@'%' def CREATE DATABASE LINK YES +'root'@'%' def EXECUTE YES +'root'@'%' def ALTER ROUTINE YES +'root'@'%' def CREATE ROUTINE YES 'admin'@'%' def ALTER YES 'admin'@'%' def CREATE YES 'admin'@'%' def CREATE USER YES @@ -86,3 +89,6 @@ GRANTEE TABLE_CATALOG PRIVILEGE_TYPE IS_GRANTABLE 'admin'@'%' def REPLICATION CLIENT YES 'admin'@'%' def DROP DATABASE LINK YES 'admin'@'%' def CREATE DATABASE LINK YES +'admin'@'%' def EXECUTE YES +'admin'@'%' def ALTER ROUTINE YES +'admin'@'%' def CREATE ROUTINE YES diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/views.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/views.result index 5a1df494e5..5a4364feed 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/views.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/views.result @@ -5,6 +5,10 @@ def mysql time_zone_transition_type SELECT time_zone_id as Time_zone_id, def mysql time_zone_transition SELECT time_zone_id as Time_zone_id, transition_time as Transition_time, transition_type_id as Transition_type_id FROM oceanbase.__all_tenant_time_zone_transition NONE NO NONE NONE utf8mb4 utf8mb4_general_ci def mysql time_zone_name SELECT name as Name, time_zone_id as Time_zone_id FROM oceanbase.__all_tenant_time_zone_name NONE NO NONE NONE utf8mb4 utf8mb4_general_ci def mysql time_zone SELECT time_zone_id as Time_zone_id, use_leap_seconds as Use_leap_seconds FROM oceanbase.__all_tenant_time_zone NONE NO NONE NONE utf8mb4 utf8mb4_general_ci +def mysql role_edges SELECT cast(from_user.host AS char(255)) FROM_HOST, cast(from_user.user_name AS char(128)) FROM_USER, cast(to_user.host AS char(255)) TO_HOST, cast(to_user.user_name AS char(128)) TO_USER, cast(CASE role_map.admin_option WHEN 1 THEN 'Y' ELSE 'N' END AS char(1)) WITH_ADMIN_OPTION FROM oceanbase.__all_tenant_role_grantee_map role_map, oceanbase.__all_user from_user, oceanbase.__all_user to_user WHERE role_map.tenant_id = from_user.tenant_id AND role_map.tenant_id = to_user.tenant_id AND role_map.grantee_id = to_user.user_id AND role_map.role_id = from_user.user_id; NONE NO NONE NONE utf8mb4 utf8mb4_general_ci +def mysql procs_priv SELECT cast(b.host as char(60)) as Host, cast(a.database_name as char(64)) as Db, cast(b.user_name as char(32)) as User, cast(a.routine_name as char(64)) as Routine_name, case when a.routine_type = 1 then 'PROCEDURE' else 'FUNCTION' end as Routine_type, cast(c.priv_user as char(93)) as Grantor, substr(concat(case when (a.all_priv & 1) > 0 then ',Execute' else '' end, case when (a.all_priv & 2) > 0 then ',Alter Routine' else '' end, case when (a.all_priv & 4) > 0 then ',Grant' else '' end), 2) as Proc_priv, cast(a.gmt_modified as date) as Timestamp FROM oceanbase.__all_routine_privilege a, oceanbase.__all_user b, oceanbase.__all_routine c, oceanbase.__all_database d WHERE a.tenant_id = b.tenant_id AND a.user_id = b.user_id AND a.tenant_id = d.tenant_id and a.database_name = d.database_name AND a.tenant_id = c.tenant_id AND a.routine_name = c.routine_name AND a.routine_type = c.routine_type AND c.database_id = d.database_id AND c.package_id = -1; NONE NO NONE NONE utf8mb4 utf8mb4_general_ci +def mysql default_roles SELECT cast(to_user.host AS char(255)) HOST, cast(to_user.user_name AS char(128)) USER, cast(from_user.host AS char(255)) DEFAULT_ROLE_HOST, cast(from_user.user_name AS char(128)) DEFAULT_ROLE_USER FROM oceanbase.__all_tenant_role_grantee_map role_map, oceanbase.__all_user from_user, oceanbase.__all_user to_user WHERE role_map.tenant_id = from_user.tenant_id AND role_map.tenant_id = to_user.tenant_id AND role_map.grantee_id = to_user.user_id AND role_map.role_id = from_user.user_id AND role_map.disable_flag = 0; NONE NO NONE NONE utf8mb4 utf8mb4_general_ci +def mysql columns_priv SELECT cast(b.host as char(255)) as Host, cast(a.database_name as char(128)) as Db, cast(b.user_name as char(128)) as User, cast(a.table_name as char(128)) as Table_name, cast(a.column_name as char(128)) as Column_name, substr(concat(case when (a.all_priv & 1) > 0 then ',Select' else '' end, case when (a.all_priv & 2) > 0 then ',Insert' else '' end, case when (a.all_priv & 4) > 0 then ',Update' else '' end, case when (a.all_priv & 8) > 0 then ',References' else '' end), 2) as Column_priv, cast(a.gmt_modified as datetime) as Timestamp FROM oceanbase.__all_column_privilege a, oceanbase.__all_user b WHERE a.tenant_id = 0 and a.tenant_id = b.tenant_id AND a.user_id = b.user_id NONE NO NONE NONE utf8mb4 utf8mb4_general_ci show create view views; View Create View character_set_client collation_connection VIEWS CREATE VIEW `VIEWS` AS select cast('def' as CHAR(64)) AS TABLE_CATALOG, d.database_name collate utf8mb4_name_case as TABLE_SCHEMA, t.table_name collate utf8mb4_name_case as TABLE_NAME, t.view_definition as VIEW_DEFINITION, case t.view_check_option when 1 then 'LOCAL' when 2 then 'CASCADED' else 'NONE' end as CHECK_OPTION, case t.view_is_updatable when 1 then 'YES' else 'NO' end as IS_UPDATABLE, cast((case t.define_user_id when -1 then 'NONE' else concat(u.user_name, '@', u.host) end) as CHAR(288)) as DEFINER, cast('NONE' as CHAR(7)) AS SECURITY_TYPE, cast((case t.collation_type when 45 then 'utf8mb4' else 'NONE' end) as CHAR(64)) AS CHARACTER_SET_CLIENT, cast((case t.collation_type when 45 then 'utf8mb4_general_ci' else 'NONE' end) as CHAR(64)) AS COLLATION_CONNECTION from oceanbase.__all_table as t join oceanbase.__all_database as d on t.tenant_id = d.tenant_id and t.database_id = d.database_id left join oceanbase.__all_user as u on t.tenant_id = u.tenant_id and t.define_user_id = u.user_id and t.define_user_id != -1 where t.tenant_id = 0 and t.table_type in (1, 4) and t.table_mode >> 12 & 15 in (0,1) and d.in_recyclebin = 0 and d.database_name != '__recyclebin' and d.database_name != 'information_schema' and d.database_name != 'oceanbase' and 0 = sys_privilege_check('table_acc', effective_tenant_id(), d.database_name, t.table_name) utf8mb4 utf8mb4_general_ci diff --git a/unittest/share/schema/test_schema_service.cpp b/unittest/share/schema/test_schema_service.cpp index 55b6e95502..469ee41ae2 100644 --- a/unittest/share/schema/test_schema_service.cpp +++ b/unittest/share/schema/test_schema_service.cpp @@ -330,6 +330,10 @@ TEST_F(TestSchemaService, test_get_schema_operation_str) OB_DDL_GRANT_REVOKE_TABLE, OB_DDL_DEL_TABLE_PRIV, OB_DDL_TABLE_PRIV_OPERATION_END, + OB_DDL_ROUTINE_PRIV_OPERATION_BEGIN, + OB_DDL_GRANT_REVOKE_ROUTINE, + OB_DDL_DEL_ROUTINE_PRIV, + OB_DDL_ROUTINE_PRIV_OPERATION_END, OB_DDL_ALTER_ROLE, OB_DDL_MAX_OP }; diff --git a/unittest/sql/parser/print_parser_tree.result b/unittest/sql/parser/print_parser_tree.result index 98417beba9..f343960994 100644 --- a/unittest/sql/parser/print_parser_tree.result +++ b/unittest/sql/parser/print_parser_tree.result @@ -221,13 +221,43 @@ question_mask_size: 0 |--[0],[T_HINT], str_value_=[commit work], value=[9223372036854775807] ************** Case 20 *************** +commit comment 'comment transaction commit'; +question_mask_size: 0 + +|--[0],[T_STMT_LIST], str_value_=[], value=[9223372036854775807] + |--[0],[T_COMMIT], str_value_=[], value=[0] + +************** Case 21 *************** +commit work comment 'comment txn commit work'; +question_mask_size: 0 + +|--[0],[T_STMT_LIST], str_value_=[], value=[9223372036854775807] + |--[0],[T_COMMIT], str_value_=[], value=[0] + +************** Case 22 *************** +commit/*hint+commit tx hint*/ comment 'comment + hint'; +question_mask_size: 0 + +|--[0],[T_STMT_LIST], str_value_=[], value=[9223372036854775807] + |--[0],[T_COMMIT], str_value_=[], value=[0] + |--[0],[T_HINT], str_value_=[commit tx hint], value=[9223372036854775807] + +************** Case 23 *************** +commit/*hint+commit tx work hint*/ work comment 'comment + hint'; +question_mask_size: 0 + +|--[0],[T_STMT_LIST], str_value_=[], value=[9223372036854775807] + |--[0],[T_COMMIT], str_value_=[], value=[0] + |--[0],[T_HINT], str_value_=[commit tx work hint], value=[9223372036854775807] + +************** Case 24 *************** rollback; question_mask_size: 0 |--[0],[T_STMT_LIST], str_value_=[], value=[9223372036854775807] |--[0],[T_ROLLBACK], str_value_=[], value=[0] -************** Case 21 *************** +************** Case 25 *************** rollback/*hint+rollback*/; question_mask_size: 0 @@ -235,14 +265,14 @@ question_mask_size: 0 |--[0],[T_ROLLBACK], str_value_=[], value=[0] |--[0],[T_HINT], str_value_=[rollback], value=[9223372036854775807] -************** Case 22 *************** +************** Case 26 *************** rollback work; question_mask_size: 0 |--[0],[T_STMT_LIST], str_value_=[], value=[9223372036854775807] |--[0],[T_ROLLBACK], str_value_=[], value=[0] -************** Case 23 *************** +************** Case 27 *************** rollback/*hint+rollback work*/ work; question_mask_size: 0 @@ -250,7 +280,7 @@ question_mask_size: 0 |--[0],[T_ROLLBACK], str_value_=[], value=[0] |--[0],[T_HINT], str_value_=[rollback work], value=[9223372036854775807] -************** Case 24 *************** +************** Case 28 *************** alter user 'zdy' account lock; question_mask_size: 0 @@ -261,7 +291,7 @@ question_mask_size: 0 |--[0],[T_VARCHAR], str_value_=[zdy], value=[9223372036854775807] |--[1],[T_BOOL], str_value_=[], value=[1] -************** Case 25 *************** +************** Case 29 *************** alter user 'zdy' account unlock; question_mask_size: 0 @@ -272,7 +302,7 @@ question_mask_size: 0 |--[0],[T_VARCHAR], str_value_=[zdy], value=[9223372036854775807] |--[1],[T_BOOL], str_value_=[], value=[0] -************** Case 26 *************** +************** Case 30 *************** select d.t1.c1, sum(t1.c2) from d.t1 where d.t1.c1 > 0 and c2 + d.t1.c1 = 100 group by d.t1.c2 order by t.d1.c1 desc limit 0, 1 question_mask_size: 0 @@ -331,7 +361,7 @@ question_mask_size: 0 |--[0],[T_INT], str_value_=[0], value=[0] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 27 *************** +************** Case 31 *************** select c1, sum(d.t1.c2) from t1 where t1.c1 > 0 and c2 + t1.c1 = 100 group by t1.c2 order by t1.c1 desc limit 0, 1 question_mask_size: 0 @@ -384,7 +414,7 @@ question_mask_size: 0 |--[0],[T_INT], str_value_=[0], value=[0] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 28 *************** +************** Case 32 *************** select t1.c1, sum(c2) from t1 where c1 > 0 and c2 + c1 = 100 group by c2 order by c1 desc limit 0, 1 question_mask_size: 0 @@ -432,7 +462,7 @@ question_mask_size: 0 |--[0],[T_INT], str_value_=[0], value=[0] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 29 *************** +************** Case 33 *************** insert into t1 values(1, 2) question_mask_size: 0 @@ -449,7 +479,7 @@ question_mask_size: 0 |--[1],[T_INT], str_value_=[2], value=[2] |--[1],[T_INSERT], str_value_=[], value=[9223372036854775807] -************** Case 30 *************** +************** Case 34 *************** insert into t1.t1 values(1, 2) question_mask_size: 0 @@ -467,7 +497,7 @@ question_mask_size: 0 |--[1],[T_INT], str_value_=[2], value=[2] |--[1],[T_INSERT], str_value_=[], value=[9223372036854775807] -************** Case 31 *************** +************** Case 35 *************** insert into t1(c1) values(1), (2) question_mask_size: 0 @@ -488,7 +518,7 @@ question_mask_size: 0 |--[0],[T_INT], str_value_=[2], value=[2] |--[1],[T_INSERT], str_value_=[], value=[9223372036854775807] -************** Case 32 *************** +************** Case 36 *************** insert into t1(t1.c1) values(1), (2) question_mask_size: 0 @@ -510,7 +540,7 @@ question_mask_size: 0 |--[0],[T_INT], str_value_=[2], value=[2] |--[1],[T_INSERT], str_value_=[], value=[9223372036854775807] -************** Case 33 *************** +************** Case 37 *************** insert into d.t1(d.t1.c1) values(1), (2) question_mask_size: 0 @@ -534,7 +564,7 @@ question_mask_size: 0 |--[0],[T_INT], str_value_=[2], value=[2] |--[1],[T_INSERT], str_value_=[], value=[9223372036854775807] -************** Case 34 *************** +************** Case 38 *************** update t1 set d.t1.c2=t1.c1+1 where d.t1.c1 > 1 order by d.t1.c1 desc limit 0, 10 question_mask_size: 0 @@ -574,7 +604,7 @@ question_mask_size: 0 |--[0],[T_INT], str_value_=[0], value=[0] |--[1],[T_INT], str_value_=[10], value=[10] -************** Case 35 *************** +************** Case 39 *************** update d.t1 set t1.c2=d.t1c1+1 where t1.c1 > 1 order by c1 desc limit 0, 10 question_mask_size: 0 @@ -611,7 +641,7 @@ question_mask_size: 0 |--[0],[T_INT], str_value_=[0], value=[0] |--[1],[T_INT], str_value_=[10], value=[10] -************** Case 36 *************** +************** Case 40 *************** delete from d.t1 where d.t1.c2 > 10 order by c1 limit 0, 1 question_mask_size: 0 @@ -640,7 +670,7 @@ question_mask_size: 0 |--[0],[T_INT], str_value_=[0], value=[0] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 37 *************** +************** Case 41 *************** select t1.c1, t2.c1 from d.t1 join d.t2 on d.t1.c1=t2.c1 where t1.c1>0; question_mask_size: 0 @@ -681,7 +711,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c1], value=[9223372036854775807] |--[1],[T_INT], str_value_=[0], value=[0] -************** Case 38 *************** +************** Case 42 *************** select d.t1.c1, t2.c1 from d.t1 join t2 on t1.c1=t2.c1 where t1.c1>0; question_mask_size: 0 @@ -721,7 +751,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c1], value=[9223372036854775807] |--[1],[T_INT], str_value_=[0], value=[0] -************** Case 39 *************** +************** Case 43 *************** select d.t1.c1, t2.c1 from d.t1 join t2 on c1=c1 where t1.c1>0; question_mask_size: 0 @@ -759,7 +789,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c1], value=[9223372036854775807] |--[1],[T_INT], str_value_=[0], value=[0] -************** Case 40 *************** +************** Case 44 *************** insert into t1 value (1, 2), (3, 4) on duplicate key update d.t.c1 = t.c2 + 1, c2 = c2 + 3; question_mask_size: 0 @@ -797,7 +827,7 @@ question_mask_size: 0 |--[1],[T_INT], str_value_=[3], value=[3] |--[1],[T_INSERT], str_value_=[], value=[9223372036854775807] -************** Case 41 *************** +************** Case 45 *************** insert into d.t1 value (1, 2), (3, 4) on duplicate key update t.c1 = t.c2 + 1, d.t.c2 = t.c2 + 3; question_mask_size: 0 @@ -838,7 +868,7 @@ question_mask_size: 0 |--[1],[T_INT], str_value_=[3], value=[3] |--[1],[T_INSERT], str_value_=[], value=[9223372036854775807] -************** Case 42 *************** +************** Case 46 *************** create table rongxuan(c int primary key, c2 int) question_mask_size: 0 @@ -858,7 +888,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT32], str_value_=[], value=[65535] -************** Case 43 *************** +************** Case 47 *************** create table rongxuan(rongxuan.c int primary key, c2 int) question_mask_size: 0 @@ -879,7 +909,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT32], str_value_=[], value=[65535] -************** Case 44 *************** +************** Case 48 *************** create table rongxuan(d.rongxuan.c int primary key, c2 int) question_mask_size: 0 @@ -901,7 +931,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT32], str_value_=[], value=[65535] -************** Case 45 *************** +************** Case 49 *************** drop table t1 question_mask_size: 0 @@ -911,7 +941,7 @@ question_mask_size: 0 |--[0],[T_RELATION_FACTOR], str_value_=[t1], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[t1], value=[9223372036854775807] -************** Case 46 *************** +************** Case 50 *************** drop table oceanbase.t, t1 question_mask_size: 0 @@ -924,7 +954,7 @@ question_mask_size: 0 |--[1],[T_RELATION_FACTOR], str_value_=[t1], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[t1], value=[9223372036854775807] -************** Case 47 *************** +************** Case 51 *************** alter table rongxuan add c3 int; question_mask_size: 0 @@ -940,7 +970,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c3], value=[9223372036854775807] |--[1],[T_INT32], str_value_=[], value=[65535] -************** Case 48 *************** +************** Case 52 *************** alter table rongxuan add rongxuan.c4 int; question_mask_size: 0 @@ -957,7 +987,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c4], value=[9223372036854775807] |--[1],[T_INT32], str_value_=[], value=[65535] -************** Case 49 *************** +************** Case 53 *************** alter table rongxuan add test.rongxuan.c5 int; question_mask_size: 0 @@ -975,7 +1005,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c5], value=[9223372036854775807] |--[1],[T_INT32], str_value_=[], value=[65535] -************** Case 50 *************** +************** Case 54 *************** drop database rongxuan question_mask_size: 0 @@ -983,7 +1013,7 @@ question_mask_size: 0 |--[0],[T_DROP_DATABASE], str_value_=[], value=[0] |--[1],[T_IDENT], str_value_=[rongxuan], value=[9223372036854775807] -************** Case 51 *************** +************** Case 55 *************** create database rongxuan question_mask_size: 0 @@ -991,7 +1021,7 @@ question_mask_size: 0 |--[0],[T_CREATE_DATABASE], str_value_=[], value=[0] |--[1],[T_IDENT], str_value_=[rongxuan], value=[9223372036854775807] -************** Case 52 *************** +************** Case 56 *************** create database if not exists rongxuan question_mask_size: 0 @@ -1000,7 +1030,7 @@ question_mask_size: 0 |--[0],[T_IF_NOT_EXISTS], str_value_=[], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[rongxuan], value=[9223372036854775807] -************** Case 53 *************** +************** Case 57 *************** create database if not exists rongxuan default character set = 'utf8' default collate = 'default_collate' question_mask_size: 0 @@ -1012,7 +1042,7 @@ question_mask_size: 0 |--[0],[T_CHARSET], str_value_=[utf8], value=[9223372036854775807] |--[1],[T_COLLATION], str_value_=[default_collate], value=[9223372036854775807] -************** Case 54 *************** +************** Case 58 *************** select * from d.t1 PARTITION(p1, p2); question_mask_size: 0 @@ -1031,7 +1061,7 @@ question_mask_size: 0 |--[0],[T_IDENT], str_value_=[p1], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[p2], value=[9223372036854775807] -************** Case 55 *************** +************** Case 59 *************** delete from d.t1 PARTITION(p0, p1); question_mask_size: 0 @@ -1048,7 +1078,7 @@ question_mask_size: 0 |--[0],[T_IDENT], str_value_=[p0], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[p1], value=[9223372036854775807] -************** Case 56 *************** +************** Case 60 *************** update d.t1 PARTITION (p2) SET id = 2 WHERE name = 'Jill'; question_mask_size: 0 @@ -1074,7 +1104,7 @@ question_mask_size: 0 |--[1],[T_VARCHAR], str_value_=[Jill], value=[9223372036854775807] |--[1],[T_VARCHAR], str_value_=[Jill], value=[9223372036854775807] -************** Case 57 *************** +************** Case 61 *************** INSERT INTO d.t1 PARTITION (p3, p4) VALUES (24, 'Tim', 'Greene', 3, 1), (26, 'Linda', 'Mills', 2, 1); question_mask_size: 0 @@ -1109,7 +1139,7 @@ question_mask_size: 0 |--[4],[T_INT], str_value_=[1], value=[1] |--[1],[T_INSERT], str_value_=[], value=[9223372036854775807] -************** Case 58 *************** +************** Case 62 *************** REPLACE INTO d.t1 PARTITION (p0) VALUES (20, 'Jan', 'Jones', 3, 2); question_mask_size: 0 @@ -1135,7 +1165,7 @@ question_mask_size: 0 |--[4],[T_INT], str_value_=[2], value=[2] |--[1],[T_REPLACE], str_value_=[], value=[9223372036854775807] -************** Case 59 *************** +************** Case 63 *************** SELECT e.id, s.city, d.name FROM e JOIN stores PARTITION (p1) ON e.id=s.id JOIN departments PARTITION (p0) ON e.id=d.id; question_mask_size: 0 @@ -1189,14 +1219,14 @@ question_mask_size: 0 |--[1],[T_IDENT], str_value_=[d], value=[9223372036854775807] |--[2],[T_IDENT], str_value_=[id], value=[9223372036854775807] -************** Case 60 *************** +************** Case 64 *************** alter system report replica; question_mask_size: 0 |--[0],[T_STMT_LIST], str_value_=[], value=[9223372036854775807] |--[0],[T_REPORT_REPLICA], str_value_=[], value=[0] -************** Case 61 *************** +************** Case 65 *************** alter system report replica server = '127.0.0.1:80'; question_mask_size: 0 @@ -1205,7 +1235,7 @@ question_mask_size: 0 |--[0],[T_IP_PORT], str_value_=[], value=[9223372036854775807] |--[0],[T_VARCHAR], str_value_=["127.0.0.1":80], value=[9223372036854775807] -************** Case 62 *************** +************** Case 66 *************** alter system report replica zone = 'z1'; question_mask_size: 0 @@ -1214,14 +1244,14 @@ question_mask_size: 0 |--[0],[T_ZONE], str_value_=[], value=[9223372036854775807] |--[0],[T_VARCHAR], str_value_=[z1], value=[9223372036854775807] -************** Case 63 *************** +************** Case 67 *************** alter system recycle replica; question_mask_size: 0 |--[0],[T_STMT_LIST], str_value_=[], value=[9223372036854775807] |--[0],[T_RECYCLE_REPLICA], str_value_=[], value=[0] -************** Case 64 *************** +************** Case 68 *************** alter system recycle replica server = '127.0.0.1:80'; question_mask_size: 0 @@ -1230,7 +1260,7 @@ question_mask_size: 0 |--[0],[T_IP_PORT], str_value_=[], value=[9223372036854775807] |--[0],[T_VARCHAR], str_value_=["127.0.0.1":80], value=[9223372036854775807] -************** Case 65 *************** +************** Case 69 *************** alter system recycle replica server '127.0.0.1:80'; question_mask_size: 0 @@ -1239,7 +1269,7 @@ question_mask_size: 0 |--[0],[T_IP_PORT], str_value_=[], value=[9223372036854775807] |--[0],[T_VARCHAR], str_value_=["127.0.0.1":80], value=[9223372036854775807] -************** Case 66 *************** +************** Case 70 *************** alter system recycle replica zone = 'z1'; question_mask_size: 0 @@ -1248,7 +1278,7 @@ question_mask_size: 0 |--[0],[T_ZONE], str_value_=[], value=[9223372036854775807] |--[0],[T_VARCHAR], str_value_=[z1], value=[9223372036854775807] -************** Case 67 *************** +************** Case 71 *************** alter system recycle replica zone 'z1'; question_mask_size: 0 @@ -1257,7 +1287,7 @@ question_mask_size: 0 |--[0],[T_ZONE], str_value_=[], value=[9223372036854775807] |--[0],[T_VARCHAR], str_value_=[z1], value=[9223372036854775807] -************** Case 68 *************** +************** Case 72 *************** alter system major freeze; question_mask_size: 0 @@ -1265,7 +1295,7 @@ question_mask_size: 0 |--[0],[T_FREEZE], str_value_=[], value=[0] |--[0],[T_INT], str_value_=[], value=[1] -************** Case 69 *************** +************** Case 73 *************** alter system start merge zone = 'z1'; question_mask_size: 0 @@ -1275,7 +1305,7 @@ question_mask_size: 0 |--[1],[T_ZONE], str_value_=[], value=[9223372036854775807] |--[0],[T_VARCHAR], str_value_=[z1], value=[9223372036854775807] -************** Case 70 *************** +************** Case 74 *************** alter system suspend merge; question_mask_size: 0 @@ -1283,7 +1313,7 @@ question_mask_size: 0 |--[0],[T_MERGE_CONTROL], str_value_=[], value=[0] |--[0],[T_INT], str_value_=[], value=[2] -************** Case 71 *************** +************** Case 75 *************** alter system suspend merge tenant = sys; question_mask_size: 0 @@ -1293,7 +1323,7 @@ question_mask_size: 0 |--[1],[T_TENANT_LIST], str_value_=[], value=[9223372036854775807] |--[0],[T_VARCHAR], str_value_=[sys], value=[9223372036854775807] -************** Case 72 *************** +************** Case 76 *************** alter system suspend merge tenant = all_user; question_mask_size: 0 @@ -1303,7 +1333,7 @@ question_mask_size: 0 |--[1],[T_TENANT_LIST], str_value_=[], value=[9223372036854775807] |--[0],[T_VARCHAR], str_value_=[all_user], value=[9223372036854775807] -************** Case 73 *************** +************** Case 77 *************** alter system suspend merge tenant = all_meta; question_mask_size: 0 @@ -1313,7 +1343,7 @@ question_mask_size: 0 |--[1],[T_TENANT_LIST], str_value_=[], value=[9223372036854775807] |--[0],[T_VARCHAR], str_value_=[all_meta], value=[9223372036854775807] -************** Case 74 *************** +************** Case 78 *************** alter system resume merge; question_mask_size: 0 @@ -1321,7 +1351,7 @@ question_mask_size: 0 |--[0],[T_MERGE_CONTROL], str_value_=[], value=[0] |--[0],[T_INT], str_value_=[], value=[3] -************** Case 75 *************** +************** Case 79 *************** alter system resume merge tenant = sys; question_mask_size: 0 @@ -1331,7 +1361,7 @@ question_mask_size: 0 |--[1],[T_TENANT_LIST], str_value_=[], value=[9223372036854775807] |--[0],[T_VARCHAR], str_value_=[sys], value=[9223372036854775807] -************** Case 76 *************** +************** Case 80 *************** alter system resume merge tenant = all_user; question_mask_size: 0 @@ -1341,7 +1371,7 @@ question_mask_size: 0 |--[1],[T_TENANT_LIST], str_value_=[], value=[9223372036854775807] |--[0],[T_VARCHAR], str_value_=[all_user], value=[9223372036854775807] -************** Case 77 *************** +************** Case 81 *************** alter system resume merge tenant = all_meta; question_mask_size: 0 @@ -1351,14 +1381,14 @@ question_mask_size: 0 |--[1],[T_TENANT_LIST], str_value_=[], value=[9223372036854775807] |--[0],[T_VARCHAR], str_value_=[all_meta], value=[9223372036854775807] -************** Case 78 *************** +************** Case 82 *************** alter system clear roottable; question_mask_size: 0 |--[0],[T_STMT_LIST], str_value_=[], value=[9223372036854775807] |--[0],[T_CLEAR_ROOT_TABLE], str_value_=[], value=[0] -************** Case 79 *************** +************** Case 83 *************** alter system clear roottable tenant = 'xxx'; question_mask_size: 0 @@ -1367,7 +1397,7 @@ question_mask_size: 0 |--[0],[T_TENANT_NAME], str_value_=[], value=[9223372036854775807] |--[0],[T_VARCHAR], str_value_=[xxx], value=[9223372036854775807] -************** Case 80 *************** +************** Case 84 *************** alter system modify zone 'z1' set region 'r1' question_mask_size: 0 @@ -1378,9 +1408,9 @@ question_mask_size: 0 |--[2],[T_LINK_NODE], str_value_=[], value=[9223372036854775807] |--[0],[T_REGION], str_value_=[r1], value=[9223372036854775807] -************** Case 81 *************** +************** Case 85 *************** alter system start zone 'z1' region 'r1' -************** Case 82 *************** +************** Case 86 *************** alter system modify zone 'z1' IDC 'idc1' question_mask_size: 0 @@ -1391,7 +1421,7 @@ question_mask_size: 0 |--[2],[T_LINK_NODE], str_value_=[], value=[9223372036854775807] |--[0],[T_IDC], str_value_=[idc1], value=[9223372036854775807] -************** Case 83 *************** +************** Case 87 *************** alter system modify zone 'z1' set IDC 'idc1', region 'r1' question_mask_size: 0 @@ -1403,7 +1433,7 @@ question_mask_size: 0 |--[0],[T_IDC], str_value_=[idc1], value=[9223372036854775807] |--[1],[T_REGION], str_value_=[r1], value=[9223372036854775807] -************** Case 84 *************** +************** Case 88 *************** alter system add zone 'z1' idc 'idc1', region 'r1' question_mask_size: 0 @@ -1415,7 +1445,7 @@ question_mask_size: 0 |--[0],[T_IDC], str_value_=[idc1], value=[9223372036854775807] |--[1],[T_REGION], str_value_=[r1], value=[9223372036854775807] -************** Case 85 *************** +************** Case 89 *************** alter system add zone 'z1' idc 'idc1' question_mask_size: 0 @@ -1426,7 +1456,7 @@ question_mask_size: 0 |--[2],[T_LINK_NODE], str_value_=[], value=[9223372036854775807] |--[0],[T_IDC], str_value_=[idc1], value=[9223372036854775807] -************** Case 86 *************** +************** Case 90 *************** alter system modify zone 'z1' question_mask_size: 0 @@ -1435,11 +1465,11 @@ question_mask_size: 0 |--[0],[T_INT], str_value_=[], value=[5] |--[1],[T_VARCHAR], str_value_=[z1], value=[9223372036854775807] -************** Case 87 *************** +************** Case 91 *************** alter system start zone 'z1' IDC 'idc1' -************** Case 88 *************** +************** Case 92 *************** alter system start zone 'z1' zone_type 'ReadWrite' -************** Case 89 *************** +************** Case 93 *************** alter system add zone 'z1' zone_type 'ReadWrite', idc 'idc1', region 'r1' question_mask_size: 0 @@ -1452,7 +1482,7 @@ question_mask_size: 0 |--[1],[T_IDC], str_value_=[idc1], value=[9223372036854775807] |--[2],[T_REGION], str_value_=[r1], value=[9223372036854775807] -************** Case 90 *************** +************** Case 94 *************** alter system add zone 'z1' zone_type 'ReadWrite', idc 'idc1' question_mask_size: 0 @@ -1464,7 +1494,7 @@ question_mask_size: 0 |--[0],[T_ZONE_TYPE], str_value_=[ReadWrite], value=[9223372036854775807] |--[1],[T_IDC], str_value_=[idc1], value=[9223372036854775807] -************** Case 91 *************** +************** Case 95 *************** alter system add zone 'z1' zone_type 'ReadWrite', region 'r1' question_mask_size: 0 @@ -1476,7 +1506,7 @@ question_mask_size: 0 |--[0],[T_ZONE_TYPE], str_value_=[ReadWrite], value=[9223372036854775807] |--[1],[T_REGION], str_value_=[r1], value=[9223372036854775807] -************** Case 92 *************** +************** Case 96 *************** alter system add zone 'z1' zone_type 'ReadWrite' question_mask_size: 0 @@ -1487,7 +1517,7 @@ question_mask_size: 0 |--[2],[T_LINK_NODE], str_value_=[], value=[9223372036854775807] |--[0],[T_ZONE_TYPE], str_value_=[ReadWrite], value=[9223372036854775807] -************** Case 93 *************** +************** Case 97 *************** alter system modify zone 'z1' zone_type 'ReadWrite', idc 'idc1', region 'r1' question_mask_size: 0 @@ -1500,7 +1530,7 @@ question_mask_size: 0 |--[1],[T_IDC], str_value_=[idc1], value=[9223372036854775807] |--[2],[T_REGION], str_value_=[r1], value=[9223372036854775807] -************** Case 94 *************** +************** Case 98 *************** alter system modify zone 'z1' zone_type 'ReadWrite', idc 'idc1' question_mask_size: 0 @@ -1512,7 +1542,7 @@ question_mask_size: 0 |--[0],[T_ZONE_TYPE], str_value_=[ReadWrite], value=[9223372036854775807] |--[1],[T_IDC], str_value_=[idc1], value=[9223372036854775807] -************** Case 95 *************** +************** Case 99 *************** alter system modify zone 'z1' zone_type 'ReadWrite', region 'r1' question_mask_size: 0 @@ -1524,7 +1554,7 @@ question_mask_size: 0 |--[0],[T_ZONE_TYPE], str_value_=[ReadWrite], value=[9223372036854775807] |--[1],[T_REGION], str_value_=[r1], value=[9223372036854775807] -************** Case 96 *************** +************** Case 100 *************** alter system modify zone 'z1' zone_type 'ReadWrite' question_mask_size: 0 @@ -1535,7 +1565,7 @@ question_mask_size: 0 |--[2],[T_LINK_NODE], str_value_=[], value=[9223372036854775807] |--[0],[T_ZONE_TYPE], str_value_=[ReadWrite], value=[9223372036854775807] -************** Case 97 *************** +************** Case 101 *************** select * from t1 where c1>ANY(select c1 from t2 where c2>1); question_mask_size: 0 @@ -1568,7 +1598,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 98 *************** +************** Case 102 *************** select * from t1 where c1>SOME(select c1 from t2 where c2>1); question_mask_size: 0 @@ -1601,7 +1631,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 99 *************** +************** Case 103 *************** select * from t1 where c1>ALL(select c1 from t2 where c2>1); question_mask_size: 0 @@ -1634,7 +1664,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 100 *************** +************** Case 104 *************** select * from t1 where c1>(select c1 from t2 where c2>1); question_mask_size: 0 @@ -1666,7 +1696,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 101 *************** +************** Case 105 *************** select * from t1 where c11); question_mask_size: 0 @@ -1699,7 +1729,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 102 *************** +************** Case 106 *************** select * from t1 where c11); question_mask_size: 0 @@ -1732,7 +1762,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 103 *************** +************** Case 107 *************** select * from t1 where c11); question_mask_size: 0 @@ -1765,7 +1795,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 104 *************** +************** Case 108 *************** select * from t1 where c1<(select c1 from t2 where c2>1); question_mask_size: 0 @@ -1797,7 +1827,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 105 *************** +************** Case 109 *************** select * from t1 where c1>=ANY(select c1 from t2 where c2>1); question_mask_size: 0 @@ -1830,7 +1860,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 106 *************** +************** Case 110 *************** select * from t1 where c1>=SOME(select c1 from t2 where c2>1); question_mask_size: 0 @@ -1863,7 +1893,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 107 *************** +************** Case 111 *************** select * from t1 where c1>=ALL(select c1 from t2 where c2>1); question_mask_size: 0 @@ -1896,7 +1926,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 108 *************** +************** Case 112 *************** select * from t1 where c1>=(select c1 from t2 where c2>1); question_mask_size: 0 @@ -1928,7 +1958,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 109 *************** +************** Case 113 *************** select * from t1 where c1<=ANY(select c1 from t2 where c2>1); question_mask_size: 0 @@ -1961,7 +1991,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 110 *************** +************** Case 114 *************** select * from t1 where c1<=SOME(select c1 from t2 where c2>1); question_mask_size: 0 @@ -1994,7 +2024,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 111 *************** +************** Case 115 *************** select * from t1 where c1<=ALL(select c1 from t2 where c2>1); question_mask_size: 0 @@ -2027,7 +2057,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 112 *************** +************** Case 116 *************** select * from t1 where c1<=(select c1 from t2 where c2>1); question_mask_size: 0 @@ -2059,7 +2089,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 113 *************** +************** Case 117 *************** select * from t1 where c1=ANY(select c1 from t2 where c2>1); question_mask_size: 0 @@ -2092,7 +2122,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 114 *************** +************** Case 118 *************** select * from t1 where c1=SOME(select c1 from t2 where c2>1); question_mask_size: 0 @@ -2125,7 +2155,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 115 *************** +************** Case 119 *************** select * from t1 where c1=ALL(select c1 from t2 where c2>1); question_mask_size: 0 @@ -2158,7 +2188,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 116 *************** +************** Case 120 *************** select * from t1 where c1=(select c1 from t2 where c2>1); question_mask_size: 0 @@ -2190,7 +2220,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 117 *************** +************** Case 121 *************** select * from t1 where c1!=ANY(select c1 from t2 where c2>1); question_mask_size: 0 @@ -2223,7 +2253,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 118 *************** +************** Case 122 *************** select * from t1 where c1!=SOME(select c1 from t2 where c2>1); question_mask_size: 0 @@ -2256,7 +2286,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 119 *************** +************** Case 123 *************** select * from t1 where c1!=ALL(select c1 from t2 where c2>1); question_mask_size: 0 @@ -2289,7 +2319,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 120 *************** +************** Case 124 *************** select * from t1 where c1!=(select c1 from t2 where c2>1); question_mask_size: 0 @@ -2321,7 +2351,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 121 *************** +************** Case 125 *************** select * from t1 where c1 in (select c1 from t2 where c2>1); question_mask_size: 0 @@ -2353,7 +2383,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 122 *************** +************** Case 126 *************** select * from t1 where c1 not in (select c1 from t2 where c2>1); question_mask_size: 0 @@ -2385,7 +2415,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 123 *************** +************** Case 127 *************** select * from t1 where exists (select c1 from t2 where c2>1); question_mask_size: 0 @@ -2415,7 +2445,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 124 *************** +************** Case 128 *************** select * from t1 where not exists (select c1 from t2 where c2>1); question_mask_size: 0 @@ -2446,7 +2476,7 @@ question_mask_size: 0 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 125 *************** +************** Case 129 *************** select * from t1 where (select c1 from t1) like (select c2 from t2); question_mask_size: 0 @@ -2480,7 +2510,7 @@ question_mask_size: 0 |--[0],[T_RELATION_FACTOR], str_value_=[t2], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[t2], value=[9223372036854775807] -************** Case 126 *************** +************** Case 130 *************** select * from t1 where (select c1 from t1) not like (select c2 from t2); question_mask_size: 0 @@ -2514,7 +2544,7 @@ question_mask_size: 0 |--[0],[T_RELATION_FACTOR], str_value_=[t2], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[t2], value=[9223372036854775807] -************** Case 127 *************** +************** Case 131 *************** select * from t1 where (c1) in (select c1 from t2); question_mask_size: 0 @@ -2541,7 +2571,7 @@ question_mask_size: 0 |--[0],[T_RELATION_FACTOR], str_value_=[t2], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[t2], value=[9223372036854775807] -************** Case 128 *************** +************** Case 132 *************** select * from t1 where (c1, c2) in (select c1, c2 from t2); question_mask_size: 0 @@ -2574,7 +2604,7 @@ question_mask_size: 0 |--[0],[T_RELATION_FACTOR], str_value_=[t2], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[t2], value=[9223372036854775807] -************** Case 129 *************** +************** Case 133 *************** select * from t1 where ROW(c1, c2) in (select c1, c2 from t2); question_mask_size: 0 @@ -2607,7 +2637,7 @@ question_mask_size: 0 |--[0],[T_RELATION_FACTOR], str_value_=[t2], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[t2], value=[9223372036854775807] -************** Case 130 *************** +************** Case 134 *************** set names latin1; question_mask_size: 0 @@ -2616,7 +2646,7 @@ question_mask_size: 0 |--[0],[T_SET_NAMES], str_value_=[], value=[9223372036854775807] |--[0],[T_CHAR_CHARSET], str_value_=[latin1], value=[9223372036854775807] -************** Case 131 *************** +************** Case 135 *************** set names 'latin1'; question_mask_size: 0 @@ -2625,7 +2655,7 @@ question_mask_size: 0 |--[0],[T_SET_NAMES], str_value_=[], value=[9223372036854775807] |--[0],[T_VARCHAR], str_value_=[latin1], value=[9223372036854775807] -************** Case 132 *************** +************** Case 136 *************** set names utf8 collate 'utf8_general_ci'; question_mask_size: 0 @@ -2635,7 +2665,7 @@ question_mask_size: 0 |--[0],[T_CHAR_CHARSET], str_value_=[utf8], value=[9223372036854775807] |--[1],[T_COLLATION], str_value_=[utf8_general_ci], value=[9223372036854775807] -************** Case 133 *************** +************** Case 137 *************** set names utf8 collate utf8_general_ci; question_mask_size: 0 @@ -2645,7 +2675,7 @@ question_mask_size: 0 |--[0],[T_CHAR_CHARSET], str_value_=[utf8], value=[9223372036854775807] |--[1],[T_COLLATION], str_value_=[utf8_general_ci], value=[9223372036854775807] -************** Case 134 *************** +************** Case 138 *************** set character set utf8; question_mask_size: 0 @@ -2654,7 +2684,7 @@ question_mask_size: 0 |--[0],[T_SET_CHARSET], str_value_=[], value=[9223372036854775807] |--[0],[T_CHAR_CHARSET], str_value_=[utf8], value=[9223372036854775807] -************** Case 135 *************** +************** Case 139 *************** set character set 'utf8'; question_mask_size: 0 @@ -2663,7 +2693,7 @@ question_mask_size: 0 |--[0],[T_SET_CHARSET], str_value_=[], value=[9223372036854775807] |--[0],[T_VARCHAR], str_value_=[utf8], value=[9223372036854775807] -************** Case 136 *************** +************** Case 140 *************** set charset utf8; question_mask_size: 0 @@ -2672,7 +2702,7 @@ question_mask_size: 0 |--[0],[T_SET_CHARSET], str_value_=[], value=[9223372036854775807] |--[0],[T_CHAR_CHARSET], str_value_=[utf8], value=[9223372036854775807] -************** Case 137 *************** +************** Case 141 *************** select _utf8 'abc', _utf8mb4 'def' collate utf8mb4_general_ci from t1 where c1 collate utf8_bin = 'xyz' collate utf8_bin; question_mask_size: 0 @@ -2710,7 +2740,7 @@ question_mask_size: 0 |--[1],[T_VARCHAR], str_value_=[xyz], value=[9223372036854775807] |--[1],[T_COLLATION], str_value_=[utf8_bin], value=[9223372036854775807] -************** Case 138 *************** +************** Case 142 *************** select * from t1 where c1=?; question_mask_size: 1 @@ -2729,7 +2759,7 @@ question_mask_size: 1 |--[2],[T_IDENT], str_value_=[c1], value=[9223372036854775807] |--[1],[T_QUESTIONMARK], str_value_=[], value=[0] -************** Case 139 *************** +************** Case 143 *************** select * from t1 where c1>?; question_mask_size: 1 @@ -2748,7 +2778,7 @@ question_mask_size: 1 |--[2],[T_IDENT], str_value_=[c1], value=[9223372036854775807] |--[1],[T_QUESTIONMARK], str_value_=[], value=[0] -************** Case 140 *************** +************** Case 144 *************** select * from t1 where (select c1 from t1 where c1 = ?) not like (select c2 from t2 where c2=?); question_mask_size: 2 @@ -2792,7 +2822,7 @@ question_mask_size: 2 |--[2],[T_IDENT], str_value_=[c2], value=[9223372036854775807] |--[1],[T_QUESTIONMARK], str_value_=[], value=[1] -************** Case 141 *************** +************** Case 145 *************** select * from t1 join t2; question_mask_size: 0 @@ -2811,7 +2841,7 @@ question_mask_size: 0 |--[0],[T_RELATION_FACTOR], str_value_=[t2], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[t2], value=[9223372036854775807] -************** Case 142 *************** +************** Case 146 *************** select * from t1 inner join t2; question_mask_size: 0 @@ -2830,7 +2860,7 @@ question_mask_size: 0 |--[0],[T_RELATION_FACTOR], str_value_=[t2], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[t2], value=[9223372036854775807] -************** Case 143 *************** +************** Case 147 *************** select * from t1 cross join t2; question_mask_size: 0 @@ -2849,7 +2879,7 @@ question_mask_size: 0 |--[0],[T_RELATION_FACTOR], str_value_=[t2], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[t2], value=[9223372036854775807] -************** Case 144 *************** +************** Case 148 *************** select * from t1 cross join t2 join t3; question_mask_size: 0 @@ -2873,7 +2903,7 @@ question_mask_size: 0 |--[0],[T_RELATION_FACTOR], str_value_=[t3], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[t3], value=[9223372036854775807] -************** Case 145 *************** +************** Case 149 *************** select "1234"; question_mask_size: 0 @@ -2884,7 +2914,7 @@ question_mask_size: 0 |--[0],[T_VARCHAR], str_value_=[1234], value=[9223372036854775807] |--[1],[T_VARCHAR], str_value_=[1234], value=[9223372036854775807] -************** Case 146 *************** +************** Case 150 *************** select '1234'; question_mask_size: 0 @@ -2895,7 +2925,7 @@ question_mask_size: 0 |--[0],[T_VARCHAR], str_value_=[1234], value=[9223372036854775807] |--[1],[T_VARCHAR], str_value_=[1234], value=[9223372036854775807] -************** Case 147 *************** +************** Case 151 *************** create table test(c1 varchar(3) binary charset utf8mb4); question_mask_size: 0 @@ -2911,7 +2941,7 @@ question_mask_size: 0 |--[0],[T_CHARSET], str_value_=[utf8mb4], value=[9223372036854775807] |--[2],[T_BINARY], str_value_=[], value=[1] -************** Case 148 *************** +************** Case 152 *************** replace into test values(1,2); question_mask_size: 0 @@ -2928,7 +2958,7 @@ question_mask_size: 0 |--[1],[T_INT], str_value_=[2], value=[2] |--[1],[T_REPLACE], str_value_=[], value=[9223372036854775807] -************** Case 149 *************** +************** Case 153 *************** replace ignore into test values(1,2); question_mask_size: 0 @@ -2946,7 +2976,7 @@ question_mask_size: 0 |--[1],[T_REPLACE], str_value_=[], value=[9223372036854775807] |--[3],[T_IGNORE], str_value_=[], value=[9223372036854775807] -************** Case 150 *************** +************** Case 154 *************** insert ignore into test values(1,2); question_mask_size: 0 @@ -2964,7 +2994,7 @@ question_mask_size: 0 |--[1],[T_INSERT], str_value_=[], value=[9223372036854775807] |--[3],[T_IGNORE], str_value_=[], value=[9223372036854775807] -************** Case 151 *************** +************** Case 155 *************** insert ignore into test values(1,2) on duplicate key update c2 = c1 + 1; question_mask_size: 0 @@ -2990,7 +3020,7 @@ question_mask_size: 0 |--[1],[T_INSERT], str_value_=[], value=[9223372036854775807] |--[3],[T_IGNORE], str_value_=[], value=[9223372036854775807] -************** Case 152 *************** +************** Case 156 *************** create outline out_name on select * from t1; question_mask_size: 0 @@ -3008,7 +3038,7 @@ question_mask_size: 0 |--[0],[T_RELATION_FACTOR], str_value_=[t1], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[t1], value=[9223372036854775807] -************** Case 153 *************** +************** Case 157 *************** create or replace outline out_name on select * from t1; question_mask_size: 0 @@ -3027,7 +3057,7 @@ question_mask_size: 0 |--[0],[T_RELATION_FACTOR], str_value_=[t1], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[t1], value=[9223372036854775807] -************** Case 154 *************** +************** Case 158 *************** create outline out_name on select * from t1; question_mask_size: 0 @@ -3045,7 +3075,7 @@ question_mask_size: 0 |--[0],[T_RELATION_FACTOR], str_value_=[t1], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[t1], value=[9223372036854775807] -************** Case 155 *************** +************** Case 159 *************** create outline out_name on select /*+ssssss*/* from t1; question_mask_size: 0 @@ -3063,7 +3093,7 @@ question_mask_size: 0 |--[0],[T_RELATION_FACTOR], str_value_=[t1], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[t1], value=[9223372036854775807] -************** Case 156 *************** +************** Case 160 *************** create outline out_name on select /*+ssssss*/* from t1 to select /*+ssssss*/* from t1; question_mask_size: 0 @@ -3089,7 +3119,7 @@ question_mask_size: 0 |--[0],[T_RELATION_FACTOR], str_value_=[t1], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[t1], value=[9223372036854775807] -************** Case 157 *************** +************** Case 161 *************** create outline out_name on select /*+ssssss*/* from t1 to select * from t1; question_mask_size: 0 @@ -3115,7 +3145,7 @@ question_mask_size: 0 |--[0],[T_RELATION_FACTOR], str_value_=[t1], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[t1], value=[9223372036854775807] -************** Case 158 *************** +************** Case 162 *************** create outline out_name on insert /*+ssssss*/ into t1 values(1, 2) to insert /*+ssssss*/ into t1 values(1, 2); question_mask_size: 0 @@ -3147,7 +3177,7 @@ question_mask_size: 0 |--[1],[T_INT], str_value_=[2], value=[2] |--[1],[T_INSERT], str_value_=[], value=[9223372036854775807] -************** Case 159 *************** +************** Case 163 *************** drop outline out_name; question_mask_size: 0 @@ -3156,7 +3186,7 @@ question_mask_size: 0 |--[0],[T_RELATION_FACTOR], str_value_=[out_name], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[out_name], value=[9223372036854775807] -************** Case 160 *************** +************** Case 164 *************** drop outline db_name.out_name; question_mask_size: 0 @@ -3166,7 +3196,7 @@ question_mask_size: 0 |--[0],[T_IDENT], str_value_=[db_name], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[out_name], value=[9223372036854775807] -************** Case 161 *************** +************** Case 165 *************** create tenant tt1 replica_num = 1, primary_zone = 'zone1', resource_pool_list = ('zone1') set ob_tcp_invited_nodes='%'; question_mask_size: 0 @@ -3186,7 +3216,7 @@ question_mask_size: 0 |--[1],[T_VARCHAR], str_value_=[%], value=[9223372036854775807] |--[1],[T_VARCHAR], str_value_=[%], value=[9223372036854775807] -************** Case 162 *************** +************** Case 166 *************** create tenant if not exists tt1 replica_num = 1, primary_zone = 'zone1', resource_pool_list = ('zone1') set ob_tcp_invited_nodes='%'; question_mask_size: 0 @@ -3207,7 +3237,7 @@ question_mask_size: 0 |--[1],[T_VARCHAR], str_value_=[%], value=[9223372036854775807] |--[1],[T_VARCHAR], str_value_=[%], value=[9223372036854775807] -************** Case 163 *************** +************** Case 167 *************** create tenant tt1 replica_num = 1, primary_zone = 'zone1', resource_pool_list = ('zone1'), locality = 'auto_locality_strategy' set ob_tcp_invited_nodes='%'; question_mask_size: 0 @@ -3229,7 +3259,7 @@ question_mask_size: 0 |--[1],[T_VARCHAR], str_value_=[%], value=[9223372036854775807] |--[1],[T_VARCHAR], str_value_=[%], value=[9223372036854775807] -************** Case 164 *************** +************** Case 168 *************** create tenant if not exists tt1 replica_num = 1, primary_zone = 'zone1', resource_pool_list = ('zone1'), locality = 'auto_locality_strategy' set ob_tcp_invited_nodes='%'; question_mask_size: 0 @@ -3252,7 +3282,7 @@ question_mask_size: 0 |--[1],[T_VARCHAR], str_value_=[%], value=[9223372036854775807] |--[1],[T_VARCHAR], str_value_=[%], value=[9223372036854775807] -************** Case 165 *************** +************** Case 169 *************** create tenant tt1 replica_num = 1, primary_zone = 'zone1', resource_pool_list = ('zone1'), logonly_replica_num = 1 set ob_tcp_invited_nodes='%'; question_mask_size: 0 @@ -3274,7 +3304,7 @@ question_mask_size: 0 |--[1],[T_VARCHAR], str_value_=[%], value=[9223372036854775807] |--[1],[T_VARCHAR], str_value_=[%], value=[9223372036854775807] -************** Case 166 *************** +************** Case 170 *************** create tenant if not exists tt1 replica_num = 1, primary_zone = 'zone1', resource_pool_list = ('zone1'), logonly_replica_num = 1 set ob_tcp_invited_nodes='%'; question_mask_size: 0 @@ -3297,7 +3327,7 @@ question_mask_size: 0 |--[1],[T_VARCHAR], str_value_=[%], value=[9223372036854775807] |--[1],[T_VARCHAR], str_value_=[%], value=[9223372036854775807] -************** Case 167 *************** +************** Case 171 *************** select /*+max_concurrent(-10)*/* from t1; question_mask_size: 0 @@ -3312,7 +3342,7 @@ question_mask_size: 0 |--[1],[T_IDENT], str_value_=[t1], value=[9223372036854775807] |--[17],[T_HINT_OPTION_LIST], str_value_=[], value=[9223372036854775807] -************** Case 168 *************** +************** Case 172 *************** select /*+max_concurrent(10)*/* from t1; question_mask_size: 0 @@ -3329,32 +3359,32 @@ question_mask_size: 0 |--[0],[T_MAX_CONCURRENT], str_value_=[], value=[9223372036854775807] |--[0],[T_INT], str_value_=[10], value=[10] -************** Case 169 *************** +************** Case 173 *************** alter system refresh time_zone_info; question_mask_size: 0 |--[0],[T_STMT_LIST], str_value_=[], value=[9223372036854775807] |--[0],[T_REFRESH_TIME_ZONE_INFO], str_value_=[], value=[0] -************** Case 170 *************** -merge into targetTable t1 using sourceTable t2 on (t1.id = t2.id) when matched then update set t1.sales = t2.sales when not matched then insert(t1.id, t1.sales) values(t2.id, t2.sales); -************** Case 171 *************** -merge into targetTable t1 using sourceTable t2 on (t1.id = t2.id) when matched then update set t1.sales = t2.sales where t2.id!= t1.id when not matched then insert(t1.id, t1.sales) values(t2.id, t2.sales); -************** Case 172 *************** -merge into targetTable t1 using sourceTable t2 on (t1.id = t2.id) when matched then update set t1.sales = t2.sales where t1.id < 3 delete where t1.id < 5 when not matched then insert(t1.id, t1.sales) values(t2.id, t2.sales); -************** Case 173 *************** -merge into targetTable t1 using sourceTable t2 on (t1.id = t2.id) when matched then update set t1.sales = t2.sales delete where t1.sales =2 when not matched then insert(t1.id, t1.sales) values(t2.id, t2.sales); ************** Case 174 *************** -merge into targetTable t1 using sourceTable t2 on (t1.id = t2.id) when not matched then insert(t1.id, t1.sales) values(t2.id, t2.sales) where t2.id > 0; +merge into targetTable t1 using sourceTable t2 on (t1.id = t2.id) when matched then update set t1.sales = t2.sales when not matched then insert(t1.id, t1.sales) values(t2.id, t2.sales); ************** Case 175 *************** -merge into targetTable t1 using sourceTable t2 on (1 = 2) when not matched then insert(t1.id, t1.sales) values(t2.id, t2.sales) where t2.id > 0; +merge into targetTable t1 using sourceTable t2 on (t1.id = t2.id) when matched then update set t1.sales = t2.sales where t2.id!= t1.id when not matched then insert(t1.id, t1.sales) values(t2.id, t2.sales); ************** Case 176 *************** -merge into targetTable t1 using sourceTable t2 on (t1.id = t2.id) when matched then update set t1.sales = t2.sales; +merge into targetTable t1 using sourceTable t2 on (t1.id = t2.id) when matched then update set t1.sales = t2.sales where t1.id < 3 delete where t1.id < 5 when not matched then insert(t1.id, t1.sales) values(t2.id, t2.sales); ************** Case 177 *************** -merge into targetTable using sourceTable on (targetTable.id = sourceTable.id) when matched then update set targetTable.sales = sourceTable.sales; +merge into targetTable t1 using sourceTable t2 on (t1.id = t2.id) when matched then update set t1.sales = t2.sales delete where t1.sales =2 when not matched then insert(t1.id, t1.sales) values(t2.id, t2.sales); ************** Case 178 *************** -merge into targetTable using (select * from t1 ) sourceTable on (targetTable.id = sourceTable.id) when matched then update set targetTable.sales = sourceTable.sales; +merge into targetTable t1 using sourceTable t2 on (t1.id = t2.id) when not matched then insert(t1.id, t1.sales) values(t2.id, t2.sales) where t2.id > 0; ************** Case 179 *************** +merge into targetTable t1 using sourceTable t2 on (1 = 2) when not matched then insert(t1.id, t1.sales) values(t2.id, t2.sales) where t2.id > 0; +************** Case 180 *************** +merge into targetTable t1 using sourceTable t2 on (t1.id = t2.id) when matched then update set t1.sales = t2.sales; +************** Case 181 *************** +merge into targetTable using sourceTable on (targetTable.id = sourceTable.id) when matched then update set targetTable.sales = sourceTable.sales; +************** Case 182 *************** +merge into targetTable using (select * from t1 ) sourceTable on (targetTable.id = sourceTable.id) when matched then update set targetTable.sales = sourceTable.sales; +************** Case 183 *************** select unique(c1), c2 from t1; question_mask_size: 0 @@ -3374,7 +3404,7 @@ question_mask_size: 0 |--[0],[T_RELATION_FACTOR], str_value_=[t1], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[t1], value=[9223372036854775807] -************** Case 180 *************** +************** Case 184 *************** select unique(c1+1), c2 from t1; question_mask_size: 0 @@ -3396,7 +3426,7 @@ question_mask_size: 0 |--[0],[T_RELATION_FACTOR], str_value_=[t1], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[t1], value=[9223372036854775807] -************** Case 181 *************** +************** Case 185 *************** select distinct unique( max(c1)), c2 from t1; question_mask_size: 0 @@ -3418,7 +3448,7 @@ question_mask_size: 0 |--[0],[T_RELATION_FACTOR], str_value_=[t1], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[t1], value=[9223372036854775807] -************** Case 182 *************** +************** Case 186 *************** select unique distinct( max(c1)), c2 from t1; question_mask_size: 0 @@ -3440,9 +3470,106 @@ question_mask_size: 0 |--[0],[T_RELATION_FACTOR], str_value_=[t1], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[t1], value=[9223372036854775807] -************** Case 183 *************** +************** Case 187 *************** select unique(*) from t1; -************** Case 184 *************** +************** Case 188 *************** +delete from t1 where c1 = 1 returning c1 + 1, c2 * 2; +question_mask_size: 0 + +|--[0],[T_STMT_LIST], str_value_=[], value=[9223372036854775807] + |--[0],[T_DELETE], str_value_=[], value=[0] + |--[1],[T_DELETE_TABLE_NODE], str_value_=[], value=[9223372036854775807] + |--[1],[T_TABLE_REFERENCES], str_value_=[], value=[9223372036854775807] + |--[0],[T_ORG], str_value_=[], value=[9223372036854775807] + |--[0],[T_RELATION_FACTOR], str_value_=[T1], value=[9223372036854775807] + |--[1],[T_IDENT], str_value_=[T1], value=[1] + |--[2],[T_WHERE_CLAUSE], str_value_=[], value=[9223372036854775807] + |--[0],[T_OP_EQ], str_value_=[], value=[9223372036854775807] + |--[0],[T_OBJ_ACCESS_REF], str_value_=[], value=[9223372036854775807] + |--[0],[T_IDENT], str_value_=[C1], value=[1] + |--[1],[T_INT], str_value_=[1], value=[1] + |--[7],[T_RETURNING], str_value_=[], value=[9223372036854775807] + |--[0],[T_PROJECT_LIST], str_value_=[], value=[9223372036854775807] + |--[0],[T_PROJECT_STRING], str_value_=[C1+1], value=[9223372036854775807] + |--[0],[T_OP_ADD], str_value_=[], value=[9223372036854775807] + |--[0],[T_OBJ_ACCESS_REF], str_value_=[], value=[9223372036854775807] + |--[0],[T_IDENT], str_value_=[C1], value=[1] + |--[1],[T_INT], str_value_=[1], value=[1] + |--[1],[T_PROJECT_STRING], str_value_=[C2*2], value=[9223372036854775807] + |--[0],[T_OP_MUL], str_value_=[], value=[9223372036854775807] + |--[0],[T_OBJ_ACCESS_REF], str_value_=[], value=[9223372036854775807] + |--[0],[T_IDENT], str_value_=[C2], value=[1] + |--[1],[T_INT], str_value_=[2], value=[2] + +************** Case 189 *************** +update t1 set c1 = 1 where c2 = 2 returning c1, c2 + 3, c3 * c4; +question_mask_size: 0 + +|--[0],[T_STMT_LIST], str_value_=[], value=[9223372036854775807] + |--[0],[T_UPDATE], str_value_=[], value=[0] + |--[1],[T_TABLE_REFERENCES], str_value_=[], value=[9223372036854775807] + |--[0],[T_ALIAS], str_value_=[], value=[9223372036854775807] + |--[0],[T_RELATION_FACTOR], str_value_=[T1], value=[9223372036854775807] + |--[1],[T_IDENT], str_value_=[T1], value=[1] + |--[2],[T_ASSIGN_LIST], str_value_=[], value=[9223372036854775807] + |--[0],[T_ASSIGN_ITEM], str_value_=[], value=[9223372036854775807] + |--[0],[T_COLUMN_REF], str_value_=[C1], value=[9223372036854775807] + |--[2],[T_IDENT], str_value_=[C1], value=[1] + |--[1],[T_INT], str_value_=[1], value=[1] + |--[3],[T_WHERE_CLAUSE], str_value_=[], value=[9223372036854775807] + |--[0],[T_OP_EQ], str_value_=[], value=[9223372036854775807] + |--[0],[T_OBJ_ACCESS_REF], str_value_=[], value=[9223372036854775807] + |--[0],[T_IDENT], str_value_=[C2], value=[1] + |--[1],[T_INT], str_value_=[2], value=[2] + |--[9],[T_RETURNING], str_value_=[], value=[9223372036854775807] + |--[0],[T_PROJECT_LIST], str_value_=[], value=[9223372036854775807] + |--[0],[T_PROJECT_STRING], str_value_=[C1], value=[9223372036854775807] + |--[0],[T_OBJ_ACCESS_REF], str_value_=[], value=[9223372036854775807] + |--[0],[T_IDENT], str_value_=[C1], value=[1] + |--[1],[T_PROJECT_STRING], str_value_=[C2+3], value=[9223372036854775807] + |--[0],[T_OP_ADD], str_value_=[], value=[9223372036854775807] + |--[0],[T_OBJ_ACCESS_REF], str_value_=[], value=[9223372036854775807] + |--[0],[T_IDENT], str_value_=[C2], value=[1] + |--[1],[T_INT], str_value_=[3], value=[3] + |--[2],[T_PROJECT_STRING], str_value_=[C3*C4], value=[9223372036854775807] + |--[0],[T_OP_MUL], str_value_=[], value=[9223372036854775807] + |--[0],[T_OBJ_ACCESS_REF], str_value_=[], value=[9223372036854775807] + |--[0],[T_IDENT], str_value_=[C3], value=[1] + |--[1],[T_OBJ_ACCESS_REF], str_value_=[], value=[9223372036854775807] + |--[0],[T_IDENT], str_value_=[C4], value=[1] + +************** Case 190 *************** +insert into t1 values(1, 2, 3) returning c1, c2, c3; +question_mask_size: 0 + +|--[0],[T_STMT_LIST], str_value_=[], value=[9223372036854775807] + |--[0],[T_INSERT], str_value_=[], value=[0] + |--[0],[T_SINGLE_TABLE_INSERT], str_value_=[], value=[9223372036854775807] + |--[0],[T_INSERT_INTO_CLAUSE], str_value_=[], value=[9223372036854775807] + |--[0],[T_ALIAS], str_value_=[], value=[9223372036854775807] + |--[0],[T_RELATION_FACTOR], str_value_=[T1], value=[9223372036854775807] + |--[1],[T_IDENT], str_value_=[T1], value=[1] + |--[1],[T_VALUE_LIST], str_value_=[], value=[9223372036854775807] + |--[0],[T_VALUE_VECTOR], str_value_=[], value=[9223372036854775807] + |--[0],[T_INT], str_value_=[1], value=[1] + |--[1],[T_INT], str_value_=[2], value=[2] + |--[2],[T_INT], str_value_=[3], value=[3] + |--[2],[T_RETURNING], str_value_=[], value=[9223372036854775807] + |--[0],[T_PROJECT_LIST], str_value_=[], value=[9223372036854775807] + |--[0],[T_PROJECT_STRING], str_value_=[C1], value=[9223372036854775807] + |--[0],[T_OBJ_ACCESS_REF], str_value_=[], value=[9223372036854775807] + |--[0],[T_IDENT], str_value_=[C1], value=[1] + |--[1],[T_PROJECT_STRING], str_value_=[C2], value=[9223372036854775807] + |--[0],[T_OBJ_ACCESS_REF], str_value_=[], value=[9223372036854775807] + |--[0],[T_IDENT], str_value_=[C2], value=[1] + |--[2],[T_PROJECT_STRING], str_value_=[C3], value=[9223372036854775807] + |--[0],[T_OBJ_ACCESS_REF], str_value_=[], value=[9223372036854775807] + |--[0],[T_IDENT], str_value_=[C3], value=[1] + |--[1],[T_INSERT], str_value_=[], value=[9223372036854775807] + +************** Case 191 *************** +replace into t1 values(1, 2) returning c1, c2, c3, c4, c5, c6; +************** Case 192 *************** alter tablegroup tg2 add table t1,t2; question_mask_size: 0 @@ -3455,7 +3582,7 @@ question_mask_size: 0 |--[1],[T_RELATION_FACTOR], str_value_=[t2], value=[9223372036854775807] |--[1],[T_IDENT], str_value_=[t2], value=[9223372036854775807] -************** Case 185 *************** +************** Case 193 *************** insert into t1 values(X''); question_mask_size: 0 @@ -3471,7 +3598,7 @@ question_mask_size: 0 |--[0],[T_HEX_STRING], str_value_=[], value=[9223372036854775807] |--[1],[T_INSERT], str_value_=[], value=[9223372036854775807] -************** Case 186 *************** +************** Case 194 *************** create table t1(`thedate` date NOT NULL COMMENT '日期'); question_mask_size: 0 @@ -3489,7 +3616,7 @@ question_mask_size: 0 |--[1],[T_COMMENT], str_value_=[], value=[9223372036854775807] |--[0],[T_VARCHAR], str_value_=[日期], value=[9223372036854775807] -************** Case 187 *************** +************** Case 195 *************** alter system bootstrap REGION 'sys_region' ZONE 'zone1' SERVER '10.101.74.122:41425'; question_mask_size: 0 @@ -3501,7 +3628,7 @@ question_mask_size: 0 |--[1],[T_VARCHAR], str_value_=[zone1], value=[9223372036854775807] |--[2],[T_VARCHAR], str_value_=["10.101.74.122":41425], value=[9223372036854775807] -************** Case 188 *************** +************** Case 196 *************** alter system transfer partition table_id = 1, object_id = 1 to ls 1001; question_mask_size: 0 @@ -3513,7 +3640,7 @@ question_mask_size: 0 |--[1],[T_INT], str_value_=[1], value=[1] |--[1],[T_INT], str_value_=[1001], value=[1001] -************** Case 189 *************** +************** Case 197 *************** alter system transfer partition table_id = 1, object_id = 1 to ls 1001 tenant 'mysql'; question_mask_size: 0 @@ -3527,7 +3654,7 @@ question_mask_size: 0 |--[1],[T_TENANT_NAME], str_value_=[], value=[9223372036854775807] |--[0],[T_VARCHAR], str_value_=[mysql], value=[9223372036854775807] -************** Case 190 *************** +************** Case 198 *************** alter system cancel transfer partition table_id = 1, object_id = 1; question_mask_size: 0 @@ -3537,7 +3664,7 @@ question_mask_size: 0 |--[0],[T_INT], str_value_=[1], value=[1] |--[1],[T_INT], str_value_=[1], value=[1] -************** Case 191 *************** +************** Case 199 *************** alter system cancel transfer partition table_id = 1, object_id = 1 tenant 'mysql'; question_mask_size: 0 @@ -3549,7 +3676,7 @@ question_mask_size: 0 |--[1],[T_TENANT_NAME], str_value_=[], value=[9223372036854775807] |--[0],[T_VARCHAR], str_value_=[mysql], value=[9223372036854775807] -************** Case 192 *************** +************** Case 200 *************** alter system cancel transfer partition ALL; question_mask_size: 0 @@ -3557,7 +3684,7 @@ question_mask_size: 0 |--[0],[T_CANCEL_TRANSFER_PARTITION], str_value_=[], value=[0] |--[0],[T_ALL], str_value_=[], value=[9223372036854775807] -************** Case 193 *************** +************** Case 201 *************** alter system cancel transfer partition ALL tenant 'mysql'; question_mask_size: 0 @@ -3567,14 +3694,14 @@ question_mask_size: 0 |--[1],[T_TENANT_NAME], str_value_=[], value=[9223372036854775807] |--[0],[T_VARCHAR], str_value_=[mysql], value=[9223372036854775807] -************** Case 194 *************** +************** Case 202 *************** alter system cancel balance job; question_mask_size: 0 |--[0],[T_STMT_LIST], str_value_=[], value=[9223372036854775807] |--[0],[T_CANCEL_BALANCE_JOB], str_value_=[], value=[0] -************** Case 195 *************** +************** Case 203 *************** alter system cancel balance job tenant 'mysql'; question_mask_size: 0 diff --git a/unittest/sql/parser/test_mysql_pl_keyword.result b/unittest/sql/parser/test_mysql_pl_keyword.result new file mode 100644 index 0000000000..32f38d07e9 --- /dev/null +++ b/unittest/sql/parser/test_mysql_pl_keyword.result @@ -0,0 +1,187 @@ +************** Begin Test Reserved Keyword *************** +Reserved Keyword: ALTER +Test PL procedure name Sql:create procedure ALTER () select 1; +Reserved Keyword: BEFORE +Test PL procedure name Sql:create procedure BEFORE () select 1; +Reserved Keyword: BY +Test PL procedure name Sql:create procedure BY () select 1; +Reserved Keyword: CALL +Test PL procedure name Sql:create procedure CALL () select 1; +Reserved Keyword: CASE +Test PL procedure name Sql:create procedure CASE () select 1; +Reserved Keyword: CONDITION +Test PL procedure name Sql:create procedure CONDITION () select 1; +Reserved Keyword: CONTINUE +Test PL procedure name Sql:create procedure CONTINUE () select 1; +Reserved Keyword: CREATE +Test PL procedure name Sql:create procedure CREATE () select 1; +Reserved Keyword: CURRENT_USER +Test PL procedure name Sql:create procedure CURRENT_USER () select 1; +Reserved Keyword: CURSOR +Test PL procedure name Sql:create procedure CURSOR () select 1; +Reserved Keyword: DECLARE +Test PL procedure name Sql:create procedure DECLARE () select 1; +Reserved Keyword: DEFAULT +Test PL procedure name Sql:create procedure DEFAULT () select 1; +Reserved Keyword: DELETE +Test PL procedure name Sql:create procedure DELETE () select 1; +Reserved Keyword: DETERMINISTIC +Test PL procedure name Sql:create procedure DETERMINISTIC () select 1; +Reserved Keyword: DROP +Test PL procedure name Sql:create procedure DROP () select 1; +Reserved Keyword: EACH +Test PL procedure name Sql:create procedure EACH () select 1; +Reserved Keyword: ELSE +Test PL procedure name Sql:create procedure ELSE () select 1; +Reserved Keyword: ELSEIF +Test PL procedure name Sql:create procedure ELSEIF () select 1; +Reserved Keyword: EXISTS +Test PL procedure name Sql:create procedure EXISTS () select 1; +Reserved Keyword: EXIT +Test PL procedure name Sql:create procedure EXIT () select 1; +Reserved Keyword: FETCH +Test PL procedure name Sql:create procedure FETCH () select 1; +Reserved Keyword: FOR +Test PL procedure name Sql:create procedure FOR () select 1; +Reserved Keyword: FROM +Test PL procedure name Sql:create procedure FROM () select 1; +Reserved Keyword: IF +Test PL procedure name Sql:create procedure IF () select 1; +Reserved Keyword: IN +Test PL procedure name Sql:create procedure IN () select 1; +Reserved Keyword: INDEX +Test PL procedure name Sql:create procedure INDEX () select 1; +Reserved Keyword: INOUT +Test PL procedure name Sql:create procedure INOUT () select 1; +Reserved Keyword: INSERT +Test PL procedure name Sql:create procedure INSERT () select 1; +Reserved Keyword: INTO +Test PL procedure name Sql:create procedure INTO () select 1; +Reserved Keyword: IS +Test PL procedure name Sql:create procedure IS () select 1; +Reserved Keyword: ITERATE +Test PL procedure name Sql:create procedure ITERATE () select 1; +Reserved Keyword: LEAVE +Test PL procedure name Sql:create procedure LEAVE () select 1; +Reserved Keyword: LIMIT +Test PL procedure name Sql:create procedure LIMIT () select 1; +Reserved Keyword: LONG +Test PL procedure name Sql:create procedure LONG () select 1; +Reserved Keyword: LOOP +Test PL procedure name Sql:create procedure LOOP () select 1; +Reserved Keyword: MODIFIES +Test PL procedure name Sql:create procedure MODIFIES () select 1; +Reserved Keyword: NOT +Test PL procedure name Sql:create procedure NOT () select 1; +Reserved Keyword: ON +Test PL procedure name Sql:create procedure ON () select 1; +Reserved Keyword: OR +Test PL procedure name Sql:create procedure OR () select 1; +Reserved Keyword: OUT +Test PL procedure name Sql:create procedure OUT () select 1; +Reserved Keyword: PROCEDURE +Test PL procedure name Sql:create procedure PROCEDURE () select 1; +Reserved Keyword: READS +Test PL procedure name Sql:create procedure READS () select 1; +Reserved Keyword: REPEAT +Test PL procedure name Sql:create procedure REPEAT () select 1; +Reserved Keyword: REPLACE +Test PL procedure name Sql:create procedure REPLACE () select 1; +Reserved Keyword: RESIGNAL +Test PL procedure name Sql:create procedure RESIGNAL () select 1; +Reserved Keyword: RETURN +Test PL procedure name Sql:create procedure RETURN () select 1; +Reserved Keyword: SELECT +Test PL procedure name Sql:create procedure SELECT () select 1; +Reserved Keyword: SIGNAL +Test PL procedure name Sql:create procedure SIGNAL () select 1; +Reserved Keyword: SQL +Test PL procedure name Sql:create procedure SQL () select 1; +Reserved Keyword: SQLEXCEPTION +Test PL procedure name Sql:create procedure SQLEXCEPTION () select 1; +Reserved Keyword: SQLSTATE +Test PL procedure name Sql:create procedure SQLSTATE () select 1; +Reserved Keyword: SQLWARNING +Test PL procedure name Sql:create procedure SQLWARNING () select 1; +Reserved Keyword: TABLE +Test PL procedure name Sql:create procedure TABLE () select 1; +Reserved Keyword: THEN +Test PL procedure name Sql:create procedure THEN () select 1; +Reserved Keyword: TRIGGER +Test PL procedure name Sql:create procedure TRIGGER () select 1; +Reserved Keyword: UPDATE +Test PL procedure name Sql:create procedure UPDATE () select 1; +Reserved Keyword: USING +Test PL procedure name Sql:create procedure USING () select 1; +Reserved Keyword: WHEN +Test PL procedure name Sql:create procedure WHEN () select 1; +Reserved Keyword: WHILE +Test PL procedure name Sql:create procedure WHILE () select 1; +Reserved Keyword: TINYINT +Test PL procedure name Sql:create procedure TINYINT () select 1; +Reserved Keyword: SMALLINT +Test PL procedure name Sql:create procedure SMALLINT () select 1; +Reserved Keyword: MEDIUMINT +Test PL procedure name Sql:create procedure MEDIUMINT () select 1; +Reserved Keyword: INTEGER +Test PL procedure name Sql:create procedure INTEGER () select 1; +Reserved Keyword: BIGINT +Test PL procedure name Sql:create procedure BIGINT () select 1; +Reserved Keyword: FLOAT +Test PL procedure name Sql:create procedure FLOAT () select 1; +Reserved Keyword: DOUBLE +Test PL procedure name Sql:create procedure DOUBLE () select 1; +Reserved Keyword: PRECISION +Test PL procedure name Sql:create procedure PRECISION () select 1; +Reserved Keyword: DEC +Test PL procedure name Sql:create procedure DEC () select 1; +Reserved Keyword: DECIMAL +Test PL procedure name Sql:create procedure DECIMAL () select 1; +Reserved Keyword: NUMERIC +Test PL procedure name Sql:create procedure NUMERIC () select 1; +Reserved Keyword: CHARACTER +Test PL procedure name Sql:create procedure CHARACTER () select 1; +Reserved Keyword: VARCHAR +Test PL procedure name Sql:create procedure VARCHAR () select 1; +Reserved Keyword: BINARY +Test PL procedure name Sql:create procedure BINARY () select 1; +Reserved Keyword: VARBINARY +Test PL procedure name Sql:create procedure VARBINARY () select 1; +Reserved Keyword: UNSIGNED +Test PL procedure name Sql:create procedure UNSIGNED () select 1; +Reserved Keyword: ZEROFILL +Test PL procedure name Sql:create procedure ZEROFILL () select 1; +Reserved Keyword: COLLATE +Test PL procedure name Sql:create procedure COLLATE () select 1; +Reserved Keyword: SET +Test PL procedure name Sql:create procedure SET () select 1; +Reserved Keyword: BLOB +Test PL procedure name Sql:create procedure BLOB () select 1; +Reserved Keyword: TINYTEXT +Test PL procedure name Sql:create procedure TINYTEXT () select 1; +Reserved Keyword: MEDIUMTEXT +Test PL procedure name Sql:create procedure MEDIUMTEXT () select 1; +Reserved Keyword: LONGTEXT +Test PL procedure name Sql:create procedure LONGTEXT () select 1; +Reserved Keyword: TINYBLOB +Test PL procedure name Sql:create procedure TINYBLOB () select 1; +Reserved Keyword: MEDIUMBLOB +Test PL procedure name Sql:create procedure MEDIUMBLOB () select 1; +Reserved Keyword: LONGBLOB +Test PL procedure name Sql:create procedure LONGBLOB () select 1; +Reserved Keyword: VARYING +Test PL procedure name Sql:create procedure VARYING () select 1; +Reserved Keyword: CHARSET +Test PL procedure name Sql:create procedure CHARSET () select 1; +Reserved Keyword: COMMIT +Test PL procedure name Sql:create procedure COMMIT () select 1; +Reserved Keyword: ROLLBACK +Test PL procedure name Sql:create procedure ROLLBACK () select 1; +Reserved Keyword: DO +Test PL procedure name Sql:create procedure DO () select 1; +Reserved Keyword: UNTIL +Test PL procedure name Sql:create procedure UNTIL () select 1; +************** Total Count of Reserved Keyword:91 *************** +************** End Test Reserved Keyword *************** +************** Begin Test Non-Reserved Keyword *************** +************** End Test Non-Reserved Keyword *************** diff --git a/unittest/sql/parser/test_mysql_sql_keyword.result b/unittest/sql/parser/test_mysql_sql_keyword.result new file mode 100644 index 0000000000..213f0fc251 --- /dev/null +++ b/unittest/sql/parser/test_mysql_sql_keyword.result @@ -0,0 +1,465 @@ +************** Begin Test Reserved Keyword *************** +Reserved Keyword: ACCESSIBLE +Test Table Name and Column Name Sql:create table ACCESSIBLE(ACCESSIBLE int); +Reserved Keyword: ADD +Test Table Name and Column Name Sql:create table ADD(ADD int); +Reserved Keyword: ALL +Test Table Name and Column Name Sql:create table ALL(ALL int); +Reserved Keyword: ALTER +Test Table Name and Column Name Sql:create table ALTER(ALTER int); +Reserved Keyword: ANALYZE +Test Table Name and Column Name Sql:create table ANALYZE(ANALYZE int); +Reserved Keyword: AND +Test Table Name and Column Name Sql:create table AND(AND int); +Reserved Keyword: AS +Test Table Name and Column Name Sql:create table AS(AS int); +Reserved Keyword: ASC +Test Table Name and Column Name Sql:create table ASC(ASC int); +Reserved Keyword: ASENSITIVE +Test Table Name and Column Name Sql:create table ASENSITIVE(ASENSITIVE int); +Reserved Keyword: BEFORE +Test Table Name and Column Name Sql:create table BEFORE(BEFORE int); +Reserved Keyword: BETWEEN +Test Table Name and Column Name Sql:create table BETWEEN(BETWEEN int); +Reserved Keyword: BIGINT +Test Table Name and Column Name Sql:create table BIGINT(BIGINT int); +Reserved Keyword: BINARY +Test Table Name and Column Name Sql:create table BINARY(BINARY int); +Reserved Keyword: BLOB +Test Table Name and Column Name Sql:create table BLOB(BLOB int); +Reserved Keyword: BOTH +Test Table Name and Column Name Sql:create table BOTH(BOTH int); +Reserved Keyword: BY +Test Table Name and Column Name Sql:create table BY(BY int); +Reserved Keyword: CALL +Test Table Name and Column Name Sql:create table CALL(CALL int); +Reserved Keyword: CASCADE +Test Table Name and Column Name Sql:create table CASCADE(CASCADE int); +Reserved Keyword: CASE +Test Table Name and Column Name Sql:create table CASE(CASE int); +Reserved Keyword: CHANGE +Test Table Name and Column Name Sql:create table CHANGE(CHANGE int); +Reserved Keyword: CHAR +Test Table Name and Column Name Sql:create table CHAR(CHAR int); +Reserved Keyword: CHARACTER +Test Table Name and Column Name Sql:create table CHARACTER(CHARACTER int); +Reserved Keyword: CHECK +Test Table Name and Column Name Sql:create table CHECK(CHECK int); +Reserved Keyword: COLLATE +Test Table Name and Column Name Sql:create table COLLATE(COLLATE int); +Reserved Keyword: COLUMN +Test Table Name and Column Name Sql:create table COLUMN(COLUMN int); +Reserved Keyword: CONDITION +Test Table Name and Column Name Sql:create table CONDITION(CONDITION int); +Reserved Keyword: CONSTRAINT +Test Table Name and Column Name Sql:create table CONSTRAINT(CONSTRAINT int); +Reserved Keyword: CONTINUE +Test Table Name and Column Name Sql:create table CONTINUE(CONTINUE int); +Reserved Keyword: CONVERT +Test Table Name and Column Name Sql:create table CONVERT(CONVERT int); +Reserved Keyword: CREATE +Test Table Name and Column Name Sql:create table CREATE(CREATE int); +Reserved Keyword: CROSS +Test Table Name and Column Name Sql:create table CROSS(CROSS int); +Reserved Keyword: CURRENT_DATE +Test Table Name and Column Name Sql:create table CURRENT_DATE(CURRENT_DATE int); +Reserved Keyword: CURRENT_TIME +Test Table Name and Column Name Sql:create table CURRENT_TIME(CURRENT_TIME int); +Reserved Keyword: CURRENT_TIMESTAMP +Test Table Name and Column Name Sql:create table CURRENT_TIMESTAMP(CURRENT_TIMESTAMP int); +Reserved Keyword: CURRENT_USER +Test Table Name and Column Name Sql:create table CURRENT_USER(CURRENT_USER int); +Reserved Keyword: CURSOR +Test Table Name and Column Name Sql:create table CURSOR(CURSOR int); +Reserved Keyword: DATABASE +Test Table Name and Column Name Sql:create table DATABASE(DATABASE int); +Reserved Keyword: DATABASES +Test Table Name and Column Name Sql:create table DATABASES(DATABASES int); +Reserved Keyword: DAY_HOUR +Test Table Name and Column Name Sql:create table DAY_HOUR(DAY_HOUR int); +Reserved Keyword: DAY_MICROSECOND +Test Table Name and Column Name Sql:create table DAY_MICROSECOND(DAY_MICROSECOND int); +Reserved Keyword: DAY_MINUTE +Test Table Name and Column Name Sql:create table DAY_MINUTE(DAY_MINUTE int); +Reserved Keyword: DAY_SECOND +Test Table Name and Column Name Sql:create table DAY_SECOND(DAY_SECOND int); +Reserved Keyword: DECLARE +Test Table Name and Column Name Sql:create table DECLARE(DECLARE int); +Reserved Keyword: DECIMAL +Test Table Name and Column Name Sql:create table DECIMAL(DECIMAL int); +Reserved Keyword: DEFAULT +Test Table Name and Column Name Sql:create table DEFAULT(DEFAULT int); +Reserved Keyword: DELAYED +Test Table Name and Column Name Sql:create table DELAYED(DELAYED int); +Reserved Keyword: DELETE +Test Table Name and Column Name Sql:create table DELETE(DELETE int); +Reserved Keyword: DESC +Test Table Name and Column Name Sql:create table DESC(DESC int); +Reserved Keyword: DESCRIBE +Test Table Name and Column Name Sql:create table DESCRIBE(DESCRIBE int); +Reserved Keyword: DETERMINISTIC +Test Table Name and Column Name Sql:create table DETERMINISTIC(DETERMINISTIC int); +Reserved Keyword: DISTINCT +Test Table Name and Column Name Sql:create table DISTINCT(DISTINCT int); +Reserved Keyword: DISTINCTROW +Test Table Name and Column Name Sql:create table DISTINCTROW(DISTINCTROW int); +Reserved Keyword: DIV +Test Table Name and Column Name Sql:create table DIV(DIV int); +Reserved Keyword: DOUBLE +Test Table Name and Column Name Sql:create table DOUBLE(DOUBLE int); +Reserved Keyword: DROP +Test Table Name and Column Name Sql:create table DROP(DROP int); +Reserved Keyword: DUAL +Test Table Name and Column Name Sql:create table DUAL(DUAL int); +Reserved Keyword: EACH +Test Table Name and Column Name Sql:create table EACH(EACH int); +Reserved Keyword: ELSE +Test Table Name and Column Name Sql:create table ELSE(ELSE int); +Reserved Keyword: ELSEIF +Test Table Name and Column Name Sql:create table ELSEIF(ELSEIF int); +Reserved Keyword: ENCLOSED +Test Table Name and Column Name Sql:create table ENCLOSED(ENCLOSED int); +Reserved Keyword: ESCAPED +Test Table Name and Column Name Sql:create table ESCAPED(ESCAPED int); +Reserved Keyword: EXISTS +Test Table Name and Column Name Sql:create table EXISTS(EXISTS int); +Reserved Keyword: EXIT +Test Table Name and Column Name Sql:create table EXIT(EXIT int); +Reserved Keyword: EXPLAIN +Test Table Name and Column Name Sql:create table EXPLAIN(EXPLAIN int); +Reserved Keyword: FETCH +Test Table Name and Column Name Sql:create table FETCH(FETCH int); +Reserved Keyword: FLOAT +Test Table Name and Column Name Sql:create table FLOAT(FLOAT int); +Reserved Keyword: FLOAT4 +Test Table Name and Column Name Sql:create table FLOAT4(FLOAT4 int); +Reserved Keyword: FLOAT8 +Test Table Name and Column Name Sql:create table FLOAT8(FLOAT8 int); +Reserved Keyword: FOR +Test Table Name and Column Name Sql:create table FOR(FOR int); +Reserved Keyword: FORCE +Test Table Name and Column Name Sql:create table FORCE(FORCE int); +Reserved Keyword: FOREIGN +Test Table Name and Column Name Sql:create table FOREIGN(FOREIGN int); +Reserved Keyword: FROM +Test Table Name and Column Name Sql:create table FROM(FROM int); +Reserved Keyword: FULLTEXT +Test Table Name and Column Name Sql:create table FULLTEXT(FULLTEXT int); +Reserved Keyword: GENERATED +Test Table Name and Column Name Sql:create table GENERATED(GENERATED int); +Reserved Keyword: GET +Test Table Name and Column Name Sql:create table GET(GET int); +Reserved Keyword: GRANT +Test Table Name and Column Name Sql:create table GRANT(GRANT int); +Reserved Keyword: GROUP +Test Table Name and Column Name Sql:create table GROUP(GROUP int); +Reserved Keyword: HAVING +Test Table Name and Column Name Sql:create table HAVING(HAVING int); +Reserved Keyword: HIGH_PRIORITY +Test Table Name and Column Name Sql:create table HIGH_PRIORITY(HIGH_PRIORITY int); +Reserved Keyword: HOUR_MICROSECOND +Test Table Name and Column Name Sql:create table HOUR_MICROSECOND(HOUR_MICROSECOND int); +Reserved Keyword: HOUR_MINUTE +Test Table Name and Column Name Sql:create table HOUR_MINUTE(HOUR_MINUTE int); +Reserved Keyword: HOUR_SECOND +Test Table Name and Column Name Sql:create table HOUR_SECOND(HOUR_SECOND int); +Reserved Keyword: IF +Test Table Name and Column Name Sql:create table IF(IF int); +Reserved Keyword: IGNORE +Test Table Name and Column Name Sql:create table IGNORE(IGNORE int); +Reserved Keyword: IN +Test Table Name and Column Name Sql:create table IN(IN int); +Reserved Keyword: INDEX +Test Table Name and Column Name Sql:create table INDEX(INDEX int); +Reserved Keyword: INFILE +Test Table Name and Column Name Sql:create table INFILE(INFILE int); +Reserved Keyword: INNER +Test Table Name and Column Name Sql:create table INNER(INNER int); +Reserved Keyword: INOUT +Test Table Name and Column Name Sql:create table INOUT(INOUT int); +Reserved Keyword: INSENSITIVE +Test Table Name and Column Name Sql:create table INSENSITIVE(INSENSITIVE int); +Reserved Keyword: INSERT +Test Table Name and Column Name Sql:create table INSERT(INSERT int); +Reserved Keyword: INT +Test Table Name and Column Name Sql:create table INT(INT int); +Reserved Keyword: INT1 +Test Table Name and Column Name Sql:create table INT1(INT1 int); +Reserved Keyword: INT2 +Test Table Name and Column Name Sql:create table INT2(INT2 int); +Reserved Keyword: INT3 +Test Table Name and Column Name Sql:create table INT3(INT3 int); +Reserved Keyword: INT4 +Test Table Name and Column Name Sql:create table INT4(INT4 int); +Reserved Keyword: INT8 +Test Table Name and Column Name Sql:create table INT8(INT8 int); +Reserved Keyword: INTEGER +Test Table Name and Column Name Sql:create table INTEGER(INTEGER int); +Reserved Keyword: INTERVAL +Test Table Name and Column Name Sql:create table INTERVAL(INTERVAL int); +Reserved Keyword: INTO +Test Table Name and Column Name Sql:create table INTO(INTO int); +Reserved Keyword: IO_AFTER_GTIDS +Test Table Name and Column Name Sql:create table IO_AFTER_GTIDS(IO_AFTER_GTIDS int); +Reserved Keyword: IO_BEFORE_GTIDS +Test Table Name and Column Name Sql:create table IO_BEFORE_GTIDS(IO_BEFORE_GTIDS int); +Reserved Keyword: IS +Test Table Name and Column Name Sql:create table IS(IS int); +Reserved Keyword: ITERATE +Test Table Name and Column Name Sql:create table ITERATE(ITERATE int); +Reserved Keyword: JOIN +Test Table Name and Column Name Sql:create table JOIN(JOIN int); +Reserved Keyword: KEY +Test Table Name and Column Name Sql:create table KEY(KEY int); +Reserved Keyword: KEYS +Test Table Name and Column Name Sql:create table KEYS(KEYS int); +Reserved Keyword: KILL +Test Table Name and Column Name Sql:create table KILL(KILL int); +Reserved Keyword: LEADING +Test Table Name and Column Name Sql:create table LEADING(LEADING int); +Reserved Keyword: LEAVE +Test Table Name and Column Name Sql:create table LEAVE(LEAVE int); +Reserved Keyword: LEFT +Test Table Name and Column Name Sql:create table LEFT(LEFT int); +Reserved Keyword: LIKE +Test Table Name and Column Name Sql:create table LIKE(LIKE int); +Reserved Keyword: LIMIT +Test Table Name and Column Name Sql:create table LIMIT(LIMIT int); +Reserved Keyword: LINEAR +Test Table Name and Column Name Sql:create table LINEAR(LINEAR int); +Reserved Keyword: LINES +Test Table Name and Column Name Sql:create table LINES(LINES int); +Reserved Keyword: LOAD +Test Table Name and Column Name Sql:create table LOAD(LOAD int); +Reserved Keyword: LOCALTIME +Test Table Name and Column Name Sql:create table LOCALTIME(LOCALTIME int); +Reserved Keyword: LOCALTIMESTAMP +Test Table Name and Column Name Sql:create table LOCALTIMESTAMP(LOCALTIMESTAMP int); +Reserved Keyword: LONG +Test Table Name and Column Name Sql:create table LONG(LONG int); +Reserved Keyword: LONGBLOB +Test Table Name and Column Name Sql:create table LONGBLOB(LONGBLOB int); +Reserved Keyword: LONGTEXT +Test Table Name and Column Name Sql:create table LONGTEXT(LONGTEXT int); +Reserved Keyword: LOOP +Test Table Name and Column Name Sql:create table LOOP(LOOP int); +Reserved Keyword: LOW_PRIORITY +Test Table Name and Column Name Sql:create table LOW_PRIORITY(LOW_PRIORITY int); +Reserved Keyword: MASTER_BIND +Test Table Name and Column Name Sql:create table MASTER_BIND(MASTER_BIND int); +Reserved Keyword: MASTER_SSL_VERIFY_SERVER_CERT +Test Table Name and Column Name Sql:create table MASTER_SSL_VERIFY_SERVER_CERT(MASTER_SSL_VERIFY_SERVER_CERT int); +Reserved Keyword: MATCH +Test Table Name and Column Name Sql:create table MATCH(MATCH int); +Reserved Keyword: MAXVALUE +Test Table Name and Column Name Sql:create table MAXVALUE(MAXVALUE int); +Reserved Keyword: MEDIUMBLOB +Test Table Name and Column Name Sql:create table MEDIUMBLOB(MEDIUMBLOB int); +Reserved Keyword: MEDIUMINT +Test Table Name and Column Name Sql:create table MEDIUMINT(MEDIUMINT int); +Reserved Keyword: MEDIUMTEXT +Test Table Name and Column Name Sql:create table MEDIUMTEXT(MEDIUMTEXT int); +Reserved Keyword: MIDDLEINT +Test Table Name and Column Name Sql:create table MIDDLEINT(MIDDLEINT int); +Reserved Keyword: MINUTE_MICROSECOND +Test Table Name and Column Name Sql:create table MINUTE_MICROSECOND(MINUTE_MICROSECOND int); +Reserved Keyword: MINUTE_SECOND +Test Table Name and Column Name Sql:create table MINUTE_SECOND(MINUTE_SECOND int); +Reserved Keyword: MOD +Test Table Name and Column Name Sql:create table MOD(MOD int); +Reserved Keyword: MODIFIES +Test Table Name and Column Name Sql:create table MODIFIES(MODIFIES int); +Reserved Keyword: NATURAL +Test Table Name and Column Name Sql:create table NATURAL(NATURAL int); +Reserved Keyword: NOT +Test Table Name and Column Name Sql:create table NOT(NOT int); +Reserved Keyword: NO_WRITE_TO_BINLOG +Test Table Name and Column Name Sql:create table NO_WRITE_TO_BINLOG(NO_WRITE_TO_BINLOG int); +Reserved Keyword: NUMERIC +Test Table Name and Column Name Sql:create table NUMERIC(NUMERIC int); +Reserved Keyword: ON +Test Table Name and Column Name Sql:create table ON(ON int); +Reserved Keyword: OPTIMIZE +Test Table Name and Column Name Sql:create table OPTIMIZE(OPTIMIZE int); +Reserved Keyword: OPTION +Test Table Name and Column Name Sql:create table OPTION(OPTION int); +Reserved Keyword: OPTIONALLY +Test Table Name and Column Name Sql:create table OPTIONALLY(OPTIONALLY int); +Reserved Keyword: OR +Test Table Name and Column Name Sql:create table OR(OR int); +Reserved Keyword: ORDER +Test Table Name and Column Name Sql:create table ORDER(ORDER int); +Reserved Keyword: OUT +Test Table Name and Column Name Sql:create table OUT(OUT int); +Reserved Keyword: OUTER +Test Table Name and Column Name Sql:create table OUTER(OUTER int); +Reserved Keyword: OUTFILE +Test Table Name and Column Name Sql:create table OUTFILE(OUTFILE int); +Reserved Keyword: PARTITION +Test Table Name and Column Name Sql:create table PARTITION(PARTITION int); +Reserved Keyword: PRECISION +Test Table Name and Column Name Sql:create table PRECISION(PRECISION int); +Reserved Keyword: PRIMARY +Test Table Name and Column Name Sql:create table PRIMARY(PRIMARY int); +Reserved Keyword: PROCEDURE +Test Table Name and Column Name Sql:create table PROCEDURE(PROCEDURE int); +Reserved Keyword: PURGE +Test Table Name and Column Name Sql:create table PURGE(PURGE int); +Reserved Keyword: RANGE +Test Table Name and Column Name Sql:create table RANGE(RANGE int); +Reserved Keyword: READ +Test Table Name and Column Name Sql:create table READ(READ int); +Reserved Keyword: READS +Test Table Name and Column Name Sql:create table READS(READS int); +Reserved Keyword: READ_WRITE +Test Table Name and Column Name Sql:create table READ_WRITE(READ_WRITE int); +Reserved Keyword: REAL +Test Table Name and Column Name Sql:create table REAL(REAL int); +Reserved Keyword: REFERENCES +Test Table Name and Column Name Sql:create table REFERENCES(REFERENCES int); +Reserved Keyword: REGEXP +Test Table Name and Column Name Sql:create table REGEXP(REGEXP int); +Reserved Keyword: RELEASE +Test Table Name and Column Name Sql:create table RELEASE(RELEASE int); +Reserved Keyword: RENAME +Test Table Name and Column Name Sql:create table RENAME(RENAME int); +Reserved Keyword: REPEAT +Test Table Name and Column Name Sql:create table REPEAT(REPEAT int); +Reserved Keyword: REPLACE +Test Table Name and Column Name Sql:create table REPLACE(REPLACE int); +Reserved Keyword: REQUIRE +Test Table Name and Column Name Sql:create table REQUIRE(REQUIRE int); +Reserved Keyword: RESIGNAL +Test Table Name and Column Name Sql:create table RESIGNAL(RESIGNAL int); +Reserved Keyword: RESTRICT +Test Table Name and Column Name Sql:create table RESTRICT(RESTRICT int); +Reserved Keyword: RETURN +Test Table Name and Column Name Sql:create table RETURN(RETURN int); +Reserved Keyword: REVOKE +Test Table Name and Column Name Sql:create table REVOKE(REVOKE int); +Reserved Keyword: RIGHT +Test Table Name and Column Name Sql:create table RIGHT(RIGHT int); +Reserved Keyword: RLIKE +Test Table Name and Column Name Sql:create table RLIKE(RLIKE int); +Reserved Keyword: SCHEMA +Test Table Name and Column Name Sql:create table SCHEMA(SCHEMA int); +Reserved Keyword: SCHEMAS +Test Table Name and Column Name Sql:create table SCHEMAS(SCHEMAS int); +Reserved Keyword: SECOND_MICROSECOND +Test Table Name and Column Name Sql:create table SECOND_MICROSECOND(SECOND_MICROSECOND int); +Reserved Keyword: SELECT +Test Table Name and Column Name Sql:create table SELECT(SELECT int); +Reserved Keyword: SENSITIVE +Test Table Name and Column Name Sql:create table SENSITIVE(SENSITIVE int); +Reserved Keyword: SEPARATOR +Test Table Name and Column Name Sql:create table SEPARATOR(SEPARATOR int); +Reserved Keyword: SET +Test Table Name and Column Name Sql:create table SET(SET int); +Reserved Keyword: SHOW +Test Table Name and Column Name Sql:create table SHOW(SHOW int); +Reserved Keyword: SIGNAL +Test Table Name and Column Name Sql:create table SIGNAL(SIGNAL int); +Reserved Keyword: SMALLINT +Test Table Name and Column Name Sql:create table SMALLINT(SMALLINT int); +Reserved Keyword: SPATIAL +Test Table Name and Column Name Sql:create table SPATIAL(SPATIAL int); +Reserved Keyword: SPECIFIC +Test Table Name and Column Name Sql:create table SPECIFIC(SPECIFIC int); +Reserved Keyword: SQL +Test Table Name and Column Name Sql:create table SQL(SQL int); +Reserved Keyword: SQLEXCEPTION +Test Table Name and Column Name Sql:create table SQLEXCEPTION(SQLEXCEPTION int); +Reserved Keyword: SQLSTATE +Test Table Name and Column Name Sql:create table SQLSTATE(SQLSTATE int); +Reserved Keyword: SQLWARNING +Test Table Name and Column Name Sql:create table SQLWARNING(SQLWARNING int); +Reserved Keyword: SQL_BIG_RESULT +Test Table Name and Column Name Sql:create table SQL_BIG_RESULT(SQL_BIG_RESULT int); +Reserved Keyword: SQL_CALC_FOUND_ROWS +Test Table Name and Column Name Sql:create table SQL_CALC_FOUND_ROWS(SQL_CALC_FOUND_ROWS int); +Reserved Keyword: SQL_SMALL_RESULT +Test Table Name and Column Name Sql:create table SQL_SMALL_RESULT(SQL_SMALL_RESULT int); +Reserved Keyword: SSL +Test Table Name and Column Name Sql:create table SSL(SSL int); +Reserved Keyword: STARTING +Test Table Name and Column Name Sql:create table STARTING(STARTING int); +Reserved Keyword: STORED +Test Table Name and Column Name Sql:create table STORED(STORED int); +Reserved Keyword: STRAIGHT_JOIN +Test Table Name and Column Name Sql:create table STRAIGHT_JOIN(STRAIGHT_JOIN int); +Reserved Keyword: TABLE +Test Table Name and Column Name Sql:create table TABLE(TABLE int); +Reserved Keyword: TERMINATED +Test Table Name and Column Name Sql:create table TERMINATED(TERMINATED int); +Reserved Keyword: THEN +Test Table Name and Column Name Sql:create table THEN(THEN int); +Reserved Keyword: TINYBLOB +Test Table Name and Column Name Sql:create table TINYBLOB(TINYBLOB int); +Reserved Keyword: TINYINT +Test Table Name and Column Name Sql:create table TINYINT(TINYINT int); +Reserved Keyword: TINYTEXT +Test Table Name and Column Name Sql:create table TINYTEXT(TINYTEXT int); +Reserved Keyword: TO +Test Table Name and Column Name Sql:create table TO(TO int); +Reserved Keyword: TRAILING +Test Table Name and Column Name Sql:create table TRAILING(TRAILING int); +Reserved Keyword: TRIGGER +Test Table Name and Column Name Sql:create table TRIGGER(TRIGGER int); +Reserved Keyword: UNDO +Test Table Name and Column Name Sql:create table UNDO(UNDO int); +Reserved Keyword: UNION +Test Table Name and Column Name Sql:create table UNION(UNION int); +Reserved Keyword: UNIQUE +Test Table Name and Column Name Sql:create table UNIQUE(UNIQUE int); +Reserved Keyword: UNLOCK +Test Table Name and Column Name Sql:create table UNLOCK(UNLOCK int); +Reserved Keyword: UNSIGNED +Test Table Name and Column Name Sql:create table UNSIGNED(UNSIGNED int); +Reserved Keyword: UPDATE +Test Table Name and Column Name Sql:create table UPDATE(UPDATE int); +Reserved Keyword: USAGE +Test Table Name and Column Name Sql:create table USAGE(USAGE int); +Reserved Keyword: USE +Test Table Name and Column Name Sql:create table USE(USE int); +Reserved Keyword: USING +Test Table Name and Column Name Sql:create table USING(USING int); +Reserved Keyword: UTC_DATE +Test Table Name and Column Name Sql:create table UTC_DATE(UTC_DATE int); +Reserved Keyword: UTC_TIME +Test Table Name and Column Name Sql:create table UTC_TIME(UTC_TIME int); +Reserved Keyword: UTC_TIMESTAMP +Test Table Name and Column Name Sql:create table UTC_TIMESTAMP(UTC_TIMESTAMP int); +Reserved Keyword: VALUES +Test Table Name and Column Name Sql:create table VALUES(VALUES int); +Reserved Keyword: VARBINARY +Test Table Name and Column Name Sql:create table VARBINARY(VARBINARY int); +Reserved Keyword: VARCHAR +Test Table Name and Column Name Sql:create table VARCHAR(VARCHAR int); +Reserved Keyword: VARCHARACTER +Test Table Name and Column Name Sql:create table VARCHARACTER(VARCHARACTER int); +Reserved Keyword: VARYING +Test Table Name and Column Name Sql:create table VARYING(VARYING int); +Reserved Keyword: VIRTUAL +Test Table Name and Column Name Sql:create table VIRTUAL(VIRTUAL int); +Reserved Keyword: WHEN +Test Table Name and Column Name Sql:create table WHEN(WHEN int); +Reserved Keyword: WHERE +Test Table Name and Column Name Sql:create table WHERE(WHERE int); +Reserved Keyword: WHILE +Test Table Name and Column Name Sql:create table WHILE(WHILE int); +Reserved Keyword: WITH +Test Table Name and Column Name Sql:create table WITH(WITH int); +Reserved Keyword: WRITE +Test Table Name and Column Name Sql:create table WRITE(WRITE int); +Reserved Keyword: XOR +Test Table Name and Column Name Sql:create table XOR(XOR int); +Reserved Keyword: YEAR_MONTH +Test Table Name and Column Name Sql:create table YEAR_MONTH(YEAR_MONTH int); +Reserved Keyword: ZEROFILL +Test Table Name and Column Name Sql:create table ZEROFILL(ZEROFILL int); +Reserved Keyword: TABLEGROUP +Test Table Name and Column Name Sql:create table TABLEGROUP(TABLEGROUP int); +************** Total Count of Reserved Keyword:230 *************** +************** End Test Reserved Keyword *************** +************** Begin Test Non-Reserved Keyword *************** +************** End Test Non-Reserved Keyword *************** diff --git a/unittest/sql/parser/test_oracle_pl_keyword.result b/unittest/sql/parser/test_oracle_pl_keyword.result new file mode 100644 index 0000000000..3765541715 --- /dev/null +++ b/unittest/sql/parser/test_oracle_pl_keyword.result @@ -0,0 +1,191 @@ +************** Begin Test Reserved Keyword *************** +Reserved Keyword: ALL +Test PL type name Sql:create type ALL as table of varchar2(1); +Reserved Keyword: ALTER +Test PL type name Sql:create type ALTER as table of varchar2(1); +Reserved Keyword: AND +Test PL type name Sql:create type AND as table of varchar2(1); +Reserved Keyword: ANY +Test PL type name Sql:create type ANY as table of varchar2(1); +Reserved Keyword: AS +Test PL type name Sql:create type AS as table of varchar2(1); +Reserved Keyword: ASC +Test PL type name Sql:create type ASC as table of varchar2(1); +Reserved Keyword: AT +Test PL type name Sql:create type AT as table of varchar2(1); +Reserved Keyword: BEGIN +Test PL type name Sql:create type BEGIN as table of varchar2(1); +Reserved Keyword: BETWEEN +Test PL type name Sql:create type BETWEEN as table of varchar2(1); +Reserved Keyword: BY +Test PL type name Sql:create type BY as table of varchar2(1); +Reserved Keyword: CASE +Test PL type name Sql:create type CASE as table of varchar2(1); +Reserved Keyword: CHECK +Test PL type name Sql:create type CHECK as table of varchar2(1); +Reserved Keyword: CLUSTERS +Test PL type name Sql:create type CLUSTERS as table of varchar2(1); +Reserved Keyword: CLUSTER +Test PL type name Sql:create type CLUSTER as table of varchar2(1); +Reserved Keyword: COLAUTH +Test PL type name Sql:create type COLAUTH as table of varchar2(1); +Reserved Keyword: COLUMNS +Test PL type name Sql:create type COLUMNS as table of varchar2(1); +Reserved Keyword: COMPRESS +Test PL type name Sql:create type COMPRESS as table of varchar2(1); +Reserved Keyword: CONNECT +Test PL type name Sql:create type CONNECT as table of varchar2(1); +Reserved Keyword: CRASH +Test PL type name Sql:create type CRASH as table of varchar2(1); +Reserved Keyword: CREATE +Test PL type name Sql:create type CREATE as table of varchar2(1); +Reserved Keyword: CURSOR +Test PL type name Sql:create type CURSOR as table of varchar2(1); +Reserved Keyword: COMMIT +Test PL type name Sql:create type COMMIT as table of varchar2(1); +Reserved Keyword: DELETE +Test PL type name Sql:create type DELETE as table of varchar2(1); +Reserved Keyword: DECLARE +Test PL type name Sql:create type DECLARE as table of varchar2(1); +Reserved Keyword: DEFAULT +Test PL type name Sql:create type DEFAULT as table of varchar2(1); +Reserved Keyword: DESC +Test PL type name Sql:create type DESC as table of varchar2(1); +Reserved Keyword: DISTINCT +Test PL type name Sql:create type DISTINCT as table of varchar2(1); +Reserved Keyword: DROP +Test PL type name Sql:create type DROP as table of varchar2(1); +Reserved Keyword: EXISTS +Test PL type name Sql:create type EXISTS as table of varchar2(1); +Reserved Keyword: ELSE +Test PL type name Sql:create type ELSE as table of varchar2(1); +Reserved Keyword: ELSIF +Test PL type name Sql:create type ELSIF as table of varchar2(1); +Reserved Keyword: END +Test PL type name Sql:create type END as table of varchar2(1); +Reserved Keyword: EXCEPTION +Test PL type name Sql:create type EXCEPTION as table of varchar2(1); +Reserved Keyword: EXCLUSIVE +Test PL type name Sql:create type EXCLUSIVE as table of varchar2(1); +Reserved Keyword: FETCH +Test PL type name Sql:create type FETCH as table of varchar2(1); +Reserved Keyword: FOR +Test PL type name Sql:create type FOR as table of varchar2(1); +Reserved Keyword: FROM +Test PL type name Sql:create type FROM as table of varchar2(1); +Reserved Keyword: FUNCTION +Test PL type name Sql:create type FUNCTION as table of varchar2(1); +Reserved Keyword: GOTO +Test PL type name Sql:create type GOTO as table of varchar2(1); +Reserved Keyword: GRANT +Test PL type name Sql:create type GRANT as table of varchar2(1); +Reserved Keyword: GROUP +Test PL type name Sql:create type GROUP as table of varchar2(1); +Reserved Keyword: HAVING +Test PL type name Sql:create type HAVING as table of varchar2(1); +Reserved Keyword: IDENTIFIED +Test PL type name Sql:create type IDENTIFIED as table of varchar2(1); +Reserved Keyword: IF +Test PL type name Sql:create type IF as table of varchar2(1); +Reserved Keyword: IN +Test PL type name Sql:create type IN as table of varchar2(1); +Reserved Keyword: INDEX +Test PL type name Sql:create type INDEX as table of varchar2(1); +Reserved Keyword: INDEXES +Test PL type name Sql:create type INDEXES as table of varchar2(1); +Reserved Keyword: INSERT +Test PL type name Sql:create type INSERT as table of varchar2(1); +Reserved Keyword: INTERSECT +Test PL type name Sql:create type INTERSECT as table of varchar2(1); +Reserved Keyword: INTO +Test PL type name Sql:create type INTO as table of varchar2(1); +Reserved Keyword: IS +Test PL type name Sql:create type IS as table of varchar2(1); +Reserved Keyword: LIKE +Test PL type name Sql:create type LIKE as table of varchar2(1); +Reserved Keyword: LOCK +Test PL type name Sql:create type LOCK as table of varchar2(1); +Reserved Keyword: MINUS +Test PL type name Sql:create type MINUS as table of varchar2(1); +Reserved Keyword: MODE +Test PL type name Sql:create type MODE as table of varchar2(1); +Reserved Keyword: NOCOMPRESS +Test PL type name Sql:create type NOCOMPRESS as table of varchar2(1); +Reserved Keyword: NOT +Test PL type name Sql:create type NOT as table of varchar2(1); +Reserved Keyword: NOWAIT +Test PL type name Sql:create type NOWAIT as table of varchar2(1); +Reserved Keyword: NULL +Test PL type name Sql:create type NULL as table of varchar2(1); +Reserved Keyword: OF +Test PL type name Sql:create type OF as table of varchar2(1); +Reserved Keyword: ON +Test PL type name Sql:create type ON as table of varchar2(1); +Reserved Keyword: OPTION +Test PL type name Sql:create type OPTION as table of varchar2(1); +Reserved Keyword: OR +Test PL type name Sql:create type OR as table of varchar2(1); +Reserved Keyword: ORDER +Test PL type name Sql:create type ORDER as table of varchar2(1); +Reserved Keyword: OVERLAPS +Test PL type name Sql:create type OVERLAPS as table of varchar2(1); +Reserved Keyword: PROCEDURE +Test PL type name Sql:create type PROCEDURE as table of varchar2(1); +Reserved Keyword: PUBLIC +Test PL type name Sql:create type PUBLIC as table of varchar2(1); +Reserved Keyword: RESOURCE +Test PL type name Sql:create type RESOURCE as table of varchar2(1); +Reserved Keyword: REVOKE +Test PL type name Sql:create type REVOKE as table of varchar2(1); +Reserved Keyword: RETURN +Test PL type name Sql:create type RETURN as table of varchar2(1); +Reserved Keyword: ROLLBACK +Test PL type name Sql:create type ROLLBACK as table of varchar2(1); +Reserved Keyword: SELECT +Test PL type name Sql:create type SELECT as table of varchar2(1); +Reserved Keyword: SHARE +Test PL type name Sql:create type SHARE as table of varchar2(1); +Reserved Keyword: SIZE +Test PL type name Sql:create type SIZE as table of varchar2(1); +Reserved Keyword: SQL +Test PL type name Sql:create type SQL as table of varchar2(1); +Reserved Keyword: START +Test PL type name Sql:create type START as table of varchar2(1); +Reserved Keyword: SUBTYPE +Test PL type name Sql:create type SUBTYPE as table of varchar2(1); +Reserved Keyword: SAVEPOINT +Test PL type name Sql:create type SAVEPOINT as table of varchar2(1); +Reserved Keyword: SET +Test PL type name Sql:create type SET as table of varchar2(1); +Reserved Keyword: TABAUTH +Test PL type name Sql:create type TABAUTH as table of varchar2(1); +Reserved Keyword: TABLE +Test PL type name Sql:create type TABLE as table of varchar2(1); +Reserved Keyword: THEN +Test PL type name Sql:create type THEN as table of varchar2(1); +Reserved Keyword: TO +Test PL type name Sql:create type TO as table of varchar2(1); +Reserved Keyword: UNION +Test PL type name Sql:create type UNION as table of varchar2(1); +Reserved Keyword: UNIQUE +Test PL type name Sql:create type UNIQUE as table of varchar2(1); +Reserved Keyword: UPDATE +Test PL type name Sql:create type UPDATE as table of varchar2(1); +Reserved Keyword: VALUES +Test PL type name Sql:create type VALUES as table of varchar2(1); +Reserved Keyword: VIEW +Test PL type name Sql:create type VIEW as table of varchar2(1); +Reserved Keyword: VIEWS +Test PL type name Sql:create type VIEWS as table of varchar2(1); +Reserved Keyword: WHEN +Test PL type name Sql:create type WHEN as table of varchar2(1); +Reserved Keyword: WHERE +Test PL type name Sql:create type WHERE as table of varchar2(1); +Reserved Keyword: WITH +Test PL type name Sql:create type WITH as table of varchar2(1); +Reserved Keyword: WHILE +Test PL type name Sql:create type WHILE as table of varchar2(1); +************** Total Count of Reserved Keyword:93 *************** +************** End Test Reserved Keyword *************** +************** Begin Test Non-Reserved Keyword *************** +************** End Test Non-Reserved Keyword *************** diff --git a/unittest/sql/parser/test_oracle_sql_keyword.result b/unittest/sql/parser/test_oracle_sql_keyword.result new file mode 100644 index 0000000000..5193fb0b0e --- /dev/null +++ b/unittest/sql/parser/test_oracle_sql_keyword.result @@ -0,0 +1,231 @@ +************** Begin Test Reserved Keyword *************** +Reserved Keyword: ACCESS +Test Table Name and Column Name Sql:create table ACCESS(ACCESS int); +Reserved Keyword: ADD +Test Table Name and Column Name Sql:create table ADD(ADD int); +Reserved Keyword: ALL +Test Table Name and Column Name Sql:create table ALL(ALL int); +Reserved Keyword: ALTER +Test Table Name and Column Name Sql:create table ALTER(ALTER int); +Reserved Keyword: AND +Test Table Name and Column Name Sql:create table AND(AND int); +Reserved Keyword: ANY +Test Table Name and Column Name Sql:create table ANY(ANY int); +Reserved Keyword: AS +Test Table Name and Column Name Sql:create table AS(AS int); +Reserved Keyword: ASC +Test Table Name and Column Name Sql:create table ASC(ASC int); +Reserved Keyword: AUDIT +Test Table Name and Column Name Sql:create table AUDIT(AUDIT int); +Reserved Keyword: BETWEEN +Test Table Name and Column Name Sql:create table BETWEEN(BETWEEN int); +Reserved Keyword: BY +Test Table Name and Column Name Sql:create table BY(BY int); +Reserved Keyword: CHAR +Test Table Name and Column Name Sql:create table CHAR(CHAR int); +Reserved Keyword: CHECK +Test Table Name and Column Name Sql:create table CHECK(CHECK int); +Reserved Keyword: CLUSTER +Test Table Name and Column Name Sql:create table CLUSTER(CLUSTER int); +Reserved Keyword: COLUMN +Test Table Name and Column Name Sql:create table COLUMN(COLUMN int); +Reserved Keyword: COMMENT +Test Table Name and Column Name Sql:create table COMMENT(COMMENT int); +Reserved Keyword: COMPRESS +Test Table Name and Column Name Sql:create table COMPRESS(COMPRESS int); +Reserved Keyword: CONNECT +Test Table Name and Column Name Sql:create table CONNECT(CONNECT int); +Reserved Keyword: CREATE +Test Table Name and Column Name Sql:create table CREATE(CREATE int); +Reserved Keyword: CURRENT +Test Table Name and Column Name Sql:create table CURRENT(CURRENT int); +Reserved Keyword: DATE +Test Table Name and Column Name Sql:create table DATE(DATE int); +Reserved Keyword: DECIMAL +Test Table Name and Column Name Sql:create table DECIMAL(DECIMAL int); +Reserved Keyword: DEFAULT +Test Table Name and Column Name Sql:create table DEFAULT(DEFAULT int); +Reserved Keyword: DELETE +Test Table Name and Column Name Sql:create table DELETE(DELETE int); +Reserved Keyword: DESC +Test Table Name and Column Name Sql:create table DESC(DESC int); +Reserved Keyword: DISTINCT +Test Table Name and Column Name Sql:create table DISTINCT(DISTINCT int); +Reserved Keyword: DROP +Test Table Name and Column Name Sql:create table DROP(DROP int); +Reserved Keyword: ELSE +Test Table Name and Column Name Sql:create table ELSE(ELSE int); +Reserved Keyword: EXCLUSIVE +Test Table Name and Column Name Sql:create table EXCLUSIVE(EXCLUSIVE int); +Reserved Keyword: EXISTS +Test Table Name and Column Name Sql:create table EXISTS(EXISTS int); +Reserved Keyword: FILE +Test Table Name and Column Name Sql:create table FILE(FILE int); +Reserved Keyword: FLOAT +Test Table Name and Column Name Sql:create table FLOAT(FLOAT int); +Reserved Keyword: FOR +Test Table Name and Column Name Sql:create table FOR(FOR int); +Reserved Keyword: FROM +Test Table Name and Column Name Sql:create table FROM(FROM int); +Reserved Keyword: GRANT +Test Table Name and Column Name Sql:create table GRANT(GRANT int); +Reserved Keyword: GROUP +Test Table Name and Column Name Sql:create table GROUP(GROUP int); +Reserved Keyword: HAVING +Test Table Name and Column Name Sql:create table HAVING(HAVING int); +Reserved Keyword: IDENTIFIED +Test Table Name and Column Name Sql:create table IDENTIFIED(IDENTIFIED int); +Reserved Keyword: IMMEDIATE +Test Table Name and Column Name Sql:create table IMMEDIATE(IMMEDIATE int); +Reserved Keyword: IN +Test Table Name and Column Name Sql:create table IN(IN int); +Reserved Keyword: INCREMENT +Test Table Name and Column Name Sql:create table INCREMENT(INCREMENT int); +Reserved Keyword: INDEX +Test Table Name and Column Name Sql:create table INDEX(INDEX int); +Reserved Keyword: INITIAL +Test Table Name and Column Name Sql:create table INITIAL(INITIAL int); +Reserved Keyword: INSERT +Test Table Name and Column Name Sql:create table INSERT(INSERT int); +Reserved Keyword: INTEGER +Test Table Name and Column Name Sql:create table INTEGER(INTEGER int); +Reserved Keyword: INTERSECT +Test Table Name and Column Name Sql:create table INTERSECT(INTERSECT int); +Reserved Keyword: INTO +Test Table Name and Column Name Sql:create table INTO(INTO int); +Reserved Keyword: IS +Test Table Name and Column Name Sql:create table IS(IS int); +Reserved Keyword: LEVEL +Test Table Name and Column Name Sql:create table LEVEL(LEVEL int); +Reserved Keyword: LIKE +Test Table Name and Column Name Sql:create table LIKE(LIKE int); +Reserved Keyword: LOCK +Test Table Name and Column Name Sql:create table LOCK(LOCK int); +Reserved Keyword: LONG +Test Table Name and Column Name Sql:create table LONG(LONG int); +Reserved Keyword: MAXEXTENTS +Test Table Name and Column Name Sql:create table MAXEXTENTS(MAXEXTENTS int); +Reserved Keyword: MINUS +Test Table Name and Column Name Sql:create table MINUS(MINUS int); +Reserved Keyword: MODE +Test Table Name and Column Name Sql:create table MODE(MODE int); +Reserved Keyword: MODIFY +Test Table Name and Column Name Sql:create table MODIFY(MODIFY int); +Reserved Keyword: NOAUDIT +Test Table Name and Column Name Sql:create table NOAUDIT(NOAUDIT int); +Reserved Keyword: NOCOMPRESS +Test Table Name and Column Name Sql:create table NOCOMPRESS(NOCOMPRESS int); +Reserved Keyword: NOT +Test Table Name and Column Name Sql:create table NOT(NOT int); +Reserved Keyword: NOTFOUND +Test Table Name and Column Name Sql:create table NOTFOUND(NOTFOUND int); +Reserved Keyword: NOWAIT +Test Table Name and Column Name Sql:create table NOWAIT(NOWAIT int); +Reserved Keyword: NUMBER +Test Table Name and Column Name Sql:create table NUMBER(NUMBER int); +Reserved Keyword: OF +Test Table Name and Column Name Sql:create table OF(OF int); +Reserved Keyword: OFFLINE +Test Table Name and Column Name Sql:create table OFFLINE(OFFLINE int); +Reserved Keyword: ON +Test Table Name and Column Name Sql:create table ON(ON int); +Reserved Keyword: ONLINE +Test Table Name and Column Name Sql:create table ONLINE(ONLINE int); +Reserved Keyword: OPTION +Test Table Name and Column Name Sql:create table OPTION(OPTION int); +Reserved Keyword: OR +Test Table Name and Column Name Sql:create table OR(OR int); +Reserved Keyword: ORDER +Test Table Name and Column Name Sql:create table ORDER(ORDER int); +Reserved Keyword: PCTFREE +Test Table Name and Column Name Sql:create table PCTFREE(PCTFREE int); +Reserved Keyword: PRIOR +Test Table Name and Column Name Sql:create table PRIOR(PRIOR int); +Reserved Keyword: PRIVILEGES +Test Table Name and Column Name Sql:create table PRIVILEGES(PRIVILEGES int); +Reserved Keyword: PUBLIC +Test Table Name and Column Name Sql:create table PUBLIC(PUBLIC int); +Reserved Keyword: RAW +Test Table Name and Column Name Sql:create table RAW(RAW int); +Reserved Keyword: RENAME +Test Table Name and Column Name Sql:create table RENAME(RENAME int); +Reserved Keyword: RESOURCE +Test Table Name and Column Name Sql:create table RESOURCE(RESOURCE int); +Reserved Keyword: REVOKE +Test Table Name and Column Name Sql:create table REVOKE(REVOKE int); +Reserved Keyword: ROW +Test Table Name and Column Name Sql:create table ROW(ROW int); +Reserved Keyword: ROWID +Test Table Name and Column Name Sql:create table ROWID(ROWID int); +Reserved Keyword: ROWLABEL +Test Table Name and Column Name Sql:create table ROWLABEL(ROWLABEL int); +Reserved Keyword: ROWNUM +Test Table Name and Column Name Sql:create table ROWNUM(ROWNUM int); +Reserved Keyword: ROWS +Test Table Name and Column Name Sql:create table ROWS(ROWS int); +Reserved Keyword: START +Test Table Name and Column Name Sql:create table START(START int); +Reserved Keyword: SELECT +Test Table Name and Column Name Sql:create table SELECT(SELECT int); +Reserved Keyword: SESSION +Test Table Name and Column Name Sql:create table SESSION(SESSION int); +Reserved Keyword: SET +Test Table Name and Column Name Sql:create table SET(SET int); +Reserved Keyword: SHARE +Test Table Name and Column Name Sql:create table SHARE(SHARE int); +Reserved Keyword: SIZE +Test Table Name and Column Name Sql:create table SIZE(SIZE int); +Reserved Keyword: SMALLINT +Test Table Name and Column Name Sql:create table SMALLINT(SMALLINT int); +Reserved Keyword: SUCCESSFUL +Test Table Name and Column Name Sql:create table SUCCESSFUL(SUCCESSFUL int); +Reserved Keyword: SYNONYM +Test Table Name and Column Name Sql:create table SYNONYM(SYNONYM int); +Reserved Keyword: SYSDATE +Test Table Name and Column Name Sql:create table SYSDATE(SYSDATE int); +Reserved Keyword: TABLE +Test Table Name and Column Name Sql:create table TABLE(TABLE int); +Reserved Keyword: THEN +Test Table Name and Column Name Sql:create table THEN(THEN int); +Reserved Keyword: TO +Test Table Name and Column Name Sql:create table TO(TO int); +Reserved Keyword: TRIGGER +Test Table Name and Column Name Sql:create table TRIGGER(TRIGGER int); +Reserved Keyword: UID +Test Table Name and Column Name Sql:create table UID(UID int); +Reserved Keyword: UNION +Test Table Name and Column Name Sql:create table UNION(UNION int); +Reserved Keyword: UNIQUE +Test Table Name and Column Name Sql:create table UNIQUE(UNIQUE int); +Reserved Keyword: UPDATE +Test Table Name and Column Name Sql:create table UPDATE(UPDATE int); +Reserved Keyword: USER +Test Table Name and Column Name Sql:create table USER(USER int); +Reserved Keyword: VALIDATE +Test Table Name and Column Name Sql:create table VALIDATE(VALIDATE int); +Reserved Keyword: VALUES +Test Table Name and Column Name Sql:create table VALUES(VALUES int); +Reserved Keyword: VARCHAR +Test Table Name and Column Name Sql:create table VARCHAR(VARCHAR int); +Reserved Keyword: VARCHAR2 +Test Table Name and Column Name Sql:create table VARCHAR2(VARCHAR2 int); +Reserved Keyword: VIEW +Test Table Name and Column Name Sql:create table VIEW(VIEW int); +Reserved Keyword: WHENEVER +Test Table Name and Column Name Sql:create table WHENEVER(WHENEVER int); +Reserved Keyword: WHERE +Test Table Name and Column Name Sql:create table WHERE(WHERE int); +Reserved Keyword: WITH +Test Table Name and Column Name Sql:create table WITH(WITH int); +Reserved Keyword: CASE +Test Table Name and Column Name Sql:create table CASE(CASE int); +Reserved Keyword: CONNECT_BY_ROOT +Test Table Name and Column Name Sql:create table CONNECT_BY_ROOT(CONNECT_BY_ROOT int); +Reserved Keyword: DUAL +Test Table Name and Column Name Sql:create table DUAL(DUAL int); +Reserved Keyword: SQL_CALC_FOUND_ROWS +Test Table Name and Column Name Sql:create table SQL_CALC_FOUND_ROWS(SQL_CALC_FOUND_ROWS int); +************** Total Count of Reserved Keyword:113 *************** +************** End Test Reserved Keyword *************** +************** Begin Test Non-Reserved Keyword *************** +************** End Test Non-Reserved Keyword *************** diff --git a/unittest/sql/parser/test_parser.cpp b/unittest/sql/parser/test_parser.cpp index e886fe9851..acd4872da8 100644 --- a/unittest/sql/parser/test_parser.cpp +++ b/unittest/sql/parser/test_parser.cpp @@ -40,6 +40,9 @@ protected: void print_parse_outline(const char *query_str, std::ofstream &of_result, int64_t expect_error = OB_SUCCESS); void do_filter_hint(const char *query_str, std::ofstream &of_result, int64_t expect_error = OB_SUCCESS); bool pretreat_cmd(std::string line, int64_t &expect_error); + void parse_keyword(std::ifstream &if_tests, std::ofstream &of_result, bool is_sql_keyword); + void do_parse_keyword(const char *keyword, std::ofstream &of_result, bool is_reserved, bool is_sql_keyword); + bool non_reserved_keyword_can_not_be_name(const char *keyword, bool is_sql_keyword); protected: // data members ObArenaAllocator allocator_; @@ -262,6 +265,283 @@ TEST_F(TestParser, test_parser_outline) is_equal_content(tmp_file,result_file); } +TEST_F(TestParser, test_mysql_sql_keyword) +{ + const char* test_file = "../../../../src/sql/parser/sql_parser_mysql_mode.y"; + const char* result_file = "./test_mysql_sql_keyword.result"; + const char* tmp_file = "./test_mysql_sql_keyword.tmp"; + // run tests + std::ifstream if_tests(test_file); + ASSERT_TRUE(if_tests.is_open()); + std::ofstream of_result(tmp_file); + ASSERT_TRUE(of_result.is_open()); + test::clp.sql_mode = DEFAULT_MYSQL_MODE; + set_compat_mode(oceanbase::lib::Worker::CompatMode::MYSQL); + ASSERT_NO_FATAL_FAILURE(parse_keyword(if_tests, of_result, true)); + of_result.close(); + // verify results + is_equal_content(tmp_file,result_file); +} + +TEST_F(TestParser, test_mysql_pl_keyword) +{ + const char* test_file = "../../../../src/pl/parser/pl_parser_mysql_mode.y"; + const char* result_file = "./test_mysql_pl_keyword.result"; + const char* tmp_file = "./test_mysql_pl_keyword.tmp"; + // run tests + std::ifstream if_tests(test_file); + ASSERT_TRUE(if_tests.is_open()); + std::ofstream of_result(tmp_file); + ASSERT_TRUE(of_result.is_open()); + test::clp.sql_mode = DEFAULT_MYSQL_MODE; + set_compat_mode(oceanbase::lib::Worker::CompatMode::MYSQL); + ASSERT_NO_FATAL_FAILURE(parse_keyword(if_tests, of_result, false)); + of_result.close(); + // verify results + is_equal_content(tmp_file,result_file); +} + +TEST_F(TestParser, test_oracle_sql_keyword) +{ + const char* test_file = "../../../../close_modules/oracle_parser/sql/parser/sql_parser_oracle_mode.y"; + const char* result_file = "./test_oracle_sql_keyword.result"; + const char* tmp_file = "./test_oracle_sql_keyword.tmp"; + // run tests + std::ifstream if_tests(test_file); + ASSERT_TRUE(if_tests.is_open()); + std::ofstream of_result(tmp_file); + ASSERT_TRUE(of_result.is_open()); + test::clp.sql_mode = DEFAULT_ORACLE_MODE | SMO_ORACLE; + set_compat_mode(oceanbase::lib::Worker::CompatMode::ORACLE); + ASSERT_NO_FATAL_FAILURE(parse_keyword(if_tests, of_result, true)); + of_result.close(); + // verify results + is_equal_content(tmp_file,result_file); +} + +TEST_F(TestParser, test_oracle_pl_keyword) +{ + const char* test_file = "../../../../close_modules/oracle_pl/pl/parser/pl_parser_oracle_mode.y"; + const char* result_file = "./test_oracle_pl_keyword.result"; + const char* tmp_file = "./test_oracle_pl_keyword.tmp"; + // run tests + std::ifstream if_tests(test_file); + ASSERT_TRUE(if_tests.is_open()); + std::ofstream of_result(tmp_file); + ASSERT_TRUE(of_result.is_open()); + test::clp.sql_mode = DEFAULT_ORACLE_MODE | SMO_ORACLE; + set_compat_mode(oceanbase::lib::Worker::CompatMode::ORACLE); + ASSERT_NO_FATAL_FAILURE(parse_keyword(if_tests, of_result, false)); + of_result.close(); + // verify results + is_equal_content(tmp_file,result_file); +} + +void TestParser::parse_keyword(std::ifstream &if_tests, std::ofstream &of_result, bool is_sql_keyword) +{ + std::string line; + const char* reserved_keyword_begin = "//-----------------------------reserved keyword begin-----------------------------------------------"; + const char* reserved_keyword_end = "//-----------------------------reserved keyword end-------------------------------------------------"; + const char* non_reserved_keyword_begin = "//-----------------------------non_reserved keyword begin-------------------------------------------"; + const char* non_keyword_end = "//-----------------------------non_reserved keyword end---------------------------------------------"; + bool test_reserved_keyword = false; + bool test_non_reserved_keyword = false; + int64_t num_reserved_keyword = 0; + while (std::getline(if_tests, line)) { + if (strncmp(line.c_str(), reserved_keyword_begin, strlen(reserved_keyword_begin)) == 0) { + of_result << "************** Begin Test Reserved Keyword ***************" << std::endl; + test_reserved_keyword = true; + continue; + } else if (strncmp(line.c_str(), reserved_keyword_end, strlen(reserved_keyword_end)) == 0) { + of_result << "************** Total Count of Reserved Keyword:" << num_reserved_keyword <<" ***************" << std::endl; + of_result << "************** End Test Reserved Keyword ***************" << std::endl; + test_reserved_keyword = false; + continue; + } else if (strncmp(line.c_str(), non_reserved_keyword_begin, strlen(non_reserved_keyword_begin)) == 0) { + of_result << "************** Begin Test Non-Reserved Keyword ***************" << std::endl; + test_non_reserved_keyword = true; + continue; + } else if (strncmp(line.c_str(), non_keyword_end, strlen(non_keyword_end)) == 0) { + of_result << "************** End Test Non-Reserved Keyword ***************" << std::endl; + break; + } else if (!test_reserved_keyword && !test_non_reserved_keyword) { + continue; + } + int64_t line_size = strlen(line.c_str()); + char *tmp_buf = NULL; + if (NULL == (tmp_buf = static_cast(allocator_.alloc(line_size + 1)))) { + fprintf(stderr, "failed to alloc memory for: %s\n", line.c_str()); + break; + } else { + MEMSET(tmp_buf, '\0', line_size + 1); + int64_t valid_buf_len = 0; + for (int64_t i = 0; i < line_size; ++i) { + if (isspace(line.c_str()[i])) { + if (valid_buf_len > 0 && valid_buf_len <= line_size) { + tmp_buf[valid_buf_len] = '\0'; + if ((is_sql_keyword && (test::clp.sql_mode & SMO_ORACLE) && strcmp(tmp_buf, "FILE_KEY") == 0) || + (!is_sql_keyword && (test::clp.sql_mode & SMO_ORACLE) && strcmp(tmp_buf, "BEGIN_KEY") == 0) || + (!is_sql_keyword && (test::clp.sql_mode & SMO_ORACLE) && strcmp(tmp_buf, "END_KEY") == 0)) { + valid_buf_len -= 4;//FILE_KEY ==> FILE、BEGIN_KEY==> DEGIN、END_KEY==> END + tmp_buf[valid_buf_len] = '\0'; + } else if ((is_sql_keyword && (test::clp.sql_mode & SMO_ORACLE) && strcmp(tmp_buf, "INITIAL_") == 0) || + (!is_sql_keyword && (test::clp.sql_mode & SMO_ORACLE) && strcmp(tmp_buf, "NULLX") == 0)) { + valid_buf_len -= 1;//INITIAL_ ==> INITIAL、NULLX==>NULL + tmp_buf[valid_buf_len] = '\0'; + } + ASSERT_NO_FATAL_FAILURE(do_parse_keyword(tmp_buf, of_result, test_reserved_keyword, is_sql_keyword)); + valid_buf_len = 0; + if (test_reserved_keyword) { + ++ num_reserved_keyword; + } + } + } else if (line.c_str()[i] == '/' && i < line_size - 1 && line.c_str()[i + 1] == '*') { + i = i + 2; + while (i < line_size) { + if (line.c_str()[i] == '*' && i < line_size - 1 && line.c_str()[i + 1] == '/') { + i = i + 2; + break; + } + ++ i; + } + } else if (valid_buf_len < line_size) { + tmp_buf[valid_buf_len++] = line.c_str()[i]; + } + } + if (valid_buf_len > 0 && valid_buf_len <= line_size) { + tmp_buf[valid_buf_len] = '\0'; + if ((is_sql_keyword && (test::clp.sql_mode & SMO_ORACLE) && strcmp(tmp_buf, "FILE_KEY") == 0) || + (!is_sql_keyword && (test::clp.sql_mode & SMO_ORACLE) && strcmp(tmp_buf, "BEGIN_KEY") == 0) || + (!is_sql_keyword && (test::clp.sql_mode & SMO_ORACLE) && strcmp(tmp_buf, "END_KEY") == 0)) { + valid_buf_len -= 4;//FILE_KEY ==> FILE、BEGIN_KEY==> DEGIN、END_KEY==> END + tmp_buf[valid_buf_len] = '\0'; + } else if ((is_sql_keyword && (test::clp.sql_mode & SMO_ORACLE) && strcmp(tmp_buf, "INITIAL_") == 0) || + (!is_sql_keyword && (test::clp.sql_mode & SMO_ORACLE) && strcmp(tmp_buf, "NULLX") == 0)) { + valid_buf_len -= 1;//INITIAL_ ==> INITIAL、NULLX==>NULL + tmp_buf[valid_buf_len] = '\0'; + } + ASSERT_NO_FATAL_FAILURE(do_parse_keyword(tmp_buf, of_result, test_reserved_keyword, is_sql_keyword)); + valid_buf_len = 0; + if (test_reserved_keyword) { + ++ num_reserved_keyword; + } + } + } + } +} +//reserved keyword test: create table table_name(column_name int); +//non_reserved keyword test: create table table_name(column_name int) +// select 1 alias_name from t1 alias_name; +void TestParser::do_parse_keyword(const char *keyword, std::ofstream &of_result, bool is_reserved, bool is_sql_keyword) +{ + char *buf = NULL; + int64_t buf_len = strlen(keyword) * 2 + 1024; + if (NULL == (buf = static_cast(allocator_.alloc(buf_len)))) { + fprintf(stderr, "failed to alloc memory for: %s\n", keyword); + } else if (is_sql_keyword) { + sprintf(buf, "create table %s(%s int);", keyword, keyword); + if (is_reserved) { + of_result << "Reserved Keyword: "<< keyword << std::endl; + of_result << "Test Table Name and Column Name Sql:" << buf << std::endl; + } + } else if (test::clp.sql_mode & SMO_ORACLE) { + sprintf(buf, "create type %s as table of varchar2(1);", keyword); + if (is_reserved) { + of_result << "Reserved Keyword: "<< keyword << std::endl; + of_result << "Test PL type name Sql:" << buf << std::endl; + } + } else { + sprintf(buf, "create procedure %s () select 1;", keyword); + if (is_reserved) { + of_result << "Reserved Keyword: "<< keyword << std::endl; + of_result << "Test PL procedure name Sql:" << buf << std::endl; + } + } + ObString query = ObString::make_string(buf); + int ret = OB_SUCCESS; + _OB_LOG(INFO, "test keyword to be name: %s", buf); + ObSQLMode mode = test::clp.sql_mode; + ObParser parser(allocator_, mode); + ParseResult parse_result; + ret = parser.parse(query, parse_result); + if ((is_reserved && ret != 0) || + (!is_reserved && ret == 0)) { + ret = OB_SUCCESS; + } else if (!is_reserved && is_sql_keyword && (test::clp.sql_mode & SMO_ORACLE) && strcmp(keyword, "CONSTRAINT") == 0) { + ret = OB_SUCCESS; + } else if ((is_reserved && !is_sql_keyword && (test::clp.sql_mode & SMO_ORACLE) && strcmp(keyword, "EXISTS") == 0) || + (is_reserved && !is_sql_keyword && (test::clp.sql_mode & SMO_ORACLE) && strcmp(keyword, "SET") == 0)) { + ret = OB_SUCCESS; + } else if (!is_reserved && !is_sql_keyword && non_reserved_keyword_can_not_be_name(keyword, is_sql_keyword)) { + ret = OB_SUCCESS; + } else { + fprintf(stderr, "test keyword to be name failed:%s\n", buf); + } + ASSERT_EQ(OB_SUCCESS, -ret); + if (!is_reserved && is_sql_keyword) { + sprintf(buf, "select 1 %s from t1 %s;", keyword, keyword); + query = ObString::make_string(buf); + _OB_LOG(INFO, "test keyword to alias name: %s", buf); + ret = parser.parse(query, parse_result); + if (ret != 0) { + if (non_reserved_keyword_can_not_be_name(keyword, is_sql_keyword)) { + ret = 0; + } else { + fprintf(stderr, "test keyword to alias name failed:%s\n", buf); + } + } + } + ASSERT_EQ(OB_SUCCESS, -ret); + parser.free_result(parse_result); +} + +bool TestParser::non_reserved_keyword_can_not_be_name(const char *keyword, bool is_sql_keyword) +{ + bool ret = false; + if (is_sql_keyword) { + if (test::clp.sql_mode & SMO_ORACLE) { + if (strcmp(keyword, "USING") == 0 || + strcmp(keyword, "BULK") == 0 || + strcmp(keyword, "COLLATE") == 0 || + strcmp(keyword, "CROSS") == 0 || + strcmp(keyword, "FULL") == 0 || + strcmp(keyword, "INNER") == 0 || + strcmp(keyword, "JOIN") == 0 || + strcmp(keyword, "LOG") == 0 || + strcmp(keyword, "LEFT") == 0 || + strcmp(keyword, "NATURAL") == 0 || + strcmp(keyword, "RETURN") == 0 || + strcmp(keyword, "RIGHT") == 0 || + strcmp(keyword, "RETURNING") == 0) { + ret = true; + } + } else if (strcmp(keyword, "EXCEPT") == 0 || + strcmp(keyword, "INTERSECT") == 0 || + strcmp(keyword, "MINUS") == 0 || + strcmp(keyword, "MEMBER") == 0 || + strcmp(keyword, "SOUNDS") == 0 || + strcmp(keyword, "WINDOW") == 0) { + ret = true; + } + } else { + if (test::clp.sql_mode & SMO_ORACLE) { + if (strcmp(keyword, "CHARACTER") == 0 || + strcmp(keyword, "CONSTANT") == 0 || + strcmp(keyword, "DATE") == 0 || + strcmp(keyword, "FLOAT") == 0 || + strcmp(keyword, "LOOP") == 0 || + strcmp(keyword, "NUMBER") == 0 || + strcmp(keyword, "RAW") == 0 || + strcmp(keyword, "REAL") == 0 || + strcmp(keyword, "VARCHAR") == 0 || + strcmp(keyword, "VARCHAR2") == 0) { + ret = true; + } + } + } + return ret; +} + void TestParser::do_parse(const char *query_str, std::ofstream &of_result, int64_t expect_error) { ObSQLMode mode = test::clp.sql_mode; ObParser parser(allocator_, mode); @@ -327,9 +607,11 @@ bool TestParser::pretreat_cmd(std::string line, int64_t &expect_error) if (strncmp(p, "oracle", strlen("oracle")) == 0) { OB_LOG(INFO, "switch parser sql_mode to oracle"); test::clp.sql_mode = DEFAULT_ORACLE_MODE | SMO_ORACLE; + set_compat_mode(oceanbase::lib::Worker::CompatMode::ORACLE); } else if (strncmp(p, "mysql", strlen("mysql")) == 0) { OB_LOG(INFO, "switch parser sql_mode to mysql"); test::clp.sql_mode = DEFAULT_MYSQL_MODE; + set_compat_mode(oceanbase::lib::Worker::CompatMode::MYSQL); } skip_cmd = true; UNUSED(w); diff --git a/unittest/sql/parser/test_parser.result b/unittest/sql/parser/test_parser.result index a8b8584308..62c36ff441 100644 --- a/unittest/sql/parser/test_parser.result +++ b/unittest/sql/parser/test_parser.result @@ -1077,6 +1077,96 @@ question_mask_size: 0 ] } ************** Case 20 *************** +commit comment 'comment transaction commit'; +question_mask_size: 0 +{ + "type":"T_STMT_LIST", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_COMMIT", + "int_val":0, + "str_len":0, + "str_val":"", + "children": [ + { } + ] + } + ] +} +************** Case 21 *************** +commit work comment 'comment txn commit work'; +question_mask_size: 0 +{ + "type":"T_STMT_LIST", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_COMMIT", + "int_val":0, + "str_len":0, + "str_val":"", + "children": [ + { } + ] + } + ] +} +************** Case 22 *************** +commit/*hint+commit tx hint*/ comment 'comment + hint'; +question_mask_size: 0 +{ + "type":"T_STMT_LIST", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_COMMIT", + "int_val":0, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_HINT", + "int_val":9223372036854775807, + "str_len":15, + "str_val":"commit tx hint" + } + ] + } + ] +} +************** Case 23 *************** +commit/*hint+commit tx work hint*/ work comment 'comment + hint'; +question_mask_size: 0 +{ + "type":"T_STMT_LIST", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_COMMIT", + "int_val":0, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_HINT", + "int_val":9223372036854775807, + "str_len":20, + "str_val":"commit tx work hint" + } + ] + } + ] +} +************** Case 24 *************** rollback; question_mask_size: 0 { @@ -1096,7 +1186,7 @@ question_mask_size: 0 } ] } -************** Case 21 *************** +************** Case 25 *************** rollback/*hint+rollback*/; question_mask_size: 0 { @@ -1121,7 +1211,7 @@ question_mask_size: 0 } ] } -************** Case 22 *************** +************** Case 26 *************** rollback work; question_mask_size: 0 { @@ -1141,7 +1231,7 @@ question_mask_size: 0 } ] } -************** Case 23 *************** +************** Case 27 *************** rollback/*hint+rollback work*/ work; question_mask_size: 0 { @@ -1166,7 +1256,7 @@ question_mask_size: 0 } ] } -************** Case 24 *************** +************** Case 28 *************** alter user 'zdy' account lock; question_mask_size: 0 { @@ -1214,7 +1304,7 @@ question_mask_size: 0 } ] } -************** Case 25 *************** +************** Case 29 *************** alter user 'zdy' account unlock; question_mask_size: 0 { @@ -1262,7 +1352,7 @@ question_mask_size: 0 } ] } -************** Case 26 *************** +************** Case 30 *************** select d.t1.c1, sum(t1.c2) from d.t1 where d.t1.c1 > 0 and c2 + d.t1.c1 = 100 group by d.t1.c2 order by t.d1.c1 desc limit 0, 1 question_mask_size: 0 { @@ -1676,7 +1766,7 @@ question_mask_size: 0 } ] } -************** Case 27 *************** +************** Case 31 *************** select c1, sum(d.t1.c2) from t1 where t1.c1 > 0 and c2 + t1.c1 = 100 group by t1.c2 order by t1.c1 desc limit 0, 1 question_mask_size: 0 { @@ -2060,7 +2150,7 @@ question_mask_size: 0 } ] } -************** Case 28 *************** +************** Case 32 *************** select t1.c1, sum(c2) from t1 where c1 > 0 and c2 + c1 = 100 group by c2 order by c1 desc limit 0, 1 question_mask_size: 0 { @@ -2419,7 +2509,7 @@ question_mask_size: 0 } ] } -************** Case 29 *************** +************** Case 33 *************** insert into t1 values(1, 2) question_mask_size: 0 { @@ -2519,7 +2609,7 @@ question_mask_size: 0 } ] } -************** Case 30 *************** +************** Case 34 *************** insert into t1.t1 values(1, 2) question_mask_size: 0 { @@ -2624,7 +2714,7 @@ question_mask_size: 0 } ] } -************** Case 31 *************** +************** Case 35 *************** insert into t1(c1) values(1), (2) question_mask_size: 0 { @@ -2755,7 +2845,7 @@ question_mask_size: 0 } ] } -************** Case 32 *************** +************** Case 36 *************** insert into t1(t1.c1) values(1), (2) question_mask_size: 0 { @@ -2891,7 +2981,7 @@ question_mask_size: 0 } ] } -************** Case 33 *************** +************** Case 37 *************** insert into d.t1(d.t1.c1) values(1), (2) question_mask_size: 0 { @@ -3037,7 +3127,7 @@ question_mask_size: 0 } ] } -************** Case 34 *************** +************** Case 38 *************** update t1 set d.t1.c2=t1.c1+1 where d.t1.c1 > 1 order by d.t1.c1 desc limit 0, 10 question_mask_size: 0 { @@ -3300,7 +3390,7 @@ question_mask_size: 0 } ] } -************** Case 35 *************** +************** Case 39 *************** update d.t1 set t1.c2=d.t1c1+1 where t1.c1 > 1 order by c1 desc limit 0, 10 question_mask_size: 0 { @@ -3548,7 +3638,7 @@ question_mask_size: 0 } ] } -************** Case 36 *************** +************** Case 40 *************** delete from d.t1 where d.t1.c2 > 10 order by c1 limit 0, 1 question_mask_size: 0 { @@ -3737,7 +3827,7 @@ question_mask_size: 0 } ] } -************** Case 37 *************** +************** Case 41 *************** select t1.c1, t2.c1 from d.t1 join d.t2 on d.t1.c1=t2.c1 where t1.c1>0; question_mask_size: 0 { @@ -4028,7 +4118,7 @@ question_mask_size: 0 } ] } -************** Case 38 *************** +************** Case 42 *************** select d.t1.c1, t2.c1 from d.t1 join t2 on t1.c1=t2.c1 where t1.c1>0; question_mask_size: 0 { @@ -4314,7 +4404,7 @@ question_mask_size: 0 } ] } -************** Case 39 *************** +************** Case 43 *************** select d.t1.c1, t2.c1 from d.t1 join t2 on c1=c1 where t1.c1>0; question_mask_size: 0 { @@ -4590,7 +4680,7 @@ question_mask_size: 0 } ] } -************** Case 40 *************** +************** Case 44 *************** insert into t1 value (1, 2), (3, 4) on duplicate key update d.t.c1 = t.c2 + 1, c2 = c2 + 3; question_mask_size: 0 { @@ -4840,7 +4930,7 @@ question_mask_size: 0 } ] } -************** Case 41 *************** +************** Case 45 *************** insert into d.t1 value (1, 2), (3, 4) on duplicate key update t.c1 = t.c2 + 1, d.t.c2 = t.c2 + 3; question_mask_size: 0 { @@ -5105,7 +5195,7 @@ question_mask_size: 0 } ] } -************** Case 42 *************** +************** Case 46 *************** create table rongxuan(c int primary key, c2 int) question_mask_size: 0 { @@ -5231,7 +5321,7 @@ question_mask_size: 0 } ] } -************** Case 43 *************** +************** Case 47 *************** create table rongxuan(rongxuan.c int primary key, c2 int) question_mask_size: 0 { @@ -5362,7 +5452,7 @@ question_mask_size: 0 } ] } -************** Case 44 *************** +************** Case 48 *************** create table rongxuan(d.rongxuan.c int primary key, c2 int) question_mask_size: 0 { @@ -5498,7 +5588,7 @@ question_mask_size: 0 } ] } -************** Case 45 *************** +************** Case 49 *************** drop table t1 question_mask_size: 0 { @@ -5543,7 +5633,7 @@ question_mask_size: 0 } ] } -************** Case 46 *************** +************** Case 50 *************** drop table oceanbase.t, t1 question_mask_size: 0 { @@ -5609,7 +5699,7 @@ question_mask_size: 0 } ] } -************** Case 47 *************** +************** Case 51 *************** alter table rongxuan add c3 int; question_mask_size: 0 { @@ -5702,7 +5792,7 @@ question_mask_size: 0 } ] } -************** Case 48 *************** +************** Case 52 *************** alter table rongxuan add rongxuan.c4 int; question_mask_size: 0 { @@ -5800,7 +5890,7 @@ question_mask_size: 0 } ] } -************** Case 49 *************** +************** Case 53 *************** alter table rongxuan add test.rongxuan.c5 int; question_mask_size: 0 { @@ -5903,7 +5993,7 @@ question_mask_size: 0 } ] } -************** Case 50 *************** +************** Case 54 *************** drop database rongxuan question_mask_size: 0 { @@ -5929,7 +6019,7 @@ question_mask_size: 0 } ] } -************** Case 51 *************** +************** Case 55 *************** create database rongxuan question_mask_size: 0 { @@ -5956,7 +6046,7 @@ question_mask_size: 0 } ] } -************** Case 52 *************** +************** Case 56 *************** create database if not exists rongxuan question_mask_size: 0 { @@ -5988,7 +6078,7 @@ question_mask_size: 0 } ] } -************** Case 53 *************** +************** Case 57 *************** create database if not exists rongxuan default character set = 'utf8' default collate = 'default_collate' question_mask_size: 0 { @@ -6039,7 +6129,7 @@ question_mask_size: 0 } ] } -************** Case 54 *************** +************** Case 58 *************** select * from d.t1 PARTITION(p1, p2); question_mask_size: 0 { @@ -6168,7 +6258,7 @@ question_mask_size: 0 } ] } -************** Case 55 *************** +************** Case 59 *************** delete from d.t1 PARTITION(p0, p1); question_mask_size: 0 { @@ -6271,7 +6361,7 @@ question_mask_size: 0 } ] } -************** Case 56 *************** +************** Case 60 *************** update d.t1 PARTITION (p2) SET id = 2 WHERE name = 'Jill'; question_mask_size: 0 { @@ -6445,7 +6535,7 @@ question_mask_size: 0 } ] } -************** Case 57 *************** +************** Case 61 *************** INSERT INTO d.t1 PARTITION (p3, p4) VALUES (24, 'Tim', 'Greene', 3, 1), (26, 'Linda', 'Mills', 2, 1); question_mask_size: 0 { @@ -6669,7 +6759,7 @@ question_mask_size: 0 } ] } -************** Case 58 *************** +************** Case 62 *************** REPLACE INTO d.t1 PARTITION (p0) VALUES (20, 'Jan', 'Jones', 3, 2); question_mask_size: 0 { @@ -6831,7 +6921,7 @@ question_mask_size: 0 } ] } -************** Case 59 *************** +************** Case 63 *************** SELECT e.id, s.city, d.name FROM e JOIN stores PARTITION (p1) ON e.id=s.id JOIN departments PARTITION (p0) ON e.id=d.id; question_mask_size: 0 { @@ -7227,7 +7317,7 @@ question_mask_size: 0 } ] } -************** Case 60 *************** +************** Case 64 *************** alter system report replica; question_mask_size: 0 { @@ -7247,7 +7337,7 @@ question_mask_size: 0 } ] } -************** Case 61 *************** +************** Case 65 *************** alter system report replica server = '127.0.0.1:80'; question_mask_size: 0 { @@ -7280,7 +7370,7 @@ question_mask_size: 0 } ] } -************** Case 62 *************** +************** Case 66 *************** alter system report replica zone = 'z1'; question_mask_size: 0 { @@ -7313,7 +7403,7 @@ question_mask_size: 0 } ] } -************** Case 63 *************** +************** Case 67 *************** alter system recycle replica; question_mask_size: 0 { @@ -7333,7 +7423,7 @@ question_mask_size: 0 } ] } -************** Case 64 *************** +************** Case 68 *************** alter system recycle replica server = '127.0.0.1:80'; question_mask_size: 0 { @@ -7366,7 +7456,7 @@ question_mask_size: 0 } ] } -************** Case 65 *************** +************** Case 69 *************** alter system recycle replica server '127.0.0.1:80'; question_mask_size: 0 { @@ -7399,7 +7489,7 @@ question_mask_size: 0 } ] } -************** Case 66 *************** +************** Case 70 *************** alter system recycle replica zone = 'z1'; question_mask_size: 0 { @@ -7432,7 +7522,7 @@ question_mask_size: 0 } ] } -************** Case 67 *************** +************** Case 71 *************** alter system recycle replica zone 'z1'; question_mask_size: 0 { @@ -7465,7 +7555,7 @@ question_mask_size: 0 } ] } -************** Case 68 *************** +************** Case 72 *************** alter system major freeze; question_mask_size: 0 { @@ -7492,7 +7582,7 @@ question_mask_size: 0 } ] } -************** Case 69 *************** +************** Case 73 *************** alter system start merge zone = 'z1'; question_mask_size: 0 { @@ -7531,7 +7621,7 @@ question_mask_size: 0 } ] } -************** Case 70 *************** +************** Case 74 *************** alter system suspend merge; question_mask_size: 0 { @@ -7557,7 +7647,7 @@ question_mask_size: 0 } ] } -************** Case 71 *************** +************** Case 75 *************** alter system suspend merge tenant = sys; question_mask_size: 0 { @@ -7596,7 +7686,7 @@ question_mask_size: 0 } ] } -************** Case 72 *************** +************** Case 76 *************** alter system suspend merge tenant = all_user; question_mask_size: 0 { @@ -7635,7 +7725,7 @@ question_mask_size: 0 } ] } -************** Case 73 *************** +************** Case 77 *************** alter system suspend merge tenant = all_meta; question_mask_size: 0 { @@ -7674,7 +7764,7 @@ question_mask_size: 0 } ] } -************** Case 74 *************** +************** Case 78 *************** alter system resume merge; question_mask_size: 0 { @@ -7700,7 +7790,7 @@ question_mask_size: 0 } ] } -************** Case 75 *************** +************** Case 79 *************** alter system resume merge tenant = sys; question_mask_size: 0 { @@ -7739,7 +7829,7 @@ question_mask_size: 0 } ] } -************** Case 76 *************** +************** Case 80 *************** alter system resume merge tenant = all_user; question_mask_size: 0 { @@ -7778,7 +7868,7 @@ question_mask_size: 0 } ] } -************** Case 77 *************** +************** Case 81 *************** alter system resume merge tenant = all_meta; question_mask_size: 0 { @@ -7817,7 +7907,7 @@ question_mask_size: 0 } ] } -************** Case 78 *************** +************** Case 82 *************** alter system clear roottable; question_mask_size: 0 { @@ -7837,7 +7927,7 @@ question_mask_size: 0 } ] } -************** Case 79 *************** +************** Case 83 *************** alter system clear roottable tenant = 'xxx'; question_mask_size: 0 { @@ -7870,7 +7960,7 @@ question_mask_size: 0 } ] } -************** Case 80 *************** +************** Case 84 *************** alter system modify zone 'z1' set region 'r1' question_mask_size: 0 { @@ -7915,9 +8005,9 @@ question_mask_size: 0 } ] } -************** Case 81 *************** +************** Case 85 *************** alter system start zone 'z1' region 'r1' -************** Case 82 *************** +************** Case 86 *************** alter system modify zone 'z1' IDC 'idc1' question_mask_size: 0 { @@ -7962,7 +8052,7 @@ question_mask_size: 0 } ] } -************** Case 83 *************** +************** Case 87 *************** alter system modify zone 'z1' set IDC 'idc1', region 'r1' question_mask_size: 0 { @@ -8013,7 +8103,7 @@ question_mask_size: 0 } ] } -************** Case 84 *************** +************** Case 88 *************** alter system add zone 'z1' idc 'idc1', region 'r1' question_mask_size: 0 { @@ -8064,7 +8154,7 @@ question_mask_size: 0 } ] } -************** Case 85 *************** +************** Case 89 *************** alter system add zone 'z1' idc 'idc1' question_mask_size: 0 { @@ -8109,7 +8199,7 @@ question_mask_size: 0 } ] } -************** Case 86 *************** +************** Case 90 *************** alter system modify zone 'z1' question_mask_size: 0 { @@ -8141,11 +8231,11 @@ question_mask_size: 0 } ] } -************** Case 87 *************** +************** Case 91 *************** alter system start zone 'z1' IDC 'idc1' -************** Case 88 *************** +************** Case 92 *************** alter system start zone 'z1' zone_type 'ReadWrite' -************** Case 89 *************** +************** Case 93 *************** alter system add zone 'z1' zone_type 'ReadWrite', idc 'idc1', region 'r1' question_mask_size: 0 { @@ -8202,7 +8292,7 @@ question_mask_size: 0 } ] } -************** Case 90 *************** +************** Case 94 *************** alter system add zone 'z1' zone_type 'ReadWrite', idc 'idc1' question_mask_size: 0 { @@ -8253,7 +8343,7 @@ question_mask_size: 0 } ] } -************** Case 91 *************** +************** Case 95 *************** alter system add zone 'z1' zone_type 'ReadWrite', region 'r1' question_mask_size: 0 { @@ -8304,7 +8394,7 @@ question_mask_size: 0 } ] } -************** Case 92 *************** +************** Case 96 *************** alter system add zone 'z1' zone_type 'ReadWrite' question_mask_size: 0 { @@ -8349,7 +8439,7 @@ question_mask_size: 0 } ] } -************** Case 93 *************** +************** Case 97 *************** alter system modify zone 'z1' zone_type 'ReadWrite', idc 'idc1', region 'r1' question_mask_size: 0 { @@ -8406,7 +8496,7 @@ question_mask_size: 0 } ] } -************** Case 94 *************** +************** Case 98 *************** alter system modify zone 'z1' zone_type 'ReadWrite', idc 'idc1' question_mask_size: 0 { @@ -8457,7 +8547,7 @@ question_mask_size: 0 } ] } -************** Case 95 *************** +************** Case 99 *************** alter system modify zone 'z1' zone_type 'ReadWrite', region 'r1' question_mask_size: 0 { @@ -8508,7 +8598,7 @@ question_mask_size: 0 } ] } -************** Case 96 *************** +************** Case 100 *************** alter system modify zone 'z1' zone_type 'ReadWrite' question_mask_size: 0 { @@ -8553,7 +8643,7 @@ question_mask_size: 0 } ] } -************** Case 97 *************** +************** Case 101 *************** select * from t1 where c1>ANY(select c1 from t2 where c2>1); question_mask_size: 0 { @@ -8824,7 +8914,7 @@ question_mask_size: 0 } ] } -************** Case 98 *************** +************** Case 102 *************** select * from t1 where c1>SOME(select c1 from t2 where c2>1); question_mask_size: 0 { @@ -9095,7 +9185,7 @@ question_mask_size: 0 } ] } -************** Case 99 *************** +************** Case 103 *************** select * from t1 where c1>ALL(select c1 from t2 where c2>1); question_mask_size: 0 { @@ -9366,7 +9456,7 @@ question_mask_size: 0 } ] } -************** Case 100 *************** +************** Case 104 *************** select * from t1 where c1>(select c1 from t2 where c2>1); question_mask_size: 0 { @@ -9629,7 +9719,7 @@ question_mask_size: 0 } ] } -************** Case 101 *************** +************** Case 105 *************** select * from t1 where c11); question_mask_size: 0 { @@ -9900,7 +9990,7 @@ question_mask_size: 0 } ] } -************** Case 102 *************** +************** Case 106 *************** select * from t1 where c11); question_mask_size: 0 { @@ -10171,7 +10261,7 @@ question_mask_size: 0 } ] } -************** Case 103 *************** +************** Case 107 *************** select * from t1 where c11); question_mask_size: 0 { @@ -10442,7 +10532,7 @@ question_mask_size: 0 } ] } -************** Case 104 *************** +************** Case 108 *************** select * from t1 where c1<(select c1 from t2 where c2>1); question_mask_size: 0 { @@ -10705,7 +10795,7 @@ question_mask_size: 0 } ] } -************** Case 105 *************** +************** Case 109 *************** select * from t1 where c1>=ANY(select c1 from t2 where c2>1); question_mask_size: 0 { @@ -10976,7 +11066,7 @@ question_mask_size: 0 } ] } -************** Case 106 *************** +************** Case 110 *************** select * from t1 where c1>=SOME(select c1 from t2 where c2>1); question_mask_size: 0 { @@ -11247,7 +11337,7 @@ question_mask_size: 0 } ] } -************** Case 107 *************** +************** Case 111 *************** select * from t1 where c1>=ALL(select c1 from t2 where c2>1); question_mask_size: 0 { @@ -11518,7 +11608,7 @@ question_mask_size: 0 } ] } -************** Case 108 *************** +************** Case 112 *************** select * from t1 where c1>=(select c1 from t2 where c2>1); question_mask_size: 0 { @@ -11781,7 +11871,7 @@ question_mask_size: 0 } ] } -************** Case 109 *************** +************** Case 113 *************** select * from t1 where c1<=ANY(select c1 from t2 where c2>1); question_mask_size: 0 { @@ -12052,7 +12142,7 @@ question_mask_size: 0 } ] } -************** Case 110 *************** +************** Case 114 *************** select * from t1 where c1<=SOME(select c1 from t2 where c2>1); question_mask_size: 0 { @@ -12323,7 +12413,7 @@ question_mask_size: 0 } ] } -************** Case 111 *************** +************** Case 115 *************** select * from t1 where c1<=ALL(select c1 from t2 where c2>1); question_mask_size: 0 { @@ -12594,7 +12684,7 @@ question_mask_size: 0 } ] } -************** Case 112 *************** +************** Case 116 *************** select * from t1 where c1<=(select c1 from t2 where c2>1); question_mask_size: 0 { @@ -12857,7 +12947,7 @@ question_mask_size: 0 } ] } -************** Case 113 *************** +************** Case 117 *************** select * from t1 where c1=ANY(select c1 from t2 where c2>1); question_mask_size: 0 { @@ -13128,7 +13218,7 @@ question_mask_size: 0 } ] } -************** Case 114 *************** +************** Case 118 *************** select * from t1 where c1=SOME(select c1 from t2 where c2>1); question_mask_size: 0 { @@ -13399,7 +13489,7 @@ question_mask_size: 0 } ] } -************** Case 115 *************** +************** Case 119 *************** select * from t1 where c1=ALL(select c1 from t2 where c2>1); question_mask_size: 0 { @@ -13670,7 +13760,7 @@ question_mask_size: 0 } ] } -************** Case 116 *************** +************** Case 120 *************** select * from t1 where c1=(select c1 from t2 where c2>1); question_mask_size: 0 { @@ -13933,7 +14023,7 @@ question_mask_size: 0 } ] } -************** Case 117 *************** +************** Case 121 *************** select * from t1 where c1!=ANY(select c1 from t2 where c2>1); question_mask_size: 0 { @@ -14204,7 +14294,7 @@ question_mask_size: 0 } ] } -************** Case 118 *************** +************** Case 122 *************** select * from t1 where c1!=SOME(select c1 from t2 where c2>1); question_mask_size: 0 { @@ -14475,7 +14565,7 @@ question_mask_size: 0 } ] } -************** Case 119 *************** +************** Case 123 *************** select * from t1 where c1!=ALL(select c1 from t2 where c2>1); question_mask_size: 0 { @@ -14746,7 +14836,7 @@ question_mask_size: 0 } ] } -************** Case 120 *************** +************** Case 124 *************** select * from t1 where c1!=(select c1 from t2 where c2>1); question_mask_size: 0 { @@ -15009,7 +15099,7 @@ question_mask_size: 0 } ] } -************** Case 121 *************** +************** Case 125 *************** select * from t1 where c1 in (select c1 from t2 where c2>1); question_mask_size: 0 { @@ -15272,7 +15362,7 @@ question_mask_size: 0 } ] } -************** Case 122 *************** +************** Case 126 *************** select * from t1 where c1 not in (select c1 from t2 where c2>1); question_mask_size: 0 { @@ -15535,7 +15625,7 @@ question_mask_size: 0 } ] } -************** Case 123 *************** +************** Case 127 *************** select * from t1 where exists (select c1 from t2 where c2>1); question_mask_size: 0 { @@ -15782,7 +15872,7 @@ question_mask_size: 0 } ] } -************** Case 124 *************** +************** Case 128 *************** select * from t1 where not exists (select c1 from t2 where c2>1); question_mask_size: 0 { @@ -16037,7 +16127,7 @@ question_mask_size: 0 } ] } -************** Case 125 *************** +************** Case 129 *************** select * from t1 where (select c1 from t1) like (select c2 from t2); question_mask_size: 0 { @@ -16342,7 +16432,7 @@ question_mask_size: 0 } ] } -************** Case 126 *************** +************** Case 130 *************** select * from t1 where (select c1 from t1) not like (select c2 from t2); question_mask_size: 0 { @@ -16647,7 +16737,7 @@ question_mask_size: 0 } ] } -************** Case 127 *************** +************** Case 131 *************** select * from t1 where (c1) in (select c1 from t2); question_mask_size: 0 { @@ -16872,7 +16962,7 @@ question_mask_size: 0 } ] } -************** Case 128 *************** +************** Case 132 *************** select * from t1 where (c1, c2) in (select c1, c2 from t2); question_mask_size: 0 { @@ -17145,7 +17235,7 @@ question_mask_size: 0 } ] } -************** Case 129 *************** +************** Case 133 *************** select * from t1 where ROW(c1, c2) in (select c1, c2 from t2); question_mask_size: 0 { @@ -17418,7 +17508,7 @@ question_mask_size: 0 } ] } -************** Case 130 *************** +************** Case 134 *************** set names latin1; question_mask_size: 0 { @@ -17452,7 +17542,7 @@ question_mask_size: 0 } ] } -************** Case 131 *************** +************** Case 135 *************** set names 'latin1'; question_mask_size: 0 { @@ -17486,7 +17576,7 @@ question_mask_size: 0 } ] } -************** Case 132 *************** +************** Case 136 *************** set names utf8 collate 'utf8_general_ci'; question_mask_size: 0 { @@ -17525,7 +17615,7 @@ question_mask_size: 0 } ] } -************** Case 133 *************** +************** Case 137 *************** set names utf8 collate utf8_general_ci; question_mask_size: 0 { @@ -17564,7 +17654,7 @@ question_mask_size: 0 } ] } -************** Case 134 *************** +************** Case 138 *************** set character set utf8; question_mask_size: 0 { @@ -17597,7 +17687,7 @@ question_mask_size: 0 } ] } -************** Case 135 *************** +************** Case 139 *************** set character set 'utf8'; question_mask_size: 0 { @@ -17630,7 +17720,7 @@ question_mask_size: 0 } ] } -************** Case 136 *************** +************** Case 140 *************** set charset utf8; question_mask_size: 0 { @@ -17663,7 +17753,7 @@ question_mask_size: 0 } ] } -************** Case 137 *************** +************** Case 141 *************** select _utf8 'abc', _utf8mb4 'def' collate utf8mb4_general_ci from t1 where c1 collate utf8_bin = 'xyz' collate utf8_bin; question_mask_size: 0 { @@ -17933,7 +18023,7 @@ question_mask_size: 0 } ] } -************** Case 138 *************** +************** Case 142 *************** select * from t1 where c1=?; question_mask_size: 1 { @@ -18068,7 +18158,7 @@ question_mask_size: 1 } ] } -************** Case 139 *************** +************** Case 143 *************** select * from t1 where c1>?; question_mask_size: 1 { @@ -18203,7 +18293,7 @@ question_mask_size: 1 } ] } -************** Case 140 *************** +************** Case 144 *************** select * from t1 where (select c1 from t1 where c1 = ?) not like (select c2 from t2 where c2=?); question_mask_size: 2 { @@ -18584,7 +18674,7 @@ question_mask_size: 2 } ] } -************** Case 141 *************** +************** Case 145 *************** select * from t1 join t2; question_mask_size: 0 { @@ -18724,7 +18814,7 @@ question_mask_size: 0 } ] } -************** Case 142 *************** +************** Case 146 *************** select * from t1 inner join t2; question_mask_size: 0 { @@ -18864,7 +18954,7 @@ question_mask_size: 0 } ] } -************** Case 143 *************** +************** Case 147 *************** select * from t1 cross join t2; question_mask_size: 0 { @@ -19004,7 +19094,7 @@ question_mask_size: 0 } ] } -************** Case 144 *************** +************** Case 148 *************** select * from t1 cross join t2 join t3; question_mask_size: 0 { @@ -19187,7 +19277,7 @@ question_mask_size: 0 } ] } -************** Case 145 *************** +************** Case 149 *************** select "1234"; question_mask_size: 0 { @@ -19259,7 +19349,7 @@ question_mask_size: 0 } ] } -************** Case 146 *************** +************** Case 150 *************** select '1234'; question_mask_size: 0 { @@ -19331,7 +19421,7 @@ question_mask_size: 0 } ] } -************** Case 147 *************** +************** Case 151 *************** create table test(c1 varchar(3) binary charset utf8mb4); question_mask_size: 0 { @@ -19427,7 +19517,7 @@ question_mask_size: 0 } ] } -************** Case 148 *************** +************** Case 152 *************** replace into test values(1,2); question_mask_size: 0 { @@ -19527,7 +19617,7 @@ question_mask_size: 0 } ] } -************** Case 149 *************** +************** Case 153 *************** replace ignore into test values(1,2); question_mask_size: 0 { @@ -19632,7 +19722,7 @@ question_mask_size: 0 } ] } -************** Case 150 *************** +************** Case 154 *************** insert ignore into test values(1,2); question_mask_size: 0 { @@ -19737,7 +19827,7 @@ question_mask_size: 0 } ] } -************** Case 151 *************** +************** Case 155 *************** insert ignore into test values(1,2) on duplicate key update c2 = c1 + 1; question_mask_size: 0 { @@ -19903,7 +19993,7 @@ question_mask_size: 0 } ] } -************** Case 152 *************** +************** Case 156 *************** create outline out_name on select * from t1; question_mask_size: 0 { @@ -20031,7 +20121,7 @@ question_mask_size: 0 } ] } -************** Case 153 *************** +************** Case 157 *************** create or replace outline out_name on select * from t1; question_mask_size: 0 { @@ -20164,7 +20254,7 @@ question_mask_size: 0 } ] } -************** Case 154 *************** +************** Case 158 *************** create outline out_name on select * from t1; question_mask_size: 0 { @@ -20292,7 +20382,7 @@ question_mask_size: 0 } ] } -************** Case 155 *************** +************** Case 159 *************** create outline out_name on select /*+ssssss*/* from t1; question_mask_size: 0 { @@ -20420,7 +20510,7 @@ question_mask_size: 0 } ] } -************** Case 156 *************** +************** Case 160 *************** create outline out_name on select /*+ssssss*/* from t1 to select /*+ssssss*/* from t1; question_mask_size: 0 { @@ -20633,7 +20723,7 @@ question_mask_size: 0 } ] } -************** Case 157 *************** +************** Case 161 *************** create outline out_name on select /*+ssssss*/* from t1 to select * from t1; question_mask_size: 0 { @@ -20846,7 +20936,7 @@ question_mask_size: 0 } ] } -************** Case 158 *************** +************** Case 162 *************** create outline out_name on insert /*+ssssss*/ into t1 values(1, 2) to insert /*+ssssss*/ into t1 values(1, 2); question_mask_size: 0 { @@ -21065,7 +21155,7 @@ question_mask_size: 0 } ] } -************** Case 159 *************** +************** Case 163 *************** drop outline out_name; question_mask_size: 0 { @@ -21100,7 +21190,7 @@ question_mask_size: 0 } ] } -************** Case 160 *************** +************** Case 164 *************** drop outline db_name.out_name; question_mask_size: 0 { @@ -21140,7 +21230,7 @@ question_mask_size: 0 } ] } -************** Case 161 *************** +************** Case 165 *************** create tenant tt1 replica_num = 1, primary_zone = 'zone1', resource_pool_list = ('zone1') set ob_tcp_invited_nodes='%'; question_mask_size: 0 { @@ -21253,7 +21343,7 @@ question_mask_size: 0 } ] } -************** Case 162 *************** +************** Case 166 *************** create tenant if not exists tt1 replica_num = 1, primary_zone = 'zone1', resource_pool_list = ('zone1') set ob_tcp_invited_nodes='%'; question_mask_size: 0 { @@ -21371,7 +21461,7 @@ question_mask_size: 0 } ] } -************** Case 163 *************** +************** Case 167 *************** create tenant tt1 replica_num = 1, primary_zone = 'zone1', resource_pool_list = ('zone1'), locality = 'auto_locality_strategy' set ob_tcp_invited_nodes='%'; question_mask_size: 0 { @@ -21499,7 +21589,7 @@ question_mask_size: 0 } ] } -************** Case 164 *************** +************** Case 168 *************** create tenant if not exists tt1 replica_num = 1, primary_zone = 'zone1', resource_pool_list = ('zone1'), locality = 'auto_locality_strategy' set ob_tcp_invited_nodes='%'; question_mask_size: 0 { @@ -21632,7 +21722,7 @@ question_mask_size: 0 } ] } -************** Case 165 *************** +************** Case 169 *************** create tenant tt1 replica_num = 1, primary_zone = 'zone1', resource_pool_list = ('zone1'), logonly_replica_num = 1 set ob_tcp_invited_nodes='%'; question_mask_size: 0 { @@ -21759,7 +21849,7 @@ question_mask_size: 0 } ] } -************** Case 166 *************** +************** Case 170 *************** create tenant if not exists tt1 replica_num = 1, primary_zone = 'zone1', resource_pool_list = ('zone1'), logonly_replica_num = 1 set ob_tcp_invited_nodes='%'; question_mask_size: 0 { @@ -21891,7 +21981,7 @@ question_mask_size: 0 } ] } -************** Case 167 *************** +************** Case 171 *************** select /*+max_concurrent(-10)*/* from t1; question_mask_size: 0 { @@ -21993,7 +22083,7 @@ question_mask_size: 0 } ] } -************** Case 168 *************** +************** Case 172 *************** select /*+max_concurrent(10)*/* from t1; question_mask_size: 0 { @@ -22111,7 +22201,7 @@ question_mask_size: 0 } ] } -************** Case 169 *************** +************** Case 173 *************** alter system refresh time_zone_info; question_mask_size: 0 { @@ -22128,25 +22218,25 @@ question_mask_size: 0 } ] } -************** Case 170 *************** -merge into targetTable t1 using sourceTable t2 on (t1.id = t2.id) when matched then update set t1.sales = t2.sales when not matched then insert(t1.id, t1.sales) values(t2.id, t2.sales); -************** Case 171 *************** -merge into targetTable t1 using sourceTable t2 on (t1.id = t2.id) when matched then update set t1.sales = t2.sales where t2.id!= t1.id when not matched then insert(t1.id, t1.sales) values(t2.id, t2.sales); -************** Case 172 *************** -merge into targetTable t1 using sourceTable t2 on (t1.id = t2.id) when matched then update set t1.sales = t2.sales where t1.id < 3 delete where t1.id < 5 when not matched then insert(t1.id, t1.sales) values(t2.id, t2.sales); -************** Case 173 *************** -merge into targetTable t1 using sourceTable t2 on (t1.id = t2.id) when matched then update set t1.sales = t2.sales delete where t1.sales =2 when not matched then insert(t1.id, t1.sales) values(t2.id, t2.sales); ************** Case 174 *************** -merge into targetTable t1 using sourceTable t2 on (t1.id = t2.id) when not matched then insert(t1.id, t1.sales) values(t2.id, t2.sales) where t2.id > 0; +merge into targetTable t1 using sourceTable t2 on (t1.id = t2.id) when matched then update set t1.sales = t2.sales when not matched then insert(t1.id, t1.sales) values(t2.id, t2.sales); ************** Case 175 *************** -merge into targetTable t1 using sourceTable t2 on (1 = 2) when not matched then insert(t1.id, t1.sales) values(t2.id, t2.sales) where t2.id > 0; +merge into targetTable t1 using sourceTable t2 on (t1.id = t2.id) when matched then update set t1.sales = t2.sales where t2.id!= t1.id when not matched then insert(t1.id, t1.sales) values(t2.id, t2.sales); ************** Case 176 *************** -merge into targetTable t1 using sourceTable t2 on (t1.id = t2.id) when matched then update set t1.sales = t2.sales; +merge into targetTable t1 using sourceTable t2 on (t1.id = t2.id) when matched then update set t1.sales = t2.sales where t1.id < 3 delete where t1.id < 5 when not matched then insert(t1.id, t1.sales) values(t2.id, t2.sales); ************** Case 177 *************** -merge into targetTable using sourceTable on (targetTable.id = sourceTable.id) when matched then update set targetTable.sales = sourceTable.sales; +merge into targetTable t1 using sourceTable t2 on (t1.id = t2.id) when matched then update set t1.sales = t2.sales delete where t1.sales =2 when not matched then insert(t1.id, t1.sales) values(t2.id, t2.sales); ************** Case 178 *************** -merge into targetTable using (select * from t1 ) sourceTable on (targetTable.id = sourceTable.id) when matched then update set targetTable.sales = sourceTable.sales; +merge into targetTable t1 using sourceTable t2 on (t1.id = t2.id) when not matched then insert(t1.id, t1.sales) values(t2.id, t2.sales) where t2.id > 0; ************** Case 179 *************** +merge into targetTable t1 using sourceTable t2 on (1 = 2) when not matched then insert(t1.id, t1.sales) values(t2.id, t2.sales) where t2.id > 0; +************** Case 180 *************** +merge into targetTable t1 using sourceTable t2 on (t1.id = t2.id) when matched then update set t1.sales = t2.sales; +************** Case 181 *************** +merge into targetTable using sourceTable on (targetTable.id = sourceTable.id) when matched then update set targetTable.sales = sourceTable.sales; +************** Case 182 *************** +merge into targetTable using (select * from t1 ) sourceTable on (targetTable.id = sourceTable.id) when matched then update set targetTable.sales = sourceTable.sales; +************** Case 183 *************** select unique(c1), c2 from t1; question_mask_size: 0 { @@ -22290,7 +22380,7 @@ question_mask_size: 0 } ] } -************** Case 180 *************** +************** Case 184 *************** select unique(c1+1), c2 from t1; question_mask_size: 0 { @@ -22448,7 +22538,7 @@ question_mask_size: 0 } ] } -************** Case 181 *************** +************** Case 185 *************** select distinct unique( max(c1)), c2 from t1; question_mask_size: 0 { @@ -22607,7 +22697,7 @@ question_mask_size: 0 } ] } -************** Case 182 *************** +************** Case 186 *************** select unique distinct( max(c1)), c2 from t1; question_mask_size: 0 { @@ -22766,9 +22856,664 @@ question_mask_size: 0 } ] } -************** Case 183 *************** +************** Case 187 *************** select unique(*) from t1; -************** Case 184 *************** +************** Case 188 *************** +delete from t1 where c1 = 1 returning c1 + 1, c2 * 2; +question_mask_size: 0 +{ + "type":"T_STMT_LIST", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_DELETE", + "int_val":0, + "str_len":0, + "str_val":"", + "children": [ + { }, + { + "type":"T_DELETE_TABLE_NODE", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { }, + { + "type":"T_TABLE_REFERENCES", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_ORG", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_RELATION_FACTOR", + "int_val":9223372036854775807, + "str_len":2, + "str_val":"T1", + "children": [ + { }, + { + "type":"T_IDENT", + "int_val":1, + "str_len":2, + "str_val":"T1" + }, + { } + ] + }, + { }, + { }, + { }, + { } + ] + } + ] + } + ] + }, + { + "type":"T_WHERE_CLAUSE", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_OP_EQ", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_OBJ_ACCESS_REF", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_IDENT", + "int_val":1, + "str_len":2, + "str_val":"C1" + }, + { } + ] + }, + { + "type":"T_INT", + "int_val":1, + "str_len":1, + "str_val":"1" + } + ] + }, + { } + ] + }, + { }, + { }, + { }, + { }, + { + "type":"T_RETURNING", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_PROJECT_LIST", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_PROJECT_STRING", + "int_val":9223372036854775807, + "str_len":4, + "str_val":"C1+1", + "children": [ + { + "type":"T_OP_ADD", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_OBJ_ACCESS_REF", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_IDENT", + "int_val":1, + "str_len":2, + "str_val":"C1" + }, + { } + ] + }, + { + "type":"T_INT", + "int_val":1, + "str_len":1, + "str_val":"1" + } + ] + } + ] + }, + { + "type":"T_PROJECT_STRING", + "int_val":9223372036854775807, + "str_len":4, + "str_val":"C2*2", + "children": [ + { + "type":"T_OP_MUL", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_OBJ_ACCESS_REF", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_IDENT", + "int_val":1, + "str_len":2, + "str_val":"C2" + }, + { } + ] + }, + { + "type":"T_INT", + "int_val":2, + "str_len":1, + "str_val":"2" + } + ] + } + ] + } + ] + }, + { } + ] + }, + { } + ] + } + ] +} +************** Case 189 *************** +update t1 set c1 = 1 where c2 = 2 returning c1, c2 + 3, c3 * c4; +question_mask_size: 0 +{ + "type":"T_STMT_LIST", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_UPDATE", + "int_val":0, + "str_len":0, + "str_val":"", + "children": [ + { }, + { + "type":"T_TABLE_REFERENCES", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_ALIAS", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_RELATION_FACTOR", + "int_val":9223372036854775807, + "str_len":2, + "str_val":"T1", + "children": [ + { }, + { + "type":"T_IDENT", + "int_val":1, + "str_len":2, + "str_val":"T1" + }, + { } + ] + }, + { }, + { }, + { }, + { } + ] + } + ] + }, + { + "type":"T_ASSIGN_LIST", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_ASSIGN_ITEM", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_COLUMN_REF", + "int_val":9223372036854775807, + "str_len":2, + "str_val":"C1", + "children": [ + { }, + { }, + { + "type":"T_IDENT", + "int_val":1, + "str_len":2, + "str_val":"C1" + } + ] + }, + { + "type":"T_INT", + "int_val":1, + "str_len":1, + "str_val":"1" + } + ] + } + ] + }, + { + "type":"T_WHERE_CLAUSE", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_OP_EQ", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_OBJ_ACCESS_REF", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_IDENT", + "int_val":1, + "str_len":2, + "str_val":"C2" + }, + { } + ] + }, + { + "type":"T_INT", + "int_val":2, + "str_len":1, + "str_val":"2" + } + ] + }, + { } + ] + }, + { }, + { }, + { }, + { }, + { }, + { + "type":"T_RETURNING", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_PROJECT_LIST", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_PROJECT_STRING", + "int_val":9223372036854775807, + "str_len":2, + "str_val":"C1", + "children": [ + { + "type":"T_OBJ_ACCESS_REF", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_IDENT", + "int_val":1, + "str_len":2, + "str_val":"C1" + }, + { } + ] + } + ] + }, + { + "type":"T_PROJECT_STRING", + "int_val":9223372036854775807, + "str_len":4, + "str_val":"C2+3", + "children": [ + { + "type":"T_OP_ADD", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_OBJ_ACCESS_REF", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_IDENT", + "int_val":1, + "str_len":2, + "str_val":"C2" + }, + { } + ] + }, + { + "type":"T_INT", + "int_val":3, + "str_len":1, + "str_val":"3" + } + ] + } + ] + }, + { + "type":"T_PROJECT_STRING", + "int_val":9223372036854775807, + "str_len":5, + "str_val":"C3*C4", + "children": [ + { + "type":"T_OP_MUL", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_OBJ_ACCESS_REF", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_IDENT", + "int_val":1, + "str_len":2, + "str_val":"C3" + }, + { } + ] + }, + { + "type":"T_OBJ_ACCESS_REF", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_IDENT", + "int_val":1, + "str_len":2, + "str_val":"C4" + }, + { } + ] + } + ] + } + ] + } + ] + }, + { } + ] + }, + { } + ] + } + ] +} +************** Case 190 *************** +insert into t1 values(1, 2, 3) returning c1, c2, c3; +question_mask_size: 0 +{ + "type":"T_STMT_LIST", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_INSERT", + "int_val":0, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_SINGLE_TABLE_INSERT", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_INSERT_INTO_CLAUSE", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_ALIAS", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_RELATION_FACTOR", + "int_val":9223372036854775807, + "str_len":2, + "str_val":"T1", + "children": [ + { }, + { + "type":"T_IDENT", + "int_val":1, + "str_len":2, + "str_val":"T1" + }, + { } + ] + }, + { }, + { }, + { }, + { } + ] + }, + { } + ] + }, + { + "type":"T_VALUE_LIST", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_VALUE_VECTOR", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_INT", + "int_val":1, + "str_len":1, + "str_val":"1" + }, + { + "type":"T_INT", + "int_val":2, + "str_len":1, + "str_val":"2" + }, + { + "type":"T_INT", + "int_val":3, + "str_len":1, + "str_val":"3" + } + ] + } + ] + }, + { + "type":"T_RETURNING", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_PROJECT_LIST", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_PROJECT_STRING", + "int_val":9223372036854775807, + "str_len":2, + "str_val":"C1", + "children": [ + { + "type":"T_OBJ_ACCESS_REF", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_IDENT", + "int_val":1, + "str_len":2, + "str_val":"C1" + }, + { } + ] + } + ] + }, + { + "type":"T_PROJECT_STRING", + "int_val":9223372036854775807, + "str_len":2, + "str_val":"C2", + "children": [ + { + "type":"T_OBJ_ACCESS_REF", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_IDENT", + "int_val":1, + "str_len":2, + "str_val":"C2" + }, + { } + ] + } + ] + }, + { + "type":"T_PROJECT_STRING", + "int_val":9223372036854775807, + "str_len":2, + "str_val":"C3", + "children": [ + { + "type":"T_OBJ_ACCESS_REF", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"", + "children": [ + { + "type":"T_IDENT", + "int_val":1, + "str_len":2, + "str_val":"C3" + }, + { } + ] + } + ] + } + ] + }, + { } + ] + }, + { } + ] + }, + { + "type":"T_INSERT", + "int_val":9223372036854775807, + "str_len":0, + "str_val":"" + }, + { }, + { } + ] + } + ] +} +************** Case 191 *************** +replace into t1 values(1, 2) returning c1, c2, c3, c4, c5, c6; +************** Case 192 *************** alter tablegroup tg2 add table t1,t2; question_mask_size: 0 { @@ -22833,7 +23578,7 @@ question_mask_size: 0 } ] } -************** Case 185 *************** +************** Case 193 *************** insert into t1 values(X''); question_mask_size: 0 { @@ -22927,7 +23672,7 @@ question_mask_size: 0 } ] } -************** Case 186 *************** +************** Case 194 *************** create table t1(`thedate` date NOT NULL COMMENT '日期'); question_mask_size: 0 { @@ -23035,7 +23780,7 @@ question_mask_size: 0 } ] } -************** Case 187 *************** +************** Case 195 *************** alter system bootstrap REGION 'sys_region' ZONE 'zone1' SERVER '10.101.74.122:41425'; question_mask_size: 0 { @@ -23088,7 +23833,7 @@ question_mask_size: 0 } ] } -************** Case 188 *************** +************** Case 196 *************** alter system transfer partition table_id = 1, object_id = 1 to ls 1001; question_mask_size: 0 { @@ -23142,7 +23887,7 @@ question_mask_size: 0 } ] } -************** Case 189 *************** +************** Case 197 *************** alter system transfer partition table_id = 1, object_id = 1 to ls 1001 tenant 'mysql'; question_mask_size: 0 { @@ -23209,7 +23954,7 @@ question_mask_size: 0 } ] } -************** Case 190 *************** +************** Case 198 *************** alter system cancel transfer partition table_id = 1, object_id = 1; question_mask_size: 0 { @@ -23249,7 +23994,7 @@ question_mask_size: 0 } ] } -************** Case 191 *************** +************** Case 199 *************** alter system cancel transfer partition table_id = 1, object_id = 1 tenant 'mysql'; question_mask_size: 0 { @@ -23302,7 +24047,7 @@ question_mask_size: 0 } ] } -************** Case 192 *************** +************** Case 200 *************** alter system cancel transfer partition ALL; question_mask_size: 0 { @@ -23328,7 +24073,7 @@ question_mask_size: 0 } ] } -************** Case 193 *************** +************** Case 201 *************** alter system cancel transfer partition ALL tenant 'mysql'; question_mask_size: 0 { @@ -23367,7 +24112,7 @@ question_mask_size: 0 } ] } -************** Case 194 *************** +************** Case 202 *************** alter system cancel balance job; question_mask_size: 0 { @@ -23387,7 +24132,7 @@ question_mask_size: 0 } ] } -************** Case 195 *************** +************** Case 203 *************** alter system cancel balance job tenant 'mysql'; question_mask_size: 0 { diff --git a/unittest/sql/parser/test_parser.test b/unittest/sql/parser/test_parser.test index c840fee28e..e05feca204 100644 --- a/unittest/sql/parser/test_parser.test +++ b/unittest/sql/parser/test_parser.test @@ -20,11 +20,11 @@ commit; commit/*hint+commit*/; commit work; commit/*hint+commit work*/ work; -#--sql_mode oracle -#commit comment 'comment transaction commit'; -#commit work comment 'comment txn commit work'; -#commit/*hint+commit tx hint*/ comment 'comment + hint'; -#commit/*hint+commit tx work hint*/ work comment 'comment + hint'; +--sql_mode oracle +commit comment 'comment transaction commit'; +commit work comment 'comment txn commit work'; +commit/*hint+commit tx hint*/ comment 'comment + hint'; +commit/*hint+commit tx work hint*/ work comment 'comment + hint'; --sql_mode mysql rollback; rollback/*hint+rollback*/; @@ -293,12 +293,12 @@ select unique distinct( max(c1)), c2 from t1; select unique(*) from t1; ########################## test for returning ################################### -#--sql_mode oracle -#delete from t1 where c1 = 1 returning c1 + 1, c2 * 2; -#update t1 set c1 = 1 where c2 = 2 returning c1, c2 + 3, c3 * c4; -#insert into t1 values(1, 2, 3) returning c1, c2, c3; -#--error 5001 -#replace into t1 values(1, 2) returning c1, c2, c3, c4, c5, c6; +--sql_mode oracle +delete from t1 where c1 = 1 returning c1 + 1, c2 * 2; +update t1 set c1 = 1 where c2 = 2 returning c1, c2 + 3, c3 * c4; +insert into t1 values(1, 2, 3) returning c1, c2, c3; +--error 5001 +replace into t1 values(1, 2) returning c1, c2, c3, c4, c5, c6; ############# tablegroup ################## --sql_mode mysql alter tablegroup tg2 add table t1,t2;