Skip to content

Commit 4599906

Browse files
jrgemignaniMuhammadTahaNaveed
authored andcommitted
Fix issue 2201: unexpected empty string behavior (#2203)
This PR fixes the issue of some string functions returning NULL instead of the empty string. The string functions affected and corrected are - reverse, toupper, tolower, rtrim, ltrim, trim, right, left, substring, and replace. Added additional regression tests. Corrected previous tests. modified: regress/expected/expr.out modified: regress/sql/expr.sql modified: src/backend/utils/adt/agtype.c
1 parent 0ca6d2a commit 4599906

File tree

3 files changed

+281
-86
lines changed

3 files changed

+281
-86
lines changed

regress/expected/expr.out

Lines changed: 213 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3927,6 +3927,41 @@ SELECT * FROM age_reverse('gnirts a si siht'::cstring);
39273927
"this is a string"
39283928
(1 row)
39293929

3930+
-- should return empty string
3931+
SELECT * FROM age_reverse('');
3932+
age_reverse
3933+
-------------
3934+
""
3935+
(1 row)
3936+
3937+
SELECT * FROM age_reverse(''::text);
3938+
age_reverse
3939+
-------------
3940+
""
3941+
(1 row)
3942+
3943+
SELECT * FROM age_reverse(''::cstring);
3944+
age_reverse
3945+
-------------
3946+
""
3947+
(1 row)
3948+
3949+
SELECT * FROM cypher('expr', $$
3950+
RETURN reverse('')
3951+
$$) AS (result agtype);
3952+
result
3953+
--------
3954+
""
3955+
(1 row)
3956+
3957+
SELECT * FROM cypher('expr', $$
3958+
RETURN reverse("")
3959+
$$) AS (result agtype);
3960+
result
3961+
--------
3962+
""
3963+
(1 row)
3964+
39303965
-- should return null
39313966
SELECT * FROM cypher('expr', $$
39323967
RETURN reverse(null)
@@ -4104,6 +4139,75 @@ SELECT * FROM age_tolower('CSTRING'::cstring);
41044139
"cstring"
41054140
(1 row)
41064141

4142+
-- should return empty string
4143+
SELECT * FROM age_toupper('');
4144+
age_toupper
4145+
-------------
4146+
""
4147+
(1 row)
4148+
4149+
SELECT * FROM age_toupper(''::text);
4150+
age_toupper
4151+
-------------
4152+
""
4153+
(1 row)
4154+
4155+
SELECT * FROM age_toupper(''::cstring);
4156+
age_toupper
4157+
-------------
4158+
""
4159+
(1 row)
4160+
4161+
SELECT * FROM cypher('expr', $$
4162+
RETURN toupper('')
4163+
$$) AS (result agtype);
4164+
result
4165+
--------
4166+
""
4167+
(1 row)
4168+
4169+
SELECT * FROM cypher('expr', $$
4170+
RETURN toupper("")
4171+
$$) AS (result agtype);
4172+
result
4173+
--------
4174+
""
4175+
(1 row)
4176+
4177+
SELECT * FROM age_tolower('');
4178+
age_tolower
4179+
-------------
4180+
""
4181+
(1 row)
4182+
4183+
SELECT * FROM age_tolower(''::text);
4184+
age_tolower
4185+
-------------
4186+
""
4187+
(1 row)
4188+
4189+
SELECT * FROM age_tolower(''::cstring);
4190+
age_tolower
4191+
-------------
4192+
""
4193+
(1 row)
4194+
4195+
SELECT * FROM cypher('expr', $$
4196+
RETURN tolower('')
4197+
$$) AS (result agtype);
4198+
result
4199+
--------
4200+
""
4201+
(1 row)
4202+
4203+
SELECT * FROM cypher('expr', $$
4204+
RETURN tolower("")
4205+
$$) AS (result agtype);
4206+
result
4207+
--------
4208+
""
4209+
(1 row)
4210+
41074211
-- should return null
41084212
SELECT * FROM cypher('expr', $$
41094213
RETURN toUpper(null)
@@ -4211,6 +4315,73 @@ SELECT * FROM age_trim(' string ');
42114315
"string"
42124316
(1 row)
42134317

4318+
-- should return empty string
4319+
SELECT * FROM cypher('expr', $$
4320+
RETURN lTrim('')
4321+
$$) AS (results agtype);
4322+
results
4323+
---------
4324+
""
4325+
(1 row)
4326+
4327+
SELECT * FROM cypher('expr', $$
4328+
RETURN rTrim('')
4329+
$$) AS (results agtype);
4330+
results
4331+
---------
4332+
""
4333+
(1 row)
4334+
4335+
SELECT * FROM cypher('expr', $$
4336+
RETURN trim('')
4337+
$$) AS (results agtype);
4338+
results
4339+
---------
4340+
""
4341+
(1 row)
4342+
4343+
SELECT * FROM cypher('expr', $$
4344+
RETURN lTrim("")
4345+
$$) AS (results agtype);
4346+
results
4347+
---------
4348+
""
4349+
(1 row)
4350+
4351+
SELECT * FROM cypher('expr', $$
4352+
RETURN rTrim("")
4353+
$$) AS (results agtype);
4354+
results
4355+
---------
4356+
""
4357+
(1 row)
4358+
4359+
SELECT * FROM cypher('expr', $$
4360+
RETURN trim("")
4361+
$$) AS (results agtype);
4362+
results
4363+
---------
4364+
""
4365+
(1 row)
4366+
4367+
SELECT * FROM age_ltrim('');
4368+
age_ltrim
4369+
-----------
4370+
""
4371+
(1 row)
4372+
4373+
SELECT * FROM age_rtrim('');
4374+
age_rtrim
4375+
-----------
4376+
""
4377+
(1 row)
4378+
4379+
SELECT * FROM age_trim('');
4380+
age_trim
4381+
----------
4382+
""
4383+
(1 row)
4384+
42144385
-- should return null
42154386
SELECT * FROM cypher('expr', $$
42164387
RETURN lTrim(null)
@@ -4322,15 +4493,16 @@ $$) AS (results agtype);
43224493
"123"
43234494
(1 row)
43244495

4325-
-- should return null
4496+
-- should return empty string
43264497
SELECT * FROM cypher('expr', $$
43274498
RETURN left("123456789", 0)
43284499
$$) AS (results agtype);
43294500
results
43304501
---------
4331-
4502+
""
43324503
(1 row)
43334504

4505+
-- should return null
43344506
SELECT * FROM cypher('expr', $$
43354507
RETURN left(null, 1)
43364508
$$) AS (results agtype);
@@ -4401,15 +4573,16 @@ $$) AS (results agtype);
44014573
"789"
44024574
(1 row)
44034575

4404-
-- should return null
4576+
-- should return empty string
44054577
SELECT * FROM cypher('expr', $$
44064578
RETURN right("123456789", 0)
44074579
$$) AS (results agtype);
44084580
results
44094581
---------
4410-
4582+
""
44114583
(1 row)
44124584

4585+
-- should return null
44134586
SELECT * FROM cypher('expr', $$
44144587
RETURN right(null, 1)
44154588
$$) AS (results agtype);
@@ -4508,6 +4681,13 @@ SELECT * FROM age_substring('0123456789', 1);
45084681
"123456789"
45094682
(1 row)
45104683

4684+
-- should return empty string
4685+
SELECT * FROM age_substring('0123456789', 0, 0);
4686+
age_substring
4687+
---------------
4688+
""
4689+
(1 row)
4690+
45114691
-- should return null
45124692
SELECT * FROM cypher('expr', $$
45134693
RETURN substring(null, null, null)
@@ -4747,49 +4927,68 @@ $$) AS (results agtype);
47474927
"ababab"
47484928
(1 row)
47494929

4750-
-- should return null
4930+
-- should return empty string
47514931
SELECT * FROM cypher('expr', $$
4752-
RETURN replace(null, null, null)
4932+
RETURN replace("", "", "")
47534933
$$) AS (results agtype);
47544934
results
47554935
---------
4756-
4936+
""
47574937
(1 row)
47584938

47594939
SELECT * FROM cypher('expr', $$
4760-
RETURN replace("Hello", null, null)
4940+
RETURN replace("Hello", "Hello", "")
47614941
$$) AS (results agtype);
47624942
results
47634943
---------
4764-
4944+
""
47654945
(1 row)
47664946

47674947
SELECT * FROM cypher('expr', $$
4768-
RETURN replace("Hello", "", null)
4948+
RETURN replace("", "Hello", "Mellow")
47694949
$$) AS (results agtype);
47704950
results
47714951
---------
4772-
4952+
""
4953+
(1 row)
4954+
4955+
SELECT * FROM age_replace('', '', '');
4956+
age_replace
4957+
-------------
4958+
""
47734959
(1 row)
47744960

4961+
SELECT * FROM age_replace('Hello', 'Hello', '');
4962+
age_replace
4963+
-------------
4964+
""
4965+
(1 row)
4966+
4967+
SELECT * FROM age_replace('', 'Hello', 'Mellow');
4968+
age_replace
4969+
-------------
4970+
""
4971+
(1 row)
4972+
4973+
-- should return null
47754974
SELECT * FROM cypher('expr', $$
4776-
RETURN replace("", "", "")
4975+
RETURN replace(null, null, null)
47774976
$$) AS (results agtype);
47784977
results
47794978
---------
47804979

47814980
(1 row)
47824981

47834982
SELECT * FROM cypher('expr', $$
4784-
RETURN replace("Hello", "Hello", "")
4983+
RETURN replace("Hello", null, null)
47854984
$$) AS (results agtype);
47864985
results
47874986
---------
47884987

47894988
(1 row)
47904989

47914990
SELECT * FROM cypher('expr', $$
4792-
RETURN replace("", "Hello", "Mellow")
4991+
RETURN replace("Hello", "", null)
47934992
$$) AS (results agtype);
47944993
results
47954994
---------
@@ -4814,24 +5013,6 @@ SELECT * FROM age_replace('Hello', '', null);
48145013

48155014
(1 row)
48165015

4817-
SELECT * FROM age_replace('', '', '');
4818-
age_replace
4819-
-------------
4820-
4821-
(1 row)
4822-
4823-
SELECT * FROM age_replace('Hello', 'Hello', '');
4824-
age_replace
4825-
-------------
4826-
4827-
(1 row)
4828-
4829-
SELECT * FROM age_replace('', 'Hello', 'Mellow');
4830-
age_replace
4831-
-------------
4832-
4833-
(1 row)
4834-
48355016
-- should fail
48365017
SELECT * FROM cypher('expr', $$
48375018
RETURN replace()

0 commit comments

Comments
 (0)