[ 
https://issues.apache.org/jira/browse/FLINK-23269?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jark Wu updated FLINK-23269:
----------------------------
    Component/s: Table SQL / Ecosystem

> json format decode number to vatchar error when define Decimal type in ddl
> --------------------------------------------------------------------------
>
>                 Key: FLINK-23269
>                 URL: https://issues.apache.org/jira/browse/FLINK-23269
>             Project: Flink
>          Issue Type: Bug
>          Components: Formats (JSON, Avro, Parquet, ORC, SequenceFile), Table 
> SQL / Ecosystem
>            Reporter: silence
>            Priority: Minor
>
> when use json format and define decimal
> json:
> {"c1":50.0,"c2":50.0}
> ddl:
> create table(
> c1 varchar,
> c2 decimal
> )with(
> 'format'='json'
> )
> output:
> {"c1":"5E+1","c2":50.0}
> And the following unit tests will produce the following results
> {"double1":50.0,"double2":50.0,"double3":"50.0","float1":20.0,"float2":20.0,"float3":"20.0"}
> java.lang.AssertionError: 
> Expected :+I[50.0, 50.0, 50.0, 20.0, 20.0, 20.0]
> Actual   :+I[5E+1, 50.0, 50.0, 2E+1, 20.0, 20.0]
> {code:java}
> @Test
>     public void testDeserialization() throws Exception {
>         double doubleValue = 50.0;
>         float floatValue = 20.0f;
>         ObjectMapper objectMapper = new ObjectMapper();
>         ObjectNode root = objectMapper.createObjectNode();
>         root.put("double1", doubleValue);
>         root.put("double2", doubleValue);
>         root.put("double3", String.valueOf(doubleValue));
>         root.put("float1", floatValue);
>         root.put("float2", floatValue);
>         root.put("float3", String.valueOf(floatValue));
>         byte[] serializedJson = objectMapper.writeValueAsBytes(root);
>         System.out.println(new String(serializedJson));
>         DataType dataType =
>                 ROW(
>                         FIELD("double1", STRING()),
>                         FIELD("double2", DECIMAL(10,1)),
>                         FIELD("double3", DOUBLE()),
>                         FIELD("float1", STRING()),
>                         FIELD("float2", DECIMAL(10,1)),
>                         FIELD("float3", FLOAT()));
>         RowType rowType = (RowType) dataType.getLogicalType();
>         JsonRowDataDeserializationSchema deserializationSchema =
>                 new JsonRowDataDeserializationSchema(
>                         rowType,
>                         InternalTypeInfo.of(rowType),
>                         false,
>                         false,
>                         TimestampFormat.ISO_8601);
>         Row expected = new Row(6);
>         expected.setField(0, String.valueOf(doubleValue));
>         expected.setField(1, String.valueOf(doubleValue));
>         expected.setField(2, doubleValue);
>         expected.setField(3, String.valueOf(floatValue));
>         expected.setField(4, String.valueOf(floatValue));
>         expected.setField(5, floatValue);
>         RowData rowData = deserializationSchema.deserialize(serializedJson);
>         Row actual = convertToExternal(rowData, dataType);
>         assertEquals(expected, actual);
>     }
> {code}
> when define the DecimalType 
> ObjectMapper will enable USE_BIG_DECIMAL_FOR_FLOATS
> and jsonNode.asText() will call BigDecimal toString method
> {code:java}
> boolean hasDecimalType =
>                 LogicalTypeChecks.hasNested(rowType, t -> t instanceof 
> DecimalType);
>         if (hasDecimalType) {
>             
> objectMapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);
>         }
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to