mirror of
https://github.com/MariaDB/server.git
synced 2025-01-27 01:04:19 +01:00
fd0cc2b1fd
Update `SESSION_USER()` behaviour to be comparable with `CURRENT_USER()`. `SESSION_USER()` will return the user and host columns from `mysql.user` used to authenticate the user when the session was created. Historically `SESSION_USER()` was an alias of `USER()` function. The main difference with `USER()` behaviour after this changes is that `SESSION_USER()` now returns the host column from `mysql.user` instead of the client host or ip. NOTE: `SESSION_USER_IS_USER` old mode is added to make the change backward compatible. All new code of the whole pull request, including one or several files that are either new files or modified ones, are contributed under the BSD-new license. I am contributing on behalf of my employer Amazon Web Services, Inc.
56 lines
2.9 KiB
Text
56 lines
2.9 KiB
Text
# Create a stored procedure which calls the different functions to retrieve the user
|
|
CREATE FUNCTION test.func_session_user() RETURNS CHAR(80) SQL SECURITY DEFINER RETURN CONCAT(USER(), '; ', CURRENT_USER(), '; ', SESSION_USER());
|
|
# Create a view which calls the different functions to retrieve the user
|
|
CREATE SQL SECURITY DEFINER VIEW test.view_session_user AS SELECT USER(), CURRENT_USER(), SESSION_USER();
|
|
# Create test_user
|
|
CREATE USER 'test_user'@'%';
|
|
GRANT EXECUTE, CREATE, DROP, SELECT ON test.* TO 'test_user'@'%';
|
|
# Connect as test_user
|
|
connect test_user_con,localhost,test_user,,;
|
|
# Check the function called directly
|
|
SELECT USER(), CURRENT_USER(), SESSION_USER();
|
|
USER() CURRENT_USER() SESSION_USER()
|
|
test_user@localhost test_user@% test_user@%
|
|
# Check the function inside of a stored procedure
|
|
SELECT test.func_session_user();
|
|
test.func_session_user()
|
|
test_user@localhost; root@localhost; test_user@%
|
|
# Check the function inside of a view
|
|
SELECT * FROM test.view_session_user;
|
|
USER() CURRENT_USER() SESSION_USER()
|
|
test_user@localhost root@localhost test_user@%
|
|
# Check SESSION_USER is allowed in virtual columns
|
|
CREATE OR REPLACE TABLE t1 (a int, b varchar(100) GENERATED ALWAYS AS (SESSION_USER()));
|
|
# Check SESSION_USER is not allowed for indexed virtual columns
|
|
CREATE OR REPLACE TABLE t1 (a int, b varchar(100) GENERATED ALWAYS AS (SESSION_USER()), INDEX idx (b));
|
|
ERROR HY000: Function or expression 'session_user()' cannot be used in the GENERATED ALWAYS AS clause of `b`
|
|
# Check SESSION_USER is not allowed in virtual columns when CHECK constrains are provided
|
|
CREATE OR REPLACE TABLE t1 (a int, b varchar(100) GENERATED ALWAYS AS (SESSION_USER()) CHECK (b <> ''));
|
|
ERROR HY000: Function or expression 'b' cannot be used in the CHECK clause of `b`
|
|
# Check SESSION_USER is not allowed for stored virtual columns
|
|
CREATE OR REPLACE TABLE t1 (a int, b varchar(100) GENERATED ALWAYS AS (SESSION_USER()) STORED);
|
|
ERROR HY000: Function or expression 'session_user()' cannot be used in the GENERATED ALWAYS AS clause of `b`
|
|
# Check SESSION_USER is allowed as default
|
|
CREATE OR REPLACE TABLE t1 (a int, b varchar(100) DEFAULT (SESSION_USER()));
|
|
# Test old mode SESSION_USER_IS_USER behaves properly
|
|
SELECT @@OLD_MODE, @@GLOBAL.OLD_MODE;
|
|
@@OLD_MODE @@GLOBAL.OLD_MODE
|
|
UTF8_IS_UTF8MB3 UTF8_IS_UTF8MB3
|
|
SELECT USER(), SESSION_USER();
|
|
USER() SESSION_USER()
|
|
test_user@localhost test_user@%
|
|
SET @@OLD_MODE = CONCAT(@@OLD_MODE, ',SESSION_USER_IS_USER');
|
|
Warnings:
|
|
Warning 1287 'SESSION_USER_IS_USER' is deprecated and will be removed in a future release
|
|
SELECT @@OLD_MODE, @@GLOBAL.OLD_MODE;
|
|
@@OLD_MODE @@GLOBAL.OLD_MODE
|
|
UTF8_IS_UTF8MB3,SESSION_USER_IS_USER UTF8_IS_UTF8MB3
|
|
SELECT USER(), SESSION_USER();
|
|
USER() SESSION_USER()
|
|
test_user@localhost test_user@localhost
|
|
# Cleanup
|
|
connection default;
|
|
DROP USER 'test_user'@'%';
|
|
DROP FUNCTION test.func_session_user;
|
|
DROP VIEW test.view_session_user;
|
|
DROP TABLE test.t1;
|