forked from babelfish-for-postgresql/babelfish_extensions
-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added BABEL-4519 related fix in tsql upgrade script 2.8.0--3.0.0 (bab…
…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
1 parent
a3f0dac
commit 084191e
Showing
2 changed files
with
104 additions
and
0 deletions.
There are no files selected for viewing
103 changes: 103 additions & 0 deletions
103
contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--2.8.0--3.0.0.sql
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters