From b9bd7af02e91011f149670483f258413991ac34a Mon Sep 17 00:00:00 2001 From: Joo Youngjin <68979537+youngjinj@users.noreply.github.com> Date: Wed, 26 Apr 2023 13:24:30 +0900 Subject: [PATCH] [CBRD-24781] Added csql option for catalog rebuild (#4325) (#4329) http://jira.cubrid.org/browse/CBRD-24781 backport #4325 --- src/compat/db_client_type.hpp | 1 + src/executables/csql.c | 10 ++++++++-- src/executables/csql.h | 1 + src/executables/csql_launcher.c | 21 ++++++++++++++++++++- src/executables/utility.h | 2 ++ src/object/authenticate.c | 23 ++++++----------------- src/object/authenticate.h | 1 - src/query/execute_schema.c | 8 ++++++++ src/transaction/boot.h | 27 ++++++++++++++++++++------- src/transaction/boot_sr.c | 6 ++++++ 10 files changed, 72 insertions(+), 28 deletions(-) diff --git a/src/compat/db_client_type.hpp b/src/compat/db_client_type.hpp index 90fb6468ab..6bdbc0362c 100644 --- a/src/compat/db_client_type.hpp +++ b/src/compat/db_client_type.hpp @@ -46,6 +46,7 @@ enum db_client_type DB_CLIENT_TYPE_SKIP_VACUUM_ADMIN_CSQL = 16, DB_CLIENT_TYPE_ADMIN_COMPACTDB_WOS = 17, /* admin compactdb that can run on standby */ DB_CLIENT_TYPE_ADMIN_LOADDB_COMPAT = 18, /* loaddb with --no-user-specified-name option */ + DB_CLIENT_TYPE_ADMIN_CSQL_REBUILD_CATALOG = 19, DB_CLIENT_TYPE_MAX }; diff --git a/src/executables/csql.c b/src/executables/csql.c index 96d0f45edb..b6ff4009f1 100644 --- a/src/executables/csql.c +++ b/src/executables/csql.c @@ -1022,7 +1022,7 @@ csql_do_session_cmd (char *line_read, CSQL_ARGUMENT * csql_arg) { if (csql_arg->sysadm && au_is_dba_group_member (Au_user)) { - au_sysadm_disable (); + au_disable (); } csql_Database_connected = true; @@ -2828,6 +2828,12 @@ csql (const char *argv0, CSQL_ARGUMENT * csql_arg) client_type = DB_CLIENT_TYPE_CSQL; } + if (csql_arg->sysadm_rebuild_catalog) + { + client_type = DB_CLIENT_TYPE_ADMIN_CSQL_REBUILD_CATALOG; + csql_arg->sysadm = true; + } + if (db_restart_ex (argv0, csql_arg->db_name, csql_arg->user_name, csql_arg->passwd, NULL, client_type) != NO_ERROR) { if (!csql_Is_interactive || csql_arg->passwd != NULL || db_error_code () != ER_AU_INVALID_PASSWORD) @@ -2882,7 +2888,7 @@ csql (const char *argv0, CSQL_ARGUMENT * csql_arg) if (csql_arg->sysadm && au_is_dba_group_member (Au_user)) { - au_sysadm_disable (); + au_disable (); } /* allow environmental setting of the "-s" command line flag to enable automated testing */ diff --git a/src/executables/csql.h b/src/executables/csql.h index 2c9a284d8b..f30f4e0b8c 100644 --- a/src/executables/csql.h +++ b/src/executables/csql.h @@ -269,6 +269,7 @@ extern "C" bool nopager; bool continue_on_error; bool sysadm; + bool sysadm_rebuild_catalog; bool write_on_standby; bool trigger_action_flag; bool plain_output; diff --git a/src/executables/csql_launcher.c b/src/executables/csql_launcher.c index aff1dcbdf0..9769954899 100644 --- a/src/executables/csql_launcher.c +++ b/src/executables/csql_launcher.c @@ -137,6 +137,7 @@ main (int argc, char *argv[]) {CSQL_NO_PAGER_L, 0, 0, CSQL_NO_PAGER_S}, {CSQL_NO_SINGLE_LINE_L, 0, 0, CSQL_NO_SINGLE_LINE_S}, {CSQL_SYSADM_L, 0, 0, CSQL_SYSADM_S}, + {CSQL_SYSADM_REBUILD_CATALOG_L, 0, 0, CSQL_SYSADM_REBUILD_CATALOG_S}, {CSQL_WRITE_ON_STANDBY_L, 0, 0, CSQL_WRITE_ON_STANDBY_S}, {CSQL_STRING_WIDTH_L, 1, 0, CSQL_STRING_WIDTH_S}, {CSQL_NO_TRIGGER_ACTION_L, 0, 0, CSQL_NO_TRIGGER_ACTION_S}, @@ -257,6 +258,10 @@ main (int argc, char *argv[]) csql_arg.sysadm = true; break; + case CSQL_SYSADM_REBUILD_CATALOG_S: + csql_arg.sysadm_rebuild_catalog = true; + break; + case CSQL_WRITE_ON_STANDBY_S: csql_arg.write_on_standby = true; break; @@ -410,7 +415,21 @@ main (int argc, char *argv[]) goto print_usage; } - if (csql_arg.sysadm && (csql_arg.user_name == NULL || strcasecmp (csql_arg.user_name, "DBA"))) + if (csql_arg.sysadm_rebuild_catalog) + { + if (!csql_arg.sa_mode) + { + goto print_usage; + } + + if (csql_arg.in_file_name == NULL && csql_arg.command == NULL) + { + goto print_usage; + } + } + + if ((csql_arg.sysadm || csql_arg.sysadm_rebuild_catalog) + && (csql_arg.user_name == NULL || strcasecmp (csql_arg.user_name, "DBA"))) { /* sysadm is allowed only to DBA */ goto print_usage; diff --git a/src/executables/utility.h b/src/executables/utility.h index 7578b107fa..9f2c9d6c52 100644 --- a/src/executables/utility.h +++ b/src/executables/utility.h @@ -1430,6 +1430,8 @@ typedef struct _ha_config #define CSQL_QUERY_COLUMN_ENCLOSURE_L "enclosure" #define CSQL_LOADDB_OUTPUT_S 'd' #define CSQL_LOADDB_OUTPUT_L "loaddb-output" +#define CSQL_SYSADM_REBUILD_CATALOG_S 12020 +#define CSQL_SYSADM_REBUILD_CATALOG_L "sysadm-rebuild-catalog" #define COMMDB_SERVER_LIST_S 'P' #define COMMDB_SERVER_LIST_L "server-list" diff --git a/src/object/authenticate.c b/src/object/authenticate.c index 5e554d2d38..7927f2bb2f 100644 --- a/src/object/authenticate.c +++ b/src/object/authenticate.c @@ -311,7 +311,6 @@ MOP Au_root = NULL; * use the AU_DISABLE, AU_ENABLE macros instead. */ int Au_disable = 1; -bool Au_sysadm = false; /* * Au_ignore_passwords @@ -6402,9 +6401,13 @@ check_authorization (MOP classobj, SM_CLASS * sm_class, DB_AUTH type) * Callers generally check Au_disable already to avoid the function call. * Check it again to be safe, at this point, it isn't going to add anything. */ - if (Au_disable && (!Au_sysadm || !(sm_class->flags & SM_CLASSFLAG_SYSTEM))) + if (Au_disable) { - return NO_ERROR; + int client_type = db_get_client_type (); + if (!BOOT_ADMIN_CSQL_CLIENT_TYPE (client_type) || !(sm_class->flags & SM_CLASSFLAG_SYSTEM)) + { + return NO_ERROR; + } } /* try to catch attempts by even the DBA to update a protected class */ @@ -9199,19 +9202,6 @@ au_disable (void) return save; } -/* - * au_sysadm_disable - set Au_disable for sysadm - * return: original Au_disable value - */ -int -au_sysadm_disable (void) -{ - int save = Au_disable; - Au_disable = 1; - Au_sysadm = true; - return save; -} - /* * au_enable - restore Au_disable * return: @@ -9221,7 +9211,6 @@ void au_enable (int save) { Au_disable = save; - Au_sysadm = false; } /* diff --git a/src/object/authenticate.h b/src/object/authenticate.h index 026818a531..d7a549aa2f 100644 --- a/src/object/authenticate.h +++ b/src/object/authenticate.h @@ -99,7 +99,6 @@ extern const char *AU_DBA_USER_NAME; int au_disable (void); -int au_sysadm_disable (void); void au_enable (int save); MOP au_get_public_user (void); MOP au_get_dba_user (void); diff --git a/src/query/execute_schema.c b/src/query/execute_schema.c index c6eae01c88..545f019a04 100644 --- a/src/query/execute_schema.c +++ b/src/query/execute_schema.c @@ -9034,6 +9034,14 @@ do_create_entity (PARSER_CONTEXT * parser, PT_NODE * node) break; } + if (db_get_client_type () == DB_CLIENT_TYPE_ADMIN_CSQL_REBUILD_CATALOG) + { + if (sm_check_system_class_by_name (class_name)) + { + sm_mark_system_class (class_obj, 1); + } + } + if (do_flush_class_mop == true) { assert (error == NO_ERROR); diff --git a/src/transaction/boot.h b/src/transaction/boot.h index 202d8696ff..8247eb6a1e 100644 --- a/src/transaction/boot.h +++ b/src/transaction/boot.h @@ -49,10 +49,12 @@ #define BOOT_ADMIN_CLIENT_TYPE(client_type) \ ((client_type) == DB_CLIENT_TYPE_ADMIN_UTILITY \ - || (client_type) == DB_CLIENT_TYPE_ADMIN_COMPACTDB_WOS \ || (client_type) == DB_CLIENT_TYPE_ADMIN_CSQL \ + || (client_type) == DB_CLIENT_TYPE_ADMIN_CSQL_REBUILD_CATALOG \ || (client_type) == DB_CLIENT_TYPE_ADMIN_CSQL_WOS \ - || (client_type) == DB_CLIENT_TYPE_SKIP_VACUUM_ADMIN_CSQL) + || (client_type) == DB_CLIENT_TYPE_SKIP_VACUUM_ADMIN_CSQL \ + || (client_type) == DB_CLIENT_TYPE_ADMIN_COMPACTDB_WOS \ + || (client_type) == DB_CLIENT_TYPE_ADMIN_LOADDB_COMPAT) #define BOOT_LOG_REPLICATOR_TYPE(client_type) \ ((client_type) == DB_CLIENT_TYPE_LOG_COPIER \ @@ -60,11 +62,22 @@ #define BOOT_CSQL_CLIENT_TYPE(client_type) \ ((client_type) == DB_CLIENT_TYPE_CSQL \ - || (client_type) == DB_CLIENT_TYPE_READ_ONLY_CSQL \ - || (client_type) == DB_CLIENT_TYPE_SKIP_VACUUM_CSQL \ - || (client_type) == DB_CLIENT_TYPE_SKIP_VACUUM_ADMIN_CSQL \ - || (client_type) == DB_CLIENT_TYPE_ADMIN_CSQL \ - || (client_type) == DB_CLIENT_TYPE_ADMIN_CSQL_WOS) + || (client_type) == DB_CLIENT_TYPE_READ_ONLY_CSQL \ + || (client_type) == DB_CLIENT_TYPE_ADMIN_CSQL \ + || (client_type) == DB_CLIENT_TYPE_ADMIN_CSQL_REBUILD_CATALOG \ + || (client_type) == DB_CLIENT_TYPE_ADMIN_CSQL_WOS \ + || (client_type) == DB_CLIENT_TYPE_SKIP_VACUUM_CSQL \ + || (client_type) == DB_CLIENT_TYPE_SKIP_VACUUM_ADMIN_CSQL) + +/* DB_CLIENT_TYPE_ADMIN_CSQL_REBUILD_CATALOG is excluded + * for using the `--sysadm_rebuild_catalog` option of the csql utility. + * + * See CBRD-24781 for the details. + */ +#define BOOT_ADMIN_CSQL_CLIENT_TYPE(client_type) \ + ((client_type) == DB_CLIENT_TYPE_ADMIN_CSQL \ + || (client_type) == DB_CLIENT_TYPE_ADMIN_CSQL_WOS \ + || (client_type) == DB_CLIENT_TYPE_SKIP_VACUUM_ADMIN_CSQL) #define BOOT_BROKER_AND_DEFAULT_CLIENT_TYPE(client_type) \ ((client_type) == DB_CLIENT_TYPE_DEFAULT \ diff --git a/src/transaction/boot_sr.c b/src/transaction/boot_sr.c index 5334f57b9b..386c94b8a5 100644 --- a/src/transaction/boot_sr.c +++ b/src/transaction/boot_sr.c @@ -5987,6 +5987,8 @@ boot_client_type_to_string (BOOT_CLIENT_TYPE type) return "ADMIN_UTILITY"; case DB_CLIENT_TYPE_ADMIN_CSQL: return "ADMIN_CSQL"; + case DB_CLIENT_TYPE_ADMIN_CSQL_REBUILD_CATALOG: + return "ADMIN_CSQL_REBUILD_CATALOG"; case DB_CLIENT_TYPE_LOG_COPIER: return "LOG_COPIER"; case DB_CLIENT_TYPE_LOG_APPLIER: @@ -6003,6 +6005,10 @@ boot_client_type_to_string (BOOT_CLIENT_TYPE type) return "SKIP_VACUUM_CSQL"; case DB_CLIENT_TYPE_SKIP_VACUUM_ADMIN_CSQL: return "SKIP_VACUUM_ADMIN_CSQL"; + case DB_CLIENT_TYPE_ADMIN_COMPACTDB_WOS: + return "ADMIN_COMPACTDB_WOS"; + case DB_CLIENT_TYPE_ADMIN_LOADDB_COMPAT: + return "ADMIN_LOADDB_COMPAT"; case DB_CLIENT_TYPE_UNKNOWN: default: return "UNKNOWN";