You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2021/04/15 04:11:14 UTC
[calcite] 06/08: [CALCITE-4579] Piglet throws ClassCastException if
Pig Latin script contains FLATTEN or STRSPLIT operators (Mahesh Kumar
Behera)
This is an automated email from the ASF dual-hosted git repository.
jhyde pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git
commit 760714d9ed4a1323d59b4bb2bf2887f030500019
Author: Mahesh Kumar Behera <ma...@apache.org>
AuthorDate: Mon Apr 12 07:47:22 2021 +0530
[CALCITE-4579] Piglet throws ClassCastException if Pig Latin script contains FLATTEN or STRSPLIT operators (Mahesh Kumar Behera)
Close apache/calcite#2396
---
.../apache/calcite/piglet/PigRelOpInnerVisitor.java | 18 ++++++++++++++----
.../java/org/apache/calcite/test/PigRelOpTest.java | 14 ++++++++++++++
2 files changed, 28 insertions(+), 4 deletions(-)
diff --git a/piglet/src/main/java/org/apache/calcite/piglet/PigRelOpInnerVisitor.java b/piglet/src/main/java/org/apache/calcite/piglet/PigRelOpInnerVisitor.java
index 5d62668..727a187 100644
--- a/piglet/src/main/java/org/apache/calcite/piglet/PigRelOpInnerVisitor.java
+++ b/piglet/src/main/java/org/apache/calcite/piglet/PigRelOpInnerVisitor.java
@@ -23,6 +23,7 @@ import org.apache.calcite.rel.core.JoinRelType;
import org.apache.calcite.rel.logical.LogicalValues;
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.sql.fun.SqlStdOperatorTable;
import org.apache.calcite.sql.type.MultisetSqlType;
import org.apache.calcite.sql.type.SqlTypeName;
import org.apache.calcite.sql.type.SqlTypeUtil;
@@ -172,10 +173,19 @@ class PigRelOpInnerVisitor extends PigRelOpVisitor {
&& (dataType.getFieldCount() > 0 || dataType instanceof DynamicTupleRecordType)) {
if (dataType instanceof DynamicTupleRecordType) {
((DynamicTupleRecordType) dataType).resize(outputFieldSchema.size());
- }
- for (int j = 0; j < dataType.getFieldCount(); j++) {
- innerCols.add(builder.dot(rexNode, j));
- fieldAlias.add(outputFieldSchema.getField(j).alias);
+ for (int j = 0; j < outputFieldSchema.size(); j++) {
+ final RelDataType scriptType = PigTypes.convertSchemaField(
+ outputFieldSchema.getField(j));
+ RexNode exp = builder.call(
+ SqlStdOperatorTable.ITEM, rexNode, builder.literal(j + 1));
+ innerCols.add(builder.getRexBuilder().makeCast(scriptType, exp));
+ fieldAlias.add(outputFieldSchema.getField(j).alias);
+ }
+ } else {
+ for (int j = 0; j < dataType.getFieldCount(); j++) {
+ innerCols.add(builder.dot(rexNode, j));
+ fieldAlias.add(outputFieldSchema.getField(j).alias);
+ }
}
} else {
innerCols.add(rexNode);
diff --git a/piglet/src/test/java/org/apache/calcite/test/PigRelOpTest.java b/piglet/src/test/java/org/apache/calcite/test/PigRelOpTest.java
index 5c1a5b2..de14526 100644
--- a/piglet/src/test/java/org/apache/calcite/test/PigRelOpTest.java
+++ b/piglet/src/test/java/org/apache/calcite/test/PigRelOpTest.java
@@ -1607,4 +1607,18 @@ class PigRelOpTest extends PigRelTestBase {
.assertResult(is(result))
.assertSql(is(sql));
}
+
+ @Test void testFlattenStrSplit() {
+ final String script = ""
+ + "A = LOAD 'scott.DEPT' as (DEPTNO:int, DNAME:chararray, LOC:CHARARRAY);\n"
+ + "B = FOREACH A GENERATE FLATTEN(STRSPLIT(DNAME, ',')) as NAMES;\n";
+ final String plan = ""
+ + "LogicalProject(NAMES=[CAST(ITEM(STRSPLIT(PIG_TUPLE($1, ',')), 1)):BINARY(1)])\n"
+ + " LogicalTableScan(table=[[scott, DEPT]])\n";
+ final String sql = ""
+ + "SELECT CAST(STRSPLIT(PIG_TUPLE(DNAME, ','))[1] AS BINARY(1)) AS NAMES\n"
+ + "FROM scott.DEPT";
+ pig(script).assertRel(hasTree(plan))
+ .assertSql(is(sql));
+ }
}