Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion contrib/babelfishpg_tsql/runtime/functions.c
Original file line number Diff line number Diff line change
Expand Up @@ -4481,8 +4481,14 @@ objectproperty_internal(PG_FUNCTION_ARGS)
*/
if (pg_strcasecmp(property, "isschemabound") == 0)
{
bool is_weak_view = false;
bool is_view = (type == OBJECT_TYPE_VIEW);

if (is_view)
check_is_tsql_view(object_id, &is_weak_view);

pfree(property);
PG_RETURN_INT32(0);
PG_RETURN_INT32(is_view ? ((int) !is_weak_view) : 0);
}
/*
* For ExecIsQuotedIdentOn and ExecIsAnsiNullsOn, we hardcoded it to 1
Expand Down
55 changes: 50 additions & 5 deletions contrib/babelfishpg_tsql/src/catalog.c
Original file line number Diff line number Diff line change
Expand Up @@ -1199,17 +1199,40 @@ get_bbf_view_def_idx_oid()
}

HeapTuple
search_bbf_view_def(Relation bbf_view_def_rel, int16 dbid, const char *logical_schema_name, const char *view_name)
search_bbf_view_def(Relation bbf_view_def_rel, Oid viewOid)
{

ScanKeyData scanKey[3];
SysScanDesc scan;
HeapTuple scantup,
oldtup;
Oid schema_id;
char *schema_name = NULL;
char *view_name = NULL;
const char *logical_schema_name = NULL;
int16 dbid = InvalidDbid;

if (!DbidIsValid(dbid) || logical_schema_name == NULL || view_name == NULL)
if (!OidIsValid(viewOid))
return NULL;

schema_id = get_rel_namespace(viewOid);
schema_name = get_namespace_name(schema_id);
view_name = get_rel_name(viewOid);

if (!schema_name)
return NULL;

logical_schema_name = get_logical_schema_name(schema_name, true);
dbid = get_dbid_from_physical_schema_name(schema_name, true);

if (!DbidIsValid(dbid) || logical_schema_name == NULL || view_name == NULL)
{
pfree(view_name);
pfree(schema_name);
if (logical_schema_name)
pfree((char *) logical_schema_name);
return NULL;
}

/* Search and drop the definition */
ScanKeyInit(&scanKey[0],
Expand Down Expand Up @@ -1239,7 +1262,7 @@ search_bbf_view_def(Relation bbf_view_def_rel, int16 dbid, const char *logical_s

/* Checks if it is view created during v2.2.0 or after that */
bool
check_is_tsql_view(Oid relid)
check_is_tsql_view(Oid relid, bool *is_weak_view)
{
Oid schema_oid;
Relation bbf_view_def_rel;
Expand All @@ -1249,10 +1272,17 @@ check_is_tsql_view(Oid relid)
int16 logical_dbid;
const char *logical_schema_name;
bool is_tsql_view = false;
bool bisnull;
Datum flag_values_datum;
uint64 flag_values;

view_name = get_rel_name(relid);
schema_oid = get_rel_namespace(relid);
schema_name = get_namespace_name(schema_oid);

if (is_weak_view != NULL)
*is_weak_view = false;

if (view_name == NULL || schema_name == NULL || is_shared_schema(schema_name))
{
if (view_name)
Expand All @@ -1273,12 +1303,27 @@ check_is_tsql_view(Oid relid)
}
/* Fetch the relation */
bbf_view_def_rel = table_open(get_bbf_view_def_oid(), AccessShareLock);

scantup = search_bbf_view_def(bbf_view_def_rel, logical_dbid, logical_schema_name, view_name);
scantup = search_bbf_view_def(bbf_view_def_rel, relid);

if (HeapTupleIsValid(scantup))
{
is_tsql_view = true;

/* Check if the view is a weak bound view */
if (is_weak_view != NULL)
{
flag_values_datum = heap_getattr(scantup,
Anum_bbf_view_def_flag_values,
RelationGetDescr(bbf_view_def_rel),
&bisnull);

if (!bisnull)
{
flag_values = DatumGetUInt64(flag_values_datum);
*is_weak_view = (flag_values & BBF_VIEW_DEF_FLAG_IS_WEAK_VIEW) != 0;
}
}

heap_freetuple(scantup);
}
table_close(bbf_view_def_rel, AccessShareLock);
Expand Down
10 changes: 7 additions & 3 deletions contrib/babelfishpg_tsql/src/catalog.h
Original file line number Diff line number Diff line change
Expand Up @@ -202,18 +202,22 @@ typedef FormData_authid_user_ext *Form_authid_user_ext;
#define Anum_bbf_view_def_schema_name 2
#define Anum_bbf_view_def_object_name 3
#define Anum_bbf_view_def_definition 4
#define Anum_bbf_view_def_flag_validity 5
#define Anum_bbf_view_def_flag_values 6
#define BBF_VIEW_DEF_NUM_COLS 8
#define BBF_VIEW_DEF_FLAG_IS_ANSI_NULLS_ON (1<<0)
#define BBF_VIEW_DEF_FLAG_USES_QUOTED_IDENTIFIER (1<<1)
#define BBF_VIEW_DEF_FLAG_CREATED_IN_OR_AFTER_2_4 (0<<2)
#define BBF_VIEW_DEF_FLAG_IS_WEAK_VIEW (1<<3)
#define BBF_VIEW_DEF_FLAG_IS_BROKEN (1<<4)

extern Oid bbf_view_def_oid;
extern Oid bbf_view_def_idx_oid;

extern Oid get_bbf_view_def_oid(void);
extern Oid get_bbf_view_def_idx_oid(void);
extern HeapTuple search_bbf_view_def(Relation bbf_view_def_rel, int16 dbid,
const char *logical_schema_name, const char *view_name);
extern bool check_is_tsql_view(Oid relid);
extern HeapTuple search_bbf_view_def(Relation bbf_view_def_rel, Oid viewOid);
extern bool check_is_tsql_view(Oid relid, bool *is_weak_view);
extern void clean_up_bbf_view_def(int16 dbid);
extern void drop_bbf_schema_permission_entries(int16 dbid);

Expand Down
11 changes: 11 additions & 0 deletions contrib/babelfishpg_tsql/src/guc.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#define PLTSQL_DEFAULT_LANGUAGE "us_english"

static int migration_mode = SINGLE_DB;
bool pltsql_weak_view_binding = false;
bool enable_ownership_structure = false;

bool enable_metadata_inconsistency_check = true;
Expand Down Expand Up @@ -630,6 +631,16 @@ define_custom_variables(void)
GUC_NO_RESET_ALL,
NULL, NULL, NULL);

DefineCustomBoolVariable("babelfishpg_tsql.weak_view_binding",
gettext_noop("Sets the default binding mode for views."),
gettext_noop("When set to false (default), views will bind to the schema of its underlying tables or other objects"
"When set to true, views created will have weak binding and are no longer bound to schema of its underlying"
"objects unless explicitly declared in create/alter DDL"),
&pltsql_weak_view_binding,
false, /* Default is strong binding (false) */
PGC_USERSET,
GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE | GUC_DISALLOW_IN_AUTO_FILE,
NULL, NULL, NULL);

/* ANTLR parser */
DefineCustomBoolVariable("babelfishpg_tsql.dump_antlr_query_graph",
Expand Down
1 change: 1 addition & 0 deletions contrib/babelfishpg_tsql/src/guc.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ extern bool pltsql_enable_create_alter_view_from_pg;
extern bool pltsql_enable_linked_servers;
extern bool pltsql_allow_windows_login;
extern bool pltsql_allow_fulltext_parser;
extern bool pltsql_weak_view_binding;
extern char *pltsql_psql_logical_babelfish_db_name;
extern int pltsql_isolation_level_repeatable_read;
extern int pltsql_isolation_level_serializable;
Expand Down
Loading