Nikolaus Schuetz created FLINK-40322:
----------------------------------------

             Summary: PyFlink ArrayType/MultisetType.from_sql_type calls 
to_sql_type instead
                 Key: FLINK-40322
                 URL: https://issues.apache.org/jira/browse/FLINK-40322
             Project: Flink
          Issue Type: Bug
          Components: API / Python
            Reporter: Nikolaus Schuetz


{{}}
h2. Summary

{{PyFlink's 
[ArrayType|https://github.com/apache/flink/blob/release-2.3.0/flink-python/pyflink/table/types.py#L926]}}
 and 
[{{MultisetType}}|https://github.com/apache/flink/blob/release-2.3.0/flink-python/pyflink/table/types.py#L1054]
  mistakenly call {{to_sql_type}} from their {{from_sql_type}} wrappers:
 * *MultisetType:* 
[https://github.com/apache/flink/blob/release-2.3.0/flink-python/pyflink/table/types.py#L1054]
 * *ArrayType:* 
[https://github.com/apache/flink/blob/release-2.3.0/flink-python/pyflink/table/types.py#L926]

This is a typo from the above wrapping of {{{}to_sql_type{}}}. To be clear, 
{{from_sql_type}} is meant to decode the internal/SQL representation back to 
Python. For an element type that needs conversion (e.g. {{{}DATE{}}}, whose 
internal form is an int day-count), decoding an {{{}ARRAY{}}}/{{{}MULTISET{}}} 
then feeds an {{int}} into {{{}DateType.to_sql_type{}}}, which does 
{{v.toordinal()}} and as expected it raises:

{{AttributeError: 'int' object has no attribute 'toordinal'}}

The sibling {{MapType.from_sql_type}} (same file) is correct — it calls 
{{from_sql_type}} on both key and value — so 
{{{}ArrayType{}}}/{{{}MultisetType{}}} are simply inconsistent with it.
h3. Reproduction
{code:python}
from pyflink.table.types import DataTypes

at = DataTypes.ARRAY(DataTypes.DATE())
at.from_sql_type([0, 1])
# expected: [datetime.date(1970, 1, 1), datetime.date(1970, 1, 2)]
# actual:   AttributeError: 'int' object has no attribute 'toordinal'
{code}
Same for {{{}DataTypes.MULTISET(DataTypes.DATE()){}}}.
h3. Fix

Call {{from_sql_type}} on each element, matching {{{}MapType.from_sql_type{}}}. 
Regression tests added for {{ARRAY<DATE>}} and {{{}MULTISET<DATE>{}}}.

 



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

Reply via email to