summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Midenkov <midenok@gmail.com>2023-01-18 16:52:09 +0300
committerAleksey Midenkov <midenok@gmail.com>2023-01-26 17:15:20 +0300
commit2d5758af5a8ab43d200026efc510df26e4b58266 (patch)
tree12b237c90218fe0d98d5e52d0e6d4b446642a4f1
parente69521833df7f19feb71d8d26135f20da75a3f23 (diff)
downloadmariadb-git-2d5758af5a8ab43d200026efc510df26e4b58266.tar.gz
MDEV-28933 Moved RENAME_CONSTRAINT_IDS to include/sql_funcs.h
All InnoDB internal SQL functions should be moved to sql_funcs.h
-rw-r--r--storage/innobase/CMakeLists.txt1
-rw-r--r--storage/innobase/include/sql_funcs.h92
-rw-r--r--storage/innobase/row/row0mysql.cc69
3 files changed, 96 insertions, 66 deletions
diff --git a/storage/innobase/CMakeLists.txt b/storage/innobase/CMakeLists.txt
index 848855b41e5..e75e528f500 100644
--- a/storage/innobase/CMakeLists.txt
+++ b/storage/innobase/CMakeLists.txt
@@ -337,6 +337,7 @@ SET(INNOBASE_SOURCES
include/srv0start.h
include/srw_lock.h
include/sux_lock.h
+ include/sql_funcs.h
include/trx0i_s.h
include/trx0purge.h
include/trx0rec.h
diff --git a/storage/innobase/include/sql_funcs.h b/storage/innobase/include/sql_funcs.h
new file mode 100644
index 00000000000..307756196b1
--- /dev/null
+++ b/storage/innobase/include/sql_funcs.h
@@ -0,0 +1,92 @@
+/*****************************************************************************
+
+Copyright (c) 2022, MariaDB Corporation.
+
+This program is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free Software
+Foundation; version 2 of the License.
+
+This program is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA
+
+*****************************************************************************/
+
+/**
+ @file include/sql_funcs.h
+
+ SQL procedures for InnoDB system tables operation
+*/
+
+/**
+ Rename foreign keys for rename table
+
+ @see row_rename_table_for_mysql()
+*/
+constexpr const char *rename_constraint_ids=
+R"===(PROCEDURE RENAME_CONSTRAINT_IDS () IS
+ gen_constr_prefix CHAR;
+ new_db_name CHAR;
+ foreign_id CHAR;
+ new_foreign_id CHAR;
+ old_db_name_len INT;
+ old_t_name_len INT;
+ new_db_name_len INT;
+ id_len INT;
+ offset INT;
+ found INT;
+ BEGIN
+ found := 1;
+ old_db_name_len := INSTR(:old_table_name, '/') - 1;
+ new_db_name_len := INSTR(:new_table_name, '/') - 1;
+ new_db_name := SUBSTR(:new_table_name, 0,
+ new_db_name_len);
+ old_t_name_len := LENGTH(:old_table_name);
+ gen_constr_prefix := CONCAT(:old_table_name_utf8,
+ '_ibfk_');
+ WHILE found = 1 LOOP
+ SELECT ID INTO foreign_id
+ FROM SYS_FOREIGN
+ WHERE FOR_NAME = :old_table_name
+ AND TO_BINARY(FOR_NAME)
+ = TO_BINARY(:old_table_name)
+ LOCK IN SHARE MODE;
+ IF (SQL % NOTFOUND) THEN
+ found := 0;
+ ELSE
+ UPDATE SYS_FOREIGN
+ SET FOR_NAME = :new_table_name
+ WHERE ID = foreign_id;
+ id_len := LENGTH(foreign_id);
+ IF (INSTR(foreign_id, '/') > 0) THEN
+ IF (INSTR(foreign_id,
+ gen_constr_prefix) > 0)
+ THEN
+ offset := INSTR(foreign_id, '_ibfk_') - 1;
+ new_foreign_id :=
+ CONCAT(:new_table_utf8,
+ SUBSTR(foreign_id, offset, id_len - offset));
+ ELSE
+ new_foreign_id :=
+ CONCAT(new_db_name,
+ SUBSTR(foreign_id, old_db_name_len,
+ id_len - old_db_name_len));
+ END IF;
+ UPDATE SYS_FOREIGN
+ SET ID = new_foreign_id
+ WHERE ID = foreign_id;
+ UPDATE SYS_FOREIGN_COLS
+ SET ID = new_foreign_id
+ WHERE ID = foreign_id;
+ END IF;
+ END IF;
+ END LOOP;
+ UPDATE SYS_FOREIGN SET REF_NAME = :new_table_name
+ WHERE REF_NAME = :old_table_name
+ AND TO_BINARY(REF_NAME)
+ = TO_BINARY(:old_table_name);
+END;)===";
diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc
index 5058469cd2a..5cc86dac24a 100644
--- a/storage/innobase/row/row0mysql.cc
+++ b/storage/innobase/row/row0mysql.cc
@@ -66,6 +66,8 @@ Created 9/17/2000 Heikki Tuuri
#include <thread>
+#include "sql_funcs.h"
+
/*******************************************************************//**
Delays an INSERT, DELETE or UPDATE operation if the purge is lagging. */
static
@@ -2708,72 +2710,7 @@ row_rename_table_for_mysql(
pars_info_add_str_literal(info, "new_table_utf8", new_table_name);
- err = que_eval_sql(
- info,
- "PROCEDURE RENAME_CONSTRAINT_IDS () IS\n"
- "gen_constr_prefix CHAR;\n"
- "new_db_name CHAR;\n"
- "foreign_id CHAR;\n"
- "new_foreign_id CHAR;\n"
- "old_db_name_len INT;\n"
- "old_t_name_len INT;\n"
- "new_db_name_len INT;\n"
- "id_len INT;\n"
- "offset INT;\n"
- "found INT;\n"
- "BEGIN\n"
- "found := 1;\n"
- "old_db_name_len := INSTR(:old_table_name, '/')-1;\n"
- "new_db_name_len := INSTR(:new_table_name, '/')-1;\n"
- "new_db_name := SUBSTR(:new_table_name, 0,\n"
- " new_db_name_len);\n"
- "old_t_name_len := LENGTH(:old_table_name);\n"
- "gen_constr_prefix := CONCAT(:old_table_name_utf8,\n"
- " '_ibfk_');\n"
- "WHILE found = 1 LOOP\n"
- " SELECT ID INTO foreign_id\n"
- " FROM SYS_FOREIGN\n"
- " WHERE FOR_NAME = :old_table_name\n"
- " AND TO_BINARY(FOR_NAME)\n"
- " = TO_BINARY(:old_table_name)\n"
- " LOCK IN SHARE MODE;\n"
- " IF (SQL % NOTFOUND) THEN\n"
- " found := 0;\n"
- " ELSE\n"
- " UPDATE SYS_FOREIGN\n"
- " SET FOR_NAME = :new_table_name\n"
- " WHERE ID = foreign_id;\n"
- " id_len := LENGTH(foreign_id);\n"
- " IF (INSTR(foreign_id, '/') > 0) THEN\n"
- " IF (INSTR(foreign_id,\n"
- " gen_constr_prefix) > 0)\n"
- " THEN\n"
- " offset := INSTR(foreign_id, '_ibfk_') - 1;\n"
- " new_foreign_id :=\n"
- " CONCAT(:new_table_utf8,\n"
- " SUBSTR(foreign_id, offset,\n"
- " id_len - offset));\n"
- " ELSE\n"
- " new_foreign_id :=\n"
- " CONCAT(new_db_name,\n"
- " SUBSTR(foreign_id,\n"
- " old_db_name_len,\n"
- " id_len - old_db_name_len));\n"
- " END IF;\n"
- " UPDATE SYS_FOREIGN\n"
- " SET ID = new_foreign_id\n"
- " WHERE ID = foreign_id;\n"
- " UPDATE SYS_FOREIGN_COLS\n"
- " SET ID = new_foreign_id\n"
- " WHERE ID = foreign_id;\n"
- " END IF;\n"
- " END IF;\n"
- "END LOOP;\n"
- "UPDATE SYS_FOREIGN SET REF_NAME = :new_table_name\n"
- "WHERE REF_NAME = :old_table_name\n"
- " AND TO_BINARY(REF_NAME)\n"
- " = TO_BINARY(:old_table_name);\n"
- "END;\n", trx);
+ err = que_eval_sql(info, rename_constraint_ids, trx);
} else if (n_constraints_to_drop > 0) {
/* Drop some constraints of tmp tables. */