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
65 changes: 44 additions & 21 deletions contrib/babelfishpg_tsql/sql/sys_functions.sql
Original file line number Diff line number Diff line change
Expand Up @@ -2056,36 +2056,59 @@ LANGUAGE C IMMUTABLE PARALLEL SAFE;

CREATE OR REPLACE FUNCTION sys.datename(IN dp PG_CATALOG.TEXT, IN arg anyelement) RETURNS TEXT AS
$BODY$
SELECT
CASE
WHEN dp = 'month'::text THEN
to_char(arg::sys.DATETIME, 'TMMonth')
DECLARE
date_arg_datatype regtype;
result TEXT;
datetimeoffset_value sys.datetimeoffset;
BEGIN
date_arg_datatype := pg_typeof(arg);

IF dp = 'month'::text THEN
result := to_char(arg::sys.DATETIME, 'TMMonth');
-- '1969-12-28' is a Sunday
WHEN dp = 'dow'::text THEN
to_char(arg::sys.DATETIME, 'TMDay')
ELSIF dp = 'dow'::text THEN
result := to_char(arg::sys.DATETIME, 'TMDay');
ELSIF dp = 'tzoffset'::text THEN
IF date_arg_datatype IN ('sys.datetimeoffset'::regtype, 'sys.datetime2'::regtype) THEN
-- Explicitly cast to datetimeoffset to validate
-- This will throw an error if the timezone offset is invalid
datetimeoffset_value := sys.babelfish_conv_string_to_datetimeoffset('DATETIMEOFFSET', arg::TEXT);
result := PG_CATALOG.RIGHT(datetimeoffset_value::PG_CATALOG.TEXT, 6);
ELSE
RAISE EXCEPTION 'The datepart tzoffset is not supported by date function datename for data type %.', date_arg_datatype;
END IF;
ELSE
sys.datepart(dp, arg)::TEXT
END
result := sys.datepart(dp, arg)::TEXT;
END IF;
RETURN result;
END;
$BODY$
STRICT
LANGUAGE sql IMMUTABLE;
LANGUAGE plpgsql IMMUTABLE;

-- Duplicate functions with arg TEXT since ANYELEMENT cannot handle type unknown.
-- Duplicate function with arg TEXT since ANYELEMENT cannot handle type unknown.
CREATE OR REPLACE FUNCTION sys.datename(IN dp PG_CATALOG.TEXT, IN arg TEXT) RETURNS TEXT AS
$BODY$
SELECT
CASE
WHEN dp = 'month'::text THEN
to_char(arg::date, 'TMMonth')
DECLARE
result TEXT;
datetimeoffset_value sys.datetimeoffset;
BEGIN
IF dp = 'month'::text THEN
result := to_char(arg::date, 'TMMonth');
-- '1969-12-28' is a Sunday
WHEN dp = 'dow'::text THEN
to_char(arg::date, 'TMDay')
ELSIF dp = 'dow'::text THEN
result := to_char(arg::date, 'TMDay');
ELSIF dp = 'tzoffset'::text THEN
-- Explicitly cast to datetimeoffset to validate
-- This will throw an error if the timezone offset is invalid
datetimeoffset_value := sys.babelfish_conv_string_to_datetimeoffset('DATETIMEOFFSET', arg);
result := PG_CATALOG.RIGHT(datetimeoffset_value::PG_CATALOG.TEXT, 6);
ELSE
sys.datepart(dp, arg)::TEXT
END
result := sys.datepart(dp, arg)::TEXT;
END IF;
RETURN result;
END;
$BODY$
STRICT
LANGUAGE sql IMMUTABLE;
LANGUAGE plpgsql IMMUTABLE;

-- These come from the built-in pg_catalog.count in pg_aggregate.dat
CREATE AGGREGATE sys.count(*)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1005,6 +1005,62 @@ END; $BODY$
LANGUAGE plpgsql
STABLE;

CREATE OR REPLACE FUNCTION sys.datename(IN dp PG_CATALOG.TEXT, IN arg anyelement) RETURNS TEXT AS
$BODY$
DECLARE
date_arg_datatype regtype;
result TEXT;
datetimeoffset_value sys.datetimeoffset;
BEGIN
date_arg_datatype := pg_typeof(arg);

IF dp = 'month'::text THEN
result := to_char(arg::sys.DATETIME, 'TMMonth');
-- '1969-12-28' is a Sunday
ELSIF dp = 'dow'::text THEN
result := to_char(arg::sys.DATETIME, 'TMDay');
ELSIF dp = 'tzoffset'::text THEN
IF date_arg_datatype IN ('sys.datetimeoffset'::regtype, 'sys.datetime2'::regtype) THEN
-- Explicitly cast to datetimeoffset to validate
-- This will throw an error if the timezone offset is invalid
datetimeoffset_value := sys.babelfish_conv_string_to_datetimeoffset('DATETIMEOFFSET', arg::TEXT);
result := PG_CATALOG.RIGHT(datetimeoffset_value::PG_CATALOG.TEXT, 6);
ELSE
RAISE EXCEPTION 'The datepart tzoffset is not supported by date function datename for data type %.', date_arg_datatype;
END IF;
ELSE
result := sys.datepart(dp, arg)::TEXT;
END IF;
RETURN result;
END;
$BODY$
LANGUAGE plpgsql IMMUTABLE;

-- Duplicate function with arg TEXT since ANYELEMENT cannot handle type unknown.
CREATE OR REPLACE FUNCTION sys.datename(IN dp PG_CATALOG.TEXT, IN arg TEXT) RETURNS TEXT AS
$BODY$
DECLARE
result TEXT;
datetimeoffset_value sys.datetimeoffset;
BEGIN
IF dp = 'month'::text THEN
result := to_char(arg::date, 'TMMonth');
-- '1969-12-28' is a Sunday
ELSIF dp = 'dow'::text THEN
result := to_char(arg::date, 'TMDay');
ELSIF dp = 'tzoffset'::text THEN
-- Explicitly cast to datetimeoffset to validate
-- This will throw an error if the timezone offset is invalid
datetimeoffset_value := sys.babelfish_conv_string_to_datetimeoffset('DATETIMEOFFSET', arg);
result := PG_CATALOG.RIGHT(datetimeoffset_value::PG_CATALOG.TEXT, 6);
ELSE
result := sys.datepart(dp, arg)::TEXT;
END IF;
RETURN result;
END;
$BODY$
LANGUAGE plpgsql IMMUTABLE;

-- 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);
Expand Down
2 changes: 1 addition & 1 deletion test/JDBC/expected/Datetime_system_functions.out
Original file line number Diff line number Diff line change
Expand Up @@ -3292,7 +3292,7 @@ SELECT
GO
~~START~~
varchar
FAIL: TZOFFSET issue
PASS: TZOFFSET works correctly
~~END~~


Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
DROP TABLE datename_tzoffset_test_cases;
GO

DROP TABLE datename_stability_test;
GO

DROP VIEW datename_tzoffset_no_offset_tests_view;
GO

DROP TABLE datename_tzoffset_different_test_scenarios;
GO
Loading
Loading