summaryrefslogtreecommitdiffstats
path: root/scripts/sys_schema/functions/format_path.sql
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 18:00:34 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 18:00:34 +0000
commit3f619478f796eddbba6e39502fe941b285dd97b1 (patch)
treee2c7b5777f728320e5b5542b6213fd3591ba51e2 /scripts/sys_schema/functions/format_path.sql
parentInitial commit. (diff)
downloadmariadb-3f619478f796eddbba6e39502fe941b285dd97b1.tar.xz
mariadb-3f619478f796eddbba6e39502fe941b285dd97b1.zip
Adding upstream version 1:10.11.6.upstream/1%10.11.6upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'scripts/sys_schema/functions/format_path.sql')
-rw-r--r--scripts/sys_schema/functions/format_path.sql111
1 files changed, 111 insertions, 0 deletions
diff --git a/scripts/sys_schema/functions/format_path.sql b/scripts/sys_schema/functions/format_path.sql
new file mode 100644
index 00000000..426bfb1d
--- /dev/null
+++ b/scripts/sys_schema/functions/format_path.sql
@@ -0,0 +1,111 @@
+-- Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
+--
+-- 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+
+DROP FUNCTION IF EXISTS format_path;
+
+DELIMITER $$
+
+CREATE DEFINER='mariadb.sys'@'localhost' FUNCTION format_path (
+ in_path VARCHAR(512)
+ )
+ RETURNS VARCHAR(512) CHARSET UTF8
+ COMMENT '
+ Description
+ -----------
+
+ Takes a raw path value, and strips out the datadir or tmpdir
+ replacing with @@datadir and @@tmpdir respectively.
+
+ Also normalizes the paths across operating systems, so backslashes
+ on Windows are converted to forward slashes
+
+ Parameters
+ -----------
+
+ path (VARCHAR(512)):
+ The raw file path value to format.
+
+ Returns
+ -----------
+
+ VARCHAR(512) CHARSET UTF8
+
+ Example
+ -----------
+
+ mysql> select @@datadir;
+ +-----------------------------------------------+
+ | @@datadir |
+ +-----------------------------------------------+
+ | /Users/mark/sandboxes/SmallTree/AMaster/data/ |
+ +-----------------------------------------------+
+ 1 row in set (0.06 sec)
+
+ mysql> select format_path(\'/Users/mark/sandboxes/SmallTree/AMaster/data/mysql/proc.MYD\') AS path;
+ +--------------------------+
+ | path |
+ +--------------------------+
+ | @@datadir/mysql/proc.MYD |
+ +--------------------------+
+ 1 row in set (0.03 sec)
+ '
+ SQL SECURITY INVOKER
+ DETERMINISTIC
+ NO SQL
+BEGIN
+ DECLARE v_path VARCHAR(512);
+ DECLARE v_undo_dir VARCHAR(1024);
+ DECLARE v_innodb_data_home_dir VARCHAR(1024);
+ DECLARE v_innodb_log_group_home_dir VARCHAR(1024);
+
+ DECLARE path_separator CHAR(1) DEFAULT '/';
+
+ IF @@global.version_compile_os LIKE 'win%' THEN
+ SET path_separator = '\\';
+ END IF;
+
+ -- OSX hides /private/ in variables, but Performance Schema does not
+ IF in_path LIKE '/private/%' THEN
+ SET v_path = REPLACE(in_path, '/private', '');
+ ELSE
+ SET v_path = in_path;
+ END IF;
+
+ -- @@global.innodb_undo_directory is only set when separate undo logs are used
+ SET v_undo_dir = IFNULL((SELECT VARIABLE_VALUE FROM information_schema.global_variables WHERE VARIABLE_NAME = 'innodb_undo_directory'), '');
+ SET v_innodb_data_home_dir= IFNULL((SELECT VARIABLE_VALUE FROM information_schema.global_variables WHERE VARIABLE_NAME = 'innodb_data_home_dir'), '');
+ SET v_innodb_log_group_home_dir= IFNULL((SELECT VARIABLE_VALUE FROM information_schema.global_variables WHERE VARIABLE_NAME = 'innodb_log_group_home_dir'), '');
+ IF v_path IS NULL THEN
+ RETURN NULL;
+ ELSEIF v_path LIKE CONCAT(@@global.datadir, IF(SUBSTRING(@@global.datadir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN
+ SET v_path = REPLACE(v_path, @@global.datadir, CONCAT('@@datadir', IF(SUBSTRING(@@global.datadir, -1) = path_separator, path_separator, '')));
+ ELSEIF v_path LIKE CONCAT(@@global.tmpdir, IF(SUBSTRING(@@global.tmpdir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN
+ SET v_path = REPLACE(v_path, @@global.tmpdir, CONCAT('@@tmpdir', IF(SUBSTRING(@@global.tmpdir, -1) = path_separator, path_separator, '')));
+# ELSEIF v_path LIKE CONCAT(@@global.slave_load_tmpdir, IF(SUBSTRING(@@global.slave_load_tmpdir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN
+# SET v_path = REPLACE(v_path, @@global.slave_load_tmpdir, CONCAT('@@slave_load_tmpdir', IF(SUBSTRING(@@global.slave_load_tmpdir, -1) = path_separator, path_separator, '')));
+ ELSEIF v_path LIKE CONCAT(v_innodb_data_home_dir, IF(SUBSTRING(v_innodb_data_home_dir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN
+ SET v_path = REPLACE(v_path, v_innodb_data_home_dir, CONCAT('@@innodb_data_home_dir', IF(SUBSTRING(v_innodb_data_home_dir, -1) = path_separator, path_separator, '')));
+ ELSEIF v_path LIKE CONCAT(v_innodb_log_group_home_dir, IF(SUBSTRING(v_innodb_log_group_home_dir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN
+ SET v_path = REPLACE(v_path, v_innodb_log_group_home_dir, CONCAT('@@innodb_log_group_home_dir', IF(SUBSTRING(v_innodb_log_group_home_dir, -1) = path_separator, path_separator, '')));
+ ELSEIF v_path LIKE CONCAT(v_undo_dir, IF(SUBSTRING(v_undo_dir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN
+ SET v_path = REPLACE(v_path, v_undo_dir, CONCAT('@@innodb_undo_directory', IF(SUBSTRING(v_undo_dir, -1) = path_separator, path_separator, '')));
+ ELSEIF v_path LIKE CONCAT(@@global.basedir, IF(SUBSTRING(@@global.basedir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN
+ SET v_path = REPLACE(v_path, @@global.basedir, CONCAT('@@basedir', IF(SUBSTRING(@@global.basedir, -1) = path_separator, path_separator, '')));
+ END IF;
+
+ RETURN v_path;
+END$$
+
+DELIMITER ; \ No newline at end of file