Update decimal's max precision to 38, be aligned with Hive (cherry picked from commit 30e09d8c8198ed074658d2664676a5243a0690dc)
Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/543124da Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/543124da Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/543124da Branch: refs/heads/sync Commit: 543124dab1ec1e6f23ea8cc63c97abc89a1eae0d Parents: 59d5064 Author: Yifan Zhang <event.dim...@gmail.com> Authored: Thu Jan 18 23:44:25 2018 +0800 Committer: Li Yang <liy...@apache.org> Committed: Fri Jan 26 22:54:58 2018 +0800 ---------------------------------------------------------------------- .../query/calcite/KylinRelDataTypeSystem.java | 11 +++ .../calcite/KylinRelDataTypeSystemTest.java | 78 ++++++++++++++++++++ 2 files changed, 89 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/543124da/query/src/main/java/org/apache/kylin/query/calcite/KylinRelDataTypeSystem.java ---------------------------------------------------------------------- diff --git a/query/src/main/java/org/apache/kylin/query/calcite/KylinRelDataTypeSystem.java b/query/src/main/java/org/apache/kylin/query/calcite/KylinRelDataTypeSystem.java index 060747a..35b4c3d 100644 --- a/query/src/main/java/org/apache/kylin/query/calcite/KylinRelDataTypeSystem.java +++ b/query/src/main/java/org/apache/kylin/query/calcite/KylinRelDataTypeSystem.java @@ -45,4 +45,15 @@ public class KylinRelDataTypeSystem extends RelDataTypeSystemImpl { } return argumentType; } + + /** + * Hive support decimal with 38 digits, kylin should align + * + * @see org.apache.calcite.rel.type.RelDataTypeSystem + * @see <a href="https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-DecimalsdecimalDecimals">Hive/LanguageManualTypes-Decimals</a> + */ + @Override + public int getMaxNumericPrecision() { + return 38; + } } http://git-wip-us.apache.org/repos/asf/kylin/blob/543124da/query/src/test/java/org/apache/kylin/query/calcite/KylinRelDataTypeSystemTest.java ---------------------------------------------------------------------- diff --git a/query/src/test/java/org/apache/kylin/query/calcite/KylinRelDataTypeSystemTest.java b/query/src/test/java/org/apache/kylin/query/calcite/KylinRelDataTypeSystemTest.java new file mode 100644 index 0000000..e9ef548 --- /dev/null +++ b/query/src/test/java/org/apache/kylin/query/calcite/KylinRelDataTypeSystemTest.java @@ -0,0 +1,78 @@ +/* + * 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.kylin.query.calcite; + +import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.rel.type.RelDataTypeFactory; +import org.apache.calcite.rel.type.RelDataTypeSystem; +import org.apache.calcite.sql.type.BasicSqlType; +import org.apache.calcite.sql.type.SqlTypeFactoryImpl; +import org.apache.calcite.sql.type.SqlTypeName; +import org.apache.kylin.common.util.LocalFileMetadataTestCase; +import org.apache.kylin.metadata.datatype.DataType; +import org.apache.kylin.query.schema.OLAPTable; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class KylinRelDataTypeSystemTest extends LocalFileMetadataTestCase { + + @Before + public void setUp() throws Exception { + this.createTestMetadata(); + } + + @After + public void after() throws Exception { + this.cleanupTestMetadata(); + } + + @Test + public void testLegalDecimalType() { + RelDataTypeSystem typeSystem = new KylinRelDataTypeSystem(); + RelDataTypeFactory typeFactory = new SqlTypeFactoryImpl(typeSystem); + + DataType dataType = DataType.getType("decimal(30, 10)"); + RelDataType relDataType = OLAPTable.createSqlType(typeFactory, dataType, true); + + Assert.assertTrue(relDataType instanceof BasicSqlType); + Assert.assertEquals(relDataType.getSqlTypeName(), SqlTypeName.DECIMAL); + Assert.assertEquals(relDataType.getPrecision(), 30); + Assert.assertTrue(relDataType.getPrecision() <= typeSystem.getMaxNumericPrecision()); + Assert.assertEquals(relDataType.getScale(), 10); + Assert.assertTrue(relDataType.getScale() <= typeSystem.getMaxNumericScale()); + } + + @Test + public void testIllegalDecimalType() { + RelDataTypeSystem typeSystem = new KylinRelDataTypeSystem(); + RelDataTypeFactory typeFactory = new SqlTypeFactoryImpl(typeSystem); + + DataType dataType = DataType.getType("decimal(40, 10)"); + RelDataType relDataType = OLAPTable.createSqlType(typeFactory, dataType, true); + + Assert.assertTrue(relDataType instanceof BasicSqlType); + Assert.assertEquals(relDataType.getSqlTypeName(), SqlTypeName.DECIMAL); + Assert.assertTrue(typeSystem.getMaxNumericPrecision() < 40); + Assert.assertEquals(relDataType.getPrecision(), typeSystem.getMaxNumericPrecision()); + Assert.assertEquals(relDataType.getScale(), 10); + Assert.assertTrue(relDataType.getScale() <= typeSystem.getMaxNumericScale()); + } +}