Vladimir Sitnikov created CALCITE-7890:
------------------------------------------

             Summary: SqlDescriptorOperator.checkOperandTypes rejects simple 
identifiers and is never called
                 Key: CALCITE-7890
                 URL: https://issues.apache.org/jira/browse/CALCITE-7890
             Project: Calcite
          Issue Type: Bug
          Components: core
    Affects Versions: 1.42.0
            Reporter: Vladimir Sitnikov


{{SqlDescriptorOperator.checkOperandTypes}}, added in CALCITE-3382, throws when 
an operand *is* a simple identifier:
{code:java}
if (!(operand instanceof SqlIdentifier)
    || ((SqlIdentifier) operand).isSimple()) {
  if (throwOnFailure) {
    throw SqlUtil.newContextException(operand.getParserPosition(),
        RESOURCE.aliasMustBeSimpleIdentifier());
  }
}
{code}
If the validator called it, every valid {{descriptor(rowtime)}} would fail with 
"Table or column alias must be a simple identifier". The validator never calls 
it: {{SqlDescriptorOperator.deriveType}} returns {{COLUMN_LIST}} without 
calling {{validateOperands}}, and no other validator path calls 
{{checkOperandTypes}} on a DESCRIPTOR. This is why 
{{SqlValidatorTest#testDescriptor}} accepts {{descriptor(rowtime)}}. When 
{{throwOnFailure}} is false, the method returns {{true}} for an invalid operand 
as well.

As a result, the operator itself does not enforce that a DESCRIPTOR argument is 
a list of column names (SQL:2016 8.15, {{<descriptor column list>}}). Only 
TUMBLE, HOP, and SESSION check their DESCRIPTOR operands, in 
{{SqlWindowTableFunction.validateColumnNames}}, which CALCITE-7377 added.

Seen on main at ce51f0e527 (1.43.0-SNAPSHOT), and in 1.42.0.

*Expected*, one of:
* {{SqlDescriptorOperator}} checks its operands, so that {{descriptor(1 + 2)}} 
and {{descriptor(t.a)}} fail with "The argument of DESCRIPTOR must be an 
identifier" (the {{descriptorMustBeIdentifier}} message from CALCITE-7377) in 
any function, while {{descriptor(rowtime)}} still validates. 
{{validateColumnNames}} then only needs to resolve the names. The DESCRIPTOR 
entry in {{site/_docs/reference.md}} says "The interpretation of names is left 
to the function"; it would need a sentence that each name must be a simple 
identifier.
* Or, if the window functions are meant to own the check, the dead 
{{checkOperandTypes}} override is removed.

CALCITE-3964 proposes an optional data type after each column name, so an 
operand check here would have to allow for that if it lands.




--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to