Skip to content

Commit 7cb777a

Browse files
author
RUI LUO
committed
Make round() function more clear on return types based on argument type and the number of arguments following sql server style
Signed-off-by: RUI LUO <[email protected]>
1 parent fe366e1 commit 7cb777a

26 files changed

+1834
-32
lines changed

contrib/babelfishpg_common/src/babelfishpg_common.c

+4
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,10 @@ get_common_utility_plugin(void)
190190
common_utility_plugin_var.is_tsql_decimal_datatype = &is_tsql_decimal_datatype;
191191
common_utility_plugin_var.is_tsql_sqlvariant_datatype = &is_tsql_sqlvariant_datatype;
192192
common_utility_plugin_var.is_tsql_rowversion_or_timestamp_datatype = &is_tsql_rowversion_or_timestamp_datatype;
193+
common_utility_plugin_var.is_tsql_tinyint_datatype = &is_tsql_tinyint_datatype;
194+
common_utility_plugin_var.is_tsql_money_datatype = &is_tsql_money_datatype;
195+
common_utility_plugin_var.is_tsql_smallmoney_datatype = &is_tsql_smallmoney_datatype;
196+
193197
common_utility_plugin_var.datetime_in_str = &datetime_in_str;
194198
common_utility_plugin_var.datetime2sqlvariant = &datetime2sqlvariant;
195199
common_utility_plugin_var.timestamptz_datetimeoffset = &timestamptz_datetimeoffset;

contrib/babelfishpg_common/src/babelfishpg_common.h

+4
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ typedef struct common_utility_plugin
6262
bool (*is_tsql_decimal_datatype) (Oid oid);
6363
bool (*is_tsql_sqlvariant_datatype) (Oid oid);
6464
bool (*is_tsql_rowversion_or_timestamp_datatype) (Oid oid);
65+
bool (*is_tsql_tinyint_datatype) (Oid oid);
66+
bool (*is_tsql_money_datatype) (Oid oid);
67+
bool (*is_tsql_smallmoney_datatype) (Oid oid);
68+
6569
Datum (*datetime_in_str) (char *str, Node *escontext);
6670
Datum (*datetime2sqlvariant) (PG_FUNCTION_ARGS);
6771
Datum (*timestamptz_datetimeoffset) (PG_FUNCTION_ARGS);

contrib/babelfishpg_common/src/typecode.c

+27
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,9 @@ Oid tsql_sqlvariant_oid = InvalidOid;
289289
Oid tsql_geography_oid = InvalidOid;
290290
Oid tsql_geometry_oid = InvalidOid;
291291
Oid tsql_sysname_oid = InvalidOid;
292+
Oid tsql_tinyint_oid = InvalidOid;
293+
Oid tsql_money_oid = InvalidOid;
294+
Oid tsql_smallmoney_oid = InvalidOid;
292295

293296
Oid
294297
lookup_tsql_datatype_oid(const char *typename)
@@ -492,6 +495,30 @@ is_tsql_sqlvariant_datatype(Oid oid)
492495
return tsql_sqlvariant_oid == oid;
493496
}
494497

498+
bool
499+
is_tsql_tinyint_datatype(Oid oid)
500+
{
501+
if (tsql_tinyint_oid == InvalidOid)
502+
tsql_tinyint_oid = lookup_tsql_datatype_oid("tinyint");
503+
return tsql_tinyint_oid == oid;
504+
}
505+
506+
bool
507+
is_tsql_money_datatype(Oid oid)
508+
{
509+
if (tsql_money_oid == InvalidOid)
510+
tsql_money_oid = lookup_tsql_datatype_oid("money");
511+
return tsql_money_oid == oid;
512+
}
513+
514+
bool
515+
is_tsql_smallmoney_datatype(Oid oid)
516+
{
517+
if (tsql_smallmoney_oid == InvalidOid)
518+
tsql_smallmoney_oid = lookup_tsql_datatype_oid("smallmoney");
519+
return tsql_smallmoney_oid == oid;
520+
}
521+
495522
/*
496523
* handle_type_and_collation - is implemented to handle the domain id and
497524
* collation id assigned to FuncExpr of the target column. (Maily for target types

contrib/babelfishpg_common/src/typecode.h

+3
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,9 @@ extern bool is_tsql_smalldatetime_datatype(Oid oid);
107107
extern bool is_tsql_datetimeoffset_datatype(Oid oid);
108108
extern bool is_tsql_decimal_datatype(Oid oid);
109109
extern bool is_tsql_sqlvariant_datatype(Oid oid);
110+
extern bool is_tsql_tinyint_datatype(Oid oid);
111+
extern bool is_tsql_money_datatype(Oid oid);
112+
extern bool is_tsql_smallmoney_datatype(Oid oid);
110113

111114
extern void handle_type_and_collation(struct Node *node, Oid typid, Oid collationid);
112115
extern bool check_target_type_is_sys_varchar(Oid funcid);

contrib/babelfishpg_tsql/sql/sys_functions.sql

+75-2
Original file line numberDiff line numberDiff line change
@@ -1570,11 +1570,84 @@ AS 'babelfishpg_tsql', 'datalength' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
15701570
-- TODO: in MSSQL datalength against varchar(max) will return BIGINT instead of INTEGER. However in PG we ignore typmods in functions.
15711571
-- However this is not a critical issue so we will just leave it. We may come back to this difference later once we find out solution to typmods.
15721572

1573+
-- The sys.round functions here are created depending on the number of arguments and return type
15731574
CREATE OR REPLACE FUNCTION sys.round(number PG_CATALOG.NUMERIC, length INTEGER)
1574-
RETURNS NUMERIC AS 'babelfishpg_common', 'tsql_numeric_round' LANGUAGE C IMMUTABLE PARALLEL SAFE;
1575+
RETURNS sys.DECIMAL AS 'babelfishpg_common', 'tsql_numeric_round' LANGUAGE C IMMUTABLE PARALLEL SAFE;
15751576

15761577
CREATE OR REPLACE FUNCTION sys.round(number PG_CATALOG.NUMERIC, length INTEGER, function INTEGER)
1577-
RETURNS NUMERIC AS 'babelfishpg_common', 'tsql_numeric_trunc' LANGUAGE C IMMUTABLE PARALLEL SAFE;
1578+
RETURNS sys.DECIMAL AS 'babelfishpg_common', 'tsql_numeric_trunc' LANGUAGE C IMMUTABLE PARALLEL SAFE;
1579+
1580+
CREATE OR REPLACE FUNCTION sys.round(number INTEGER, length INTEGER)
1581+
RETURNS sys.INT
1582+
AS $$
1583+
BEGIN
1584+
RETURN sys.round(number::PG_CATALOG.NUMERIC, length);
1585+
END;
1586+
$$
1587+
LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;
1588+
1589+
CREATE OR REPLACE FUNCTION sys.round(number INTEGER, length INTEGER, function INTEGER)
1590+
RETURNS sys.INT
1591+
AS $$
1592+
BEGIN
1593+
RETURN sys.round(number::PG_CATALOG.NUMERIC, length, function);
1594+
END;
1595+
$$
1596+
LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;
1597+
1598+
CREATE OR REPLACE FUNCTION sys.round(number sys.BIGINT, length INTEGER)
1599+
RETURNS sys.BIGINT
1600+
AS $$
1601+
BEGIN
1602+
RETURN sys.round(number::PG_CATALOG.NUMERIC, length);
1603+
END;
1604+
$$
1605+
LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;
1606+
1607+
CREATE OR REPLACE FUNCTION sys.round(number sys.BIGINT, length INTEGER, function INTEGER)
1608+
RETURNS sys.BIGINT
1609+
AS $$
1610+
BEGIN
1611+
RETURN sys.round(number::PG_CATALOG.NUMERIC, length, function);
1612+
END;
1613+
$$
1614+
LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;
1615+
1616+
CREATE OR REPLACE FUNCTION sys.round(number sys.fixeddecimal, length INTEGER)
1617+
RETURNS sys.money
1618+
AS $$
1619+
BEGIN
1620+
RETURN sys.round(number::PG_CATALOG.NUMERIC, length);
1621+
END;
1622+
$$
1623+
LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;
1624+
1625+
CREATE OR REPLACE FUNCTION sys.round(number sys.fixeddecimal, length INTEGER, function INTEGER)
1626+
RETURNS sys.money
1627+
AS $$
1628+
BEGIN
1629+
RETURN sys.round(number::PG_CATALOG.NUMERIC, length, function);
1630+
END;
1631+
$$
1632+
LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;
1633+
1634+
CREATE OR REPLACE FUNCTION sys.round(number sys.float, length INTEGER)
1635+
RETURNS sys.float
1636+
AS $$
1637+
BEGIN
1638+
RETURN sys.round(number::PG_CATALOG.NUMERIC, length);
1639+
END;
1640+
$$
1641+
LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;
1642+
1643+
CREATE OR REPLACE FUNCTION sys.round(number sys.float, length INTEGER, function INTEGER)
1644+
RETURNS sys.float
1645+
AS $$
1646+
BEGIN
1647+
RETURN sys.round(number::PG_CATALOG.NUMERIC, length, function);
1648+
END;
1649+
$$
1650+
LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;
15781651

15791652
CREATE OR REPLACE FUNCTION sys.day(date ANYELEMENT)
15801653
RETURNS INTEGER AS

contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--4.5.0--4.6.0.sql

+165-1
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,175 @@
44
-- add 'sys' to search path for the convenience
55
SELECT set_config('search_path', 'sys, '||current_setting('search_path'), false);
66

7+
-- Drops an object if it does not have any dependent objects.
8+
-- Is a temporary procedure for use by the upgrade script. Will be dropped at the end of the upgrade.
9+
-- Please have this be one of the first statements executed in this upgrade script.
10+
CREATE OR REPLACE PROCEDURE babelfish_drop_deprecated_object(object_type varchar, schema_name varchar, object_name varchar) AS
11+
$$
12+
DECLARE
13+
error_msg text;
14+
query1 text;
15+
query2 text;
16+
BEGIN
17+
18+
query1 := pg_catalog.format('alter extension babelfishpg_tsql drop %s %s.%s', object_type, schema_name, object_name);
19+
query2 := pg_catalog.format('drop %s %s.%s', object_type, schema_name, object_name);
20+
21+
execute query1;
22+
execute query2;
23+
EXCEPTION
24+
when object_not_in_prerequisite_state then --if 'alter extension' statement fails
25+
GET STACKED DIAGNOSTICS error_msg = MESSAGE_TEXT;
26+
raise warning '%', error_msg;
27+
when dependent_objects_still_exist then --if 'drop view' statement fails
28+
GET STACKED DIAGNOSTICS error_msg = MESSAGE_TEXT;
29+
raise warning '%', error_msg;
30+
when undefined_function then --if 'Deprecated function does not exist'
31+
GET STACKED DIAGNOSTICS error_msg = MESSAGE_TEXT;
32+
raise warning '%', error_msg;
33+
end
34+
$$
35+
LANGUAGE plpgsql;
36+
737
-- Please add your SQLs here
838
/*
939
* Note: These SQL statements may get executed multiple times specially when some features get backpatched.
1040
* So make sure that any SQL statement (DDL/DML) being added here can be executed multiple times without affecting
1141
* final behaviour.
1242
*/
1343

44+
-- The sys.round functions here are created depending on the number of arguments and return type
45+
DO $$
46+
DECLARE
47+
exception_message text;
48+
BEGIN
49+
ALTER FUNCTION sys.round(number PG_CATALOG.NUMERIC, length INTEGER) RENAME TO bbf_numeric_round_deprecated_4_6_0;
50+
51+
EXCEPTION WHEN OTHERS THEN
52+
GET STACKED DIAGNOSTICS
53+
exception_message = MESSAGE_TEXT;
54+
RAISE WARNING '%', exception_message;
55+
END;
56+
$$;
57+
58+
CALL sys.babelfish_drop_deprecated_object('function', 'sys', 'bbf_numeric_round_deprecated_4_6_0');
59+
60+
61+
DO $$
62+
DECLARE
63+
exception_message text;
64+
BEGIN
65+
ALTER FUNCTION sys.round(number PG_CATALOG.NUMERIC, length INTEGER, function INTEGER) RENAME TO bbf_numeric_trunc_deprecated_4_6_0;
66+
67+
EXCEPTION WHEN OTHERS THEN
68+
GET STACKED DIAGNOSTICS
69+
exception_message = MESSAGE_TEXT;
70+
RAISE WARNING '%', exception_message;
71+
END;
72+
$$;
73+
74+
CALL sys.babelfish_drop_deprecated_object('function', 'sys', 'bbf_numeric_trunc_deprecated_4_6_0');
75+
76+
CREATE OR REPLACE FUNCTION sys.round(number PG_CATALOG.NUMERIC, length INTEGER)
77+
RETURNS sys.DECIMAL AS 'babelfishpg_common', 'tsql_numeric_round' LANGUAGE C IMMUTABLE PARALLEL SAFE;
78+
GRANT EXECUTE ON FUNCTION sys.round(number PG_CATALOG.NUMERIC, length INTEGER) TO PUBLIC;
79+
80+
81+
CREATE OR REPLACE FUNCTION sys.round(number PG_CATALOG.NUMERIC, length INTEGER, function INTEGER)
82+
RETURNS sys.DECIMAL AS 'babelfishpg_common', 'tsql_numeric_trunc' LANGUAGE C IMMUTABLE PARALLEL SAFE;
83+
GRANT EXECUTE ON FUNCTION sys.round(number PG_CATALOG.NUMERIC, length INTEGER, function INTEGER) TO PUBLIC;
84+
85+
86+
CREATE OR REPLACE FUNCTION sys.round(number INTEGER, length INTEGER)
87+
RETURNS sys.INT
88+
AS $$
89+
BEGIN
90+
RETURN sys.round(number::PG_CATALOG.NUMERIC, length);
91+
END;
92+
$$
93+
LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;
94+
GRANT EXECUTE ON FUNCTION sys.round(number INTEGER, length INTEGER) TO PUBLIC;
95+
96+
97+
CREATE OR REPLACE FUNCTION sys.round(number INTEGER, length INTEGER, function INTEGER)
98+
RETURNS sys.INT
99+
AS $$
100+
BEGIN
101+
RETURN sys.round(number::PG_CATALOG.NUMERIC, length, function);
102+
END;
103+
$$
104+
LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;
105+
GRANT EXECUTE ON FUNCTION sys.round(number INTEGER, length INTEGER, function INTEGER) TO PUBLIC;
106+
107+
108+
CREATE OR REPLACE FUNCTION sys.round(number sys.BIGINT, length INTEGER)
109+
RETURNS sys.BIGINT
110+
AS $$
111+
BEGIN
112+
RETURN sys.round(number::PG_CATALOG.NUMERIC, length);
113+
END;
114+
$$
115+
LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;
116+
GRANT EXECUTE ON FUNCTION sys.round(number sys.BIGINT, length INTEGER) TO PUBLIC;
117+
118+
119+
120+
CREATE OR REPLACE FUNCTION sys.round(number sys.BIGINT, length INTEGER, function INTEGER)
121+
RETURNS sys.BIGINT
122+
AS $$
123+
BEGIN
124+
RETURN sys.round(number::PG_CATALOG.NUMERIC, length, function);
125+
END;
126+
$$
127+
LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;
128+
GRANT EXECUTE ON FUNCTION sys.round(number sys.BIGINT, length INTEGER, function INTEGER) TO PUBLIC;
129+
130+
131+
CREATE OR REPLACE FUNCTION sys.round(number sys.fixeddecimal, length INTEGER)
132+
RETURNS sys.money
133+
AS $$
134+
BEGIN
135+
RETURN sys.round(number::PG_CATALOG.NUMERIC, length);
136+
END;
137+
$$
138+
LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;
139+
GRANT EXECUTE ON FUNCTION sys.round(number sys.fixeddecimal, length INTEGER) TO PUBLIC;
140+
141+
142+
CREATE OR REPLACE FUNCTION sys.round(number sys.fixeddecimal, length INTEGER, function INTEGER)
143+
RETURNS sys.money
144+
AS $$
145+
BEGIN
146+
RETURN sys.round(number::PG_CATALOG.NUMERIC, length, function);
147+
END;
148+
$$
149+
LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;
150+
GRANT EXECUTE ON FUNCTION sys.round(number sys.fixeddecimal, length INTEGER, function INTEGER) TO PUBLIC;
151+
152+
153+
CREATE OR REPLACE FUNCTION sys.round(number sys.float, length INTEGER)
154+
RETURNS sys.float
155+
AS $$
156+
BEGIN
157+
RETURN sys.round(number::PG_CATALOG.NUMERIC, length);
158+
END;
159+
$$
160+
LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;
161+
GRANT EXECUTE ON FUNCTION sys.round(number sys.float, length INTEGER) TO PUBLIC;
162+
163+
164+
CREATE OR REPLACE FUNCTION sys.round(number sys.float, length INTEGER, function INTEGER)
165+
RETURNS sys.float
166+
AS $$
167+
BEGIN
168+
RETURN sys.round(number::PG_CATALOG.NUMERIC, length, function);
169+
END;
170+
$$
171+
LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;
172+
GRANT EXECUTE ON FUNCTION sys.round(number sys.float, length INTEGER, function INTEGER) TO PUBLIC;
173+
174+
175+
14176
CREATE OR REPLACE FUNCTION sys.suser_name()
15177
RETURNS sys.NVARCHAR(128)
16178
AS $$
@@ -705,7 +867,9 @@ CAST('GRANT OR DENY' as SYS.NVARCHAR(128)) as USAGE;
705867

706868
GRANT SELECT ON sys.login_token TO PUBLIC;
707869

708-
870+
-- Drops the temporary procedure used by the upgrade script.
871+
-- Please have this be one of the last statements executed in this upgrade script.
872+
DROP PROCEDURE sys.babelfish_drop_deprecated_object(varchar, varchar, varchar);
709873

710874
-- After upgrade, always run analyze for all babelfish catalogs.
711875
CALL sys.analyze_babelfish_catalogs();

0 commit comments

Comments
 (0)