diff --git a/contrib/babelfishpg_tsql/sql/babelfishpg_tsql.sql b/contrib/babelfishpg_tsql/sql/babelfishpg_tsql.sql index b6f773ce6e1..5b33c0e4436 100644 --- a/contrib/babelfishpg_tsql/sql/babelfishpg_tsql.sql +++ b/contrib/babelfishpg_tsql/sql/babelfishpg_tsql.sql @@ -2942,7 +2942,7 @@ BEGIN DECLARE @subname sys.nvarchar(776) = ''; DECLARE @schemaname sys.nvarchar(776) = ''; DECLARE @dbname sys.nvarchar(776) = ''; - SELECT @name_count = COUNT(*) FROM STRING_SPLIT(@objname, '.'); + SELECT @name_count = COUNT(*) FROM sys.babelfish_split_identifier(@objname); IF @name_count > 3 BEGIN THROW 33557097, N'No item by the given @objname could be found in the current database', 1; @@ -2951,7 +2951,7 @@ BEGIN BEGIN WITH myTableWithRows AS ( SELECT (ROW_NUMBER() OVER (ORDER BY NULL)) as row,* - FROM STRING_SPLIT(@objname, '.')) + FROM sys.babelfish_split_identifier(@objname)) SELECT @dbname = value FROM myTableWithRows WHERE row = 1; IF @dbname != sys.db_name() BEGIN @@ -2959,22 +2959,22 @@ BEGIN END WITH myTableWithRows AS ( SELECT (ROW_NUMBER() OVER (ORDER BY NULL)) as row,* - FROM STRING_SPLIT(@objname, '.')) + FROM sys.babelfish_split_identifier(@objname)) SELECT @schemaname = value FROM myTableWithRows WHERE row = 2; WITH myTableWithRows AS ( SELECT (ROW_NUMBER() OVER (ORDER BY NULL)) as row,* - FROM STRING_SPLIT(@objname, '.')) + FROM sys.babelfish_split_identifier(@objname)) SELECT @subname = value FROM myTableWithRows WHERE row = 3; END IF @name_count = 2 BEGIN WITH myTableWithRows AS ( SELECT (ROW_NUMBER() OVER (ORDER BY NULL)) as row,* - FROM STRING_SPLIT(@objname, '.')) + FROM sys.babelfish_split_identifier(@objname)) SELECT @schemaname = value FROM myTableWithRows WHERE row = 1; WITH myTableWithRows AS ( SELECT (ROW_NUMBER() OVER (ORDER BY NULL)) as row,* - FROM STRING_SPLIT(@objname, '.')) + FROM sys.babelfish_split_identifier(@objname)) SELECT @subname = value FROM myTableWithRows WHERE row = 2; END IF @name_count = 1 diff --git a/contrib/babelfishpg_tsql/sql/sys_function_helpers.sql b/contrib/babelfishpg_tsql/sql/sys_function_helpers.sql index 51d92c20598..7aa741654fe 100644 --- a/contrib/babelfishpg_tsql/sql/sys_function_helpers.sql +++ b/contrib/babelfishpg_tsql/sql/sys_function_helpers.sql @@ -10352,3 +10352,7 @@ CREATE OR REPLACE FUNCTION sys.bbf_is_shared_schema(IN schemaname TEXT) RETURNS BOOL AS 'babelfishpg_tsql', 'is_shared_schema_wrapper' LANGUAGE C IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION sys.babelfish_split_identifier(IN identifier VARCHAR, OUT value VARCHAR) +RETURNS SETOF VARCHAR AS 'babelfishpg_tsql', 'split_identifier_internal' +LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; diff --git a/contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--2.9.0--2.10.0.sql b/contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--2.9.0--2.10.0.sql index 8b6fd48f5dd..94abc140307 100644 --- a/contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--2.9.0--2.10.0.sql +++ b/contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--2.9.0--2.10.0.sql @@ -222,6 +222,106 @@ CREATE OR REPLACE VIEW information_schema_tsql.tables AS AND ext.dbid = sys.db_id() AND (NOT c.relname = 'sysdatabases'); +CREATE OR REPLACE FUNCTION sys.babelfish_split_identifier(IN identifier VARCHAR, OUT value VARCHAR) +RETURNS SETOF VARCHAR AS 'babelfishpg_tsql', 'split_identifier_internal' +LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; + +CREATE OR REPLACE PROCEDURE sys.sp_rename( + IN "@objname" sys.nvarchar(776), + IN "@newname" sys.SYSNAME, + IN "@objtype" sys.varchar(13) DEFAULT NULL +) +LANGUAGE 'pltsql' +AS $$ +BEGIN + If @objtype IS NULL + BEGIN + THROW 33557097, N'Please provide @objtype that is supported in Babelfish', 1; + END + IF @objtype = 'COLUMN' + BEGIN + THROW 33557097, N'Feature not supported: renaming object type Column', 1; + END + IF @objtype = 'INDEX' + BEGIN + THROW 33557097, N'Feature not supported: renaming object type Index', 1; + END + IF @objtype = 'STATISTICS' + BEGIN + THROW 33557097, N'Feature not supported: renaming object type Statistics', 1; + END + IF @objtype = 'USERDATATYPE' + BEGIN + THROW 33557097, N'Feature not supported: renaming object type User-defined Data Type alias', 1; + END + IF @objtype IS NOT NULL AND (@objtype != 'OBJECT') + BEGIN + THROW 33557097, N'Provided @objtype is not currently supported in Babelfish', 1; + END + DECLARE @name_count INT; + DECLARE @subname sys.nvarchar(776) = ''; + DECLARE @schemaname sys.nvarchar(776) = ''; + DECLARE @dbname sys.nvarchar(776) = ''; + SELECT @name_count = COUNT(*) FROM sys.babelfish_split_identifier(@objname); + IF @name_count > 3 + BEGIN + THROW 33557097, N'No item by the given @objname could be found in the current database', 1; + END + IF @name_count = 3 + BEGIN + WITH myTableWithRows AS ( + SELECT (ROW_NUMBER() OVER (ORDER BY NULL)) as row,* + FROM sys.babelfish_split_identifier(@objname)) + SELECT @dbname = value FROM myTableWithRows WHERE row = 1; + IF @dbname != sys.db_name() + BEGIN + THROW 33557097, N'No item by the given @objname could be found in the current database', 1; + END + WITH myTableWithRows AS ( + SELECT (ROW_NUMBER() OVER (ORDER BY NULL)) as row,* + FROM sys.babelfish_split_identifier(@objname)) + SELECT @schemaname = value FROM myTableWithRows WHERE row = 2; + WITH myTableWithRows AS ( + SELECT (ROW_NUMBER() OVER (ORDER BY NULL)) as row,* + FROM sys.babelfish_split_identifier(@objname)) + SELECT @subname = value FROM myTableWithRows WHERE row = 3; + END + IF @name_count = 2 + BEGIN + WITH myTableWithRows AS ( + SELECT (ROW_NUMBER() OVER (ORDER BY NULL)) as row,* + FROM sys.babelfish_split_identifier(@objname)) + SELECT @schemaname = value FROM myTableWithRows WHERE row = 1; + WITH myTableWithRows AS ( + SELECT (ROW_NUMBER() OVER (ORDER BY NULL)) as row,* + FROM sys.babelfish_split_identifier(@objname)) + SELECT @subname = value FROM myTableWithRows WHERE row = 2; + END + IF @name_count = 1 + BEGIN + SET @schemaname = sys.schema_name(); + SET @subname = @objname; + END + + DECLARE @count INT; + DECLARE @currtype char(2); + SELECT @count = COUNT(*) FROM sys.objects o1 INNER JOIN sys.schemas s1 ON o1.schema_id = s1.schema_id + WHERE s1.name = @schemaname AND o1.name = @subname; + IF @count > 1 + BEGIN + THROW 33557097, N'There are multiple objects with the given @objname.', 1; + END + IF @count < 1 + BEGIN + THROW 33557097, N'There is no object with the given @objname.', 1; + END + SELECT @currtype = type FROM sys.objects o1 INNER JOIN sys.schemas s1 ON o1.schema_id = s1.schema_id + WHERE s1.name = @schemaname AND o1.name = @subname; + EXEC sys.babelfish_sp_rename_internal @subname, @newname, @schemaname, @currtype; + PRINT 'Caution: Changing any part of an object name could break scripts and stored procedures.'; +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); diff --git a/contrib/babelfishpg_tsql/src/pltsql_utils.c b/contrib/babelfishpg_tsql/src/pltsql_utils.c index da0c9de1c4f..31dfc3bbd1c 100644 --- a/contrib/babelfishpg_tsql/src/pltsql_utils.c +++ b/contrib/babelfishpg_tsql/src/pltsql_utils.c @@ -38,6 +38,7 @@ bool is_tsql_nchar_or_nvarchar_datatype(Oid oid); /* sys.nchar / sys.nvarchar * bool is_tsql_binary_or_varbinary_datatype(Oid oid); /* sys.binary / sys.varbinary */ bool is_tsql_datatype_with_max_scale_expr_allowed(Oid oid); /* sys.varchar(max), sys.nvarchar(max), sys.varbinary(max) */ bool is_tsql_text_ntext_or_image_datatype(Oid oid); +PG_FUNCTION_INFO_V1(split_identifier_internal); /* To cache oid of sys.varchar */ @@ -1215,6 +1216,71 @@ split_object_name(char *name) return res; } +/* + * Wrapper over split_object_name function above to expose it as a SQL function. + */ +Datum +split_identifier_internal(PG_FUNCTION_ARGS) +{ + FuncCallContext *funcctx; + char **split_parts = NULL; + + if (SRF_IS_FIRSTCALL()) + { + int num_parts = 0; + MemoryContext oldcontext; + + funcctx = SRF_FIRSTCALL_INIT(); + oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); + if (!PG_ARGISNULL(0)) + { + char *input; + char **splited_object_name; + int i, j = 0; + + input = text_to_cstring(PG_GETARG_TEXT_P(0)); + splited_object_name = split_object_name(input); + + for (i = 0; i < 4; i++) + { + if (strlen(splited_object_name[i]) > 0) + num_parts++; + } + + if (num_parts > 0) + { + split_parts = (char **) palloc(num_parts * sizeof(char *)); + + for (i = 0; i < 4; i++) + { + if (i >= (4 - num_parts)) + split_parts[j++] = splited_object_name[i]; + else + pfree(splited_object_name[i]); + } + } + pfree(splited_object_name); + } + + funcctx->max_calls = num_parts; + funcctx->user_fctx = split_parts; + MemoryContextSwitchTo(oldcontext); + } + + funcctx = SRF_PERCALL_SETUP(); + split_parts = (char **) funcctx->user_fctx; + + if (funcctx->call_cntr < funcctx->max_calls) + { + VarChar *val = (*common_utility_plugin_ptr->tsql_varchar_input) (split_parts[funcctx->call_cntr], + strlen(split_parts[funcctx->call_cntr]), + -1); + SRF_RETURN_NEXT(funcctx, PointerGetDatum(val)); + } + else + SRF_RETURN_DONE(funcctx); +} + /* * is_schema_from_db * Given schema_oid and db_id, check if schema belongs to provided database id. diff --git a/contrib/babelfishpg_tsql/src/procedures.c b/contrib/babelfishpg_tsql/src/procedures.c index abb17da65a9..cca6cdcaf99 100644 --- a/contrib/babelfishpg_tsql/src/procedures.c +++ b/contrib/babelfishpg_tsql/src/procedures.c @@ -2764,6 +2764,8 @@ Datum sp_rename_internal(PG_FUNCTION_ARGS) PG_RETURN_VOID(); } +extern const char *ATTOPTION_BBF_ORIGINAL_TABLE_NAME; + static List * gen_sp_rename_subcmds(const char *objname, const char *newname, const char *schemaname, ObjectType objtype) { @@ -2775,6 +2777,7 @@ gen_sp_rename_subcmds(const char *objname, const char *newname, const char *sche initStringInfo(&query); if (objtype == OBJECT_TABLE) { appendStringInfo(&query, "ALTER TABLE dummy RENAME TO dummy; "); + appendStringInfo(&query, "ALTER TABLE dummy SET (dummy = 'dummy'); "); } else if (objtype == OBJECT_VIEW) { appendStringInfo(&query, "ALTER VIEW dummy RENAME TO dummy; "); } else if (objtype == OBJECT_PROCEDURE) { @@ -2790,7 +2793,7 @@ gen_sp_rename_subcmds(const char *objname, const char *newname, const char *sche } res = raw_parser(query.data, RAW_PARSE_DEFAULT); - if (list_length(res) != 1) + if ((objtype != OBJECT_TABLE) && (list_length(res) != 1)) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("Expected 1 statement but get %d statements after parsing", list_length(res)))); @@ -2807,6 +2810,29 @@ gen_sp_rename_subcmds(const char *objname, const char *newname, const char *sche renamestmt->newname = pstrdup(lowerstr(newname)); renamestmt->relation->schemaname = pstrdup(lowerstr(schemaname)); renamestmt->relation->relname = pstrdup(lowerstr(objname)); + + if (objtype == OBJECT_TABLE) + { + AlterTableStmt *altertablestmt; + AlterTableCmd *cmd; + ListCell *lc = NULL; + + rewrite_object_refs(stmt); + /* extra query nodes for modifying reloption */ + stmt = parsetree_nth_stmt(res, 1); + altertablestmt = (AlterTableStmt *) stmt; + if (!IsA(altertablestmt, AlterTableStmt)) + ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("query is not a AlterTableStmt"))); + + altertablestmt->relation->schemaname = pstrdup(lowerstr(schemaname)); + altertablestmt->relation->relname = pstrdup(lowerstr(newname)); + altertablestmt->objtype = OBJECT_TABLE; + /* get data of the first node */ + lc = list_head(altertablestmt->cmds); + cmd = (AlterTableCmd *) lfirst(lc); + cmd->subtype = AT_SetRelOptions; + cmd->def = (Node *) list_make1(makeDefElem(pstrdup(ATTOPTION_BBF_ORIGINAL_TABLE_NAME), (Node *) makeString(pstrdup(newname)), -1)); + } } else { // } else if ((objtype == OBJECT_PROCEDURE) || (objtype == OBJECT_FUNCTION)) { ObjectWithArgs *objwargs = (ObjectWithArgs *) renamestmt->object; diff --git a/test/JDBC/expected/BABEL-2877-before_16_4_or_15_8_or_14_13-vu-cleanup.out b/test/JDBC/expected/BABEL-2877-before_16_4_or_15_8_or_14_13-vu-cleanup.out index 7518ce549de..726983f8855 100644 --- a/test/JDBC/expected/BABEL-2877-before_16_4_or_15_8_or_14_13-vu-cleanup.out +++ b/test/JDBC/expected/BABEL-2877-before_16_4_or_15_8_or_14_13-vu-cleanup.out @@ -40,7 +40,7 @@ GO DROP FUNCTION [BABEL-2877-vu-prepare_FUNC_Schema].[BABEL-2877-vu-prepare_FUNC]; GO -DROP FUNCTION [BABEL-2877-vu-prepare Schema . WITH .. DOTS].[BABEL-2877-vu-prepare Function . WITH .. DOTS]; +DROP FUNCTION [BABEL-2877-vu-prepare Schema . WITH .. DOTS].[BABEL-2877-vu-prepare Function . WITH .. DOTS2]; GO DROP SCHEMA [BABEL-2877-vu-prepare_FUNC_Schema]; diff --git a/test/JDBC/expected/BABEL-2877-before_16_4_or_15_8_or_14_13-vu-verify.out b/test/JDBC/expected/BABEL-2877-before_16_4_or_15_8_or_14_13-vu-verify.out index 201e38525fd..c77619f32c0 100644 --- a/test/JDBC/expected/BABEL-2877-before_16_4_or_15_8_or_14_13-vu-verify.out +++ b/test/JDBC/expected/BABEL-2877-before_16_4_or_15_8_or_14_13-vu-verify.out @@ -198,8 +198,49 @@ master_dbo#!#babel_2877_vu_prepare_proc3#!#babel_2877_vu_prepare_proc3(integer, ~~END~~ +SELECT orig_name, + CASE flag_validity & 1 + WHEN 0 + THEN NULL + ELSE + CASE flag_values & 1 + WHEN 0 + THEN 0 + ELSE 1 + END + END AS ansi_null, + CASE flag_validity & 2 + WHEN 0 + THEN NULL + ELSE + CASE flag_values & 2 + WHEN 0 + THEN 0 + ELSE 1 + END + END AS quoted_identifier +FROM sys.babelfish_function_ext WHERE funcname LIKE 'babel-2877-vu-prepare%' ORDER BY funcname; +GO +~~START~~ +nvarchar#!#int#!#int +BABEL-2877-vu-prepare Schema . WITH .. DOTS#!#1#!#1 +BABEL-2877-vu-prepare_FUNC_Schema#!#1#!#1 +BABEL-2877-vu-prepare_FUNC_ANSI_NULLOFF_QIDOFF#!#0#!#0 +BABEL-2877-vu-prepare_FUNC_ANSI_NULLOFF_QIDON#!#0#!#1 +BABEL-2877-vu-prepare_FUNC_ANSI_NULLON_QIDOFF#!#1#!#0 +BABEL-2877-vu-prepare_FUNC_ANSI_NULLON_QIDON#!#1#!#1 +~~END~~ + + +-- Rename the existing functions to fix the originally stored incorrect orig_name +EXEC sp_rename 'BABEL-2877-vu-prepare_FUNC_Schema.BABEL-2877-vu-prepare_FUNC', 'BABEL-2877-vu-prepare_FUNC2', 'OBJECT' +GO + +EXEC sp_rename '"BABEL-2877-vu-prepare Schema . WITH .. DOTS"."BABEL-2877-vu-prepare Function . WITH .. DOTS"', 'BABEL-2877-vu-prepare Function . WITH .. DOTS2', 'OBJECT' +GO + -- create a new function with name which is prefix of schema name to verify new behavior -CREATE FUNCTION [BABEL-2877-vu-prepare_FUNC_Schema] . [BABEL-2877-vu-prepare_FUNC_S] (@a int) +CREATE FUNCTION [BABEL-2877-vu-prepare_FUNC_Schema] . [BABEL-2877-vu-prepare_FUNC] (@a int) RETURNS INT AS BEGIN RETURN 1; END; GO @@ -228,9 +269,9 @@ FROM sys.babelfish_function_ext WHERE funcname LIKE 'babel-2877-vu-prepare%' ORD GO ~~START~~ nvarchar#!#int#!#int -BABEL-2877-vu-prepare Schema . WITH .. DOTS#!#1#!#1 -BABEL-2877-vu-prepare_FUNC_S#!#1#!#1 -BABEL-2877-vu-prepare_FUNC_Schema#!#1#!#1 +BABEL-2877-vu-prepare Function . WITH .. DOTS2#!#1#!#1 +BABEL-2877-vu-prepare_FUNC#!#1#!#1 +BABEL-2877-vu-prepare_FUNC2#!#1#!#1 BABEL-2877-vu-prepare_FUNC_ANSI_NULLOFF_QIDOFF#!#0#!#0 BABEL-2877-vu-prepare_FUNC_ANSI_NULLOFF_QIDON#!#0#!#1 BABEL-2877-vu-prepare_FUNC_ANSI_NULLON_QIDOFF#!#1#!#0 @@ -238,5 +279,5 @@ BABEL-2877-vu-prepare_FUNC_ANSI_NULLON_QIDON#!#1#!#1 ~~END~~ -DROP FUNCTION [BABEL-2877-vu-prepare_FUNC_Schema] . [BABEL-2877-vu-prepare_FUNC_S] +DROP FUNCTION [BABEL-2877-vu-prepare_FUNC_Schema] . [BABEL-2877-vu-prepare_FUNC2] GO diff --git a/test/JDBC/expected/ISC-Tables-before_16_4_or_15_8_or_14_13-vu-cleanup.out b/test/JDBC/expected/ISC-Tables-before_16_4_or_15_8_or_14_13-vu-cleanup.out index d648cef653b..b2a1c38e3d1 100644 --- a/test/JDBC/expected/ISC-Tables-before_16_4_or_15_8_or_14_13-vu-cleanup.out +++ b/test/JDBC/expected/ISC-Tables-before_16_4_or_15_8_or_14_13-vu-cleanup.out @@ -1,6 +1,6 @@ DROP TABLE isc_tables_sc1.t2 DROP TABLE [ISC_TABLES_TABLE_SCHEMA].[ISC_TABLES_TABLE] -DROP TABLE [ISC_TABLES SCHEMA . WITH .. DOTS].[ISC_TABLES TABLE . WITH .. DOTS] +DROP TABLE [ISC_TABLES SCHEMA . WITH .. DOTS].[ISC_TABLES TABLE . WITH .. DOTS2] GO DROP TYPE isc_tables_sc1.isc_table_type2 diff --git a/test/JDBC/expected/ISC-Tables-before_16_4_or_15_8_or_14_13-vu-verify.out b/test/JDBC/expected/ISC-Tables-before_16_4_or_15_8_or_14_13-vu-verify.out index 739dc649cce..6e72ed8e0fa 100644 --- a/test/JDBC/expected/ISC-Tables-before_16_4_or_15_8_or_14_13-vu-verify.out +++ b/test/JDBC/expected/ISC-Tables-before_16_4_or_15_8_or_14_13-vu-verify.out @@ -1,5 +1,23 @@ +SELECT * FROM information_schema.tables WHERE TABLE_NAME LIKE 'ISC_TABLES%' ORDER BY TABLE_NAME +GO +~~START~~ +nvarchar#!#nvarchar#!#varchar#!#varchar +master#!#ISC_TABLES SCHEMA . WITH .. DOTS#!#isc_tables table . with .. dots#!#BASE TABLE +master#!#ISC_TABLES_TABLE_SCHEMA#!#ISC_TABLES_TABLE_SCHEMA#!#BASE TABLE +master#!#dbo#!#isc_tables_vu_prepare_t1#!#BASE TABLE +master#!#dbo#!#isc_tables_vu_prepare_v1#!#VIEW +~~END~~ + + +-- Rename the existing tables to fix the originally stored incorrect bbf_original_rel_name +EXEC sp_rename 'ISC_TABLES_TABLE_SCHEMA.ISC_TABLES_TABLE', 'ISC_TABLES_TABLE2', 'OBJECT' +GO + +EXEC sp_rename '"ISC_TABLES SCHEMA . WITH .. DOTS"."ISC_TABLES TABLE . WITH .. DOTS"', 'ISC_TABLES TABLE . WITH .. DOTS2', 'OBJECT' +GO + -- create a new table with name which is prefix of schema name to verify new behavior -CREATE TABLE [ISC_TABLES_TABLE_SCHEMA] . [ISC_TABLES_TABLE_S] (a INT, b INT) +CREATE TABLE [ISC_TABLES_TABLE_SCHEMA] . [ISC_TABLES_TABLE] (a INT, b INT) GO SELECT * FROM information_schema.tables WHERE TABLE_NAME LIKE 'isc_tables%' ORDER BY TABLE_NAME @@ -7,18 +25,18 @@ SELECT * FROM information_schema.tables WHERE TABLE_NAME LIKE 'ISC_TABLES%' ORDE GO ~~START~~ nvarchar#!#nvarchar#!#varchar#!#varchar -master#!#ISC_TABLES SCHEMA . WITH .. DOTS#!#isc_tables table . with .. dots#!#BASE TABLE -master#!#ISC_TABLES_TABLE_SCHEMA#!#ISC_TABLES_TABLE_S#!#BASE TABLE -master#!#ISC_TABLES_TABLE_SCHEMA#!#ISC_TABLES_TABLE_SCHEMA#!#BASE TABLE +master#!#ISC_TABLES SCHEMA . WITH .. DOTS#!#ISC_TABLES TABLE . WITH .. DOTS2#!#BASE TABLE +master#!#ISC_TABLES_TABLE_SCHEMA#!#ISC_TABLES_TABLE#!#BASE TABLE +master#!#ISC_TABLES_TABLE_SCHEMA#!#ISC_TABLES_TABLE2#!#BASE TABLE master#!#dbo#!#isc_tables_vu_prepare_t1#!#BASE TABLE master#!#dbo#!#isc_tables_vu_prepare_v1#!#VIEW ~~END~~ ~~START~~ nvarchar#!#nvarchar#!#varchar#!#varchar -master#!#ISC_TABLES SCHEMA . WITH .. DOTS#!#isc_tables table . with .. dots#!#BASE TABLE -master#!#ISC_TABLES_TABLE_SCHEMA#!#ISC_TABLES_TABLE_S#!#BASE TABLE -master#!#ISC_TABLES_TABLE_SCHEMA#!#ISC_TABLES_TABLE_SCHEMA#!#BASE TABLE +master#!#ISC_TABLES SCHEMA . WITH .. DOTS#!#ISC_TABLES TABLE . WITH .. DOTS2#!#BASE TABLE +master#!#ISC_TABLES_TABLE_SCHEMA#!#ISC_TABLES_TABLE#!#BASE TABLE +master#!#ISC_TABLES_TABLE_SCHEMA#!#ISC_TABLES_TABLE2#!#BASE TABLE master#!#dbo#!#isc_tables_vu_prepare_t1#!#BASE TABLE master#!#dbo#!#isc_tables_vu_prepare_v1#!#VIEW ~~END~~ @@ -95,13 +113,13 @@ SELECT * FROM isc_tables_vu_prepare_v1 GO ~~START~~ nvarchar#!#nvarchar#!#varchar#!#varchar -master#!#ISC_TABLES SCHEMA . WITH .. DOTS#!#isc_tables table . with .. dots#!#BASE TABLE -master#!#ISC_TABLES_TABLE_SCHEMA#!#ISC_TABLES_TABLE_S#!#BASE TABLE -master#!#ISC_TABLES_TABLE_SCHEMA#!#ISC_TABLES_TABLE_SCHEMA#!#BASE TABLE +master#!#ISC_TABLES SCHEMA . WITH .. DOTS#!#ISC_TABLES TABLE . WITH .. DOTS2#!#BASE TABLE +master#!#ISC_TABLES_TABLE_SCHEMA#!#ISC_TABLES_TABLE#!#BASE TABLE +master#!#ISC_TABLES_TABLE_SCHEMA#!#ISC_TABLES_TABLE2#!#BASE TABLE master#!#dbo#!#isc_tables_vu_prepare_t1#!#BASE TABLE master#!#dbo#!#isc_tables_vu_prepare_v1#!#VIEW ~~END~~ -DROP TABLE [ISC_TABLES_TABLE_SCHEMA] . [ISC_TABLES_TABLE_S] +DROP TABLE [ISC_TABLES_TABLE_SCHEMA] . [ISC_TABLES_TABLE2] GO diff --git a/test/JDBC/expected/Test-sp_rename-vu-cleanup.out b/test/JDBC/expected/Test-sp_rename-vu-cleanup.out index 2f39f6364ab..2a80080dea9 100644 --- a/test/JDBC/expected/Test-sp_rename-vu-cleanup.out +++ b/test/JDBC/expected/Test-sp_rename-vu-cleanup.out @@ -46,3 +46,6 @@ GO DROP SCHEMA sp_rename_vu_schema1; GO + +DROP VIEW babelfish_split_identifier_view; +GO diff --git a/test/JDBC/expected/Test-sp_rename-vu-prepare.out b/test/JDBC/expected/Test-sp_rename-vu-prepare.out index 76d2534da31..254b4c46b08 100644 --- a/test/JDBC/expected/Test-sp_rename-vu-prepare.out +++ b/test/JDBC/expected/Test-sp_rename-vu-prepare.out @@ -76,3 +76,13 @@ CREATE TRIGGER sp_rename_vu_trig1 ON sp_rename_vu_table2 AFTER INSERT, UPDATE AS RAISERROR ('Testing sp_rename', 16, 10); GO + +-- Dependency test for function babelfish_split_identifier +-- Create a view which depends upon babelfish_split_identifier function only +-- if the function exists. +IF OBJECT_ID('sys.babelfish_split_identifier') IS NOT NULL +BEGIN + EXEC sp_executesql N' + CREATE VIEW babelfish_split_identifier_view AS SELECT * FROM sys.babelfish_split_identifier(''ABC.DEF.GHI'')'; +END +GO diff --git a/test/JDBC/expected/Test-sp_rename-vu-verify.out b/test/JDBC/expected/Test-sp_rename-vu-verify.out index ff82337a55d..317149efb4b 100644 --- a/test/JDBC/expected/Test-sp_rename-vu-verify.out +++ b/test/JDBC/expected/Test-sp_rename-vu-verify.out @@ -293,7 +293,7 @@ ORDER BY TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME GO ~~START~~ nvarchar#!#nvarchar#!#varchar#!#varchar -master#!#dbo#!#sp_rename_vu_table1_case_insensitive2#!#BASE TABLE +master#!#dbo#!#SP_RENAME_vu_TABLE1_case_insensitive2#!#BASE TABLE master#!#dbo#!#sp_rename_vu_table2#!#BASE TABLE master#!#dbo#!#sp_rename_vu_view1#!#VIEW master#!#sp_rename_vu_schema1#!#sp_rename_vu_table1#!#BASE TABLE @@ -310,7 +310,7 @@ ORDER BY TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME GO ~~START~~ nvarchar#!#nvarchar#!#varchar#!#varchar -master#!#dbo#!#sp_rename_vu_table1_case_insensitive2#!#BASE TABLE +master#!#dbo#!#SP_RENAME_vu_TABLE1_case_insensitive2#!#BASE TABLE master#!#dbo#!#sp_rename_vu_table2#!#BASE TABLE master#!#dbo#!#sp_rename_vu_view1_case_insensitive1#!#VIEW master#!#sp_rename_vu_schema1#!#sp_rename_vu_table1#!#BASE TABLE @@ -347,7 +347,7 @@ ORDER BY TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME GO ~~START~~ nvarchar#!#nvarchar#!#varchar#!#varchar -master#!#dbo#!#sp_rename_vu_table1_case_insensitive2#!#BASE TABLE +master#!#dbo#!#SP_RENAME_vu_TABLE1_case_insensitive2#!#BASE TABLE master#!#dbo#!#sp_rename_vu_table2#!#BASE TABLE master#!#dbo#!#sp_rename_vu_view1#!#VIEW master#!#sp_rename_vu_schema1#!#sp_rename_vu_table1#!#BASE TABLE @@ -468,3 +468,20 @@ GO ~~ERROR (Message: Feature not supported: renaming object type Trigger)~~ + +IF OBJECT_ID('babelfish_split_identifier_view') IS NULL +BEGIN + EXEC sp_executesql N' + CREATE VIEW babelfish_split_identifier_view AS SELECT * FROM sys.babelfish_split_identifier(''ABC.DEF.GHI'')'; +END +GO + +SELECT * FROM babelfish_split_identifier_view; +GO +~~START~~ +varchar +ABC +DEF +GHI +~~END~~ + diff --git a/test/JDBC/input/BABEL-2877-before_16_4_or_15_8_or_14_13-vu-cleanup.sql b/test/JDBC/input/BABEL-2877-before_16_4_or_15_8_or_14_13-vu-cleanup.sql index b99b446a9de..89eb8dc81b1 100644 --- a/test/JDBC/input/BABEL-2877-before_16_4_or_15_8_or_14_13-vu-cleanup.sql +++ b/test/JDBC/input/BABEL-2877-before_16_4_or_15_8_or_14_13-vu-cleanup.sql @@ -40,7 +40,7 @@ GO DROP FUNCTION [BABEL-2877-vu-prepare_FUNC_Schema].[BABEL-2877-vu-prepare_FUNC]; GO -DROP FUNCTION [BABEL-2877-vu-prepare Schema . WITH .. DOTS].[BABEL-2877-vu-prepare Function . WITH .. DOTS]; +DROP FUNCTION [BABEL-2877-vu-prepare Schema . WITH .. DOTS].[BABEL-2877-vu-prepare Function . WITH .. DOTS2]; GO DROP SCHEMA [BABEL-2877-vu-prepare_FUNC_Schema]; diff --git a/test/JDBC/input/BABEL-2877-before_16_4_or_15_8_or_14_13-vu-verify.sql b/test/JDBC/input/BABEL-2877-before_16_4_or_15_8_or_14_13-vu-verify.sql index ca357ebc76a..5d074621583 100644 --- a/test/JDBC/input/BABEL-2877-before_16_4_or_15_8_or_14_13-vu-verify.sql +++ b/test/JDBC/input/BABEL-2877-before_16_4_or_15_8_or_14_13-vu-verify.sql @@ -77,8 +77,39 @@ FROM sys.babelfish_function_ext AND funcname NOT LIKE '%ansi%' ORDER BY funcname; GO +SELECT orig_name, + CASE flag_validity & 1 + WHEN 0 + THEN NULL + ELSE + CASE flag_values & 1 + WHEN 0 + THEN 0 + ELSE 1 + END + END AS ansi_null, + CASE flag_validity & 2 + WHEN 0 + THEN NULL + ELSE + CASE flag_values & 2 + WHEN 0 + THEN 0 + ELSE 1 + END + END AS quoted_identifier +FROM sys.babelfish_function_ext WHERE funcname LIKE 'babel-2877-vu-prepare%' ORDER BY funcname; +GO + +-- Rename the existing functions to fix the originally stored incorrect orig_name +EXEC sp_rename 'BABEL-2877-vu-prepare_FUNC_Schema.BABEL-2877-vu-prepare_FUNC', 'BABEL-2877-vu-prepare_FUNC2', 'OBJECT' +GO + +EXEC sp_rename '"BABEL-2877-vu-prepare Schema . WITH .. DOTS"."BABEL-2877-vu-prepare Function . WITH .. DOTS"', 'BABEL-2877-vu-prepare Function . WITH .. DOTS2', 'OBJECT' +GO + -- create a new function with name which is prefix of schema name to verify new behavior -CREATE FUNCTION [BABEL-2877-vu-prepare_FUNC_Schema] . [BABEL-2877-vu-prepare_FUNC2] (@a int) +CREATE FUNCTION [BABEL-2877-vu-prepare_FUNC_Schema] . [BABEL-2877-vu-prepare_FUNC] (@a int) RETURNS INT AS BEGIN RETURN 1; END; GO diff --git a/test/JDBC/input/ISC-Tables-before_16_4_or_15_8_or_14_13-vu-cleanup.sql b/test/JDBC/input/ISC-Tables-before_16_4_or_15_8_or_14_13-vu-cleanup.sql index d648cef653b..b2a1c38e3d1 100644 --- a/test/JDBC/input/ISC-Tables-before_16_4_or_15_8_or_14_13-vu-cleanup.sql +++ b/test/JDBC/input/ISC-Tables-before_16_4_or_15_8_or_14_13-vu-cleanup.sql @@ -1,6 +1,6 @@ DROP TABLE isc_tables_sc1.t2 DROP TABLE [ISC_TABLES_TABLE_SCHEMA].[ISC_TABLES_TABLE] -DROP TABLE [ISC_TABLES SCHEMA . WITH .. DOTS].[ISC_TABLES TABLE . WITH .. DOTS] +DROP TABLE [ISC_TABLES SCHEMA . WITH .. DOTS].[ISC_TABLES TABLE . WITH .. DOTS2] GO DROP TYPE isc_tables_sc1.isc_table_type2 diff --git a/test/JDBC/input/ISC-Tables-before_16_4_or_15_8_or_14_13-vu-verify.sql b/test/JDBC/input/ISC-Tables-before_16_4_or_15_8_or_14_13-vu-verify.sql index 3f3f13cdffe..b1bdcfc6fde 100644 --- a/test/JDBC/input/ISC-Tables-before_16_4_or_15_8_or_14_13-vu-verify.sql +++ b/test/JDBC/input/ISC-Tables-before_16_4_or_15_8_or_14_13-vu-verify.sql @@ -1,5 +1,15 @@ +SELECT * FROM information_schema.tables WHERE TABLE_NAME LIKE 'ISC_TABLES%' ORDER BY TABLE_NAME +GO + +-- Rename the existing tables to fix the originally stored incorrect bbf_original_rel_name +EXEC sp_rename 'ISC_TABLES_TABLE_SCHEMA.ISC_TABLES_TABLE', 'ISC_TABLES_TABLE2', 'OBJECT' +GO + +EXEC sp_rename '"ISC_TABLES SCHEMA . WITH .. DOTS"."ISC_TABLES TABLE . WITH .. DOTS"', 'ISC_TABLES TABLE . WITH .. DOTS2', 'OBJECT' +GO + -- create a new table with name which is prefix of schema name to verify new behavior -CREATE TABLE [ISC_TABLES_TABLE_SCHEMA] . [ISC_TABLES_TABLE2] (a INT, b INT) +CREATE TABLE [ISC_TABLES_TABLE_SCHEMA] . [ISC_TABLES_TABLE] (a INT, b INT) GO SELECT * FROM information_schema.tables WHERE TABLE_NAME LIKE 'isc_tables%' ORDER BY TABLE_NAME diff --git a/test/JDBC/input/storedProcedures/Test-sp_rename-vu-cleanup.sql b/test/JDBC/input/storedProcedures/Test-sp_rename-vu-cleanup.sql index b0ff89fcd95..2a80080dea9 100644 --- a/test/JDBC/input/storedProcedures/Test-sp_rename-vu-cleanup.sql +++ b/test/JDBC/input/storedProcedures/Test-sp_rename-vu-cleanup.sql @@ -45,4 +45,7 @@ DROP SEQUENCE sp_rename_vu_schema1.sp_rename_vu_seq1_new2; GO DROP SCHEMA sp_rename_vu_schema1; -GO \ No newline at end of file +GO + +DROP VIEW babelfish_split_identifier_view; +GO diff --git a/test/JDBC/input/storedProcedures/Test-sp_rename-vu-prepare.sql b/test/JDBC/input/storedProcedures/Test-sp_rename-vu-prepare.sql index e36d9b8dec8..254b4c46b08 100644 --- a/test/JDBC/input/storedProcedures/Test-sp_rename-vu-prepare.sql +++ b/test/JDBC/input/storedProcedures/Test-sp_rename-vu-prepare.sql @@ -75,4 +75,14 @@ GO CREATE TRIGGER sp_rename_vu_trig1 ON sp_rename_vu_table2 AFTER INSERT, UPDATE AS RAISERROR ('Testing sp_rename', 16, 10); -GO \ No newline at end of file +GO + +-- Dependency test for function babelfish_split_identifier +-- Create a view which depends upon babelfish_split_identifier function only +-- if the function exists. +IF OBJECT_ID('sys.babelfish_split_identifier') IS NOT NULL +BEGIN + EXEC sp_executesql N' + CREATE VIEW babelfish_split_identifier_view AS SELECT * FROM sys.babelfish_split_identifier(''ABC.DEF.GHI'')'; +END +GO diff --git a/test/JDBC/input/storedProcedures/Test-sp_rename-vu-verify.sql b/test/JDBC/input/storedProcedures/Test-sp_rename-vu-verify.sql index 69ef6bc3beb..c484b2fa351 100644 --- a/test/JDBC/input/storedProcedures/Test-sp_rename-vu-verify.sql +++ b/test/JDBC/input/storedProcedures/Test-sp_rename-vu-verify.sql @@ -226,4 +226,14 @@ GO -- Trigger EXEC sp_rename 'sp_rename_vu_trig1', 'sp_rename_vu_trig2', 'OBJECT'; -GO \ No newline at end of file +GO + +IF OBJECT_ID('babelfish_split_identifier_view') IS NULL +BEGIN + EXEC sp_executesql N' + CREATE VIEW babelfish_split_identifier_view AS SELECT * FROM sys.babelfish_split_identifier(''ABC.DEF.GHI'')'; +END +GO + +SELECT * FROM babelfish_split_identifier_view; +GO