[
https://issues.apache.org/jira/browse/BEAM-6783?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16788320#comment-16788320
]
Andrew Pilloud commented on BEAM-6783:
--------------------------------------
There are quite a few UDFs that have this assumption baked in. More work is
required here, but the fix looks something like this:
{code:java}
diff --git
a/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/rel/BeamCalcRel.java
b/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/rel/BeamCalcRel.java
index 790bcf2635..59baf4b307 100644
---
a/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/rel/BeamCalcRel.java
+++
b/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/rel/BeamCalcRel.java
@@ -51,6 +51,7 @@ import org.apache.calcite.adapter.enumerable.PhysType;
import org.apache.calcite.adapter.enumerable.PhysTypeImpl;
import org.apache.calcite.adapter.enumerable.RexToLixTranslator;
import org.apache.calcite.adapter.java.JavaTypeFactory;
+import org.apache.calcite.avatica.util.ByteString;
import org.apache.calcite.linq4j.QueryProvider;
import org.apache.calcite.linq4j.tree.BlockBuilder;
import org.apache.calcite.linq4j.tree.Expression;
@@ -277,6 +278,10 @@ public class BeamCalcRel extends Calc implements
BeamRelNode {
&& !Types.isAssignableFrom(BigDecimal.class, (Class) value.getType())) {
return Expressions.new_(BigDecimal.class, value);
+ } else if (toType.getTypeName() == TypeName.BYTES
+ && Types.isAssignableFrom(ByteString.class, (Class) value.getType())) {
+ return Expressions.call(value, "getBytes");
+
} else if (((Class) value.getType()).isPrimitive()
|| Types.isAssignableFrom(Number.class, (Class) value.getType())) {
Type rawType = rawTypeMap.get(toType.getTypeName());
@@ -400,6 +405,8 @@ public class BeamCalcRel extends Calc implements
BeamRelNode {
}
} else if (CalciteUtils.isDateTimeType(fromType)) {
field = Expressions.call(field, "getMillis");
+ } else if (fromType.getTypeName() == TypeName.BYTES) {
+ field = Expressions.new_(ByteString.class, field);
} else if (fromType.getTypeName().isCompositeType()
|| (fromType.getTypeName().isCollectionType()
&& fromType.getCollectionElementType().getTypeName().isCompositeType())) {
{code}
> byte[] breaks in BeamSQL codegen
> --------------------------------
>
> Key: BEAM-6783
> URL: https://issues.apache.org/jira/browse/BEAM-6783
> Project: Beam
> Issue Type: Bug
> Components: dsl-sql
> Reporter: Rui Wang
> Priority: Major
>
> Calcite will call `byte[].toString` because BeamSQL codegen read byte[] from
> Row to calcite (see:
> https://github.com/apache/beam/blob/master/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/rel/BeamCalcRel.java#L334).
>
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)