Skip to content

Commit 58a2148

Browse files
author
Rahul Parande
committed
Support for weak binding views to allow dropping of underlying objects.This commit introduces support for both strong and weak view binding in Babelfish, aligning more closely with SQL Server's default behavior while maintaining flexibility.
Key changes: - Introduce GUC parameter 'babelfishpg_tsql.weak_view_binding' to control default binding behavior (default: false) - Support explicit WITH SCHEMABINDING clause for strong binding - Implement weak binding to allow dropping of referenced objects - Handle ALTER VIEW operations in both binding modes - Add logic to repair broken views when underlying objects are recreated Limitations: - Only addresses DROP operations on tables, views, functions, and procedures - ALTER TABLE/ALTER FUNCTION operations still restricted when dependent views exist - View repair follows PostgreSQL's CREATE OR REPLACE VIEW restrictions Signed-off-by: Rahul Parande <rparande@amazon.com>
1 parent e31358f commit 58a2148

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+5082
-36
lines changed

contrib/babelfishpg_tsql/runtime/functions.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4481,8 +4481,14 @@ objectproperty_internal(PG_FUNCTION_ARGS)
44814481
*/
44824482
if (pg_strcasecmp(property, "isschemabound") == 0)
44834483
{
4484+
bool is_weak_view = false;
4485+
bool is_view = (type == OBJECT_TYPE_VIEW);
4486+
4487+
if (is_view)
4488+
check_is_tsql_view(object_id, &is_weak_view);
4489+
44844490
pfree(property);
4485-
PG_RETURN_INT32(0);
4491+
PG_RETURN_INT32(is_view ? ((int) !is_weak_view) : 0);
44864492
}
44874493
/*
44884494
* For ExecIsQuotedIdentOn and ExecIsAnsiNullsOn, we hardcoded it to 1

contrib/babelfishpg_tsql/src/catalog.c

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,17 +1199,40 @@ get_bbf_view_def_idx_oid()
11991199
}
12001200

12011201
HeapTuple
1202-
search_bbf_view_def(Relation bbf_view_def_rel, int16 dbid, const char *logical_schema_name, const char *view_name)
1202+
search_bbf_view_def(Relation bbf_view_def_rel, Oid viewOid)
12031203
{
12041204

12051205
ScanKeyData scanKey[3];
12061206
SysScanDesc scan;
12071207
HeapTuple scantup,
12081208
oldtup;
1209+
Oid schema_id;
1210+
char *schema_name = NULL;
1211+
char *view_name = NULL;
1212+
const char *logical_schema_name = NULL;
1213+
int16 dbid = InvalidDbid;
12091214

1210-
if (!DbidIsValid(dbid) || logical_schema_name == NULL || view_name == NULL)
1215+
if (!OidIsValid(viewOid))
12111216
return NULL;
12121217

1218+
schema_id = get_rel_namespace(viewOid);
1219+
schema_name = get_namespace_name(schema_id);
1220+
view_name = get_rel_name(viewOid);
1221+
1222+
if (!schema_name)
1223+
return NULL;
1224+
1225+
logical_schema_name = get_logical_schema_name(schema_name, true);
1226+
dbid = get_dbid_from_physical_schema_name(schema_name, true);
1227+
1228+
if (!DbidIsValid(dbid) || logical_schema_name == NULL || view_name == NULL)
1229+
{
1230+
pfree(view_name);
1231+
pfree(schema_name);
1232+
if (logical_schema_name)
1233+
pfree((char *) logical_schema_name);
1234+
return NULL;
1235+
}
12131236

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

12401263
/* Checks if it is view created during v2.2.0 or after that */
12411264
bool
1242-
check_is_tsql_view(Oid relid)
1265+
check_is_tsql_view(Oid relid, bool *is_weak_view)
12431266
{
12441267
Oid schema_oid;
12451268
Relation bbf_view_def_rel;
@@ -1249,10 +1272,17 @@ check_is_tsql_view(Oid relid)
12491272
int16 logical_dbid;
12501273
const char *logical_schema_name;
12511274
bool is_tsql_view = false;
1275+
bool bisnull;
1276+
Datum flag_values_datum;
1277+
uint64 flag_values;
12521278

12531279
view_name = get_rel_name(relid);
12541280
schema_oid = get_rel_namespace(relid);
12551281
schema_name = get_namespace_name(schema_oid);
1282+
1283+
if (is_weak_view != NULL)
1284+
*is_weak_view = false;
1285+
12561286
if (view_name == NULL || schema_name == NULL || is_shared_schema(schema_name))
12571287
{
12581288
if (view_name)
@@ -1273,12 +1303,27 @@ check_is_tsql_view(Oid relid)
12731303
}
12741304
/* Fetch the relation */
12751305
bbf_view_def_rel = table_open(get_bbf_view_def_oid(), AccessShareLock);
1276-
1277-
scantup = search_bbf_view_def(bbf_view_def_rel, logical_dbid, logical_schema_name, view_name);
1306+
scantup = search_bbf_view_def(bbf_view_def_rel, relid);
12781307

12791308
if (HeapTupleIsValid(scantup))
12801309
{
12811310
is_tsql_view = true;
1311+
1312+
/* Check if the view is a weak bound view */
1313+
if (is_weak_view != NULL)
1314+
{
1315+
flag_values_datum = heap_getattr(scantup,
1316+
Anum_bbf_view_def_flag_values,
1317+
RelationGetDescr(bbf_view_def_rel),
1318+
&bisnull);
1319+
1320+
if (!bisnull)
1321+
{
1322+
flag_values = DatumGetUInt64(flag_values_datum);
1323+
*is_weak_view = (flag_values & BBF_VIEW_DEF_FLAG_IS_WEAK_VIEW) != 0;
1324+
}
1325+
}
1326+
12821327
heap_freetuple(scantup);
12831328
}
12841329
table_close(bbf_view_def_rel, AccessShareLock);

contrib/babelfishpg_tsql/src/catalog.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -202,18 +202,22 @@ typedef FormData_authid_user_ext *Form_authid_user_ext;
202202
#define Anum_bbf_view_def_schema_name 2
203203
#define Anum_bbf_view_def_object_name 3
204204
#define Anum_bbf_view_def_definition 4
205+
#define Anum_bbf_view_def_flag_validity 5
206+
#define Anum_bbf_view_def_flag_values 6
205207
#define BBF_VIEW_DEF_NUM_COLS 8
206208
#define BBF_VIEW_DEF_FLAG_IS_ANSI_NULLS_ON (1<<0)
207209
#define BBF_VIEW_DEF_FLAG_USES_QUOTED_IDENTIFIER (1<<1)
208210
#define BBF_VIEW_DEF_FLAG_CREATED_IN_OR_AFTER_2_4 (0<<2)
211+
#define BBF_VIEW_DEF_FLAG_IS_WEAK_VIEW (1<<3)
212+
#define BBF_VIEW_DEF_FLAG_IS_BROKEN (1<<4)
213+
209214
extern Oid bbf_view_def_oid;
210215
extern Oid bbf_view_def_idx_oid;
211216

212217
extern Oid get_bbf_view_def_oid(void);
213218
extern Oid get_bbf_view_def_idx_oid(void);
214-
extern HeapTuple search_bbf_view_def(Relation bbf_view_def_rel, int16 dbid,
215-
const char *logical_schema_name, const char *view_name);
216-
extern bool check_is_tsql_view(Oid relid);
219+
extern HeapTuple search_bbf_view_def(Relation bbf_view_def_rel, Oid viewOid);
220+
extern bool check_is_tsql_view(Oid relid, bool *is_weak_view);
217221
extern void clean_up_bbf_view_def(int16 dbid);
218222
extern void drop_bbf_schema_permission_entries(int16 dbid);
219223

contrib/babelfishpg_tsql/src/guc.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#define PLTSQL_DEFAULT_LANGUAGE "us_english"
1919

2020
static int migration_mode = SINGLE_DB;
21+
bool pltsql_weak_view_binding = false;
2122
bool enable_ownership_structure = false;
2223

2324
bool enable_metadata_inconsistency_check = true;
@@ -630,6 +631,16 @@ define_custom_variables(void)
630631
GUC_NO_RESET_ALL,
631632
NULL, NULL, NULL);
632633

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

634645
/* ANTLR parser */
635646
DefineCustomBoolVariable("babelfishpg_tsql.dump_antlr_query_graph",

contrib/babelfishpg_tsql/src/guc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ extern bool pltsql_enable_create_alter_view_from_pg;
2020
extern bool pltsql_enable_linked_servers;
2121
extern bool pltsql_allow_windows_login;
2222
extern bool pltsql_allow_fulltext_parser;
23+
extern bool pltsql_weak_view_binding;
2324
extern char *pltsql_psql_logical_babelfish_db_name;
2425
extern int pltsql_isolation_level_repeatable_read;
2526
extern int pltsql_isolation_level_serializable;

0 commit comments

Comments
 (0)