Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion be/src/runtime/mysql_result_writer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ int MysqlResultWriter::_add_row_value(int index, const TypeDescriptor& type, voi
// TODO: Support decimal output_scale after we support FE can sure
// accuracy of output_scale
// int output_scale = _output_expr_ctxs[index]->root()->output_scale();
buf_ret = _row_buffer->push_decimal(decimal_val, -1);
buf_ret = _row_buffer->push_decimal(decimal_val, type.scale);
break;
}

Expand Down
20 changes: 10 additions & 10 deletions be/src/vec/sink/vmysql_result_writer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ Status VMysqlResultWriter::_add_one_column(const ColumnPtr& column_ptr,
}
if constexpr (type == TYPE_DECIMALV2) {
DecimalV2Value decimal_val(data[i]);
auto decimal_str = decimal_val.to_string();
auto decimal_str = decimal_val.to_string(scale);
buf_ret = _buffer.push_string(decimal_str.c_str(), decimal_str.length());
}

Expand Down Expand Up @@ -449,6 +449,7 @@ Status VMysqlResultWriter::append_block(Block& input_block) {
auto column_ptr = block.get_by_position(i).column->convert_to_full_column_if_const();
auto type_ptr = block.get_by_position(i).type;

int scale = _output_vexpr_ctxs[i]->root()->type().scale;
switch (_output_vexpr_ctxs[i]->root()->result_type()) {
case TYPE_BOOLEAN:
if (type_ptr->is_nullable()) {
Expand Down Expand Up @@ -544,10 +545,10 @@ Status VMysqlResultWriter::append_block(Block& input_block) {
auto& nested_type =
assert_cast<const DataTypeNullable&>(*type_ptr).get_nested_type();
status = _add_one_column<PrimitiveType::TYPE_DECIMALV2, true>(column_ptr, result,
nested_type);
nested_type, scale);
} else {
status = _add_one_column<PrimitiveType::TYPE_DECIMALV2, false>(column_ptr, result,
type_ptr);
type_ptr, scale);
}
break;
}
Expand All @@ -556,10 +557,10 @@ Status VMysqlResultWriter::append_block(Block& input_block) {
auto& nested_type =
assert_cast<const DataTypeNullable&>(*type_ptr).get_nested_type();
status = _add_one_column<PrimitiveType::TYPE_DECIMAL32, true>(column_ptr, result,
nested_type);
nested_type, scale);
} else {
status = _add_one_column<PrimitiveType::TYPE_DECIMAL32, false>(column_ptr, result,
type_ptr);
type_ptr, scale);
}
break;
}
Expand All @@ -568,10 +569,10 @@ Status VMysqlResultWriter::append_block(Block& input_block) {
auto& nested_type =
assert_cast<const DataTypeNullable&>(*type_ptr).get_nested_type();
status = _add_one_column<PrimitiveType::TYPE_DECIMAL64, true>(column_ptr, result,
nested_type);
nested_type, scale);
} else {
status = _add_one_column<PrimitiveType::TYPE_DECIMAL64, false>(column_ptr, result,
type_ptr);
type_ptr, scale);
}
break;
}
Expand All @@ -580,10 +581,10 @@ Status VMysqlResultWriter::append_block(Block& input_block) {
auto& nested_type =
assert_cast<const DataTypeNullable&>(*type_ptr).get_nested_type();
status = _add_one_column<PrimitiveType::TYPE_DECIMAL128, true>(column_ptr, result,
nested_type);
nested_type, scale);
} else {
status = _add_one_column<PrimitiveType::TYPE_DECIMAL128, false>(column_ptr, result,
type_ptr);
type_ptr, scale);
}
break;
}
Expand Down Expand Up @@ -613,7 +614,6 @@ Status VMysqlResultWriter::append_block(Block& input_block) {
break;
}
case TYPE_DATETIMEV2: {
int scale = _output_vexpr_ctxs[i]->root()->type().scale;
if (type_ptr->is_nullable()) {
status = _add_one_column<PrimitiveType::TYPE_DATETIMEV2, true>(column_ptr, result,
nullptr, scale);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,8 +117,8 @@ public static void initBuiltins(FunctionSet functionSet) {
Type.DOUBLE, Function.NullableMode.ALWAYS_NULLABLE));
functionSet.addBuiltin(ScalarFunction.createBuiltinOperator(
Operator.DIVIDE.getName(),
Lists.<Type>newArrayList(Type.DECIMALV2, Type.DECIMALV2),
Type.DECIMALV2, Function.NullableMode.ALWAYS_NULLABLE));
Lists.<Type>newArrayList(Type.MAX_DECIMALV2_TYPE, Type.MAX_DECIMALV2_TYPE),
Type.MAX_DECIMALV2_TYPE, Function.NullableMode.ALWAYS_NULLABLE));
functionSet.addBuiltin(ScalarFunction.createBuiltinOperator(
Operator.DIVIDE.getName(),
Lists.<Type>newArrayList(Type.DECIMAL32, Type.DECIMAL32),
Expand Down Expand Up @@ -164,8 +164,8 @@ public static void initBuiltins(FunctionSet functionSet) {
Type.DOUBLE, Function.NullableMode.ALWAYS_NULLABLE));
functionSet.addBuiltin(ScalarFunction.createVecBuiltinOperator(
Operator.DIVIDE.getName(),
Lists.<Type>newArrayList(Type.DECIMALV2, Type.DECIMALV2),
Type.DECIMALV2, Function.NullableMode.ALWAYS_NULLABLE));
Lists.<Type>newArrayList(Type.MAX_DECIMALV2_TYPE, Type.MAX_DECIMALV2_TYPE),
Type.MAX_DECIMALV2_TYPE, Function.NullableMode.ALWAYS_NULLABLE));
functionSet.addBuiltin(ScalarFunction.createVecBuiltinOperator(
Operator.DIVIDE.getName(),
Lists.<Type>newArrayList(Type.DECIMAL32, Type.DECIMAL32),
Expand All @@ -189,8 +189,8 @@ public static void initBuiltins(FunctionSet functionSet) {
Type.DOUBLE, Function.NullableMode.ALWAYS_NULLABLE));
functionSet.addBuiltin(ScalarFunction.createVecBuiltinOperator(
Operator.MOD.getName(),
Lists.<Type>newArrayList(Type.DECIMALV2, Type.DECIMALV2),
Type.DECIMALV2, Function.NullableMode.ALWAYS_NULLABLE));
Lists.<Type>newArrayList(Type.MAX_DECIMALV2_TYPE, Type.MAX_DECIMALV2_TYPE),
Type.MAX_DECIMALV2_TYPE, Function.NullableMode.ALWAYS_NULLABLE));
functionSet.addBuiltin(ScalarFunction.createVecBuiltinOperator(
Operator.MOD.getName(),
Lists.<Type>newArrayList(Type.DECIMAL32, Type.DECIMAL32),
Expand Down Expand Up @@ -309,7 +309,7 @@ private Type findCommonType(Type t1, Type t2) {
if (pt1 == PrimitiveType.DOUBLE || pt2 == PrimitiveType.DOUBLE) {
return Type.DOUBLE;
} else if (pt1 == PrimitiveType.DECIMALV2 || pt2 == PrimitiveType.DECIMALV2) {
return Type.DECIMALV2;
return Type.MAX_DECIMALV2_TYPE;
} else if (pt1 == PrimitiveType.DECIMAL32 || pt2 == PrimitiveType.DECIMAL32) {
return Type.DECIMAL32;
} else if (pt1 == PrimitiveType.DECIMAL64 || pt2 == PrimitiveType.DECIMAL64) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,11 @@ public void analyze() throws AnalysisException {
noOp = Type.matchExactType(childType, type);

if (noOp) {
// For decimalv2, we do not perform an actual cast between different precision/scale. Instead, we just
// set the target type as the child's type.
if (type.isDecimalV2() && childType.isDecimalV2()) {
getChild(0).setType(type);
}
return;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ private FEFunctionInvoker getFunction(FEFunctionSignature signature) {
if (!(invoker.getSignature().returnType.isDate() && signature.getReturnType().isDateV2())
&& !(invoker.getSignature().returnType.isDatetime() && signature.getReturnType().isDatetimeV2())
&& !(invoker.getSignature().returnType.isDecimalV2() && signature.getReturnType().isDecimalV3())
&& !(invoker.getSignature().returnType.isDecimalV2() && signature.getReturnType().isDecimalV2())
&& !invoker.getSignature().returnType.equals(signature.getReturnType())) {
continue;
}
Expand All @@ -135,6 +136,7 @@ private FEFunctionInvoker getFunction(FEFunctionSignature signature) {
if (!(argTypes1[i].isDate() && argTypes2[i].isDateV2())
&& !(argTypes1[i].isDatetime() && argTypes2[i].isDatetimeV2())
&& !(argTypes1[i].isDecimalV2() && argTypes2[i].isDecimalV3())
&& !(argTypes1[i].isDecimalV2() && argTypes2[i].isDecimalV2())
&& !argTypes1[i].equals(argTypes2[i])) {
match = false;
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,11 @@

package org.apache.doris.analysis;

import org.apache.doris.catalog.ScalarType;
import org.apache.doris.catalog.TableIf;
import org.apache.doris.catalog.Type;
import org.apache.doris.common.AnalysisException;
import org.apache.doris.common.Pair;
import org.apache.doris.common.UserException;
import org.apache.doris.rewrite.ExprRewriter;

Expand All @@ -32,6 +35,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
* Representation of a set ops with its list of operands, and optional order by and limit.
Expand Down Expand Up @@ -476,8 +480,20 @@ private void createMetadata(Analyzer analyzer) throws AnalysisException {
LOG.trace("SetOperationStmt.createMetadata: tupleId=" + tupleId.toString());
}

// One slot per expr in the select blocks. Use first select block as representative.
List<Expr> firstSelectExprs = operands.get(0).getQueryStmt().getResultExprs();
// When multiple operands exist here, we should use compatible type for each slot. For example,
// for `SELECT decimal(10,1) UNION ALL decimal(6,4)`, we should use decimal(10,4) as the result type.
List<Pair<Type, Boolean>> selectTypeWithNullable = operands.get(0).getQueryStmt().getResultExprs().stream()
.map(expr -> Pair.of(expr.getType(), expr.isNullable())).collect(Collectors.toList());
for (int i = 1; i < operands.size(); i++) {
for (int j = 1; j < selectTypeWithNullable.size(); j++) {
if (selectTypeWithNullable.get(j).first.isDecimalV2()
&& operands.get(i).getQueryStmt().getResultExprs().get(j).getType().isDecimalV2()) {
selectTypeWithNullable.get(j).first = ScalarType.getAssignmentCompatibleDecimalV2Type(
(ScalarType) selectTypeWithNullable.get(j).first,
(ScalarType) operands.get(i).getQueryStmt().getResultExprs().get(j).getType());
}
}
}

// TODO(zc) Column stats
/*
Expand All @@ -497,12 +513,11 @@ private void createMetadata(Analyzer analyzer) throws AnalysisException {
*/

// Create tuple descriptor and slots.
for (int i = 0; i < firstSelectExprs.size(); ++i) {
Expr expr = firstSelectExprs.get(i);
for (int i = 0; i < selectTypeWithNullable.size(); ++i) {
SlotDescriptor slotDesc = analyzer.addSlotDescriptor(tupleDesc);
slotDesc.setLabel(getColLabels().get(i));
slotDesc.setType(expr.getType());
slotDesc.setIsNullable(expr.isNullable());
slotDesc.setType(selectTypeWithNullable.get(i).first);
slotDesc.setIsNullable(selectTypeWithNullable.get(i).second);
// TODO(zc)
// slotDesc.setStats(columnStats.get(i));
SlotRef outputSlotRef = new SlotRef(slotDesc);
Expand Down
Loading