[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:
@ -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);
|
||||
|
||||
@ -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()) {
|
||||
|
||||
@ -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()));
|
||||
}
|
||||
}
|
||||
|
||||
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user