Skip to content

Commit

Permalink
Added BABEL-4519 related fix in tsql upgrade script 2.8.0--3.0.0 (bab…
Browse files Browse the repository at this point in the history
…elfish-for-postgresql#2041)

Fix added in PR-2019 should also present in babelfishpg_tsql--2.8.0--3.0.0.sql.

This PR will update babelfishpg_tsql--2.8.0--3.0.0.sql to add fix mentioned in PR-2019. Updated expected_drop.out.

Task: BABEL-4519
Signed-off-by: Rohit Bhagat <[email protected]>
  • Loading branch information
rohit01010 authored and Jason Teng committed Dec 24, 2023
1 parent a3f0dac commit 084191e
Show file tree
Hide file tree
Showing 2 changed files with 104 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
-- complain if script is sourced in psql, rather than via ALTER EXTENSION
\echo Use "ALTER EXTENSION ""babelfishpg_tsql"" UPDATE TO '3.0.0'" to load this file. \quit

-- add 'sys' to search path for the convenience
SELECT set_config('search_path', 'sys, '||current_setting('search_path'), false);

-- please add your SQL here

CREATE OR REPLACE FUNCTION sys.babelfish_update_server_collation_name() RETURNS VOID
LANGUAGE C
AS 'babelfishpg_common', 'babelfish_update_server_collation_name';

SELECT sys.babelfish_update_server_collation_name();

DROP FUNCTION sys.babelfish_update_server_collation_name();

-- reset babelfishpg_tsql.restored_server_collation_name GUC
do
language plpgsql
$$
declare
query text;
begin
query := pg_catalog.format('alter database %s reset babelfishpg_tsql.restored_server_collation_name', CURRENT_DATABASE());
execute query;
end;
$$;

CREATE OR REPLACE FUNCTION sys.datepart_internal(IN datepart PG_CATALOG.TEXT, IN arg anyelement,IN df_tz INTEGER DEFAULT 0) RETURNS INTEGER AS $$
DECLARE
result INTEGER;
first_day DATE;
first_week_end INTEGER;
day INTEGER;
BEGIN
CASE datepart
WHEN 'dow' THEN
result = (date_part(datepart, arg)::INTEGER - current_setting('babelfishpg_tsql.datefirst')::INTEGER + 7) % 7 + 1;
WHEN 'tsql_week' THEN
first_day = make_date(date_part('year', arg)::INTEGER, 1, 1);
first_week_end = 8 - sys.datepart_internal('dow', first_day)::INTEGER;
day = date_part('doy', arg)::INTEGER;
IF day <= first_week_end THEN
result = 1;
ELSE
result = 2 + (day - first_week_end - 1) / 7;
END IF;
WHEN 'second' THEN
result = TRUNC(date_part(datepart, arg))::INTEGER;
WHEN 'millisecond' THEN
result = right(date_part(datepart, arg)::TEXT, 3)::INTEGER;
WHEN 'microsecond' THEN
result = right(date_part(datepart, arg)::TEXT, 6)::INTEGER;
WHEN 'nanosecond' THEN
-- Best we can do - Postgres does not support nanosecond precision
result = right(date_part('microsecond', arg)::TEXT, 6)::INTEGER * 1000;
WHEN 'tzoffset' THEN
-- timezone for datetimeoffset
result = df_tz;
ELSE
result = date_part(datepart, arg)::INTEGER;
END CASE;
RETURN result;
EXCEPTION WHEN invalid_parameter_value or feature_not_supported THEN
-- date_part() throws an exception when trying to get day/month/year etc. from
-- TIME, so we just need to catch the exception in this case
-- date_part() returns 0 when trying to get hour/minute/second etc. from
-- DATE, which is the desirable behavior for datepart() as well.
-- If the date argument data type does not have the specified datepart,
-- date_part() will return the default value for that datepart.
CASE datepart
-- Case for datepart is year, yy and yyyy, all mappings are defined in gram.y.
WHEN 'year' THEN RETURN 1900;
-- Case for datepart is quater, qq and q
WHEN 'quarter' THEN RETURN 1;
-- Case for datepart is month, mm and m
WHEN 'month' THEN RETURN 1;
-- Case for datepart is day, dd and d
WHEN 'day' THEN RETURN 1;
-- Case for datepart is dayofyear, dy
WHEN 'doy' THEN RETURN 1;
-- Case for datepart is y(also refers to dayofyear)
WHEN 'y' THEN RETURN 1;
-- Case for datepart is week, wk and ww
WHEN 'tsql_week' THEN RETURN 1;
-- Case for datepart is iso_week, isowk and isoww
WHEN 'week' THEN RETURN 1;
-- Case for datepart is tzoffset and tz
WHEN 'tzoffset' THEN RETURN 0;
-- Case for datepart is weekday and dw, return dow according to datefirst
WHEN 'dow' THEN
RETURN (1 - current_setting('babelfishpg_tsql.datefirst')::INTEGER + 7) % 7 + 1 ;
ELSE
RAISE EXCEPTION '''%'' is not a recognized datepart option', datepart;
RETURN -1;
END CASE;
END;
$$
STRICT
LANGUAGE plpgsql IMMUTABLE;

-- Reset search_path to not affect any subsequent scripts
SELECT set_config('search_path', trim(leading 'sys, ' from current_setting('search_path')), false);
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ Unexpected drop found for function sys.babelfish_update_server_collation_name in
Unexpected drop found for function sys.babelfish_update_server_collation_name in file babelfishpg_tsql--2.5.0--3.0.0.sql
Unexpected drop found for function sys.babelfish_update_server_collation_name in file babelfishpg_tsql--2.6.0--3.0.0.sql
Unexpected drop found for function sys.babelfish_update_server_collation_name in file babelfishpg_tsql--2.7.0--3.0.0.sql
Unexpected drop found for function sys.babelfish_update_server_collation_name in file babelfishpg_tsql--2.8.0--3.0.0.sql
Unexpected drop found for function sys.babelfishpg_common_get_babel_server_collation_oid in file babelfishpg_common--2.2.0--2.3.0.sql
Unexpected drop found for function sys.babelfishpg_tsql_get_babel_server_collation_oid in file babelfishpg_tsql--2.2.0--2.3.0.sql
Unexpected drop found for function sys.babelfishpg_tsql_get_babel_server_collation_oid in file babelfishpg_tsql--2.3.0--3.0.0.sql
Expand Down

0 comments on commit 084191e

Please sign in to comment.