From b6c306f76a8b2cbe013f4d665b18beb135ab3b7b Mon Sep 17 00:00:00 2001 From: Zoltan Haindrich Date: Fri, 20 Oct 2023 20:18:04 +0200 Subject: [PATCH] Allow DESC ordering in window expressions (#15195) (#15221) (cherry picked from commit fbbb9c77305e2f5a4296a6969f66abb42a01ba33) --- .../calcite/planner/DruidSqlValidator.java | 36 +++++ .../convertlet/DruidConvertletTable.java | 3 + .../druid/sql/calcite/CalciteQueryTest.java | 24 ++++ .../sql/calcite/DrillWindowQueryTest.java | 134 ++++++------------ .../druid/sql/calcite/NotYetSupported.java | 3 +- .../tests/window/orderByDescNulls.sqlTest | 45 ++++++ 6 files changed, 153 insertions(+), 92 deletions(-) create mode 100644 sql/src/test/resources/calcite/tests/window/orderByDescNulls.sqlTest diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/planner/DruidSqlValidator.java b/sql/src/main/java/org/apache/druid/sql/calcite/planner/DruidSqlValidator.java index 5a901c72296e..bbc4f99a1316 100644 --- a/sql/src/main/java/org/apache/druid/sql/calcite/planner/DruidSqlValidator.java +++ b/sql/src/main/java/org/apache/druid/sql/calcite/planner/DruidSqlValidator.java @@ -22,7 +22,14 @@ import org.apache.calcite.adapter.java.JavaTypeFactory; import org.apache.calcite.prepare.BaseDruidSqlValidator; import org.apache.calcite.prepare.CalciteCatalogReader; +import org.apache.calcite.runtime.CalciteContextException; +import org.apache.calcite.runtime.CalciteException; +import org.apache.calcite.sql.SqlCall; +import org.apache.calcite.sql.SqlKind; +import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlOperatorTable; +import org.apache.calcite.sql.parser.SqlParserPos; +import org.apache.calcite.sql.validate.SqlValidatorScope; /** * Druid extended SQL validator. (At present, it doesn't actually @@ -39,4 +46,33 @@ protected DruidSqlValidator( { super(opTab, catalogReader, typeFactory, validatorConfig); } + + @Override + public void validateCall(SqlCall call, SqlValidatorScope scope) + { + if (call.getKind() == SqlKind.NULLS_FIRST) { + SqlNode op0 = call.getOperandList().get(0); + if (op0.getKind() == SqlKind.DESCENDING) { + throw buildCalciteContextException("DESCENDING ordering with NULLS FIRST is not supported!", call); + } + } + if (call.getKind() == SqlKind.NULLS_LAST) { + SqlNode op0 = call.getOperandList().get(0); + if (op0.getKind() != SqlKind.DESCENDING) { + throw buildCalciteContextException("ASCENDING ordering with NULLS LAST is not supported!", call); + } + } + super.validateCall(call, scope); + } + + private CalciteContextException buildCalciteContextException(String message, SqlCall call) + { + SqlParserPos pos = call.getParserPosition(); + return new CalciteContextException(message, + new CalciteException(message, null), + pos.getLineNum(), + pos.getColumnNum(), + pos.getEndLineNum(), + pos.getEndColumnNum()); + } } diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/planner/convertlet/DruidConvertletTable.java b/sql/src/main/java/org/apache/druid/sql/calcite/planner/convertlet/DruidConvertletTable.java index 59ad4ef24f05..eadd2e48268d 100644 --- a/sql/src/main/java/org/apache/druid/sql/calcite/planner/convertlet/DruidConvertletTable.java +++ b/sql/src/main/java/org/apache/druid/sql/calcite/planner/convertlet/DruidConvertletTable.java @@ -67,6 +67,9 @@ public class DruidConvertletTable implements SqlRexConvertletTable .add(SqlStdOperatorTable.NULLIF) .add(SqlStdOperatorTable.COALESCE) .add(SqlLibraryOperators.NVL) + .add(SqlStdOperatorTable.DESC) + .add(SqlStdOperatorTable.NULLS_FIRST) + .add(SqlStdOperatorTable.NULLS_LAST) .build(); private final Map table; 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 49b66f8bc9f9..811227162ac7 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 @@ -137,6 +137,9 @@ import java.util.Map; import java.util.stream.Collectors; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertThrows; + public class CalciteQueryTest extends BaseCalciteQueryTest { @Test @@ -14251,4 +14254,25 @@ public void testLatestByOnStringColumnWithoutMaxBytesSpecified() new Object[] {"abc", defaultString, "def", defaultString, "def", defaultString} )); } + + @Test + public void testUnSupportedNullsFirst() + { + DruidException e = assertThrows(DruidException.class, () -> testBuilder() + .queryContext(ImmutableMap.of(PlannerContext.CTX_ENABLE_WINDOW_FNS, true)) + .sql("SELECT dim1,ROW_NUMBER() OVER (ORDER BY dim1 DESC NULLS FIRST) from druid.foo") + .run()); + + assertThat(e, invalidSqlIs("DESCENDING ordering with NULLS FIRST is not supported! (line [1], column [41])")); + } + + @Test + public void testUnSupportedNullsLast() + { + DruidException e = assertThrows(DruidException.class, () -> testBuilder() + .queryContext(ImmutableMap.of(PlannerContext.CTX_ENABLE_WINDOW_FNS, true)) + .sql("SELECT dim1,ROW_NUMBER() OVER (ORDER BY dim1 NULLS LAST) from druid.foo") + .run()); + assertThat(e, invalidSqlIs("ASCENDING ordering with NULLS LAST is not supported! (line [1], column [41])")); + } } diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/DrillWindowQueryTest.java b/sql/src/test/java/org/apache/druid/sql/calcite/DrillWindowQueryTest.java index ebc551661445..8a737eca0355 100644 --- a/sql/src/test/java/org/apache/druid/sql/calcite/DrillWindowQueryTest.java +++ b/sql/src/test/java/org/apache/druid/sql/calcite/DrillWindowQueryTest.java @@ -450,7 +450,8 @@ private static Object parseLongValue(final String val) } try { LocalTime v = LocalTime.parse(val); - return v.getMillisOfDay(); + Long l = (long) v.getMillisOfDay(); + return l; } catch (Exception e) { } @@ -4384,7 +4385,7 @@ public void test_nestedAggs_nstdWinView01() windowQueryTest(); } - @NotYetSupported(Modes.MISSING_DESC) + @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("aggregates/winFnQry_63") @Test public void test_aggregates_winFnQry_63() @@ -4392,7 +4393,7 @@ public void test_aggregates_winFnQry_63() windowQueryTest(); } - @NotYetSupported(Modes.MISSING_DESC) + @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("aggregates/winFnQry_83") @Test public void test_aggregates_winFnQry_83() @@ -4400,7 +4401,7 @@ public void test_aggregates_winFnQry_83() windowQueryTest(); } - @NotYetSupported(Modes.MISSING_DESC) + @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("frameclause/multipl_wnwds/mulwind_01") @Test public void test_frameclause_multipl_wnwds_mulwind_01() @@ -4408,7 +4409,7 @@ public void test_frameclause_multipl_wnwds_mulwind_01() windowQueryTest(); } - @NotYetSupported(Modes.MISSING_DESC) + @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("frameclause/multipl_wnwds/mulwind_06") @Test public void test_frameclause_multipl_wnwds_mulwind_06() @@ -4416,7 +4417,7 @@ public void test_frameclause_multipl_wnwds_mulwind_06() windowQueryTest(); } - @NotYetSupported(Modes.MISSING_DESC) + @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("frameclause/multipl_wnwds/mulwind_07") @Test public void test_frameclause_multipl_wnwds_mulwind_07() @@ -4424,7 +4425,6 @@ public void test_frameclause_multipl_wnwds_mulwind_07() windowQueryTest(); } - @NotYetSupported(Modes.MISSING_DESC) @DrillTest("lag_func/lag_Fn_108") @Test public void test_lag_func_lag_Fn_108() @@ -4432,7 +4432,6 @@ public void test_lag_func_lag_Fn_108() windowQueryTest(); } - @NotYetSupported(Modes.MISSING_DESC) @DrillTest("lag_func/lag_Fn_109") @Test public void test_lag_func_lag_Fn_109() @@ -4440,7 +4439,6 @@ public void test_lag_func_lag_Fn_109() windowQueryTest(); } - @NotYetSupported(Modes.MISSING_DESC) @DrillTest("lag_func/lag_Fn_69") @Test public void test_lag_func_lag_Fn_69() @@ -4448,7 +4446,6 @@ public void test_lag_func_lag_Fn_69() windowQueryTest(); } - @NotYetSupported(Modes.MISSING_DESC) @DrillTest("lead_func/lead_Fn_103") @Test public void test_lead_func_lead_Fn_103() @@ -4456,7 +4453,6 @@ public void test_lead_func_lead_Fn_103() windowQueryTest(); } - @NotYetSupported(Modes.MISSING_DESC) @DrillTest("lead_func/lead_Fn_104") @Test public void test_lead_func_lead_Fn_104() @@ -4464,7 +4460,6 @@ public void test_lead_func_lead_Fn_104() windowQueryTest(); } - @NotYetSupported(Modes.MISSING_DESC) @DrillTest("lead_func/lead_Fn_69") @Test public void test_lead_func_lead_Fn_69() @@ -4472,7 +4467,7 @@ public void test_lead_func_lead_Fn_69() windowQueryTest(); } - @NotYetSupported(Modes.MISSING_DESC) + @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("nestedAggs/multiWin_7") @Test public void test_nestedAggs_multiWin_7() @@ -4992,7 +4987,7 @@ public void test_aggregates_winFnQry_7() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.RESULT_COUNT_MISMATCH) @DrillTest("aggregates/testW_Nulls_10") @Test public void test_aggregates_testW_Nulls_10() @@ -5000,7 +4995,7 @@ public void test_aggregates_testW_Nulls_10() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("aggregates/testW_Nulls_11") @Test public void test_aggregates_testW_Nulls_11() @@ -5152,7 +5147,7 @@ public void test_aggregates_testW_Nulls_29() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("aggregates/testW_Nulls_2") @Test public void test_aggregates_testW_Nulls_2() @@ -5240,7 +5235,7 @@ public void test_aggregates_testW_Nulls_39() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.RESULT_COUNT_MISMATCH) @DrillTest("aggregates/testW_Nulls_3") @Test public void test_aggregates_testW_Nulls_3() @@ -5248,7 +5243,7 @@ public void test_aggregates_testW_Nulls_3() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("aggregates/testW_Nulls_4") @Test public void test_aggregates_testW_Nulls_4() @@ -5256,7 +5251,7 @@ public void test_aggregates_testW_Nulls_4() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.COLUMN_NOT_FOUND) @DrillTest("aggregates/testW_Nulls_5") @Test public void test_aggregates_testW_Nulls_5() @@ -5264,7 +5259,7 @@ public void test_aggregates_testW_Nulls_5() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.COLUMN_NOT_FOUND) @DrillTest("aggregates/testW_Nulls_6") @Test public void test_aggregates_testW_Nulls_6() @@ -5272,7 +5267,7 @@ public void test_aggregates_testW_Nulls_6() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("aggregates/testW_Nulls_7") @Test public void test_aggregates_testW_Nulls_7() @@ -5280,7 +5275,6 @@ public void test_aggregates_testW_Nulls_7() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("aggregates/testW_Nulls_8") @Test public void test_aggregates_testW_Nulls_8() @@ -5288,7 +5282,7 @@ public void test_aggregates_testW_Nulls_8() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("aggregates/testW_Nulls_9") @Test public void test_aggregates_testW_Nulls_9() @@ -5296,7 +5290,7 @@ public void test_aggregates_testW_Nulls_9() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("aggregates/winFnQry_61") @Test public void test_aggregates_winFnQry_61() @@ -5304,7 +5298,7 @@ public void test_aggregates_winFnQry_61() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("aggregates/winFnQry_62") @Test public void test_aggregates_winFnQry_62() @@ -5312,7 +5306,7 @@ public void test_aggregates_winFnQry_62() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("aggregates/winFnQry_64") @Test public void test_aggregates_winFnQry_64() @@ -5320,7 +5314,7 @@ public void test_aggregates_winFnQry_64() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("aggregates/winFnQry_65") @Test public void test_aggregates_winFnQry_65() @@ -5408,7 +5402,7 @@ public void test_aggregates_winFnQry_75() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("aggregates/winFnQry_76") @Test public void test_aggregates_winFnQry_76() @@ -5416,7 +5410,7 @@ public void test_aggregates_winFnQry_76() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("aggregates/winFnQry_77") @Test public void test_aggregates_winFnQry_77() @@ -5424,7 +5418,7 @@ public void test_aggregates_winFnQry_77() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("aggregates/winFnQry_78") @Test public void test_aggregates_winFnQry_78() @@ -5432,7 +5426,7 @@ public void test_aggregates_winFnQry_78() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.RESULT_COUNT_MISMATCH) @DrillTest("aggregates/winFnQry_79") @Test public void test_aggregates_winFnQry_79() @@ -5440,7 +5434,7 @@ public void test_aggregates_winFnQry_79() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.RESULT_COUNT_MISMATCH) @DrillTest("aggregates/winFnQry_80") @Test public void test_aggregates_winFnQry_80() @@ -5448,7 +5442,7 @@ public void test_aggregates_winFnQry_80() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.RESULT_COUNT_MISMATCH) @DrillTest("aggregates/winFnQry_81") @Test public void test_aggregates_winFnQry_81() @@ -5456,7 +5450,7 @@ public void test_aggregates_winFnQry_81() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("aggregates/winFnQry_82") @Test public void test_aggregates_winFnQry_82() @@ -5464,7 +5458,6 @@ public void test_aggregates_winFnQry_82() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lag_func/lag_Fn_10") @Test public void test_lag_func_lag_Fn_10() @@ -5472,7 +5465,6 @@ public void test_lag_func_lag_Fn_10() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lag_func/lag_Fn_11") @Test public void test_lag_func_lag_Fn_11() @@ -5480,7 +5472,6 @@ public void test_lag_func_lag_Fn_11() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lag_func/lag_Fn_12") @Test public void test_lag_func_lag_Fn_12() @@ -5488,7 +5479,6 @@ public void test_lag_func_lag_Fn_12() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lag_func/lag_Fn_13") @Test public void test_lag_func_lag_Fn_13() @@ -5496,7 +5486,6 @@ public void test_lag_func_lag_Fn_13() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lag_func/lag_Fn_14") @Test public void test_lag_func_lag_Fn_14() @@ -5504,7 +5493,6 @@ public void test_lag_func_lag_Fn_14() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lag_func/lag_Fn_15") @Test public void test_lag_func_lag_Fn_15() @@ -5512,7 +5500,6 @@ public void test_lag_func_lag_Fn_15() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lag_func/lag_Fn_16") @Test public void test_lag_func_lag_Fn_16() @@ -5520,7 +5507,6 @@ public void test_lag_func_lag_Fn_16() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lag_func/lag_Fn_17") @Test public void test_lag_func_lag_Fn_17() @@ -5528,7 +5514,6 @@ public void test_lag_func_lag_Fn_17() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lag_func/lag_Fn_18") @Test public void test_lag_func_lag_Fn_18() @@ -5536,7 +5521,7 @@ public void test_lag_func_lag_Fn_18() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.UNSUPPORTED_NULL_ORDERING) @DrillTest("lag_func/lag_Fn_19") @Test public void test_lag_func_lag_Fn_19() @@ -5544,7 +5529,7 @@ public void test_lag_func_lag_Fn_19() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.UNSUPPORTED_NULL_ORDERING) @DrillTest("lag_func/lag_Fn_20") @Test public void test_lag_func_lag_Fn_20() @@ -5552,7 +5537,7 @@ public void test_lag_func_lag_Fn_20() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.UNSUPPORTED_NULL_ORDERING) @DrillTest("lag_func/lag_Fn_21") @Test public void test_lag_func_lag_Fn_21() @@ -5560,7 +5545,7 @@ public void test_lag_func_lag_Fn_21() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.UNSUPPORTED_NULL_ORDERING) @DrillTest("lag_func/lag_Fn_22") @Test public void test_lag_func_lag_Fn_22() @@ -5576,7 +5561,7 @@ public void test_lag_func_lag_Fn_23() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.UNSUPPORTED_NULL_ORDERING) @DrillTest("lag_func/lag_Fn_24") @Test public void test_lag_func_lag_Fn_24() @@ -5584,7 +5569,7 @@ public void test_lag_func_lag_Fn_24() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.UNSUPPORTED_NULL_ORDERING) @DrillTest("lag_func/lag_Fn_25") @Test public void test_lag_func_lag_Fn_25() @@ -5592,7 +5577,7 @@ public void test_lag_func_lag_Fn_25() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.UNSUPPORTED_NULL_ORDERING) @DrillTest("lag_func/lag_Fn_26") @Test public void test_lag_func_lag_Fn_26() @@ -5600,7 +5585,7 @@ public void test_lag_func_lag_Fn_26() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.UNSUPPORTED_NULL_ORDERING) @DrillTest("lag_func/lag_Fn_54") @Test public void test_lag_func_lag_Fn_54() @@ -5608,7 +5593,6 @@ public void test_lag_func_lag_Fn_54() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lag_func/lag_Fn_64") @Test public void test_lag_func_lag_Fn_64() @@ -5616,7 +5600,6 @@ public void test_lag_func_lag_Fn_64() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lag_func/lag_Fn_65") @Test public void test_lag_func_lag_Fn_65() @@ -5624,7 +5607,6 @@ public void test_lag_func_lag_Fn_65() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lag_func/lag_Fn_66") @Test public void test_lag_func_lag_Fn_66() @@ -5632,7 +5614,6 @@ public void test_lag_func_lag_Fn_66() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lag_func/lag_Fn_67") @Test public void test_lag_func_lag_Fn_67() @@ -5640,7 +5621,7 @@ public void test_lag_func_lag_Fn_67() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.UNSUPPORTED_NULL_ORDERING) @DrillTest("lag_func/lag_Fn_68") @Test public void test_lag_func_lag_Fn_68() @@ -5648,7 +5629,6 @@ public void test_lag_func_lag_Fn_68() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lag_func/lag_Fn_71") @Test public void test_lag_func_lag_Fn_71() @@ -5656,7 +5636,7 @@ public void test_lag_func_lag_Fn_71() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.UNSUPPORTED_NULL_ORDERING) @DrillTest("lag_func/lag_Fn_72") @Test public void test_lag_func_lag_Fn_72() @@ -5664,7 +5644,6 @@ public void test_lag_func_lag_Fn_72() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lead_func/lead_Fn_10") @Test public void test_lead_func_lead_Fn_10() @@ -5672,7 +5651,6 @@ public void test_lead_func_lead_Fn_10() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lead_func/lead_Fn_11") @Test public void test_lead_func_lead_Fn_11() @@ -5680,7 +5658,6 @@ public void test_lead_func_lead_Fn_11() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lead_func/lead_Fn_12") @Test public void test_lead_func_lead_Fn_12() @@ -5688,7 +5665,6 @@ public void test_lead_func_lead_Fn_12() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lead_func/lead_Fn_13") @Test public void test_lead_func_lead_Fn_13() @@ -5696,7 +5672,6 @@ public void test_lead_func_lead_Fn_13() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lead_func/lead_Fn_14") @Test public void test_lead_func_lead_Fn_14() @@ -5704,7 +5679,6 @@ public void test_lead_func_lead_Fn_14() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lead_func/lead_Fn_15") @Test public void test_lead_func_lead_Fn_15() @@ -5712,7 +5686,6 @@ public void test_lead_func_lead_Fn_15() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lead_func/lead_Fn_16") @Test public void test_lead_func_lead_Fn_16() @@ -5720,7 +5693,6 @@ public void test_lead_func_lead_Fn_16() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lead_func/lead_Fn_17") @Test public void test_lead_func_lead_Fn_17() @@ -5728,7 +5700,6 @@ public void test_lead_func_lead_Fn_17() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lead_func/lead_Fn_18") @Test public void test_lead_func_lead_Fn_18() @@ -5736,7 +5707,7 @@ public void test_lead_func_lead_Fn_18() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.UNSUPPORTED_NULL_ORDERING) @DrillTest("lead_func/lead_Fn_19") @Test public void test_lead_func_lead_Fn_19() @@ -5752,7 +5723,7 @@ public void test_lead_func_lead_Fn_20() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.UNSUPPORTED_NULL_ORDERING) @DrillTest("lead_func/lead_Fn_21") @Test public void test_lead_func_lead_Fn_21() @@ -5760,7 +5731,7 @@ public void test_lead_func_lead_Fn_21() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.UNSUPPORTED_NULL_ORDERING) @DrillTest("lead_func/lead_Fn_22") @Test public void test_lead_func_lead_Fn_22() @@ -5792,7 +5763,6 @@ public void test_lead_func_lead_Fn_25() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lead_func/lead_Fn_64") @Test public void test_lead_func_lead_Fn_64() @@ -5800,7 +5770,6 @@ public void test_lead_func_lead_Fn_64() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lead_func/lead_Fn_65") @Test public void test_lead_func_lead_Fn_65() @@ -5808,7 +5777,6 @@ public void test_lead_func_lead_Fn_65() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lead_func/lead_Fn_66") @Test public void test_lead_func_lead_Fn_66() @@ -5816,7 +5784,6 @@ public void test_lead_func_lead_Fn_66() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lead_func/lead_Fn_67") @Test public void test_lead_func_lead_Fn_67() @@ -5824,7 +5791,7 @@ public void test_lead_func_lead_Fn_67() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.UNSUPPORTED_NULL_ORDERING) @DrillTest("lead_func/lead_Fn_68") @Test public void test_lead_func_lead_Fn_68() @@ -5832,7 +5799,6 @@ public void test_lead_func_lead_Fn_68() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) @DrillTest("lead_func/lead_Fn_71") @Test public void test_lead_func_lead_Fn_71() @@ -5840,7 +5806,7 @@ public void test_lead_func_lead_Fn_71() windowQueryTest(); } - @NotYetSupported(Modes.NULLS_FIRST_LAST) + @NotYetSupported(Modes.UNSUPPORTED_NULL_ORDERING) @DrillTest("lead_func/lead_Fn_72") @Test public void test_lead_func_lead_Fn_72() @@ -6462,7 +6428,6 @@ public void test_aggregates_winFnQry_8() windowQueryTest(); } - @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("aggregates/wo_OrdrBy_17") @Test public void test_aggregates_wo_OrdrBy_17() @@ -6470,7 +6435,6 @@ public void test_aggregates_wo_OrdrBy_17() windowQueryTest(); } - @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("aggregates/wo_OrdrBy_18") @Test public void test_aggregates_wo_OrdrBy_18() @@ -6478,7 +6442,6 @@ public void test_aggregates_wo_OrdrBy_18() windowQueryTest(); } - @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("aggregates/wo_OrdrBy_19") @Test public void test_aggregates_wo_OrdrBy_19() @@ -6486,7 +6449,6 @@ public void test_aggregates_wo_OrdrBy_19() windowQueryTest(); } - @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("aggregates/wo_OrdrBy_20") @Test public void test_aggregates_wo_OrdrBy_20() @@ -6494,7 +6456,6 @@ public void test_aggregates_wo_OrdrBy_20() windowQueryTest(); } - @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("aggregates/wo_OrdrBy_21") @Test public void test_aggregates_wo_OrdrBy_21() @@ -6673,7 +6634,6 @@ public void test_aggregates_woPrtnBy_9() windowQueryTest(); } - @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("first_val/firstValFn_17") @Test public void test_first_val_firstValFn_17() @@ -7575,7 +7535,6 @@ public void test_lead_func_lead_Fn_51() windowQueryTest(); } - @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("lead_func/lead_Fn_54") @Test public void test_lead_func_lead_Fn_54() @@ -7590,7 +7549,6 @@ public void test_lead_func_lead_Fn_60() windowQueryTest(); } - @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("lead_func/lead_Fn_63") @Test public void test_lead_func_lead_Fn_63() @@ -7612,7 +7570,6 @@ public void test_lead_func_lead_Fn_77() windowQueryTest(); } - @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("lead_func/lead_Fn_90") @Test public void test_lead_func_lead_Fn_90() @@ -7627,7 +7584,6 @@ public void test_lead_func_lead_Fn_96() windowQueryTest(); } - @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("lead_func/lead_Fn_9") @Test public void test_lead_func_lead_Fn_9() @@ -7643,7 +7599,6 @@ public void test_nestedAggs_basic_3() windowQueryTest(); } - @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("nestedAggs/basic_5") @Test public void test_nestedAggs_basic_5() @@ -7729,7 +7684,6 @@ public void test_nestedAggs_woutPrtnBy_5() windowQueryTest(); } - @NotYetSupported(Modes.RESULT_MISMATCH) @DrillTest("ntile_func/ntileFn_15") @Test public void test_ntile_func_ntileFn_15() @@ -7898,7 +7852,6 @@ public void test_lag_func_lag_Fn_60() windowQueryTest(); } - @NotYetSupported(Modes.T_ALLTYPES_ISSUES) @DrillTest("lag_func/lag_Fn_77") @Test public void test_lag_func_lag_Fn_77() @@ -7906,7 +7859,6 @@ public void test_lag_func_lag_Fn_77() windowQueryTest(); } - @NotYetSupported(Modes.T_ALLTYPES_ISSUES) @DrillTest("lag_func/lag_Fn_95") @Test public void test_lag_func_lag_Fn_95() diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/NotYetSupported.java b/sql/src/test/java/org/apache/druid/sql/calcite/NotYetSupported.java index 32364f6a8b19..933359e96bf6 100644 --- a/sql/src/test/java/org/apache/druid/sql/calcite/NotYetSupported.java +++ b/sql/src/test/java/org/apache/druid/sql/calcite/NotYetSupported.java @@ -88,7 +88,8 @@ enum Modes INCORRECT_SYNTAX(DruidException.class, "Incorrect syntax near the keyword"), // at least c7 is represented oddly in the parquet file T_ALLTYPES_ISSUES(AssertionError.class, "(t_alltype|allTypsUniq|fewRowsAllData).parquet.*Verifier.verify"), - RESULT_MISMATCH(AssertionError.class, "assertResultsEquals"); + RESULT_MISMATCH(AssertionError.class, "assertResultsEquals"), + UNSUPPORTED_NULL_ORDERING(DruidException.class, "(A|DE)SCENDING ordering with NULLS (LAST|FIRST)"); public Class throwableClass; public String regex; diff --git a/sql/src/test/resources/calcite/tests/window/orderByDescNulls.sqlTest b/sql/src/test/resources/calcite/tests/window/orderByDescNulls.sqlTest new file mode 100644 index 000000000000..320b448c7488 --- /dev/null +++ b/sql/src/test/resources/calcite/tests/window/orderByDescNulls.sqlTest @@ -0,0 +1,45 @@ +type: "operatorValidation" + +sql: | + SELECT + cityName, + __time, + ROW_NUMBER() OVER (ORDER BY cityName desc nulls last, __time ) windowedDelta, + ROW_NUMBER() OVER (ORDER BY cityName nulls first, __time ) windowedDelta + FROM wikipedia + where page < '0' and channel like '#en%' + +expectedOperators: + - type: "naiveSort" + columns: + - column: "cityName" + direction: "DESC" + - column: "__time" + direction: "ASC" + - type: "naivePartition" + partitionColumns: [ ] + - type: "window" + processor: + type: "rowNumber" + outputColumn: "w0" + - type: "naiveSort" + columns: + - column: "cityName" + direction: "ASC" + - column: "__time" + direction: "ASC" + - type: "naivePartition" + partitionColumns: [ ] + - type: "window" + processor: + type: "rowNumber" + outputColumn: "w1" +expectedResults: + - [null,1442019358364,3,1] + - [null,1442021099146,4,2] + - [null,1442033539153,5,3] + - [null,1442095704125,6,4] + - [null,1442096110867,7,5] + - [null,1442100368226,8,6] + - ["Crescent City",1442035449448,2,7] + - ["Vinnytsya",1442100940306,1,8]