[ 
https://issues.apache.org/jira/browse/FLINK-3859?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15327547#comment-15327547
 ] 

ASF GitHub Bot commented on FLINK-3859:
---------------------------------------

Github user fhueske commented on a diff in the pull request:

    https://github.com/apache/flink/pull/2088#discussion_r66807225
  
    --- Diff: 
flink-libraries/flink-table/src/test/scala/org/apache/flink/api/scala/expression/DecimalTypeTest.scala
 ---
    @@ -0,0 +1,262 @@
    +/*
    + * Licensed to the Apache Software Foundation (ASF) under one
    + * or more contributor license agreements.  See the NOTICE file
    + * distributed with this work for additional information
    + * regarding copyright ownership.  The ASF licenses this file
    + * to you under the Apache License, Version 2.0 (the
    + * "License"); you may not use this file except in compliance
    + * with the License.  You may obtain a copy of the License at
    + *
    + *     http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + */
    +
    +package org.apache.flink.api.scala.expression
    +
    +import org.apache.flink.api.common.typeinfo.BasicTypeInfo._
    +import org.apache.flink.api.common.typeinfo.TypeInformation
    +import org.apache.flink.api.scala.expression.utils.ExpressionTestBase
    +import org.apache.flink.api.scala.table._
    +import org.apache.flink.api.table.Row
    +import org.apache.flink.api.table.expressions.Literal
    +import org.apache.flink.api.table.typeutils.RowTypeInfo
    +import org.junit.Test
    +
    +class DecimalTypeTest extends ExpressionTestBase {
    +
    +  @Test
    +  def testDecimalLiterals(): Unit = {
    +    // implicit double
    +    testAllApis(
    +      11.2,
    +      "11.2",
    +      "11.2",
    +      "11.2")
    +
    +    // implicit double
    +    testAllApis(
    +      0.7623533651719233,
    +      "0.7623533651719233",
    +      "0.7623533651719233",
    +      "0.7623533651719233")
    +
    +    // explicit decimal (with precision of 19)
    +    testAllApis(
    +      BigDecimal("1234567891234567891"),
    +      "1234567891234567891p",
    +      "1234567891234567891",
    +      "1234567891234567891")
    +
    +    // explicit decimal (high precision, not SQL compliant)
    +    testTableApi(
    +      BigDecimal("123456789123456789123456789"),
    +      "123456789123456789123456789p",
    +      "123456789123456789123456789")
    +
    +    // explicit decimal (high precision, not SQL compliant)
    +    testTableApi(
    +      BigDecimal("12.3456789123456789123456789"),
    +      "12.3456789123456789123456789p",
    +      "12.3456789123456789123456789")
    +  }
    +
    +  @Test
    +  def testDecimalBorders(): Unit = {
    +    testAllApis(
    +      Double.MaxValue,
    +      Double.MaxValue.toString,
    +      Double.MaxValue.toString,
    +      Double.MaxValue.toString)
    +
    +    testAllApis(
    +      Double.MinValue,
    +      Double.MinValue.toString,
    +      Double.MinValue.toString,
    +      Double.MinValue.toString)
    +
    +    testAllApis(
    +      Double.MinValue.cast(FLOAT_TYPE_INFO),
    +      s"${Double.MinValue}.cast(FLOAT)",
    +      s"CAST(${Double.MinValue} AS FLOAT)",
    +      Float.NegativeInfinity.toString)
    +
    +    testAllApis(
    +      Byte.MinValue.cast(BYTE_TYPE_INFO),
    +      s"(${Byte.MinValue}).cast(BYTE)",
    +      s"CAST(${Byte.MinValue} AS TINYINT)",
    +      Byte.MinValue.toString)
    +
    +    testAllApis(
    +      Byte.MinValue.cast(BYTE_TYPE_INFO) - 1.cast(BYTE_TYPE_INFO),
    +      s"(${Byte.MinValue}).cast(BYTE) - (1).cast(BYTE)",
    +      s"CAST(${Byte.MinValue} AS TINYINT) - CAST(1 AS TINYINT)",
    +      Byte.MaxValue.toString)
    +
    +    testAllApis(
    +      Short.MinValue.cast(SHORT_TYPE_INFO),
    +      s"(${Short.MinValue}).cast(SHORT)",
    +      s"CAST(${Short.MinValue} AS SMALLINT)",
    +      Short.MinValue.toString)
    +
    +    testAllApis(
    +      Int.MinValue.cast(INT_TYPE_INFO) - 1,
    +      s"(${Int.MinValue}).cast(INT) - 1",
    +      s"CAST(${Int.MinValue} AS INT) - 1",
    +      Int.MaxValue.toString)
    +
    +    testAllApis(
    +      Long.MinValue.cast(LONG_TYPE_INFO),
    +      s"(${Long.MinValue}L).cast(LONG)",
    +      s"CAST(${Long.MinValue} AS BIGINT)",
    +      Long.MinValue.toString)
    +  }
    +
    +  @Test
    +  def testDecimalCasting(): Unit = {
    +    // from String
    +    testTableApi(
    +      "123456789123456789123456789".cast(BIG_DEC_TYPE_INFO),
    +      "'123456789123456789123456789'.cast(DECIMAL)",
    +      "123456789123456789123456789")
    +
    +    // from double
    +    testAllApis(
    +      'f3.cast(BIG_DEC_TYPE_INFO),
    +      "f3.cast(DECIMAL)",
    +      "CAST(f3 AS DECIMAL)",
    +      "4.2")
    +
    +    // to double
    +    testAllApis(
    +      'f0.cast(DOUBLE_TYPE_INFO),
    +      "f0.cast(DOUBLE)",
    +      "CAST(f0 AS DOUBLE)",
    +      "1.2345678912345679E8")
    +
    +    // to int
    +    testAllApis(
    +      'f4.cast(INT_TYPE_INFO),
    +      "f4.cast(INT)",
    +      "CAST(f4 AS INT)",
    +      "123456789")
    +
    +    // to long
    +    testAllApis(
    +      'f4.cast(LONG_TYPE_INFO),
    +      "f4.cast(LONG)",
    +      "CAST(f4 AS BIGINT)",
    +      "123456789")
    +
    +    // to boolean (not SQL compliant)
    +    testTableApi(
    +      'f1.cast(BOOLEAN_TYPE_INFO),
    +      "f1.cast(BOOL)",
    +      "true")
    +
    +    testTableApi(
    +      'f5.cast(BOOLEAN_TYPE_INFO),
    +      "f5.cast(BOOL)",
    +      "false")
    +
    +    testTableApi(
    +      BigDecimal("123456789.123456789123456789").cast(DOUBLE_TYPE_INFO),
    +      "(123456789.123456789123456789p).cast(DOUBLE)",
    +      "1.2345678912345679E8")
    +  }
    +
    +  @Test
    +  def testDecimalArithmetic(): Unit = {
    +    // implicit cast to decimal
    +    testAllApis(
    +      'f1 + 12,
    +      "f1 + 12",
    +      "f1 + 12",
    +      "123456789123456789123456801")
    +
    +    // implicit cast to decimal
    +    testAllApis(
    +      Literal(12) + 'f1,
    +      "12 + f1",
    +      "12 + f1",
    +      "123456789123456789123456801")
    +
    +    // implicit cast to decimal
    +    testAllApis(
    +      'f1 + 12.3,
    +      "f1 + 12.3",
    +      "f1 + 12.3",
    +      "123456789123456789123456801.3")
    +
    +    // implicit cast to decimal
    +    testAllApis(
    +      Literal(12.3) + 'f1,
    +      "12.3 + f1",
    +      "12.3 + f1",
    +      "123456789123456789123456801.3")
    +
    +    testAllApis(
    +      'f1 + 'f1,
    +      "f1 + f1",
    +      "f1 + f1",
    +      "246913578246913578246913578")
    +
    +    testAllApis(
    +      'f1 - 'f1,
    +      "f1 - f1",
    +      "f1 - f1",
    +      "0")
    +
    +    testAllApis(
    +      'f1 * 'f1,
    +      "f1 * f1",
    +      "f1 * f1",
    +      "15241578780673678546105778281054720515622620750190521")
    +
    +    testAllApis(
    +      'f1 / 'f1,
    +      "f1 / f1",
    +      "f1 / f1",
    +      "1")
    +
    +    testAllApis(
    +      'f1 % 'f1,
    +      "f1 % f1",
    +      "MOD(f1, f1)",
    +      "0")
    +
    +    testAllApis(
    +      -'f0,
    +      "-f0",
    +      "-f0",
    +      "-123456789.123456789123456789")
    +  }
    +
    --- End diff --
    
    It would be good to add tests for comparison operators as well. For 
instance, 
    
    ```
    testTableApi('f4 < 'f0, "f4 < f0", "true")
    ```
    yields a 
    > org.apache.flink.api.table.ValidationException: Expression 'f4 < 'f0 
failed on input check: Comparison is only supported for Strings and numeric 
types, get BigDecimal and BigDecimal
    
    while
    ```
    testSqlApi("f4 < f0", "true")
    ```
    
    completes successfully. 


> Add BigDecimal/BigInteger support to Table API
> ----------------------------------------------
>
>                 Key: FLINK-3859
>                 URL: https://issues.apache.org/jira/browse/FLINK-3859
>             Project: Flink
>          Issue Type: New Feature
>          Components: Table API
>            Reporter: Timo Walther
>            Assignee: Timo Walther
>            Priority: Critical
>
> Since FLINK-3786 has been solved, we can now start integrating 
> BigDecimal/BigInteger into the Table API.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to