Skip to content

Commit 03ddf0c

Browse files
committed
[CALCITE-6684] Arrow adapter should supports filter conditions of Decimal type
1 parent aced08d commit 03ddf0c

File tree

3 files changed

+24
-3
lines changed

3 files changed

+24
-3
lines changed

arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowTable.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,8 @@ private static TreeNode makeLiteralNode(String literal, String type) {
194194
return TreeBuilder.makeLiteral(parseFloat(literal));
195195
case "double":
196196
return TreeBuilder.makeLiteral(parseDouble(literal));
197+
case "decimal":
198+
return TreeBuilder.makeDecimalLiteral(literal, 19, 0);
197199
case "string":
198200
return TreeBuilder.makeStringLiteral(literal.substring(1, literal.length() - 1));
199201
default:

arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowTranslator.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ private String translateBinary(String op, String rop, RexCall call) {
194194
private String translateOp2(String op, String name, RexLiteral right) {
195195
Object value = literalValue(right);
196196
String valueString = value.toString();
197-
String valueType = getLiteralType(value);
197+
String valueType = getLiteralType(value, right.getType());
198198

199199
if (value instanceof String) {
200200
final RelDataTypeField field = requireNonNull(rowType.getField(name, true, false), "field");
@@ -234,8 +234,10 @@ private String translateUnaryOp(String op, String name) {
234234
return name + " " + op;
235235
}
236236

237-
private static String getLiteralType(Object literal) {
238-
if (literal instanceof BigDecimal) {
237+
private static String getLiteralType(Object literal, RelDataType type) {
238+
if (type.getSqlTypeName() == SqlTypeName.DECIMAL) {
239+
return "decimal";
240+
} else if (literal instanceof BigDecimal) {
239241
BigDecimal bigDecimalLiteral = (BigDecimal) literal;
240242
int scale = bigDecimalLiteral.scale();
241243
if (scale == 0) {

arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowAdapterTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -943,4 +943,21 @@ static void initializeArrowState(@TempDir Path sharedTempDir)
943943
.returns(result)
944944
.explainContains(plan);
945945
}
946+
947+
@Test void testArrowProjectFieldsWithDecimalFilter() {
948+
String sql = "select \"decimalField\"\n"
949+
+ "from arrowdatatype\n"
950+
+ "where \"decimalField\" = 1.00";
951+
String plan = "PLAN=ArrowToEnumerableConverter\n"
952+
+ " ArrowProject(decimalField=[$8])\n"
953+
+ " ArrowFilter(condition=[=($8, 1)])\n"
954+
+ " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
955+
String result = "decimalField=1.00\n";
956+
957+
CalciteAssert.that()
958+
.with(arrow)
959+
.query(sql)
960+
.returns(result)
961+
.explainContains(plan);
962+
}
946963
}

0 commit comments

Comments
 (0)