diff --git a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java index e9b9eff95e45..358613196af8 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java @@ -6474,7 +6474,8 @@ private class JsonFunctionRexRewriter extends RexShuttle { } @Override public RexNode visitCall(RexCall call) { - if (call.getOperator() == SqlStdOperatorTable.JSON_OBJECT) { + if (call.getOperator().getName().equals(SqlStdOperatorTable.JSON_OBJECT.getName()) + && call.getOperator().getKind() == SqlStdOperatorTable.JSON_OBJECT.getKind()) { final ImmutableList.Builder builder = ImmutableList.builder(); for (int i = 0; i < call.operands.size(); ++i) { if ((i & 1) == 0 && i != 0) { @@ -6485,7 +6486,8 @@ private class JsonFunctionRexRewriter extends RexShuttle { } return rexBuilder.makeCall(SqlStdOperatorTable.JSON_OBJECT, builder.build()); } - if (call.getOperator() == SqlStdOperatorTable.JSON_ARRAY) { + if (call.getOperator().getName().equals(SqlStdOperatorTable.JSON_ARRAY.getName()) + && call.getOperator().getKind() == SqlStdOperatorTable.JSON_ARRAY.getKind()) { final ImmutableList.Builder builder = ImmutableList.builder(); builder.add(call.operands.get(0)); for (int i = 1; i < call.operands.size(); ++i) { diff --git a/core/src/test/resources/sql/agg.iq b/core/src/test/resources/sql/agg.iq index 8541f46ba5f4..f1513ed7de1a 100644 --- a/core/src/test/resources/sql/agg.iq +++ b/core/src/test/resources/sql/agg.iq @@ -3777,5 +3777,22 @@ select distinct sum(deptno + '1') as deptsum from dept order by 1; +---------+ (1 row) +!ok + +# Test cases for [CALCITE-6437] For druid sql JSON_OBJECT() function results in RUNTIME_FAILURE when querying +# INFORMATION_SCHEMA.COLUMNS +select json_object('name': job, 'value': deptno) as options +from "scott".emp +where deptno = 10 +group by deptno, job; ++---------------------------------+ +| OPTIONS | ++---------------------------------+ +| {"name":"CLERK","value":10} | +| {"name":"MANAGER","value":10} | +| {"name":"PRESIDENT","value":10} | ++---------------------------------+ +(3 rows) + !ok # End agg.iq diff --git a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java index f5c978d53a42..83d57a0e77e2 100644 --- a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java +++ b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java @@ -6330,6 +6330,12 @@ void checkRegexpExtract(SqlOperatorFixture f0, FunctionAlias functionAlias) { "{\"foo\":{\"foo\":\"bar\"}}", "VARCHAR(2000) NOT NULL"); f.checkString("json_object('foo': json_object('foo': 'bar') format json)", "{\"foo\":{\"foo\":\"bar\"}}", "VARCHAR(2000) NOT NULL"); + final SqlOperatorFixture f1 = SqlOperatorFixtureImpl.DEFAULT.withTester(t -> TESTER); + f1.check( + "select json_object('key':x, 'value':y)\n" + + "from (select 1 as x, 2 as y\n" + + " from (values (true)))", + SqlTests.ANY_TYPE_CHECKER, "{\"value\":2,\"key\":1}"); } @Test void testJsonObjectAgg() {