diff --git a/contrib/babelfishpg_tsql/sql/babelfishpg_tsql.sql b/contrib/babelfishpg_tsql/sql/babelfishpg_tsql.sql index 4a2617e7a4..fa07aee525 100644 --- a/contrib/babelfishpg_tsql/sql/babelfishpg_tsql.sql +++ b/contrib/babelfishpg_tsql/sql/babelfishpg_tsql.sql @@ -2190,6 +2190,9 @@ BEGIN ELSIF role = 'public' COLLATE sys.database_default THEN RETURN 1; + + ELSEIF role = login THEN + RETURN 0; ELSIF role COLLATE sys.database_default IN ('sysadmin', 'securityadmin', 'dbcreator') THEN has_role = (pg_has_role(login::TEXT, role::TEXT, 'MEMBER') diff --git a/contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--4.4.0--5.0.0.sql b/contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--4.4.0--5.0.0.sql index d2db5a4bf0..141fbf0a43 100644 --- a/contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--4.4.0--5.0.0.sql +++ b/contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--4.4.0--5.0.0.sql @@ -382,6 +382,7 @@ FROM pg_catalog.pg_roles AS Base INNER JOIN sys.babelfish_authid_login_ext AS Ex WHERE Ext.type = 'R' AND bbf_is_member_of_role_nosuper(sys.suser_id(), Base.oid); GRANT SELECT ON sys.login_token TO PUBLIC; + CREATE OR REPLACE FUNCTION is_srvrolemember(role sys.SYSNAME, login sys.SYSNAME DEFAULT suser_name()) RETURNS INTEGER AS $$ @@ -402,6 +403,9 @@ BEGIN ELSIF role = 'public' COLLATE sys.database_default THEN RETURN 1; + + ELSEIF role = login THEN + RETURN 0; ELSIF role COLLATE sys.database_default IN ('sysadmin', 'securityadmin', 'dbcreator') THEN has_role = (pg_has_role(login::TEXT, role::TEXT, 'MEMBER') diff --git a/test/JDBC/expected/dbcreator_role-vu-verify.out b/test/JDBC/expected/dbcreator_role-vu-verify.out index cd3efe781a..d944bad23e 100644 --- a/test/JDBC/expected/dbcreator_role-vu-verify.out +++ b/test/JDBC/expected/dbcreator_role-vu-verify.out @@ -32,6 +32,31 @@ int ~~END~~ +select is_srvrolemember('dbcreator','dbcreator') +go +~~START~~ +int +0 +~~END~~ + + +select is_srvrolemember('sysadmin','sysadmin') +go +~~START~~ +int +0 +~~END~~ + + +-- should return NULL for invalid login +select is_srvrolemember('l1', 'l1') +go +~~START~~ +int + +~~END~~ + + alter login dbcreator_login1 with password='123' go diff --git a/test/JDBC/expected/securityadmin_role-vu-verify.out b/test/JDBC/expected/securityadmin_role-vu-verify.out index ccabd5967a..97c6c10cc1 100644 --- a/test/JDBC/expected/securityadmin_role-vu-verify.out +++ b/test/JDBC/expected/securityadmin_role-vu-verify.out @@ -15,6 +15,14 @@ int ~~END~~ +select is_srvrolemember('securityadmin','securityadmin') +go +~~START~~ +int +0 +~~END~~ + + alter login securityadmin_login1 with password='123' go diff --git a/test/JDBC/expected/single_db/dbcreator_role-vu-verify.out b/test/JDBC/expected/single_db/dbcreator_role-vu-verify.out index 00b27faa19..08c4198868 100644 --- a/test/JDBC/expected/single_db/dbcreator_role-vu-verify.out +++ b/test/JDBC/expected/single_db/dbcreator_role-vu-verify.out @@ -32,6 +32,31 @@ int ~~END~~ +select is_srvrolemember('dbcreator','dbcreator') +go +~~START~~ +int +0 +~~END~~ + + +select is_srvrolemember('sysadmin','sysadmin') +go +~~START~~ +int +0 +~~END~~ + + +-- should return NULL for invalid login +select is_srvrolemember('l1', 'l1') +go +~~START~~ +int + +~~END~~ + + alter login dbcreator_login1 with password='123' go diff --git a/test/JDBC/input/dbcreator_role-vu-verify.mix b/test/JDBC/input/dbcreator_role-vu-verify.mix index bc22a67466..f5dd59a7b5 100644 --- a/test/JDBC/input/dbcreator_role-vu-verify.mix +++ b/test/JDBC/input/dbcreator_role-vu-verify.mix @@ -13,6 +13,16 @@ go select is_srvrolemember('dbcreator', 'securityadmin') go +select is_srvrolemember('dbcreator','dbcreator') +go + +select is_srvrolemember('sysadmin','sysadmin') +go + +-- should return NULL for invalid login +select is_srvrolemember('l1', 'l1') +go + alter login dbcreator_login1 with password='123' go diff --git a/test/JDBC/input/securityadmin_role-vu-verify.mix b/test/JDBC/input/securityadmin_role-vu-verify.mix index e764c9e726..60c56562b8 100644 --- a/test/JDBC/input/securityadmin_role-vu-verify.mix +++ b/test/JDBC/input/securityadmin_role-vu-verify.mix @@ -5,6 +5,9 @@ go select is_srvrolemember('securityadmin', 'sysadmin') go +select is_srvrolemember('securityadmin','securityadmin') +go + alter login securityadmin_login1 with password='123' go