Dmitry Sysolyatin created CALCITE-7457:
------------------------------------------

             Summary: Top-level VALUES and SELECT produce different validation 
results for the same expression
                 Key: CALCITE-7457
                 URL: https://issues.apache.org/jira/browse/CALCITE-7457
             Project: Calcite
          Issue Type: Bug
          Components: core
    Affects Versions: 1.41.0
            Reporter: Dmitry Sysolyatin


While working on CALCITE-7269, I encountered an issue that is somewhat of a 
blocker for me, as the code paths differ: top-level validation for VALUES and 
SELECT behaves inconsistently.


Test cases:
{code:java}
@Test void testSelectVsValuesValidation() {
  // SELECT: inferUnknownTypes runs, FIRST_KNOWN infers NULL as
  // DECIMAL(2,1) and caches it via setValidatedNodeType. deriveType
  // for NULL is never called (type already cached by inference).
  // Result: DECIMAL(2,1) + DECIMAL(2,1) = DECIMAL(3,1).
  sql("select 1.0 + NULL from (values (0)) as t(x)")
      .columnType("DECIMAL(3, 1)");
  // VALUES: inferUnknownTypes does NOT run for top-level VALUES.
  // deriveType for NULL returns SqlTypeName.NULL. The + operator
  // treats DECIMAL(2,1) + NULL as DECIMAL(2,1) since NULL does not
  // affect precision.
  expr("1.0 + NULL")
      .columnType("DECIMAL(2, 1)");

  // SELECT: inferUnknownTypes infers ? as INTEGER from FIRST_KNOWN
  sql("select 1 + ? from (values (0)) as t(x)").ok();
  // VALUES: inferUnknownTypes does NOT run, ? stays UNKNOWN,
  // + operator rejects INTEGER + UNKNOWN
  expr("^1 + ?^")
      .fails("(?s).*Cannot apply '\\+' to arguments of type.*");

  // LOCALTIME(NULL) with type coercion disabled:
  // SELECT: inferUnknownTypes rejects NULL before LOCALTIME validates
  sql("select LOCALTIME(^NULL^) from (values (0)) as t(x)")
      .withTypeCoercion(false)
      .fails("(?s).*Illegal use of .NULL.*");
  // VALUES: inferUnknownTypes does NOT run, LOCALTIME's own
  // checkOperandTypes gives a function-specific error
  wholeExpr("LOCALTIME(NULL)")
      .withTypeCoercion(false)
      .fails("(?s).*Argument to function 'LOCALTIME' must not be NULL.*");
} 
{code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to