[Bug] Fix Windows function lag()/lead() function throw AnalysisException. (#4666)

Add lag() and lead() char and varchar check in `isCastMatchAllowed`.
This commit is contained in:
HappenLee
2020-10-04 10:24:36 +08:00
committed by GitHub
parent 97dd634cdc
commit f0bb012dd2
4 changed files with 67 additions and 3 deletions

View File

@ -224,7 +224,9 @@ public class DecimalLiteral extends LiteralExpr {
@Override
protected Expr uncheckedCastTo(Type targetType) throws AnalysisException {
if (targetType.isFloatingPointType()) {
if (targetType.isDecimal() || targetType.isDecimalV2()) {
return this;
} else if (targetType.isFloatingPointType()) {
return new FloatLiteral(value.doubleValue(), targetType);
} else if (targetType.isIntegerType()) {
return new IntLiteral(value.longValue(), targetType);

View File

@ -754,7 +754,9 @@ public class FunctionSet {
final Type[] candicateArgTypes = candicate.getArgs();
if (functionName.equalsIgnoreCase("hex")
|| functionName.equalsIgnoreCase("greast")
|| functionName.equalsIgnoreCase("least")) {
|| functionName.equalsIgnoreCase("least")
|| functionName.equalsIgnoreCase("lead")
|| functionName.equalsIgnoreCase("lag")) {
final ScalarType descArgType = (ScalarType)descArgTypes[0];
final ScalarType candicateArgType = (ScalarType)candicateArgTypes[0];
if (!descArgType.isStringType() && candicateArgType.isStringType()) {

View File

@ -19,6 +19,8 @@ package org.apache.doris.analysis;
import org.apache.doris.catalog.PrimitiveType;
import org.apache.doris.catalog.Type;
import org.apache.doris.common.AnalysisException;
import org.junit.Assert;
import org.junit.Test;
@ -28,7 +30,7 @@ import java.nio.ByteBuffer;
public class DecimalLiteralTest {
@Test
public void testHashValue() {
public void testHashValue() throws AnalysisException {
BigDecimal decimal = new BigDecimal("-123456789123456789.123456789");
DecimalLiteral literal = new DecimalLiteral(decimal);
@ -40,6 +42,11 @@ public class DecimalLiteralTest {
Assert.assertEquals(-123456789123456789L, longValue);
Assert.assertEquals(-123456789, fracValue);
// if DecimalLiteral need to cast to Decimal and Decimalv2, need to cast
// to themselves
Assert.assertEquals(literal, literal.uncheckedCastTo(Type.DECIMAL));
Assert.assertEquals(literal, literal.uncheckedCastTo(Type.DECIMALV2));
Assert.assertEquals(1, literal.compareLiteral(new NullLiteral()));
}
}

View File

@ -0,0 +1,53 @@
// 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.doris.catalog;
import org.apache.doris.analysis.FunctionName;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class FunctionSetTest {
private FunctionSet functionSet;
@Before
public void setUp() {
functionSet = new FunctionSet();
functionSet.init();
}
@Test
public void testGetLagFunction() {
Type[] argTypes1 = {ScalarType.DECIMAL, ScalarType.TINYINT, ScalarType.TINYINT};
Function lagDesc1 = new Function(new FunctionName("lag"), argTypes1, (Type) ScalarType.INVALID, false);
Function newFunction = functionSet.getFunction(lagDesc1, Function.CompareMode.IS_SUPERTYPE_OF);
Type[] newArgTypes = newFunction.getArgs();
Assert.assertTrue(newArgTypes[0].matchesType(newArgTypes[2]));
Assert.assertTrue(newArgTypes[0].matchesType(ScalarType.DECIMAL));
Type[] argTypes2 = {ScalarType.VARCHAR, ScalarType.TINYINT, ScalarType.TINYINT};
Function lagDesc2 = new Function(new FunctionName("lag"), argTypes2, (Type) ScalarType.INVALID, false);
newFunction = functionSet.getFunction(lagDesc2, Function.CompareMode.IS_SUPERTYPE_OF);
newArgTypes = newFunction.getArgs();
Assert.assertTrue(newArgTypes[0].matchesType(newArgTypes[2]));
Assert.assertTrue(newArgTypes[0].matchesType(ScalarType.VARCHAR));
}
}