@@ -3307,6 +3307,69 @@ static void checkOverlaps(OverlapChecker c) {
33073307 c.isTrue("($3,$0) IMMEDIATELY SUCCEEDS ($0,$0)");
33083308 }
33093309
3310+ /** Test cases for <a href="https://issues.apache.org/jira/browse/CALCITE-7418">[CALCITE-7418]
3311+ * SqlOverlapsOperator does not reject some illegal comparisons (e.g., TIME vs DATE)</a>. */
3312+ @Test void testNegativePeriodOperators() {
3313+ final String containsError = "Supported form\\(s\\): "
3314+ + "'\\(<DT>, <DT>\\) CONTAINS \\(<DT>, <DT>\\)'\\n"
3315+ + "'\\(<DT>, <DT>\\) CONTAINS \\(<DT>, <INTERVAL>\\)'\\n"
3316+ + "'\\(<DT>, <INTERVAL>\\) CONTAINS \\(<DT>, <DT>\\)'\\n"
3317+ + "'\\(<DT>, <INTERVAL>\\) CONTAINS \\(<DT>, <INTERVAL>\\)'\\n"
3318+ + "'\\(<DT>, <DT>\\) CONTAINS <DT>'\\n"
3319+ + "'\\(<DT>, <INTERVAL>\\) CONTAINS <DT>'\\n"
3320+ + "Where 'DT' is one of 'DATE', 'TIME', or 'TIMESTAMP', the same for all arguments.";
3321+ final SqlOperatorFixture f = fixture();
3322+ f.checkFails("^(DATE '2020-10-10', DATE '2021-10-10') CONTAINS TIME '10:00:00'^",
3323+ "Cannot apply 'CONTAINS' to arguments of type "
3324+ + "'<RECORDTYPE\\(DATE EXPR\\$0, DATE EXPR\\$1\\)> CONTAINS <TIME\\(0\\)>'\\. "
3325+ + containsError, false);
3326+ f.checkFails("^(DATE '2020-10-10', DATE '2021-10-10') CONTAINS "
3327+ + "TIMESTAMP '2010-01-01 10:00:00'^",
3328+ "Cannot apply 'CONTAINS' to arguments of type "
3329+ + "'<RECORDTYPE\\(DATE EXPR\\$0, DATE EXPR\\$1\\)> CONTAINS <TIMESTAMP\\(0\\)>'\\. "
3330+ + containsError, false);
3331+ f.checkFails("^(DATE '2020-10-10', TIMESTAMP '2021-10-10 00:00:00') "
3332+ + "CONTAINS TIMESTAMP '2010-01-01 10:00:00'^",
3333+ "Cannot apply 'CONTAINS' to arguments of type "
3334+ + "'<RECORDTYPE\\(DATE EXPR\\$0, TIMESTAMP\\(0\\) EXPR\\$1\\)> "
3335+ + "CONTAINS <TIMESTAMP\\(0\\)>'\\. "
3336+ + containsError, false);
3337+ f.checkFails("^(TIME '10:10:10', DATE '2021-10-10') CONTAINS TIME '10:00:00'^",
3338+ "Cannot apply 'CONTAINS' to arguments of type "
3339+ + "'<RECORDTYPE\\(TIME\\(0\\) EXPR\\$0, DATE EXPR\\$1\\)> CONTAINS <TIME\\(0\\)>'\\. "
3340+ + containsError, false);
3341+ f.checkFails("^(TIME '10:10:10', DATE '2021-10-10') CONTAINS TIMESTAMP '2010-02-02 10:00:00'^",
3342+ "Cannot apply 'CONTAINS' to arguments of type "
3343+ + "'<RECORDTYPE\\(TIME\\(0\\) EXPR\\$0, DATE EXPR\\$1\\)> "
3344+ + "CONTAINS <TIMESTAMP\\(0\\)>'\\. "
3345+ + containsError, false);
3346+ final String overlapsError = "Supported form\\(s\\): "
3347+ + "'\\(<DT>, <DT>\\) OVERLAPS \\(<DT>, <DT>\\)'\\n"
3348+ + "'\\(<DT>, <DT>\\) OVERLAPS \\(<DT>, <INTERVAL>\\)'\\n"
3349+ + "'\\(<DT>, <INTERVAL>\\) OVERLAPS \\(<DT>, <DT>\\)'\\n"
3350+ + "'\\(<DT>, <INTERVAL>\\) OVERLAPS \\(<DT>, <INTERVAL>\\)'\\n"
3351+ + "Where 'DT' is one of 'DATE', 'TIME', or 'TIMESTAMP', the same for all arguments.";
3352+ f.checkFails("^(TIME '10:10:10', DATE '2021-10-10') OVERLAPS "
3353+ + "(TIMESTAMP '2010-02-02 10:00:00', TIME '10:00:00')^",
3354+ "Cannot apply 'OVERLAPS' to arguments of type "
3355+ + "'<RECORDTYPE\\(TIME\\(0\\) EXPR\\$0, DATE EXPR\\$1\\)> "
3356+ + "OVERLAPS <RECORDTYPE\\(TIMESTAMP\\(0\\) EXPR\\$0, TIME\\(0\\) EXPR\\$1\\)>'\\. "
3357+ + overlapsError, false);
3358+ f.checkFails("^(TIME '10:10:10', DATE '2021-10-10') "
3359+ + "OVERLAPS (TIME '10:00:00', DATE '2020-01-01')^",
3360+ "Cannot apply 'OVERLAPS' to arguments of type "
3361+ + "'<RECORDTYPE\\(TIME\\(0\\) EXPR\\$0, DATE EXPR\\$1\\)> "
3362+ + "OVERLAPS <RECORDTYPE\\(TIME\\(0\\) EXPR\\$0, DATE EXPR\\$1\\)>'\\. "
3363+ + overlapsError, false);
3364+ final String precedesError = overlapsError.replace("OVERLAPS", "PRECEDES");
3365+ f.checkFails("^(TIME '10:10:10', DATE '2021-10-10') "
3366+ + "PRECEDES (TIME '10:00:00', TIME '10:10:10')^",
3367+ "Cannot apply 'PRECEDES' to arguments of type "
3368+ + "'<RECORDTYPE\\(TIME\\(0\\) EXPR\\$0, DATE EXPR\\$1\\)> "
3369+ + "PRECEDES <RECORDTYPE\\(TIME\\(0\\) EXPR\\$0, TIME\\(0\\) EXPR\\$1\\)>'\\. "
3370+ + precedesError, false);
3371+ }
3372+
33103373 @Test void testLessThanOperator() {
33113374 final SqlOperatorFixture f = fixture();
33123375 f.setFor(SqlStdOperatorTable.LESS_THAN, VmName.EXPAND);
0 commit comments