Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added support for sys.fn_varbintohexsubstring function #3551

Open
wants to merge 1 commit into
base: BABEL_5_X_DEV
Choose a base branch
from
Open
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
38 changes: 32 additions & 6 deletions contrib/babelfishpg_tsql/sql/sys_functions.sql
Original file line number Diff line number Diff line change
Expand Up @@ -4135,14 +4135,40 @@ BEGIN
END;
$$ LANGUAGE plpgsql STABLE;

CREATE OR REPLACE FUNCTION sys.fn_varbintohexsubstring(set_prefix INT, expression sys.varbinary(128), start_offset INT, length_to_return INT)
RETURNS sys.nvarchar(128)
AS $$
CREATE OR REPLACE FUNCTION sys.fn_varbintohexsubstring(set_prefix INT, expression sys.varbinary(128), start_offset INT, substr_length INT)
RETURNS sys.nvarchar(128) AS
$$
DECLARE
pstrout sys.nvarchar(128);
hex_str text;
BEGIN
RETURN NULL;
END;
$$ LANGUAGE plpgsql STABLE;
IF expression IS NULL THEN
RETURN NULL;
END IF;

IF substr_length IS NULL OR substr_length <= 0 OR substr_length > LEN(expression) THEN
substr_length := LEN(expression);
END IF;

IF start_offset < 1 OR start_offset > LEN(expression) THEN
RETURN NULL;
END IF;

IF (LEN(expression) - start_offset + 1) < substr_length THEN
substr_length := LEN(expression) - start_offset + 1;
END IF;

hex_str := LOWER(ENCODE(SUBSTRING(expression, start_offset, substr_length)::bytea, 'hex'));

pstrout := CASE
WHEN set_prefix IS NULL THEN N''
WHEN set_prefix = 0 THEN N''
ELSE N'0x'
END || hex_str;
RETURN pstrout;
END;
$$
LANGUAGE plpgsql STABLE;

CREATE OR REPLACE FUNCTION objectproperty(
id INT,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -450,11 +450,6 @@ BEGIN
END;
$$;

-- After upgrade, always run analyze for all babelfish catalogs.
CALL sys.analyze_babelfish_catalogs();
-- Reset search_path to not affect any subsequent scripts
SELECT set_config('search_path', trim(leading 'sys, ' from current_setting('search_path')), false);

CREATE OR REPLACE FUNCTION sys.loginproperty(login_name sys.sysname, property_name sys.nvarchar(128))
RETURNS sys.nvarchar(128)
AS $$
Expand All @@ -464,14 +459,40 @@ BEGIN
END;
$$ LANGUAGE plpgsql STABLE;

CREATE OR REPLACE FUNCTION sys.fn_varbintohexsubstring(set_prefix INT, expression sys.varbinary(128), start_offset INT, length_to_return INT)
RETURNS sys.nvarchar(128)
AS $$
CREATE OR REPLACE FUNCTION sys.fn_varbintohexsubstring(set_prefix INT, expression sys.varbinary(128), start_offset INT, substr_length INT)
RETURNS sys.nvarchar(128) AS
$$
DECLARE
pstrout sys.nvarchar(128);
hex_str text;
BEGIN
RETURN NULL;
END;
$$ LANGUAGE plpgsql STABLE;
IF expression IS NULL THEN
RETURN NULL;
END IF;

IF substr_length IS NULL OR substr_length <= 0 OR substr_length > LEN(expression) THEN
substr_length := LEN(expression);
END IF;

IF start_offset < 1 OR start_offset > LEN(expression) THEN
RETURN NULL;
END IF;

IF (LEN(expression) - start_offset + 1) < substr_length THEN
substr_length := LEN(expression) - start_offset + 1;
END IF;

hex_str := LOWER(ENCODE(SUBSTRING(expression, start_offset, substr_length)::bytea, 'hex'));

pstrout := CASE
WHEN set_prefix IS NULL THEN N''
WHEN set_prefix = 0 THEN N''
ELSE N'0x'
END || hex_str;
RETURN pstrout;
END;
$$
LANGUAGE plpgsql STABLE;

CREATE OR REPLACE VIEW sys.server_permissions
AS
Expand Down Expand Up @@ -523,3 +544,7 @@ SELECT
WHERE FALSE;
GRANT SELECT ON sys.sql_logins TO PUBLIC;

-- After upgrade, always run analyze for all babelfish catalogs.
CALL sys.analyze_babelfish_catalogs();
-- Reset search_path to not affect any subsequent scripts
SELECT set_config('search_path', trim(leading 'sys, ' from current_setting('search_path')), false);
189 changes: 187 additions & 2 deletions test/JDBC/expected/sys-fn-varbintohexsubstring-vu-verify.out
Original file line number Diff line number Diff line change
@@ -1,23 +1,208 @@
-- dependent objects
SELECT * FROM fn_varbintohexsubstring_vu_prepare_view
GO
~~START~~
nvarchar
<NULL>
0x30783132
~~END~~


EXEC fn_varbintohexsubstring_vu_prepare_proc
GO
~~START~~
nvarchar
<NULL>
0x30783132
~~END~~


SELECT * FROM fn_varbintohexsubstring_vu_prepare_func()
GO
~~START~~
nvarchar
0x30783132
~~END~~


-- NULL expression results in NULL output
SELECT sys.fn_varbintohexsubstring(0,0x,1,3);
GO
~~START~~
nvarchar
<NULL>
~~END~~


SELECT sys.fn_varbintohexsubstring(0,CAST(NULL AS VARBINARY),1,4);
GO
~~START~~
nvarchar
<NULL>
~~END~~


-- if substr_length is NULL, negative, zero or greater than length of expression, set substr_length as length of expression
SELECT sys.fn_varbintohexsubstring(1,0x123486534659789876435656,1,NULL);
GO
~~START~~
nvarchar
0x123486534659789876435656
~~END~~


SELECT sys.fn_varbintohexsubstring(1, 0x123486534659789876435656, 1, -5);
GO
~~START~~
nvarchar
0x123486534659789876435656
~~END~~


SELECT sys.fn_varbintohexsubstring(1,0x123486534659789876435656,1,0);
GO
~~START~~
nvarchar
0x123486534659789876435656
~~END~~


SELECT sys.fn_varbintohexsubstring(1,0x123486534659789876435656,1,100);
GO
~~START~~
nvarchar
0x123486534659789876435656
~~END~~


-- if substr_length is out of bounds of the expression, then len is set to the length of expression - start_offset
SELECT sys.fn_varbintohexsubstring(1, 0x123486534659789876435656, 3, 20);
GO
~~START~~
nvarchar
0x86534659789876435656
~~END~~


-- if set_prefix is NULL or 0, no prefix is added
SELECT sys.fn_varbintohexsubstring(NULL,0x123486534659789876435656,1,4);
GO
~~START~~
nvarchar
12348653
~~END~~


SELECT sys.fn_varbintohexsubstring(0,0x123486534659789876435656,1,4);
GO
~~START~~
nvarchar
12348653
~~END~~


-- if set_prefix is 1 or any other integer except 0, prefix is added
SELECT sys.fn_varbintohexsubstring(1,0x123486534659789876435656,1,4);
GO
~~START~~
nvarchar
0x12348653
~~END~~


SELECT sys.fn_varbintohexsubstring(52,0x123486534659789876435656,1,4);
GO
~~START~~
nvarchar
0x12348653
~~END~~


SELECT sys.fn_varbintohexsubstring(-81,0x123486534659789876435656,1,4);
GO
~~START~~
nvarchar
0x12348653
~~END~~


-- if start_offset is NULL or 0 or negative, return NULL
SELECT sys.fn_varbintohexsubstring(1,0x87243478679,NULL,4);
GO
~~START~~
nvarchar
<NULL>
~~END~~


SELECT sys.fn_varbintohexsubstring(1,0x87243478679,CAST(NULL AS INT),4);
GO
~~START~~
nvarchar
<NULL>
~~END~~


SELECT sys.fn_varbintohexsubstring(1,0x87243478679,0,4);
GO
~~START~~
nvarchar
<NULL>
~~END~~


SELECT sys.fn_varbintohexsubstring(1, 0x123456, -1, 2);
GO
~~START~~
nvarchar
<NULL>
~~END~~


-- if start_offset is out of bound, return NULL
SELECT sys.fn_varbintohexsubstring(1, 0x123456, 100, 2);
GO
~~START~~
nvarchar
<NULL>
~~END~~


-- NULL edge cases
SELECT sys.fn_varbintohexsubstring(NULL,NULL,NULL,NULL);
GO
~~START~~
nvarchar
<NULL>
~~END~~


SELECT sys.fn_varbintohexsubstring(NULL,0x8675235657899765,NULL,NULL);
GO
~~START~~
nvarchar
<NULL>
~~END~~


SELECT sys.fn_varbintohexsubstring(NULL,0x8675235657899765,2,NULL);
GO
~~START~~
nvarchar
75235657899765
~~END~~


--negative test as varbinary only consists of 0-9 and A-F
SELECT sys.fn_varbintohexsubstring(1,0x1452J5S4, 2, 4);
GO
~~ERROR (Code: 33557097)~~

~~ERROR (Message: syntax error near '.' at line 2 and character position 10)~~


-- negative test gives error as the expression datatype is not varbinary
SELECT sys.fn_varbintohexsubstring(1,'1A2B3C4D', 2, 4);
GO
~~ERROR (Code: 33557097)~~

~~ERROR (Message: cannot coerce string literal to varbinary datatype)~~

Loading
Loading