[
https://issues.apache.org/jira/browse/CALCITE-2464?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16719302#comment-16719302
]
Julian Hyde commented on CALCITE-2464:
--------------------------------------
I found [this section of a book by Jim
Melton|https://books.google.com/books?id=phbh1EK2aNMC&pg=PA232&lpg=PA232&dq=structured+type+null&source=bl&ots=uX1ZeIsV35&sig=Es-CgYvViibEGmQ_VhZiDd7eEqU&hl=en&sa=X&ved=2ahUKEwjj7arc85rfAhWqiFQKHRQfCvkQ6AEwD3oECAIQAQ#v=onepage&q=structured%20type%20null&f=false]
describing the rationale for having constraints on columns (including ROW
columns) but not on attributes of structured types. I now see your point that
you should be able to declare a ROW column as NOT NULL, and therefore we need
the {{boolean nullable}} member variable.
I believe that a ROW value is considered null if and only if all of its fields
are null. (This contradicts what I said above.) Can you please confirm this?
Calcite differs from the SQL standard in that it allows NOT NULL constraints on
attributes of structured types. That's OK, but how do the behaviors combine? If
someone declares a column {{r ROW(x INT NOT NULL, y INT NOT NULL)}} should we
implicitly add {{NOT NULL}} to {{r}}? And vice versa, if someone declares {{r
ROW(x INT, y INT) NOT NULL}} should be implicitly add {{NOT NULL}} to {{x}} and
{{y}}?
The subject of this case, "Struct types are always not nullable", is ambiguous.
Please change it.
I don't think we need a new method in type factory. You can change the
nullability of the type after it is created.
Can we have a test that executes a query and tests whether a ROW column is
null? E.g. "WHERE address IS NULL", or "WHERE address IS NOT NULL". Also a DDL
test in server's table.iq.
> Struct types are always not nullable
> ------------------------------------
>
> Key: CALCITE-2464
> URL: https://issues.apache.org/jira/browse/CALCITE-2464
> Project: Calcite
> Issue Type: Bug
> Components: core
> Affects Versions: 1.17.0
> Reporter: Stamatis Zampetakis
> Assignee: Julian Hyde
> Priority: Major
>
> Struct types are always not nullable. This can lead to bugs in many parts of
> Calcite (e.g., expression simplification, optimization, code generation) that
> are considering the nullability of a RelDataType.
> The method
> [isNullable|https://github.com/apache/calcite/blob/3c6b5ec759caadabb67f09d7a4963cc7d9386d0c/core/src/main/java/org/apache/calcite/rel/type/RelRecordType.java#L55]
> in the RelRecordType, which is used to represent a structured type, always
> returns false. The nullability of the RelRecordType should be a parameter in
> the constructor as it is the case for various other RelDataTypes.
> Additionally, the data type cache should also take into account the
> nullability of the type in order to return a correct equivalent.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)