Skip to content

Commit 359cc7c

Browse files
authored
feat(isthmus): mapping of string extract and pad fns (#619)
1 parent 7b4d5cf commit 359cc7c

2 files changed

Lines changed: 45 additions & 1 deletion

File tree

isthmus/src/main/java/io/substrait/isthmus/expression/FunctionMappings.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,11 @@ public class FunctionMappings {
9393
s(SqlLibraryOperators.STARTS_WITH, "starts_with"),
9494
s(SqlLibraryOperators.ENDS_WITH, "ends_with"),
9595
s(SqlLibraryOperators.CONTAINS_SUBSTR, "contains"),
96-
s(SqlStdOperatorTable.POSITION, "strpos"))
96+
s(SqlStdOperatorTable.POSITION, "strpos"),
97+
s(SqlLibraryOperators.LEFT, "left"),
98+
s(SqlLibraryOperators.RIGHT, "right"),
99+
s(SqlLibraryOperators.LPAD, "lpad"),
100+
s(SqlLibraryOperators.RPAD, "rpad"))
97101
.build();
98102

99103
public static final ImmutableList<Sig> AGGREGATE_SIGS =

isthmus/src/test/java/io/substrait/isthmus/StringFunctionTest.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ public final class StringFunctionTest extends PlanTestBase {
1313
static String CREATES = "CREATE TABLE strings (c16 CHAR(16), vc32 VARCHAR(32), vc VARCHAR)";
1414
static String REPLACE_CREATES =
1515
"CREATE TABLE replace_strings (c16 CHAR(16), vc32 VARCHAR(32), replace_from VARCHAR(16), replace_to VARCHAR(16))";
16+
static String CHAR_INT_CREATES =
17+
"CREATE TABLE int_num_strings (vc32 VARCHAR(32), vc VARCHAR, i32 INT)";
1618

1719
@ParameterizedTest
1820
@ValueSource(strings = {"c16", "vc32"})
@@ -270,4 +272,42 @@ void testStrposWithLiteral(String left, String right) throws Exception {
270272

271273
assertSqlRoundTrip(query);
272274
}
275+
276+
@ParameterizedTest
277+
@CsvSource({"vc32, i32", "vc, i32"})
278+
void testLeft(String left, String right) throws Exception {
279+
280+
String query = String.format("SELECT LEFT(%s, %s) FROM int_num_strings", left, right);
281+
282+
assertSqlSubstraitRelRoundTrip(query, CHAR_INT_CREATES);
283+
}
284+
285+
@ParameterizedTest
286+
@CsvSource({"vc32, i32", "vc, i32"})
287+
void testRight(String left, String right) throws Exception {
288+
289+
String query = String.format("SELECT RIGHT(%s, %s) FROM int_num_strings", left, right);
290+
291+
assertSqlSubstraitRelRoundTrip(query, CHAR_INT_CREATES);
292+
}
293+
294+
@ParameterizedTest
295+
@CsvSource({"vc32, i32, vc32", "vc, i32, vc"})
296+
void testRpad(String left, String center, String right) throws Exception {
297+
298+
String query =
299+
String.format("SELECT RPAD(%s, %s, %s) FROM int_num_strings", left, center, right);
300+
301+
assertSqlSubstraitRelRoundTrip(query, CHAR_INT_CREATES);
302+
}
303+
304+
@ParameterizedTest
305+
@CsvSource({"vc32, i32, vc32", "vc, i32, vc"})
306+
void testLpad(String left, String center, String right) throws Exception {
307+
308+
String query =
309+
String.format("SELECT LPAD(%s, %s, %s) FROM int_num_strings", left, center, right);
310+
311+
assertSqlSubstraitRelRoundTrip(query, CHAR_INT_CREATES);
312+
}
273313
}

0 commit comments

Comments
 (0)