Skip to content

Commit 4d9c93c

Browse files
authored
Added support for sys.fn_varbintohexsubstring function (#3659)
This PR adds full support for sys.fn_varbintohexsubstring function, addressing a current limitation in Babelfish. The implementation includes essential system function sys.fn_varbintohexsubstring required for comprehensive login export capabilities. This function in Babelfish is built maintaining compatibility with TSQL syntax. Added Components Function: sys.fn_varbintohexsubstring: converts varbinary data to a hexadecimal string representation, optionally prefixed with '0x', with control over the starting position and length. BABEL-5654 Signed-off-by: Shreya Rai shreyaxr@amazon.com
1 parent 422c0f8 commit 4d9c93c

8 files changed

+546
-20
lines changed

contrib/babelfishpg_tsql/sql/sys_functions.sql

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4208,14 +4208,40 @@ BEGIN
42084208
END;
42094209
$$ LANGUAGE plpgsql STABLE;
42104210

4211-
CREATE OR REPLACE FUNCTION sys.fn_varbintohexsubstring(set_prefix INT, expression sys.varbinary(128), start_offset INT, length_to_return INT)
4212-
RETURNS sys.nvarchar(128)
4213-
AS $$
4211+
CREATE OR REPLACE FUNCTION sys.fn_varbintohexsubstring(set_prefix sys.BIT, expression sys.varbinary, start_offset INT, substr_length INT)
4212+
RETURNS sys.nvarchar AS
4213+
$$
42144214
DECLARE
4215+
pstrout sys.nvarchar;
4216+
hex_str text;
42154217
BEGIN
4216-
RETURN NULL;
4217-
END;
4218-
$$ LANGUAGE plpgsql STABLE;
4218+
IF expression IS NULL THEN
4219+
RETURN NULL;
4220+
END IF;
4221+
4222+
IF substr_length IS NULL OR substr_length <= 0 OR substr_length > sys.LEN(expression) THEN
4223+
substr_length := sys.LEN(expression);
4224+
END IF;
4225+
4226+
IF start_offset IS NULL OR start_offset < 1 OR start_offset > sys.LEN(expression) THEN
4227+
RETURN NULL;
4228+
END IF;
4229+
4230+
IF (sys.LEN(expression) - start_offset + 1) < substr_length THEN
4231+
substr_length := sys.LEN(expression) - start_offset + 1;
4232+
END IF;
4233+
4234+
hex_str := sys.LOWER(pg_catalog.ENCODE(sys.SUBSTRING(expression, start_offset, substr_length)::bytea, 'hex'));
4235+
4236+
pstrout := CASE
4237+
WHEN set_prefix IS NULL THEN N''
4238+
WHEN set_prefix = 0 THEN N''
4239+
ELSE N'0x'
4240+
END || hex_str;
4241+
RETURN pstrout;
4242+
END;
4243+
$$
4244+
LANGUAGE plpgsql IMMUTABLE;
42194245

42204246
CREATE OR REPLACE FUNCTION objectproperty(
42214247
id INT,

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

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1860,14 +1860,40 @@ BEGIN
18601860
END;
18611861
$$ LANGUAGE plpgsql STABLE;
18621862

1863-
CREATE OR REPLACE FUNCTION sys.fn_varbintohexsubstring(set_prefix INT, expression sys.varbinary(128), start_offset INT, length_to_return INT)
1864-
RETURNS sys.nvarchar(128)
1865-
AS $$
1863+
CREATE OR REPLACE FUNCTION sys.fn_varbintohexsubstring(set_prefix sys.BIT, expression sys.varbinary, start_offset INT, substr_length INT)
1864+
RETURNS sys.nvarchar AS
1865+
$$
18661866
DECLARE
1867+
pstrout sys.nvarchar;
1868+
hex_str text;
18671869
BEGIN
1868-
RETURN NULL;
1869-
END;
1870-
$$ LANGUAGE plpgsql STABLE;
1870+
IF expression IS NULL THEN
1871+
RETURN NULL;
1872+
END IF;
1873+
1874+
IF substr_length IS NULL OR substr_length <= 0 OR substr_length > sys.LEN(expression) THEN
1875+
substr_length := sys.LEN(expression);
1876+
END IF;
1877+
1878+
IF start_offset IS NULL OR start_offset < 1 OR start_offset > sys.LEN(expression) THEN
1879+
RETURN NULL;
1880+
END IF;
1881+
1882+
IF (sys.LEN(expression) - start_offset + 1) < substr_length THEN
1883+
substr_length := sys.LEN(expression) - start_offset + 1;
1884+
END IF;
1885+
1886+
hex_str := sys.LOWER(pg_catalog.ENCODE(sys.SUBSTRING(expression, start_offset, substr_length)::bytea, 'hex'));
1887+
1888+
pstrout := CASE
1889+
WHEN set_prefix IS NULL THEN N''
1890+
WHEN set_prefix = 0 THEN N''
1891+
ELSE N'0x'
1892+
END || hex_str;
1893+
RETURN pstrout;
1894+
END;
1895+
$$
1896+
LANGUAGE plpgsql IMMUTABLE;
18711897

18721898
CREATE OR REPLACE VIEW sys.server_permissions AS
18731899
WITH super_user AS (SELECT datdba AS super_user FROM pg_database WHERE datname = CURRENT_DATABASE())

test/JDBC/expected/sys-fn-varbintohexsubstring-vu-cleanup.out

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,24 @@ GO
66

77
DROP FUNCTION fn_varbintohexsubstring_vu_prepare_func
88
GO
9+
10+
DROP TABLE babel_5654_t1
11+
GO
12+
13+
DROP TABLE babel_5654_t2
14+
GO
15+
16+
DROP TABLE babel_5654_t3
17+
GO
18+
19+
DROP TYPE SetPrefixType
20+
GO
21+
22+
DROP TYPE ExpressionType
23+
GO
24+
25+
DROP TYPE StartOffsetType
26+
GO
27+
28+
DROP TYPE SubstrLengthType
29+
GO
Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,65 @@
11
-- Create dependant objects
22
CREATE VIEW fn_varbintohexsubstring_vu_prepare_view AS
3-
SELECT sys.fn_varbintohexsubstring(1, CAST('0x1234' AS varbinary(128)), 1, 4)
3+
SELECT sys.fn_varbintohexsubstring(1,0x1234, 1, 4)
44
GO
55

66
CREATE PROC fn_varbintohexsubstring_vu_prepare_proc AS
7-
SELECT sys.fn_varbintohexsubstring(1, CAST('0x1234' AS varbinary(128)), 1, 4)
7+
SELECT sys.fn_varbintohexsubstring(1,0x1234, 1, 4)
88
GO
99

1010
CREATE FUNCTION fn_varbintohexsubstring_vu_prepare_func()
1111
RETURNS nvarchar(128)
1212
AS
1313
BEGIN
14-
RETURN sys.fn_varbintohexsubstring(1, CAST('0x1234' AS varbinary(128)), 1, 4)
14+
RETURN sys.fn_varbintohexsubstring(1,0x1234, 1, 4)
1515
END
1616
GO
17+
18+
CREATE TABLE babel_5654_t1 (set_prefix sys.BIT,
19+
expression sys.varbinary(MAX),
20+
start_offset INT,
21+
substr_length INT,
22+
CHECK (sys.fn_varbintohexsubstring(set_prefix, expression, start_offset, substr_length) != NULL));
23+
GO
24+
25+
INSERT INTO babel_5654_t1 VALUES (0,0x123486534659789876435656,1,4)
26+
GO
27+
~~ROW COUNT: 1~~
28+
29+
30+
CREATE TABLE babel_5654_t2 (set_prefix sys.BIT,
31+
expression sys.varbinary(MAX),
32+
start_offset INT,
33+
substr_length INT,
34+
[varbintohexsubstring] AS sys.fn_varbintohexsubstring(set_prefix, expression, start_offset, substr_length));
35+
GO
36+
37+
INSERT INTO babel_5654_t2 VALUES (0,0x3486534659789876435656,1,4)
38+
GO
39+
~~ROW COUNT: 1~~
40+
41+
42+
CREATE TYPE SetPrefixType from sys.bit;
43+
GO
44+
45+
CREATE TYPE ExpressionType from sys.varbinary(MAX);
46+
GO
47+
48+
CREATE TYPE StartOffsetType from int;
49+
GO
50+
51+
CREATE TYPE SubstrLengthType from int;
52+
GO
53+
54+
CREATE TABLE babel_5654_t3 (set_prefix SetPrefixType,
55+
expression ExpressionType,
56+
start_offset StartOffsetType,
57+
substr_length SubstrLengthType,
58+
[varbintohexsubstring] AS sys.fn_varbintohexsubstring(set_prefix, expression, start_offset, substr_length));
59+
GO
60+
61+
INSERT INTO babel_5654_t3 VALUES (0,0x3486534659789876435656,1,4)
62+
GO
63+
~~ROW COUNT: 1~~
64+
65+

0 commit comments

Comments
 (0)