changeset 86135:76dbc360494f userprofile

Delete old M5system_auth_* bats on upgrade.
author Sjoerd Mullender <sjoerd@acm.org>
date Thu, 21 Jul 2022 14:24:58 +0200
parents 8f96e8f80079
children 3bc8f8c4238f
files sql/backends/monet5/sql_upgrades.c
diffstat 1 files changed, 48 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/sql/backends/monet5/sql_upgrades.c
+++ b/sql/backends/monet5/sql_upgrades.c
@@ -4618,12 +4618,22 @@ sql_update_default(Client c, mvc *sql)
 		pos += snprintf(buf + pos, bufsize - pos,
 						"update sys.db_user_info u set max_memory = 0, max_workers = 0, optimizer = 'default_pipe', default_role = (select id from sys.auths a where a.name = u.name);\n");
 		int endprint = (int) pos;
-		bat bid = BBPindex("M5system_auth_user");
-		BAT *u = BATdescriptor(bid);
-		bid = BBPindex("M5system_auth_passwd_v2");
-		BAT *p = BATdescriptor(bid);
-		bid = BBPindex("M5system_auth_deleted");
-		BAT *d = BATdescriptor(bid);
+		bat bid;
+		BAT *u = NULL, *p = NULL, *d = NULL;
+		if ((bid = BBPindex("M5system_auth_user")) == 0 ||
+			(u = BATdescriptor(bid)) == NULL ||
+			(bid = BBPindex("M5system_auth_passwd_v2")) == 0 ||
+			(p = BATdescriptor(bid)) == NULL ||
+			(bid = BBPindex("M5system_auth_deleted")) == 0 ||
+			(d = BATdescriptor(bid)) == NULL) {
+			if (u)
+				BBPunfix(u->batCacheid);
+			if (p)
+				BBPunfix(p->batCacheid);
+			if (d)
+				BBPunfix(d->batCacheid);
+			throw(SQL, __func__, INTERNAL_BAT_ACCESS);
+		}
 		BATiter ui = bat_iterator(u);
 		BATiter pi = bat_iterator(p);
 		for (oid i = 0; i < ui.count; i++) {
@@ -4634,6 +4644,14 @@ sql_update_default(Client c, mvc *sql)
 				char *pass_esc = NULL;
 				if (strchr(user, '\'') != NULL) {
 					char *user_esc = GDKmalloc(strlen(user) * 2 + 1);
+					if (user_esc == NULL) {
+						bat_iterator_end(&ui);
+						bat_iterator_end(&pi);
+						BBPunfix(u->batCacheid);
+						BBPunfix(p->batCacheid);
+						BBPunfix(d->batCacheid);
+						throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
+					}
 					size_t k = 0;
 					for (size_t j = 0; user[j]; j++) {
 						if (user[j] == '\'')
@@ -4644,6 +4662,15 @@ sql_update_default(Client c, mvc *sql)
 				}
 				if (strchr(pass, '\'') != NULL) {
 					char *pass_esc = GDKmalloc(strlen(pass) * 2 + 1);
+					if (pass_esc == NULL) {
+						bat_iterator_end(&ui);
+						bat_iterator_end(&pi);
+						BBPunfix(u->batCacheid);
+						BBPunfix(p->batCacheid);
+						BBPunfix(d->batCacheid);
+						GDKfree(user_esc);
+						throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
+					}
 					size_t k = 0;
 					for (size_t j = 0; pass[j]; j++) {
 						if (pass[j] == '\'')
@@ -4663,6 +4690,21 @@ sql_update_default(Client c, mvc *sql)
 		err = SQLstatementIntern(c, buf, "update", true, false, NULL);
 		bat_iterator_end(&ui);
 		bat_iterator_end(&pi);
+		if (err == MAL_SUCCEED &&
+			BATmode(u, true) == GDK_SUCCEED &&
+			BATmode(p, true) == GDK_SUCCEED &&
+			BATmode(d, true) == GDK_SUCCEED &&
+			BBPrename(u, NULL) == 0 &&
+			BBPrename(p, NULL) == 0 &&
+			BBPrename(d, NULL) == 0) {
+			bat authbats[4];
+			authbats[0] = 0;
+			authbats[1] = u->batCacheid;
+			authbats[2] = p->batCacheid;
+			authbats[3] = d->batCacheid;
+			if (TMsubcommit_list(authbats, NULL, 4, getBBPlogno(), getBBPtransid()) != GDK_SUCCEED)
+				fprintf(stderr, "Committing removal of old user/password BATs failed\n");
+		}
 		BBPunfix(u->batCacheid);
 		BBPunfix(p->batCacheid);
 		BBPunfix(d->batCacheid);