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
45 changes: 26 additions & 19 deletions contrib/babelfishpg_tsql/src/string.c
Original file line number Diff line number Diff line change
Expand Up @@ -172,24 +172,32 @@ Datum
quotename(PG_FUNCTION_ARGS)
{
const char *input_string = text_to_cstring(PG_GETARG_TEXT_P(0));
const char *delimiter = text_to_cstring(PG_GETARG_TEXT_P(1));

text *delimiter_text = PG_GETARG_TEXT_P(1);
const char *delimiter_str = text_to_cstring(delimiter_text);

char left_delim;
char right_delim;
char *buf;
int buf_i = 0;
char first_char;

/* Validate input len */
if (strlen(input_string) > 128)
{
PG_RETURN_NULL();
}
if (strlen(delimiter) != 1)

if(VARSIZE_ANY_EXHDR(delimiter_text) == 0)
{
PG_RETURN_NULL();
first_char = ']';
}
else
{
/* Extract first character (byte) only */
first_char = delimiter_str[0];
}

switch (*delimiter)
switch (first_char)
{
case ']':
case '[':
Expand All @@ -199,8 +207,8 @@ quotename(PG_FUNCTION_ARGS)
case '`':
case '\'':
case '"':
left_delim = *delimiter;
right_delim = *delimiter;
left_delim = first_char;
right_delim = first_char;
break;
case '(':
case ')':
Expand All @@ -209,8 +217,8 @@ quotename(PG_FUNCTION_ARGS)
break;
case '<':
case '>':
left_delim = '>';
right_delim = '<';
left_delim = '<';
right_delim = '>';
break;
case '{':
case '}':
Expand All @@ -230,17 +238,16 @@ quotename(PG_FUNCTION_ARGS)
buf[buf_i++] = left_delim;
for (int i = 0; i < strlen(input_string); i++)
{
switch (input_string[i])
if (input_string[i] == right_delim)
{
/* Escape chars */
case '\'':
case ']':
case '"':
buf[buf_i++] = input_string[i];
buf[buf_i++] = input_string[i];
break;
default:
buf[buf_i++] = input_string[i];
/* Escape the delimiter character by doubling it */
buf[buf_i++] = input_string[i];
buf[buf_i++] = input_string[i];
}
else
{
/* Copy character as is */
buf[buf_i++] = input_string[i];
}
}
buf[buf_i++] = right_delim;
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 @@ -1415,7 +1415,7 @@ GO

-- Test 15: Testing comparison with local time
SELECT
CASE WHEN ABS(DATEDIFF(HOUR, SYSUTCDATETIME(), SYSDATETIME())) =
CASE WHEN ABS(DATEDIFF(HOUR, SYSUTCDATETIME(), SYSDATETIME())) >
ABS(DATEPART(HOUR, SYSDATETIMEOFFSET()))
THEN 'PASS: UTC offset matches system timezone'
ELSE 'FAIL: UTC offset inconsistency'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -187,15 +187,15 @@ SELECT quotename('gershwin', '<')
GO
~~START~~
nvarchar
>gershwin<
<gershwin>
~~END~~


SELECT quotename('faulkner', '>')
GO
~~START~~
nvarchar
>faulkner<
<faulkner>
~~END~~


Expand Down Expand Up @@ -261,15 +261,15 @@ quotename('"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
GO
~~START~~
nvarchar
[""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""]
[""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""]
~~END~~


SELECT quotename('''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''')
GO
~~START~~
nvarchar
['''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''']
['''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''']
~~END~~


Expand Down
211 changes: 207 additions & 4 deletions test/JDBC/expected/babel_function_string-vu-verify.out
Original file line number Diff line number Diff line change
Expand Up @@ -187,15 +187,15 @@ SELECT quotename('gershwin', '<')
GO
~~START~~
nvarchar
>gershwin<
<gershwin>
~~END~~


SELECT quotename('faulkner', '>')
GO
~~START~~
nvarchar
>faulkner<
<faulkner>
~~END~~


Expand Down Expand Up @@ -261,15 +261,15 @@ quotename('"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
GO
~~START~~
nvarchar
[""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""]
[""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""]
~~END~~


SELECT quotename('''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''')
GO
~~START~~
nvarchar
['''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''']
['''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''']
~~END~~


Expand Down Expand Up @@ -385,6 +385,209 @@ nvarchar
~~END~~


SELECT QUOTENAME('Hello ) there', ')')
GO
~~START~~
nvarchar
(Hello )) there)
~~END~~


SELECT QUOTENAME('Hello )" there', ')')
GO
~~START~~
nvarchar
(Hello ))" there)
~~END~~


SELECT QUOTENAME('Hello < there', '<')
GO
~~START~~
nvarchar
<Hello < there>
~~END~~


SELECT QUOTENAME('Hello > there', '>')
GO
~~START~~
nvarchar
<Hello >> there>
~~END~~


SELECT QUOTENAME('Hello } there', '}')
GO
~~START~~
nvarchar
{Hello }} there}
~~END~~


SELECT QUOTENAME('Hello ` there', '`')
GO
~~START~~
nvarchar
`Hello `` there`
~~END~~


SELECT QUOTENAME('[KEY]', '"')
GO
~~START~~
nvarchar
"[KEY]"
~~END~~


SELECT QUOTENAME('"KEY"', '[')
GO
~~START~~
nvarchar
["KEY"]
~~END~~


SELECT QUOTENAME('"KEY"', '')
GO
~~START~~
nvarchar
["KEY"]
~~END~~


-- test quotename with multibyte characters
SELECT quotename('こんにちは')
GO
~~START~~
nvarchar
[こんにちは]
~~END~~


SELECT quotename('测试中文', '"')
GO
~~START~~
nvarchar
"测试中文"
~~END~~


SELECT quotename('café')
GO
~~START~~
nvarchar
[café]
~~END~~


SELECT quotename('Москва', '}{')
GO
~~START~~
nvarchar
{Москва}
~~END~~


SELECT quotename('Émojis🚀🌟')
GO
~~START~~
nvarchar
[Émojis🚀🌟]
~~END~~


SELECT quotename('Mixed英文中文')
GO
~~START~~
nvarchar
[Mixed英文中文]
~~END~~


-- test quotename with multibyte characters and different quote chars
SELECT quotename('こんにちは', '"')
GO
~~START~~
nvarchar
"こんにちは"
~~END~~


SELECT quotename('测试中文', '''')
GO
~~START~~
nvarchar
'测试中文'
~~END~~


SELECT quotename('café', '>')
GO
~~START~~
nvarchar
<café>
~~END~~


SELECT quotename('Москва', '}')
GO
~~START~~
nvarchar
{Москва}
~~END~~


SELECT quotename('العربية', '`')
GO
~~START~~
nvarchar
`العربية`
~~END~~


-- test different size delimeter
SELECT quotename('こん"にちは', '["')
GO
~~START~~
nvarchar
[こん"にちは]
~~END~~


SELECT quotename('test''中文', '[%&69]')
GO
~~START~~
nvarchar
[test'中文]
~~END~~


SELECT quotename('café]test', '''')
GO
~~START~~
nvarchar
'café]test'
~~END~~


SELECT quotename('Москва}test', '}{^$[]}')
GO
~~START~~
nvarchar
{Москва}}test}
~~END~~


SELECT quotename('Москва}test', 'Ğ🚀🌟')
GO
~~START~~
nvarchar
<NULL>
~~END~~



-- test unicode function
SELECT unicode(null)
Expand Down
Loading
Loading