diff --git a/docs/content/querying/sql.md b/docs/content/querying/sql.md index 868ad64ca950..77a13fb15b75 100644 --- a/docs/content/querying/sql.md +++ b/docs/content/querying/sql.md @@ -162,6 +162,8 @@ Numeric functions will return 64 bit integers or 64 bit floats, depending on the |`ACOS(expr)`|Arc cosine of expr.| |`ATAN(expr)`|Arc tangent of expr.| |`ATAN2(y, x)`|Angle theta from the conversion of rectangular coordinates (x, y) to polar * coordinates (r, theta).| +|`DEGREES(expr)`|Converts an angle measured in radians to an approximately equivalent angle measured in degrees| +|`RADIANS(expr)`|Converts an angle measured in degrees to an approximately equivalent angle measured in radians| ### String functions diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/planner/DruidOperatorTable.java b/sql/src/main/java/org/apache/druid/sql/calcite/planner/DruidOperatorTable.java index c908a2d52666..a1f6e159e08a 100644 --- a/sql/src/main/java/org/apache/druid/sql/calcite/planner/DruidOperatorTable.java +++ b/sql/src/main/java/org/apache/druid/sql/calcite/planner/DruidOperatorTable.java @@ -131,6 +131,8 @@ public class DruidOperatorTable implements SqlOperatorTable .add(new DirectOperatorConversion(SqlStdOperatorTable.ACOS, "acos")) .add(new DirectOperatorConversion(SqlStdOperatorTable.ATAN, "atan")) .add(new DirectOperatorConversion(SqlStdOperatorTable.ATAN2, "atan2")) + .add(new DirectOperatorConversion(SqlStdOperatorTable.RADIANS, "toRadians")) + .add(new DirectOperatorConversion(SqlStdOperatorTable.DEGREES, "toDegrees")) .add(new UnaryPrefixOperatorConversion(SqlStdOperatorTable.NOT, "!")) .add(new UnaryPrefixOperatorConversion(SqlStdOperatorTable.UNARY_MINUS, "-")) .add(new UnaryFunctionOperatorConversion(SqlStdOperatorTable.IS_NULL, "isnull")) diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java index f18c276266e3..f2c9895bc2d9 100644 --- a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java +++ b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java @@ -7669,4 +7669,28 @@ public void testTrigonometricFunction() throws Exception ) ); } + + @Test + public void testRadiansAndDegrees() throws Exception + { + testQuery( + "SELECT RADIANS(m1 * 15)/DEGREES(m2) FROM numfoo WHERE dim1 = '1'", + ImmutableList.of( + newScanQueryBuilder() + .dataSource(CalciteTests.DATASOURCE3) + .intervals(querySegmentSpec(Filtration.eternity())) + .virtualColumns( + expressionVirtualColumn("v0", "(toRadians((\"m1\" * 15)) / toDegrees(\"m2\"))", ValueType.DOUBLE) + ) + .columns("v0") + .filters(selector("dim1", "1", null)) + .resultFormat(ScanQuery.RESULT_FORMAT_COMPACTED_LIST) + .context(QUERY_CONTEXT_DEFAULT) + .build() + ), + ImmutableList.of( + new Object[]{Math.toRadians(60) / Math.toDegrees(4)} + ) + ); + } }