Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/BABEL_5_X_DEV' into babel_5454_5x
Browse files Browse the repository at this point in the history
  • Loading branch information
Tanya Gupta committed Feb 27, 2025
2 parents 0f8c245 + 46630f2 commit 3cf9991
Show file tree
Hide file tree
Showing 110 changed files with 6,661 additions and 722 deletions.
2 changes: 1 addition & 1 deletion .github/scripts/scan-warnings.sh
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ if [[ "$SNAPSHOT_ACTIVE_COUNT" -ne 44 ]]; then
ERROR_FOUND=true
fi

if [[ "$LEAK_COUNT" -ne 324 ]]; then
if [[ "$LEAK_COUNT" -ne 350 ]]; then
echo "Error: Expected 324 leak warnings, but found $LEAK_COUNT"
ERROR_FOUND=true
fi
Expand Down
11 changes: 11 additions & 0 deletions contrib/babelfishpg_tds/src/backend/tds/tdsrpc.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@
*/
#define INT32_STRLEN 12

#define VARCHAR_MAX_LEN 0x1F40 /* 8000 */

/* For checking the invalid length parameters */
#define CheckForInvalidLength(temp) \
do \
Expand Down Expand Up @@ -1182,6 +1184,15 @@ GetSetColMetadataForCharType(ParameterToken temp, StringInfo message, uint8_t td
return STATUS_ERROR;

memcpy(&tempLen, &message->data[offset], sizeof(tempLen));

/*
* Technically maxLen can be 0 but since typmod of
* 0 is not supported in PG, we will translate it
* to max supported typmod of char based datatypes.
*/
if (tempLen == 0)
tempLen = VARCHAR_MAX_LEN;

temp->maxLen = tempLen;
offset += sizeof(tempLen);
memcpy(&collation, &message->data[offset], sizeof(collation));
Expand Down
43 changes: 35 additions & 8 deletions contrib/babelfishpg_tds/src/backend/tds/tdsutils.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include "access/genam.h"
#include "access/htup_details.h"
#include "access/table.h"
#include "catalog/pg_auth_members.h"
#include "catalog/pg_authid.h"
#include "catalog/pg_db_role_setting.h"
#include "catalog/pg_database.h"
Expand All @@ -35,6 +36,7 @@
#include "utils/syscache.h"
#include "miscadmin.h"
#include "utils/builtins.h"
#include "utils/catcache.h"

static int FindMatchingParam(List *params, const char *name);
static Node *TransformParamRef(ParseState *pstate, ParamRef *pref);
Expand Down Expand Up @@ -937,8 +939,11 @@ check_babelfish_droprole_restrictions(char *role)
* This function check the underlying assumption on the membership chain instead
* sysadmin <-- dbo* <--- db_owner* <--- users/roles
*
* A Babelfish login is a member of babelfish created user/role i.e., dbo, guest or user created user.
*
* actual dbo and db_owner name varies across different babelfish logical databases
*/

static bool
is_babelfish_role(const char *role)
{
Expand All @@ -949,13 +954,16 @@ is_babelfish_role(const char *role)
Oid bbf_msdb_guest_oid;
Oid securityadmin;
Oid dbcreator;
CatCList *memlist;
int i;
bool is_babelfish_login = false;

sysadmin_oid = get_role_oid(BABELFISH_SYSADMIN, true); /* missing OK */
role_oid = get_role_oid(role, true); /* missing OK */
securityadmin = get_role_oid(BABELFISH_SECURITYADMIN, true); /* missing OK */
dbcreator = get_role_oid(BABELFISH_DBCREATOR, true); /* missing OK */

if (!OidIsValid(sysadmin_oid) || !OidIsValid(role_oid)
if (!OidIsValid(sysadmin_oid) || !OidIsValid(role_oid)
|| !OidIsValid(securityadmin) || !OidIsValid(dbcreator))
return false;

Expand All @@ -965,18 +973,37 @@ is_babelfish_role(const char *role)
pg_strcasecmp(role, BABELFISH_ROLE_ADMIN) == 0) /* check if it is bbf_role_admin */
return true;

/* Most of the Babelfish logins would be a member of one of these guest roles.*/
bbf_master_guest_oid = get_role_oid("master_guest", true);
bbf_tempdb_guest_oid = get_role_oid("tempdb_guest", true);
bbf_msdb_guest_oid = get_role_oid("msdb_guest", true);
if (OidIsValid(bbf_master_guest_oid)
&& OidIsValid(bbf_tempdb_guest_oid)
&& OidIsValid(bbf_msdb_guest_oid)
&& (is_member_of_role(role_oid, bbf_master_guest_oid)
|| is_member_of_role(role_oid, bbf_tempdb_guest_oid)
|| is_member_of_role(role_oid, bbf_msdb_guest_oid)))
if ((OidIsValid(bbf_master_guest_oid) && is_member_of_role(role_oid, bbf_master_guest_oid))
|| (OidIsValid(bbf_tempdb_guest_oid) && is_member_of_role(role_oid, bbf_tempdb_guest_oid))
|| (OidIsValid(bbf_msdb_guest_oid) && is_member_of_role(role_oid, bbf_msdb_guest_oid)))
return true;

return false;
/* Check if it's a Babelfish login, if it's not a member of any guest role.*/
memlist = SearchSysCacheList1(AUTHMEMMEMROLE,
ObjectIdGetDatum(role_oid));
for (i = 0; i < memlist->n_members; i++)
{
HeapTuple tup = &memlist->members[i]->tuple;
Form_pg_auth_members form = (Form_pg_auth_members) GETSTRUCT(tup);
Oid parent_role_oid = form->roleid;
const char *parent_role_name = GetUserNameFromId(parent_role_oid, false);

/* Check if the parent role is a Babelfish role */
if (is_member_of_role(sysadmin_oid, parent_role_oid) ||
is_member_of_role(securityadmin, parent_role_oid) ||
is_member_of_role(dbcreator, parent_role_oid) ||
pg_strcasecmp(parent_role_name, BABELFISH_ROLE_ADMIN) == 0)
{
is_babelfish_login = true;
break;
}
}
ReleaseSysCacheList(memlist);
return is_babelfish_login;
}

/*
Expand Down
10 changes: 10 additions & 0 deletions contrib/babelfishpg_tsql/runtime/functions.c
Original file line number Diff line number Diff line change
Expand Up @@ -2137,6 +2137,7 @@ object_id(PG_FUNCTION_ARGS)
Oid user_id = GetUserId();
Oid result = InvalidOid;
bool is_temp_object;
bool search_in_sys_for_sp_procs;
int i;

if (PG_ARGISNULL(0))
Expand Down Expand Up @@ -2244,6 +2245,9 @@ object_id(PG_FUNCTION_ARGS)
* user don't have lookup access
*/
schema_oid = get_namespace_oid(physical_schema_name, true);
/* search in sys when proc name is sp_ prefixed and schema name is empty or dbo */
search_in_sys_for_sp_procs = (OidIsValid(sys_schema_oid) && strncmp(object_name, "sp_", 3) == 0 &&
(strcmp(schema_name, "dbo") == 0 || strlen(schema_name) == 0));

/* free unnecessary pointers */
pfree(db_name);
Expand Down Expand Up @@ -2328,6 +2332,9 @@ object_id(PG_FUNCTION_ARGS)

/* search in pg_proc by name and schema oid */
result = tsql_get_proc_oid(object_name, schema_oid, user_id);

if (!OidIsValid(result) && search_in_sys_for_sp_procs)
result = tsql_get_proc_oid(object_name, sys_schema_oid, user_id);
}
else if (!strcmp(object_type, "tr") || !strcmp(object_type, "ta"))
{
Expand Down Expand Up @@ -2384,6 +2391,9 @@ object_id(PG_FUNCTION_ARGS)
{
/* search in pg_proc by name and schema oid */
result = tsql_get_proc_oid(object_name, schema_oid, user_id);

if (!OidIsValid(result) && search_in_sys_for_sp_procs)
result = tsql_get_proc_oid(object_name, sys_schema_oid, user_id);
}

if (!OidIsValid(result))
Expand Down
48 changes: 0 additions & 48 deletions contrib/babelfishpg_tsql/sql/ownership.sql
Original file line number Diff line number Diff line change
Expand Up @@ -178,54 +178,6 @@ BEGIN
GRANT SELECT ON msdb_dbo.syspolicy_configuration TO PUBLIC;
ALTER VIEW msdb_dbo.syspolicy_configuration OWNER TO sysadmin;

CREATE OR REPLACE PROCEDURE master_dbo.sp_addlinkedserver( IN "@server" sys.sysname,
IN "@srvproduct" sys.nvarchar(128) DEFAULT NULL,
IN "@provider" sys.nvarchar(128) DEFAULT 'SQLNCLI',
IN "@datasrc" sys.nvarchar(4000) DEFAULT NULL,
IN "@location" sys.nvarchar(4000) DEFAULT NULL,
IN "@provstr" sys.nvarchar(4000) DEFAULT NULL,
IN "@catalog" sys.sysname DEFAULT NULL)
AS 'babelfishpg_tsql', 'sp_addlinkedserver_internal'
LANGUAGE C;

ALTER PROCEDURE master_dbo.sp_addlinkedserver OWNER TO sysadmin;

CREATE OR REPLACE PROCEDURE master_dbo.sp_addlinkedsrvlogin( IN "@rmtsrvname" sys.sysname,
IN "@useself" sys.varchar(8) DEFAULT 'TRUE',
IN "@locallogin" sys.sysname DEFAULT NULL,
IN "@rmtuser" sys.sysname DEFAULT NULL,
IN "@rmtpassword" sys.sysname DEFAULT NULL)
AS 'babelfishpg_tsql', 'sp_addlinkedsrvlogin_internal'
LANGUAGE C;

ALTER PROCEDURE master_dbo.sp_addlinkedsrvlogin OWNER TO sysadmin;

CREATE OR REPLACE PROCEDURE master_dbo.sp_droplinkedsrvlogin( IN "@rmtsrvname" sys.sysname,
IN "@locallogin" sys.sysname)
AS 'babelfishpg_tsql', 'sp_droplinkedsrvlogin_internal'
LANGUAGE C;

ALTER PROCEDURE master_dbo.sp_droplinkedsrvlogin OWNER TO sysadmin;

CREATE OR REPLACE PROCEDURE master_dbo.sp_dropserver( IN "@server" sys.sysname,
IN "@droplogins" sys.bpchar(10) DEFAULT NULL)
AS 'babelfishpg_tsql', 'sp_dropserver_internal'
LANGUAGE C;

ALTER PROCEDURE master_dbo.sp_dropserver OWNER TO sysadmin;

CREATE OR REPLACE PROCEDURE master_dbo.sp_testlinkedserver( IN "@servername" sys.sysname)
AS 'babelfishpg_tsql', 'sp_testlinkedserver_internal'
LANGUAGE C;

ALTER PROCEDURE master_dbo.sp_testlinkedserver OWNER TO sysadmin;

CREATE OR REPLACE PROCEDURE master_dbo.sp_enum_oledb_providers()
AS 'babelfishpg_tsql', 'sp_enum_oledb_providers_internal'
LANGUAGE C;

ALTER PROCEDURE master_dbo.sp_enum_oledb_providers OWNER TO sysadmin;

-- let sysadmin only to update babelfish_domain_mapping
GRANT ALL ON TABLE sys.babelfish_domain_mapping TO sysadmin;
END
Expand Down
22 changes: 20 additions & 2 deletions contrib/babelfishpg_tsql/sql/sys_functions.sql
Original file line number Diff line number Diff line change
Expand Up @@ -2395,15 +2395,15 @@ LANGUAGE C PARALLEL SAFE IMMUTABLE;

CREATE OR REPLACE FUNCTION sys.db_id() RETURNS SMALLINT
AS 'babelfishpg_tsql', 'babelfish_db_id'
LANGUAGE C PARALLEL SAFE IMMUTABLE;
LANGUAGE C PARALLEL SAFE STABLE;

CREATE OR REPLACE FUNCTION sys.db_name(int) RETURNS sys.nvarchar(128)
AS 'babelfishpg_tsql', 'babelfish_db_name'
LANGUAGE C PARALLEL SAFE IMMUTABLE;

CREATE OR REPLACE FUNCTION sys.db_name() RETURNS sys.nvarchar(128)
AS 'babelfishpg_tsql', 'babelfish_db_name'
LANGUAGE C PARALLEL SAFE IMMUTABLE;
LANGUAGE C PARALLEL SAFE STABLE;

CREATE OR REPLACE FUNCTION sys.exp(IN arg DOUBLE PRECISION)
RETURNS DOUBLE PRECISION
Expand Down Expand Up @@ -4126,6 +4126,24 @@ END
$BODY$
LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE STRICT;

CREATE OR REPLACE FUNCTION sys.loginproperty(login_name sys.sysname, property_name sys.nvarchar(128))
RETURNS sys.nvarchar(128)
AS $$
DECLARE
BEGIN
RETURN NULL;
END;
$$ LANGUAGE plpgsql STABLE;

CREATE OR REPLACE FUNCTION sys.fn_varbintohexsubstring(set_prefix INT, expression sys.varbinary(128), start_offset INT, length_to_return INT)
RETURNS sys.nvarchar(128)
AS $$
DECLARE
BEGIN
RETURN NULL;
END;
$$ LANGUAGE plpgsql STABLE;

CREATE OR REPLACE FUNCTION objectproperty(
id INT,
property SYS.VARCHAR
Expand Down
50 changes: 50 additions & 0 deletions contrib/babelfishpg_tsql/sql/sys_views.sql
Original file line number Diff line number Diff line change
Expand Up @@ -3299,6 +3299,56 @@ JOIN pg_trigger pt ON pt.tgrelid = pc.oid AND tr.trigger_name = pt.tgname COLLAT
AND has_table_privilege(pc.oid, 'SELECT,INSERT,UPDATE,DELETE,TRUNCATE,TRIGGER');
GRANT SELECT ON sys.events TO PUBLIC;

CREATE OR REPLACE VIEW sys.server_permissions
AS
SELECT
CAST(0 as sys.tinyint) AS class,
CAST(NULL as sys.nvarchar(60)) AS class_desc,
CAST(NULL as INT) AS major_id,
CAST(NULL as INT) AS minor_id,
CAST(NULL as INT) AS grantee_principal_id,
CAST(NULL as INT) AS grantor_principal_id,
CAST(NULL as sys.BPCHAR(4)) AS type,
CAST(NULL as sys.nvarchar(128)) AS permission_name,
CAST(NULL as sys.BPCHAR(1)) AS state,
CAST(NULL as sys.nvarchar(60)) AS state_desc
WHERE FALSE;
GRANT SELECT ON sys.server_permissions TO PUBLIC;

CREATE OR REPLACE VIEW sys.credentials
AS
SELECT
CAST(NULL as INT) AS credential_id,
CAST(NULL as sys.sysname) AS name,
CAST(NULL as sys.nvarchar(4000)) AS credential_identity,
CAST(NULL as sys.datetime) AS create_date,
CAST(NULL as sys.datetime) AS modify_date,
CAST(NULL as sys.nvarchar(100)) AS target_type,
CAST(NULL as INT) AS target_id
WHERE FALSE;
GRANT SELECT ON sys.credentials TO PUBLIC;

CREATE VIEW sys.sql_logins AS
SELECT
CAST(NULL as sys.sysname) AS name,
CAST(NULL as INT) AS principal_id,
CAST(NULL as sys.VARBINARY(85)) AS sid,
CAST(NULL as sys.BPCHAR(1)) AS type,
CAST(NULL as sys.nvarchar(60)) AS type_desc,
CAST(NULL as INT) AS is_disabled,
CAST(NULL as sys.DATETIME) AS create_date,
CAST(NULL as sys.DATETIME) AS modify_date,
CAST(NULL as sys.sysname) AS default_database_name,
CAST(NULL as sys.sysname) AS default_language_name,
CAST(NULL as INT) AS credential_id,
CAST(NULL as INT) AS owning_principal_id,
CAST(0 as sys.BIT) AS is_fixed_role,
CAST(0 as sys.BIT) AS is_policy_checked,
CAST(0 as sys.BIT) AS is_expiration_checked,
CAST(NULL as sys.varbinary(256)) AS password_hash
WHERE FALSE;
GRANT SELECT ON sys.sql_logins TO PUBLIC;

CREATE OR REPLACE VIEW sys.trigger_events
AS
SELECT
Expand Down
Loading

0 comments on commit 3cf9991

Please sign in to comment.