Skip to content

Commit

Permalink
fix object resoultion in pltsql routines
Browse files Browse the repository at this point in the history
Signed-off-by: Tanzeel Khan <[email protected]>
  • Loading branch information
tanscorpio7 committed Feb 5, 2025
1 parent 376cf48 commit fd40915
Show file tree
Hide file tree
Showing 46 changed files with 991 additions and 681 deletions.
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
4 changes: 2 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
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,13 @@ $$;
* So make sure that any SQL statement (DDL/DML) being added here can be executed multiple times without affecting
* final behaviour.
*/
CREATE OR REPLACE FUNCTION sys.db_id() RETURNS SMALLINT
AS 'babelfishpg_tsql', 'babelfish_db_id'
LANGUAGE C PARALLEL SAFE STABLE;

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

DO $$
DECLARE
Expand Down Expand Up @@ -5559,6 +5566,72 @@ LANGUAGE plpgsql
STABLE
RETURNS NULL ON NULL INPUT;

DO $$
BEGIN
BEGIN
DROP PROCEDURE master_dbo.sp_addlinkedserver;
EXCEPTION
WHEN OTHERS THEN
raise NOTICE '%', SQLERRM;
END;
END;
$$;

DO $$
BEGIN
BEGIN
DROP PROCEDURE master_dbo.sp_addlinkedsrvlogin;
EXCEPTION
WHEN OTHERS THEN
raise NOTICE '%', SQLERRM;
END;
END;
$$;

DO $$
BEGIN
BEGIN
DROP PROCEDURE master_dbo.sp_droplinkedsrvlogin;
EXCEPTION
WHEN OTHERS THEN
raise NOTICE '%', SQLERRM;
END;
END;
$$;

DO $$
BEGIN
BEGIN
DROP PROCEDURE master_dbo.sp_dropserver;
EXCEPTION
WHEN OTHERS THEN
raise NOTICE '%', SQLERRM;
END;
END;
$$;

DO $$
BEGIN
BEGIN
DROP PROCEDURE master_dbo.sp_testlinkedserver;
EXCEPTION
WHEN OTHERS THEN
raise NOTICE '%', SQLERRM;
END;
END;
$$;

DO $$
BEGIN
BEGIN
DROP PROCEDURE master_dbo.sp_enum_oledb_providers;
EXCEPTION
WHEN OTHERS THEN
raise NOTICE '%', SQLERRM;
END;
END;
$$;

-- Drops the temporary procedure used by the upgrade script.
-- Please have this be one of the last statements executed in this upgrade script.
DROP PROCEDURE sys.babelfish_drop_deprecated_object(varchar, varchar, varchar);
Expand Down
48 changes: 17 additions & 31 deletions contrib/babelfishpg_tsql/src/catalog.c
Original file line number Diff line number Diff line change
Expand Up @@ -1002,47 +1002,33 @@ get_authid_user_ext_physical_name(const char *db_name, const char *login)
char *
get_authid_user_ext_schema_name(const char *db_name, const char *user)
{
Relation bbf_authid_user_ext_rel;
HeapTuple tuple_user_ext;
ScanKeyData key[2];
TableScanDesc scan;
char *schema_name = NULL;
NameData *user_name;

if (!db_name || !user)
return NULL;

bbf_authid_user_ext_rel = table_open(get_authid_user_ext_oid(),
RowExclusiveLock);
tuple_user_ext = SearchSysCache1(AUTHIDUSEREXTROLENAME, CStringGetDatum(user));

user_name = (NameData *) palloc0(NAMEDATALEN);
snprintf(user_name->data, NAMEDATALEN, "%s", user);
ScanKeyInit(&key[0],
Anum_bbf_authid_user_ext_rolname,
BTEqualStrategyNumber, F_NAMEEQ,
NameGetDatum(user_name));
ScanKeyInit(&key[1],
Anum_bbf_authid_user_ext_database_name,
BTEqualStrategyNumber, F_TEXTEQ,
CStringGetTextDatum(db_name));

scan = table_beginscan_catalog(bbf_authid_user_ext_rel, 2, key);

tuple_user_ext = heap_getnext(scan, ForwardScanDirection);
if (HeapTupleIsValid(tuple_user_ext))
{
Datum datum;
bool is_null;

datum = heap_getattr(tuple_user_ext,
Anum_bbf_authid_user_ext_default_schema_name,
bbf_authid_user_ext_rel->rd_att,
&is_null);
schema_name = pstrdup(TextDatumGetCString(datum));
}
Datum datum = SysCacheGetAttrNotNull(AUTHIDUSEREXTROLENAME, tuple_user_ext,
Anum_bbf_authid_user_ext_database_name);
char *db_name_cstring = TextDatumGetCString(datum);

table_endscan(scan);
table_close(bbf_authid_user_ext_rel, RowExclusiveLock);
if (strcmp(db_name_cstring, db_name) == 0)
{
Datum schema_datum = SysCacheGetAttrNotNull(AUTHIDUSEREXTROLENAME, tuple_user_ext,
Anum_bbf_authid_user_ext_default_schema_name);
char *default_schema_name = TextDatumGetCString(schema_datum);

if (strlen(default_schema_name))
schema_name = default_schema_name;
}

pfree(db_name_cstring);
ReleaseSysCache(tuple_user_ext);
}

return schema_name;
}
Expand Down
55 changes: 17 additions & 38 deletions contrib/babelfishpg_tsql/src/hooks.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,12 @@ typedef enum PltsqlInitPrivsOptions
ERROR_INIT_PRIVS
} PltsqlInitPrivsOptions;

/*****************************************
* General Hooks
*****************************************/

static bool is_bbf_tds_connection(void);

/*****************************************
* Catalog Hooks
*****************************************/
Expand Down Expand Up @@ -188,7 +194,6 @@ static bool pltsql_bbfViewHasInsteadofTrigger(Relation view, CmdType event);
static bool plsql_TriggerRecursiveCheck(ResultRelInfo *resultRelInfo);
static bool bbf_check_rowcount_hook(int es_processed);

static char *get_local_schema_for_bbf_functions(Oid proc_nsp_oid);
extern bool called_from_tsql_insert_exec();
extern bool called_for_tsql_itvf_func();
static void is_function_pg_stat_valid(FunctionCallInfo fcinfo,
Expand Down Expand Up @@ -290,7 +295,6 @@ static table_variable_satisfies_update_hook_type prev_table_variable_satisfies_u
static table_variable_satisfies_vacuum_hook_type prev_table_variable_satisfies_vacuum = NULL;
static table_variable_satisfies_vacuum_horizon_hook_type prev_table_variable_satisfies_vacuum_horizon = NULL;
static drop_relation_refcnt_hook_type prev_drop_relation_refcnt_hook = NULL;
static set_local_schema_for_func_hook_type prev_set_local_schema_for_func_hook = NULL;
static bbf_get_sysadmin_oid_hook_type prev_bbf_get_sysadmin_oid_hook = NULL;
static get_bbf_admin_oid_hook_type prev_get_bbf_admin_oid_hook = NULL;
static transform_pivot_clause_hook_type pre_transform_pivot_clause_hook = NULL;
Expand Down Expand Up @@ -474,9 +478,6 @@ InstallExtendedHooks(void)
prev_drop_relation_refcnt_hook = drop_relation_refcnt_hook;
drop_relation_refcnt_hook = pltsql_drop_relation_refcnt_hook;

prev_set_local_schema_for_func_hook = set_local_schema_for_func_hook;
set_local_schema_for_func_hook = get_local_schema_for_bbf_functions;

prev_bbf_get_sysadmin_oid_hook = bbf_get_sysadmin_oid_hook;
bbf_get_sysadmin_oid_hook = get_sysadmin_oid;

Expand Down Expand Up @@ -534,6 +535,8 @@ InstallExtendedHooks(void)
is_bbf_db_ddladmin_operation_hook = is_bbf_db_ddladmin_operation;

pltsql_allow_storing_init_privs_hook = allow_storing_init_privs;

is_bbf_tds_connection_hook = is_bbf_tds_connection;
}

void
Expand Down Expand Up @@ -590,7 +593,6 @@ UninstallExtendedHooks(void)
IsToastRelationHook = PrevIsToastRelationHook;
IsToastClassHook = PrevIsToastClassHook;
drop_relation_refcnt_hook = prev_drop_relation_refcnt_hook;
set_local_schema_for_func_hook = prev_set_local_schema_for_func_hook;
bbf_get_sysadmin_oid_hook = prev_bbf_get_sysadmin_oid_hook;
get_bbf_admin_oid_hook = prev_get_bbf_admin_oid_hook;
transform_pivot_clause_hook = pre_transform_pivot_clause_hook;
Expand All @@ -613,6 +615,7 @@ UninstallExtendedHooks(void)
handle_default_collation_hook = NULL;
pltsql_get_object_identity_event_trigger_hook = NULL;
pltsql_allow_storing_init_privs_hook = NULL;
is_bbf_tds_connection_hook = NULL;
}

/*****************************************
Expand Down Expand Up @@ -5099,37 +5102,6 @@ sort_nulls_first(SortGroupClause * sortcl, bool reverse)
}
}


static char *
get_local_schema_for_bbf_functions(Oid proc_nsp_oid)
{
HeapTuple tuple;
char *func_schema_name = NULL,
*new_search_path = NULL;
char *func_dbo_schema;
const char *cur_dbname = get_cur_db_name();

tuple = SearchSysCache1(NAMESPACEOID,
ObjectIdGetDatum(proc_nsp_oid));
if(HeapTupleIsValid(tuple))
{
func_schema_name = NameStr(((Form_pg_namespace) GETSTRUCT(tuple))->nspname);
func_dbo_schema = get_dbo_schema_name(cur_dbname);

if(strcmp(func_schema_name, func_dbo_schema) != 0
&& strcmp(func_schema_name, "sys") != 0)
new_search_path = psprintf("%s, %s, \"$user\", sys, pg_catalog",
quote_identifier(func_schema_name),
quote_identifier(func_dbo_schema));

ReleaseSysCache(tuple);

pfree(func_dbo_schema);
}

return new_search_path;
}

static ResTarget *
make_restarget_from_cstr_list(List * l)
{
Expand Down Expand Up @@ -6038,4 +6010,11 @@ remove_db_name_in_schema(const char *object_name, const char *object_type)
pfree(splited_object_name);

return (const char *)pstrdup(object_name + prefix_len);
}
}

/* Check if current connection is a tds connection */
static bool
is_bbf_tds_connection(void)
{
return IS_TDS_CONN();
}
Loading

0 comments on commit fd40915

Please sign in to comment.