Skip to content

Commit

Permalink
Revert "Fix bugs for GRANT/REVOKE on SCHEMA (babelfish-for-postgresql…
Browse files Browse the repository at this point in the history
…#2031)" (babelfish-for-postgresql#2051)

This reverts commit dd23da9.

Co-authored-by: Shalini Lohia <[email protected]>
  • Loading branch information
2 people authored and Jason Teng committed Dec 21, 2023
1 parent f47d5c8 commit dbe2d02
Show file tree
Hide file tree
Showing 14 changed files with 143 additions and 681 deletions.
10 changes: 5 additions & 5 deletions contrib/babelfishpg_tsql/sql/ownership.sql
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ GRANT SELECT on sys.babelfish_sysdatabases TO PUBLIC;
-- BABELFISH_SCHEMA_PERMISSIONS
CREATE TABLE sys.babelfish_schema_permissions (
dbid smallint NOT NULL,
schema_name NAME NOT NULL COLLATE sys.database_default,
object_name NAME NOT NULL COLLATE sys.database_default,
permission NAME NOT NULL COLLATE sys.database_default,
grantee NAME NOT NULL COLLATE sys.database_default,
object_type NAME COLLATE sys.database_default,
schema_name NAME NOT NULL,
object_name NAME NOT NULL,
permission NAME NOT NULL,
grantee NAME NOT NULL,
object_type NAME,
PRIMARY KEY(dbid, schema_name, object_name, permission, grantee)
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -891,11 +891,11 @@ LANGUAGE plpgsql STABLE;
-- BABELFISH_SCHEMA_PERMISSIONS
CREATE TABLE IF NOT EXISTS sys.babelfish_schema_permissions (
dbid smallint NOT NULL,
schema_name NAME NOT NULL COLLATE sys.database_default,
object_name NAME NOT NULL COLLATE sys.database_default,
permission NAME NOT NULL COLLATE sys.database_default,
grantee NAME NOT NULL COLLATE sys.database_default,
object_type NAME COLLATE sys.database_default,
schema_name NAME NOT NULL,
object_name NAME NOT NULL,
permission NAME NOT NULL,
grantee NAME NOT NULL,
object_type NAME,
PRIMARY KEY(dbid, schema_name, object_name, permission, grantee)
);

Expand Down
193 changes: 59 additions & 134 deletions contrib/babelfishpg_tsql/src/catalog.c
Original file line number Diff line number Diff line change
Expand Up @@ -2817,10 +2817,6 @@ add_entry_to_bbf_schema(const char *schema_name,
bool new_record_nulls_bbf_schema[BBF_SCHEMA_PERMS_NUM_OF_COLS];
int16 dbid = get_cur_db_id();

/* Immediately return, if grantee is NULL or PUBLIC. */
if ((grantee == NULL) || (strcmp(grantee, "public") == 0))
return;

/* Fetch the relation */
bbf_schema_rel = table_open(get_bbf_schema_perms_oid(),
RowExclusiveLock);
Expand Down Expand Up @@ -2863,65 +2859,45 @@ check_bbf_schema_for_entry(const char *schema_name,
{
Relation bbf_schema_rel;
HeapTuple tuple_bbf_schema;
ScanKeyData scanKey[5];
SysScanDesc scan;
ScanKeyData key[5];
TableScanDesc scan;
bool catalog_entry_exists = false;
int16 dbid = get_cur_db_id();

/* Immediately return false, if grantee is NULL or PUBLIC. */
if ((grantee == NULL) || (strcmp(grantee, "public") == 0))
return false;

bbf_schema_rel = table_open(get_bbf_schema_perms_oid(),
AccessShareLock);
ScanKeyInit(&scanKey[0],
ScanKeyInit(&key[0],
Anum_bbf_schema_perms_dbid,
BTEqualStrategyNumber, F_INT2EQ,
Int16GetDatum(dbid));
ScanKeyEntryInitialize(&scanKey[1], 0,
ScanKeyInit(&key[1],
Anum_bbf_schema_perms_schema_name,
BTEqualStrategyNumber,
InvalidOid,
tsql_get_server_collation_oid_internal(false),
F_NAMEEQ,
BTEqualStrategyNumber, F_NAMEEQ,
CStringGetDatum(schema_name));
ScanKeyEntryInitialize(&scanKey[2], 0,
ScanKeyInit(&key[2],
Anum_bbf_schema_perms_object_name,
BTEqualStrategyNumber,
InvalidOid,
tsql_get_server_collation_oid_internal(false),
F_NAMEEQ,
BTEqualStrategyNumber, F_NAMEEQ,
CStringGetDatum(object_name));
ScanKeyEntryInitialize(&scanKey[3], 0,
ScanKeyInit(&key[3],
Anum_bbf_schema_perms_permission,
BTEqualStrategyNumber,
InvalidOid,
tsql_get_server_collation_oid_internal(false),
F_NAMEEQ,
BTEqualStrategyNumber, F_NAMEEQ,
CStringGetDatum(permission));
ScanKeyEntryInitialize(&scanKey[4], 0,
ScanKeyInit(&key[4],
Anum_bbf_schema_perms_grantee,
BTEqualStrategyNumber,
InvalidOid,
tsql_get_server_collation_oid_internal(false),
F_NAMEEQ,
BTEqualStrategyNumber, F_NAMEEQ,
CStringGetDatum(grantee));
scan = systable_beginscan(bbf_schema_rel,
get_bbf_schema_perms_idx_oid(),
true, NULL, 5, scanKey);

tuple_bbf_schema = systable_getnext(scan);
scan = table_beginscan_catalog(bbf_schema_rel, 5, key);

tuple_bbf_schema = heap_getnext(scan, ForwardScanDirection);
if (HeapTupleIsValid(tuple_bbf_schema))
catalog_entry_exists = true;

systable_endscan(scan);
table_endscan(scan);
table_close(bbf_schema_rel, AccessShareLock);
return catalog_entry_exists;
}

/*
* Checks if a particular schema has any SCHEMA level permission granted to any user.
*/
bool
check_bbf_schema_for_schema(const char *schema_name,
const char *object_name,
Expand All @@ -2930,7 +2906,7 @@ check_bbf_schema_for_schema(const char *schema_name,
Relation bbf_schema_rel;
HeapTuple tuple_bbf_schema;
ScanKeyData key[4];
SysScanDesc scan;
TableScanDesc scan;
bool catalog_entry_exists = false;
int16 dbid = get_cur_db_id();

Expand All @@ -2940,37 +2916,26 @@ check_bbf_schema_for_schema(const char *schema_name,
Anum_bbf_schema_perms_dbid,
BTEqualStrategyNumber, F_INT2EQ,
Int16GetDatum(dbid));
ScanKeyEntryInitialize(&key[1], 0,
ScanKeyInit(&key[1],
Anum_bbf_schema_perms_schema_name,
BTEqualStrategyNumber,
InvalidOid,
tsql_get_server_collation_oid_internal(false),
F_NAMEEQ,
BTEqualStrategyNumber, F_NAMEEQ,
CStringGetDatum(schema_name));
ScanKeyEntryInitialize(&key[2], 0,
ScanKeyInit(&key[2],
Anum_bbf_schema_perms_object_name,
BTEqualStrategyNumber,
InvalidOid,
tsql_get_server_collation_oid_internal(false),
F_NAMEEQ,
BTEqualStrategyNumber, F_NAMEEQ,
CStringGetDatum(object_name));
ScanKeyEntryInitialize(&key[3], 0,
ScanKeyInit(&key[3],
Anum_bbf_schema_perms_permission,
BTEqualStrategyNumber,
InvalidOid,
tsql_get_server_collation_oid_internal(false),
F_NAMEEQ,
BTEqualStrategyNumber, F_NAMEEQ,
CStringGetDatum(permission));

scan = systable_beginscan(bbf_schema_rel,
get_bbf_schema_perms_idx_oid(),
true, NULL, 4, key);
scan = table_beginscan_catalog(bbf_schema_rel, 4, key);

tuple_bbf_schema = systable_getnext(scan);
tuple_bbf_schema = heap_getnext(scan, ForwardScanDirection);
if (HeapTupleIsValid(tuple_bbf_schema))
catalog_entry_exists = true;

systable_endscan(scan);
table_endscan(scan);
table_close(bbf_schema_rel, AccessShareLock);
return catalog_entry_exists;
}
Expand All @@ -2983,59 +2948,44 @@ del_from_bbf_schema(const char *schema_name,
{
Relation bbf_schema_rel;
HeapTuple tuple_bbf_schema;
ScanKeyData scanKey[5];
SysScanDesc scan;
ScanKeyData key[5];
TableScanDesc scan;
int16 dbid = get_cur_db_id();

/* Immediately return, if grantee is NULL or PUBLIC. */
if ((grantee == NULL) || (strcmp(grantee, "public") == 0))
return;

bbf_schema_rel = table_open(get_bbf_schema_perms_oid(),
RowExclusiveLock);
ScanKeyInit(&scanKey[0],
ScanKeyInit(&key[0],
Anum_bbf_schema_perms_dbid,
BTEqualStrategyNumber, F_INT2EQ,
Int16GetDatum(dbid));
ScanKeyEntryInitialize(&scanKey[1], 0,
ScanKeyInit(&key[1],
Anum_bbf_schema_perms_schema_name,
BTEqualStrategyNumber,
InvalidOid,
tsql_get_server_collation_oid_internal(false),
F_NAMEEQ,
BTEqualStrategyNumber, F_NAMEEQ,
CStringGetDatum(schema_name));
ScanKeyEntryInitialize(&scanKey[2], 0,
ScanKeyInit(&key[2],
Anum_bbf_schema_perms_object_name,
BTEqualStrategyNumber,
InvalidOid,
tsql_get_server_collation_oid_internal(false),
F_NAMEEQ,
BTEqualStrategyNumber, F_NAMEEQ,
CStringGetDatum(object_name));
ScanKeyEntryInitialize(&scanKey[3], 0,
ScanKeyInit(&key[3],
Anum_bbf_schema_perms_permission,
BTEqualStrategyNumber,
InvalidOid,
tsql_get_server_collation_oid_internal(false),
F_NAMEEQ,
BTEqualStrategyNumber, F_NAMEEQ,
CStringGetDatum(permission));
ScanKeyEntryInitialize(&scanKey[4], 0,
ScanKeyInit(&key[4],
Anum_bbf_schema_perms_grantee,
BTEqualStrategyNumber,
InvalidOid,
tsql_get_server_collation_oid_internal(false),
F_NAMEEQ,
BTEqualStrategyNumber, F_NAMEEQ,
CStringGetDatum(grantee));
scan = systable_beginscan(bbf_schema_rel,
get_bbf_schema_perms_idx_oid(),
true, NULL, 5, scanKey);

tuple_bbf_schema = systable_getnext(scan);
scan = table_beginscan_catalog(bbf_schema_rel, 5, key);

tuple_bbf_schema = heap_getnext(scan, ForwardScanDirection);

if (HeapTupleIsValid(tuple_bbf_schema))
CatalogTupleDelete(bbf_schema_rel, &tuple_bbf_schema->t_self);

systable_endscan(scan);
table_endscan(scan);
table_close(bbf_schema_rel, RowExclusiveLock);

CommandCounterIncrement();
}

void
Expand All @@ -3059,12 +3009,9 @@ clean_up_bbf_schema(const char *schema_name,
Anum_bbf_schema_perms_dbid,
BTEqualStrategyNumber, F_INT2EQ,
Int16GetDatum(dbid));
ScanKeyEntryInitialize(&scanKey[1], 0,
ScanKeyInit(&scanKey[1],
Anum_bbf_schema_perms_schema_name,
BTEqualStrategyNumber,
InvalidOid,
tsql_get_server_collation_oid_internal(false),
F_NAMEEQ,
BTEqualStrategyNumber, F_NAMEEQ,
CStringGetDatum(schema_name));
scan = systable_beginscan(bbf_schema_rel,
get_bbf_schema_perms_idx_oid(),
Expand All @@ -3077,19 +3024,13 @@ clean_up_bbf_schema(const char *schema_name,
Anum_bbf_schema_perms_dbid,
BTEqualStrategyNumber, F_INT2EQ,
Int16GetDatum(dbid));
ScanKeyEntryInitialize(&scanKey[1], 0,
ScanKeyInit(&scanKey[1],
Anum_bbf_schema_perms_schema_name,
BTEqualStrategyNumber,
InvalidOid,
tsql_get_server_collation_oid_internal(false),
F_NAMEEQ,
BTEqualStrategyNumber, F_NAMEEQ,
CStringGetDatum(schema_name));
ScanKeyEntryInitialize(&scanKey[2], 0,
ScanKeyInit(&scanKey[2],
Anum_bbf_schema_perms_object_name,
BTEqualStrategyNumber,
InvalidOid,
tsql_get_server_collation_oid_internal(false),
F_NAMEEQ,
BTEqualStrategyNumber, F_NAMEEQ,
CStringGetDatum(object_name));
scan = systable_beginscan(bbf_schema_rel,
get_bbf_schema_perms_idx_oid(),
Expand All @@ -3107,18 +3048,12 @@ clean_up_bbf_schema(const char *schema_name,
table_close(bbf_schema_rel, RowExclusiveLock);
}

/*
* For all objects belonging to a schema which has OBJECT level permission,
* It grants the permission explicitly when REVOKE has been executed on that
* specific schema.
*/

void
grant_perms_to_objects_in_schema(const char *schema_name,
const char *permission,
const char *grantee)
{
SysScanDesc scan;
TableScanDesc scan;
Relation bbf_schema_rel;
HeapTuple tuple_bbf_schema;
const char *object_name;
Expand All @@ -3134,31 +3069,21 @@ grant_perms_to_objects_in_schema(const char *schema_name,
Anum_bbf_schema_perms_dbid,
BTEqualStrategyNumber, F_INT2EQ,
Int16GetDatum(dbid));
ScanKeyEntryInitialize(&scanKey[1], 0,
ScanKeyInit(&scanKey[1],
Anum_bbf_schema_perms_schema_name,
BTEqualStrategyNumber,
InvalidOid,
tsql_get_server_collation_oid_internal(false),
F_NAMEEQ,
BTEqualStrategyNumber, F_NAMEEQ,
CStringGetDatum(schema_name));
ScanKeyEntryInitialize(&scanKey[2], 0,
ScanKeyInit(&scanKey[2],
Anum_bbf_schema_perms_permission,
BTEqualStrategyNumber,
InvalidOid,
tsql_get_server_collation_oid_internal(false),
F_NAMEEQ,
BTEqualStrategyNumber, F_NAMEEQ,
CStringGetDatum(permission));
ScanKeyEntryInitialize(&scanKey[3], 0,
ScanKeyInit(&scanKey[3],
Anum_bbf_schema_perms_grantee,
BTEqualStrategyNumber,
InvalidOid,
tsql_get_server_collation_oid_internal(false),
F_NAMEEQ,
BTEqualStrategyNumber, F_NAMEEQ,
CStringGetDatum(grantee));

scan = systable_beginscan(bbf_schema_rel, get_bbf_schema_perms_idx_oid(),
true, NULL, 4, scanKey);
tuple_bbf_schema = systable_getnext(scan);
scan = table_beginscan_catalog(bbf_schema_rel, 4, scanKey);
tuple_bbf_schema = heap_getnext(scan, ForwardScanDirection);

while (HeapTupleIsValid(tuple_bbf_schema))
{
Expand Down Expand Up @@ -3211,9 +3136,9 @@ grant_perms_to_objects_in_schema(const char *schema_name,
/* make sure later steps can see the object created here */
CommandCounterIncrement();
}
tuple_bbf_schema = systable_getnext(scan);
tuple_bbf_schema = heap_getnext(scan, ForwardScanDirection);
}
systable_endscan(scan);
table_endscan(scan);
table_close(bbf_schema_rel, AccessShareLock);
}

Expand Down
2 changes: 0 additions & 2 deletions contrib/babelfishpg_tsql/src/catalog.h
Original file line number Diff line number Diff line change
Expand Up @@ -299,8 +299,6 @@ typedef FormData_bbf_function_ext *Form_bbf_function_ext;
#define Anum_bbf_schema_perms_grantee 5
#define Anum_bbf_schema_perms_object_type 6

#define PERMISSIONS_FOR_ALL_OBJECTS_IN_SCHEMA "ALL"

extern Oid bbf_schema_perms_oid;
extern Oid bbf_schema_perms_idx_oid;

Expand Down
Loading

0 comments on commit dbe2d02

Please sign in to comment.