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

feat: add trim/ltrim/rtrim with single input argument to remove spaces #754

Open
wants to merge 2 commits into
base: main
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
30 changes: 30 additions & 0 deletions extensions/functions_string.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1316,6 +1316,16 @@ scalar_functions:
name: "characters"
description: "The set of characters to remove."
return: "string"
- args:
- value: "varchar<L1>"
name: "input"
description: "The string to remove characters from."
return: "varchar<L1>"
- args:
- value: "string"
name: "input"
description: "The string to remove characters from."
return: "string"
-
name: rtrim
description: >-
Expand All @@ -1338,6 +1348,16 @@ scalar_functions:
name: "characters"
description: "The set of characters to remove."
return: "string"
- args:
- value: "varchar<L1>"
name: "input"
description: "The string to remove characters from."
return: "varchar<L1>"
- args:
- value: "string"
name: "input"
description: "The string to remove characters from."
return: "string"
-
name: trim
description: >-
Expand All @@ -1360,6 +1380,16 @@ scalar_functions:
name: "characters"
description: "The set of characters to remove."
return: "string"
- args:
- value: "varchar<L1>"
name: "input"
description: "The string to remove characters from."
return: "varchar<L1>"
- args:
- value: "string"
name: "input"
description: "The string to remove characters from."
return: "string"
-
name: lpad
description: >-
Expand Down
25 changes: 25 additions & 0 deletions tests/cases/string/ltrim.test
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,32 @@ ltrim(''::str, ' '::str) = ''::str
ltrim(' '::str, ' '::str) = ''::str
ltrim(null::str, ' '::str) = null::str

# spaces_only: Examples with only spaces to trim off
ltrim('abc'::str) = 'abc'::str
ltrim(' abc'::str) = 'abc'::str
ltrim('abc '::str) = 'abc '::str
ltrim(' abc '::str) = 'abc '::str
ltrim(''::str) = ''::str
ltrim(' '::str) = ''::str
ltrim(null::str) = null::str
EpsilonPrime marked this conversation as resolved.
Show resolved Hide resolved

# two_inputs: Examples with character input to trim off
ltrim('aaaaabc'::str, 'a'::str) [spaces_only:FALSE] = 'bc'::str
ltrim('abcabcdef'::str, 'abc'::str) [spaces_only:FALSE] = 'def'::str
ltrim('abccbadef'::str, 'abc'::str) [spaces_only:FALSE] = 'def'::str

# varchar
ltrim('abc'::vchar<20>, ' '::vchar<5>) = 'abc'::vchar<20>
ltrim(' abc'::vchar<20>, ' '::vchar<5>) = 'abc'::vchar<20>
ltrim('abc '::vchar<20>, ' '::vchar<5>) = 'abc '::vchar<20>
ltrim(' abc '::vchar<20>, ' '::vchar<5>) = 'abc '::vchar<20>
ltrim('abc'::vchar<20>) = 'abc'::vchar<20>
ltrim(' abc'::vchar<20>) = 'abc'::vchar<20>
ltrim('abc '::vchar<20>) = 'abc '::vchar<20>
ltrim(' abc '::vchar<20>) = 'abc '::vchar<20>
ltrim('aaaaabc'::vchar<20>, 'a'::vchar<9>) [spaces_only:False] = 'bc'::vchar<20>
ltrim('abcabcdef'::vchar<20>, 'abc'::vchar<9>) [spaces_only:False] = 'def'::vchar<20>
ltrim(' \t\tHello World'::vchar<30>) = '\t\tHello World'::vchar<30>
ltrim(' \n\nHello World'::vchar<30>) = '\n\nHello World'::vchar<30>
ltrim(' \r\rHello World'::vchar<30>) = '\r\rHello World'::vchar<30>
ltrim(' \u2003Hello World'::vchar<30>) = '\u2003Hello World'::vchar<30>
25 changes: 25 additions & 0 deletions tests/cases/string/rtrim.test
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,32 @@ rtrim(''::str, ' '::str) = ''::str
rtrim(' '::str, ' '::str) = ''::str
rtrim(null::str, ' '::str) = null::str

# spaces_only: Examples with only spaces to trim off
rtrim('abc'::str) = 'abc'::str
rtrim(' abc'::str) = ' abc'::str
rtrim('abc '::str) = 'abc'::str
rtrim(' abc '::str) = ' abc'::str
rtrim(''::str) = ''::str
rtrim(' '::str) = ''::str
rtrim(null::str) = null::str

# two_inputs: Examples with character input to trim off
rtrim('aaaaabccccc'::str, 'c'::str) [spaces_only:FALSE] = 'aaaaab'::str
rtrim('abcabcdef'::str, 'def'::str) [spaces_only:FALSE] = 'abcabc'::str
rtrim('defabccba'::str, 'abc'::str) [spaces_only:FALSE] = 'def'::str

# varchar
rtrim('abc'::vchar<20>, ' '::vchar<5>) = 'abc'::vchar<20>
rtrim(' abc'::vchar<20>, ' '::vchar<5>) = ' abc'::vchar<20>
rtrim('abc '::vchar<20>, ' '::vchar<5>) = 'abc'::vchar<20>
rtrim(' abc '::vchar<20>, ' '::vchar<5>) = ' abc'::vchar<20>
rtrim('abc'::vchar<20>) = 'abc'::vchar<20>
rtrim(' abc'::vchar<20>) = ' abc'::vchar<20>
rtrim('abc '::vchar<20>) = 'abc'::vchar<20>
rtrim(' abc '::vchar<20>) = ' abc'::vchar<20>
rtrim('aaaaabccccc'::vchar<20>, 'c'::vchar<9>) [spaces_only:False] = 'aaaaab'::vchar<20>
rtrim('abcabcdef'::vchar<20>, 'def'::vchar<9>) [spaces_only:False] = 'abcabc'::vchar<20>
rtrim('Hello World\t\t '::vchar<30>) = 'Hello World\t\t'::vchar<30>
rtrim('Hello World\n\n '::vchar<30>) = 'Hello World\n\n'::vchar<30>
rtrim('Hello World\r\r '::vchar<30>) = 'Hello World\r\r'::vchar<30>
rtrim('Hello World\u2003 '::vchar<30>) = 'Hello World\u2003'::vchar<30>
25 changes: 25 additions & 0 deletions tests/cases/string/trim.test
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,32 @@ trim(''::str, ' '::str) = ''::str
trim(' '::str, ' '::str) = ''::str
trim(null::str, ' '::str) = null::str

# spaces_only: Examples with only spaces to trim off
trim('abc'::str) = 'abc'::str
trim(' abc'::str) = 'abc'::str
trim('abc '::str) = 'abc'::str
trim(' abc '::str) = 'abc'::str
trim(''::str) = ''::str
trim(' '::str) = ''::str
trim(null::str) = null::str

# two_inputs: Examples with character input to trim off
trim('aaaaabcccccaaa'::str, 'a'::str) [spaces_only:False] = 'bccccc'::str
trim('defabcabcdef'::str, 'def'::str) [spaces_only:False] = 'abcabc'::str
trim('abcdefcbaa'::str, 'abc'::str) [spaces_only:False] = 'def'::str

# varchar
trim('abc'::vchar<20>, ' '::vchar<5>) = 'abc'::vchar<20>
trim(' abc'::vchar<20>, ' '::vchar<5>) = 'abc'::vchar<20>
trim('abc '::vchar<20>, ' '::vchar<5>) = 'abc'::vchar<20>
trim(' abc '::vchar<20>, ' '::vchar<5>) = 'abc'::vchar<20>
trim('abc'::vchar<20>) = 'abc'::vchar<20>
trim(' abc'::vchar<20>) = 'abc'::vchar<20>
trim('abc '::vchar<20>) = 'abc'::vchar<20>
trim(' abc '::vchar<20>) = 'abc'::vchar<20>
trim('aaaaabcccccaaa'::vchar<20>, 'a'::vchar<9>) [spaces_only:False] = 'bccccc'::vchar<20>
trim('defabcabcdef'::vchar<20>, 'def'::vchar<9>) [spaces_only:False] = 'abcabc'::vchar<20>
trim(' \tHello World\t '::vchar<30>) = '\tHello World\t'::vchar<30>
trim(' \nHello World\n '::vchar<30>) = '\nHello World\n'::vchar<30>
trim(' \rHello World\r '::vchar<30>) = '\rHello World\r'::vchar<30>
trim(' \u2003Hello World\u2003 '::vchar<30>) = '\u2003Hello World\u2003'::vchar<30>
8 changes: 8 additions & 0 deletions tests/coverage/visitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,8 @@ def visitArgument(self, ctx: FuncTestCaseParser.ArgumentContext):
return self.visitBooleanArg(ctx.booleanArg())
if ctx.stringArg() is not None:
return self.visitStringArg(ctx.stringArg())
if ctx.varCharArg() is not None:
return self.visitVarCharArg(ctx.varCharArg())
if ctx.decimalArg() is not None:
return self.visitDecimalArg(ctx.decimalArg())
if ctx.dateArg() is not None:
Expand Down Expand Up @@ -330,6 +332,12 @@ def visitBooleanArg(self, ctx: FuncTestCaseParser.BooleanArgContext):
def visitStringArg(self, ctx: FuncTestCaseParser.StringArgContext):
return CaseLiteral(value=ctx.StringLiteral().getText(), type="str")

def visitVarCharArg(self, ctx: FuncTestCaseParser.VarCharArgContext):
return CaseLiteral(
value=ctx.StringLiteral().getText(),
type=ctx.varCharType().getText().lower(),
)

def visitDecimalArg(self, ctx: FuncTestCaseParser.DecimalArgContext):
return CaseLiteral(
value=self.visitNumericLiteral(ctx.numericLiteral()),
Expand Down
8 changes: 4 additions & 4 deletions tests/test_extensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,15 @@ def test_substrait_extension_coverage():
all_test_files = load_all_testcases(test_case_dir)
coverage = get_test_coverage(all_test_files, registry)

assert coverage.test_count >= 1077
assert coverage.test_count >= 1140
assert (
coverage.num_tests_with_no_matching_function == 0
), f"{coverage.num_tests_with_no_matching_function} tests with no matching function"
assert coverage.num_covered_function_variants >= 226
assert coverage.total_function_variants >= 513
assert coverage.num_covered_function_variants >= 235
assert coverage.total_function_variants >= 519
assert (
coverage.total_function_variants - coverage.num_covered_function_variants
) <= 287, (
) <= 284, (
f"Coverage gap too large: {coverage.total_function_variants - coverage.num_covered_function_variants} "
f"function variants with no tests, out of {coverage.total_function_variants} total function variants."
)
Expand Down
Loading