Skip to content

Commit

Permalink
Trim functions support (#25189)
Browse files Browse the repository at this point in the history
* support for Char function

* support for Weight string SQL

* Support for Char & weight string Function

* Support for Substring function

* Support for substring,dual,spatial functions

* support for Char function

* support for Weight string SQL

* Support for Char & weight string Function

* Support for Substring function

* Support for trim functions

* support for Char function

* support for Weight string SQL

* Support for Char & weight string Function

* null

* Revert "Support for Substring function"

This reverts commit 9af038be0f4be54affd801c9ac2f6750db883377.

* Support for Trim functions
  • Loading branch information
kanha-gupta authored Apr 17, 2023
1 parent 972a79b commit be806e8
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import org.apache.calcite.sql.SqlLiteral;
import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.parser.SqlParserPos;
import org.apache.calcite.sql.fun.SqlTrimFunction;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.SQLSegmentConverter;

Expand All @@ -38,6 +39,23 @@ public Optional<SqlNode> convert(final LiteralExpressionSegment segment) {
if (segment.getLiterals() instanceof Integer) {
return Optional.of(SqlLiteral.createExactNumeric(String.valueOf(segment.getLiterals()), SqlParserPos.ZERO));
}
if (segment.getLiterals().equals("BOTH") || segment.getLiterals().equals("LEADING") || segment.getLiterals().equals("TRAILING")) {
SqlTrimFunction.Flag flag;
switch (segment.getLiterals().toString()) {
case "BOTH":
flag = SqlTrimFunction.Flag.BOTH;
break;
case "LEADING":
flag = SqlTrimFunction.Flag.LEADING;
break;
case "TRAILING":
flag = SqlTrimFunction.Flag.TRAILING;
break;
default:
throw new IllegalArgumentException("Invalid literal for flag: " + segment.getLiterals());
}
return Optional.of(SqlLiteral.createSymbol(flag, SqlParserPos.ZERO));
}
if (segment.getLiterals() instanceof String) {
return Optional.of(SqlLiteral.createCharString(String.valueOf(segment.getLiterals()), SqlParserPos.ZERO));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -961,11 +961,28 @@ public final ASTNode visitCharFunction(final CharFunctionContext ctx) {
}
return result;
}

@Override
public final ASTNode visitTrimFunction(final TrimFunctionContext ctx) {
calculateParameterCount(ctx.expr());
return new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.TRIM().getText(), getOriginalText(ctx));
FunctionSegment result = new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.TRIM().getText(), getOriginalText(ctx));
if (null != ctx.BOTH()) {
result.getParameters().add(new LiteralExpressionSegment(ctx.BOTH().getSymbol().getStartIndex(), ctx.BOTH().getSymbol().getStopIndex(),
new OtherLiteralValue(ctx.BOTH().getSymbol().getText()).getValue()));
}
if (null != ctx.TRAILING()) {
result.getParameters().add(new LiteralExpressionSegment(ctx.TRAILING().getSymbol().getStartIndex(), ctx.TRAILING().getSymbol().getStopIndex(),
new OtherLiteralValue(ctx.TRAILING().getSymbol().getText()).getValue()));
}
if (null != ctx.LEADING()) {
result.getParameters().add(new LiteralExpressionSegment(ctx.LEADING().getSymbol().getStartIndex(), ctx.LEADING().getSymbol().getStopIndex(),
new OtherLiteralValue(ctx.LEADING().getSymbol().getText()).getValue()));
}
for (ExprContext each : ctx.expr()) {
ASTNode expr = visit(each);
result.getParameters().add((ExpressionSegment) expr);
}
return result;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,9 @@ private Set<String> getSupportedSQLCaseIDs() {
result.add("select_order_by_for_nulls_last");
result.add("select_char");
result.add("select_weight_string");
result.add("select_trim");
result.add("select_with_trim_expr");
result.add("select_with_trim_expr_from_expr");
return result;
}
// CHECKSTYLE:ON
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,36 +150,66 @@
</projections>
</select>
<select sql-case-id="select_trim">
<projections start-index="7" stop-index="22">
<expression-projection text="TRIM(' bar ')" start-index="7" stop-index="22">
<projections start-index="7" stop-index="33">
<expression-projection text="TRIM(BOTH ' ' from ' bar ')" start-index="7" stop-index="33">
<expr>
<function function-name="TRIM" start-index="7" stop-index="22" text="TRIM(' bar ')" />
<function function-name="TRIM" start-index="7" stop-index="33" text="TRIM(BOTH ' ' from ' bar ')" >
<parameter>
<literal-expression value="BOTH" start-index="12" stop-index="15" />
</parameter>
<parameter>
<literal-expression value=" " start-index="17" stop-index="19" />
</parameter>
<parameter>
<literal-expression value=" bar " start-index="26" stop-index="32" />
</parameter>
</function>
</expr>
</expression-projection>
</projections>
</select>
<select sql-case-id="select_with_trim_expr">
<projections start-index="7" stop-index="27">
<expression-projection text="trim('#' from `name`)" start-index="7" stop-index="27">
<projections start-index="7" stop-index="32">
<expression-projection text="TRIM(BOTH '#' FROM `name`)" start-index="7" stop-index="32">
<expr>
<function function-name="trim" start-index="7" stop-index="27" text="trim('#' from `name`)" />
<function function-name="TRIM" start-index="7" stop-index="32" text="TRIM(BOTH '#' FROM `name`)" >
<parameter>
<literal-expression value="BOTH" start-index="12" stop-index="15" />
</parameter>
<parameter>
<literal-expression value="#" start-index="17" stop-index="19" />
</parameter>
<parameter>
<column name="name" start-delimiter="`" end-delimiter="`" start-index="26" stop-index="31" />
</parameter>
</function>
</expr>
</expression-projection>
</projections>
<from>
<simple-table name="t_order" start-index="34" stop-index="40" />
<simple-table name="t_order" start-delimiter="`" end-delimiter="`" start-index="39" stop-index="47" />
</from>
</select>
<select sql-case-id="select_with_trim_expr_from_expr">
<projections start-index="7" stop-index="33">
<expression-projection text="trim(remove_name from name)" start-index="7" stop-index="33">
<projections start-index="7" stop-index="42">
<expression-projection text="TRIM(BOTH `remove_name` FROM `name`)" start-index="7" stop-index="42">
<expr>
<function function-name="trim" start-index="7" stop-index="33" text="trim(remove_name from name)" />
<function function-name="TRIM" start-index="7" stop-index="42" text="TRIM(BOTH `remove_name` FROM `name`)" >
<parameter>
<literal-expression value="BOTH" start-index="12" stop-index="15" />
</parameter>
<parameter>
<column name="remove_name" start-delimiter="`" end-delimiter="`" start-index="17" stop-index="29" />
</parameter>
<parameter>
<column name="name" start-delimiter="`" end-delimiter="`" start-index="36" stop-index="41" />
</parameter>
</function>
</expr>
</expression-projection>
</projections>
<from>
<simple-table name="t_order" start-index="40" stop-index="46" />
<simple-table name="t_order" start-delimiter="`" end-delimiter="`" start-index="49" stop-index="57" />
</from>
</select>
<select sql-case-id="select_weight_string">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@
<sql-case id="select_substring" value="SELECT SUBSTRING('foobarbar' from 4)" db-types="MySQL" />
<sql-case id="select_extract" value="SELECT EXTRACT(YEAR FROM '2019-07-02')" db-types="MySQL" />
<sql-case id="select_char" value="SELECT CHAR(77,121,83,81,'76')" db-types="MySQL" />
<sql-case id="select_trim" value="SELECT TRIM(' bar ')" db-types="MySQL" />
<sql-case id="select_with_trim_expr" value="select trim('#' from `name`) from t_order" db-types="MySQL" />
<sql-case id="select_with_trim_expr_from_expr" value="select trim(remove_name from name) from t_order" db-types="MySQL" />
<sql-case id="select_trim" value="SELECT TRIM(BOTH ' ' from ' bar ')" db-types="MySQL" />
<sql-case id="select_with_trim_expr" value="SELECT TRIM(BOTH '#' FROM `name`) FROM `t_order`" db-types="MySQL" />
<sql-case id="select_with_trim_expr_from_expr" value="SELECT TRIM(BOTH `remove_name` FROM `name`) FROM `t_order`" db-types="MySQL" />
<sql-case id="select_weight_string" value="SELECT WEIGHT_STRING('bar')" db-types="MySQL" />
<sql-case id="select_values" value="SELECT VALUES(order_id) FROM t_order" db-types="MySQL" />
<sql-case id="select_current_user_brackets" value="SELECT CURRENT_USER()" db-types="MySQL" />
Expand Down

0 comments on commit be806e8

Please sign in to comment.