This is an automated email from the ASF dual-hosted git repository.
davidzollo pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/seatunnel.git
The following commit(s) were added to refs/heads/dev by this push:
new 1cbff54fef [Fix][Connector-V2] Cap decimal scale to what Doris 1.x
accepts (#11690)
1cbff54fef is described below
commit 1cbff54fef1e76c7067e46f03d23887f4c498bfa
Author: zhengxiang378928908-code <[email protected]>
AuthorDate: Tue Aug 11 19:33:26 2026 +0800
[Fix][Connector-V2] Cap decimal scale to what Doris 1.x accepts (#11690)
Co-authored-by: zhengxiang <[email protected]>
---
.../doris/datatype/AbstractDorisTypeConverter.java | 31 +++++++++++++++++++++-
.../doris/datatype/DorisTypeConverterV1.java | 10 +++++++
.../doris/datatype/DorisTypeConvertorV1Test.java | 16 ++++++++++-
.../doris/datatype/DorisTypeConvertorV2Test.java | 12 +++++++++
4 files changed, 67 insertions(+), 2 deletions(-)
diff --git
a/seatunnel-connectors-v2/connector-doris/src/main/java/org/apache/seatunnel/connectors/doris/datatype/AbstractDorisTypeConverter.java
b/seatunnel-connectors-v2/connector-doris/src/main/java/org/apache/seatunnel/connectors/doris/datatype/AbstractDorisTypeConverter.java
index a1acf3c33f..f56de2739c 100644
---
a/seatunnel-connectors-v2/connector-doris/src/main/java/org/apache/seatunnel/connectors/doris/datatype/AbstractDorisTypeConverter.java
+++
b/seatunnel-connectors-v2/connector-doris/src/main/java/org/apache/seatunnel/connectors/doris/datatype/AbstractDorisTypeConverter.java
@@ -83,6 +83,9 @@ public abstract class AbstractDorisTypeConverter implements
TypeConverter<BasicT
public static final Integer DEFAULT_SCALE = 0;
public static final Integer MAX_SCALE = 10;
+ /** Maximum decimal scale supported by Doris 1.x, whose DECIMAL is
DecimalV2 (max 27, 9). */
+ public static final Integer MAX_DECIMALV2_SCALE = 9;
+
public static final Integer MAX_DATETIME_SCALE = 6;
// Min value of LARGEINT is -170141183460469231731687303715884105728, it
will use 39 bytes in
@@ -242,6 +245,18 @@ public abstract class AbstractDorisTypeConverter
implements TypeConverter<BasicT
IDENTIFIER, column.getDataType().getSqlType().name(),
column.getName());
}
+ /**
+ * Maximum decimal scale accepted by the target Doris version.
+ *
+ * <p>DECIMALV3 only requires the scale to not exceed the precision, which
the caller already
+ * enforces, so the default imposes no further limit. Doris 1.x is
stricter and overrides this.
+ *
+ * @return the largest scale that may be emitted for a decimal column
+ */
+ protected int getMaxDecimalScale() {
+ return MAX_PRECISION.intValue();
+ }
+
protected BasicTypeDefine sampleReconvert(
Column column, BasicTypeDefine.BasicTypeDefineBuilder builder) {
@@ -296,7 +311,7 @@ public abstract class AbstractDorisTypeConverter implements
TypeConverter<BasicT
int scale = decimalType.getScale();
if (precision <= 0) {
precision = MAX_PRECISION.intValue();
- scale = MAX_SCALE;
+ scale = Math.min(MAX_SCALE, getMaxDecimalScale());
log.warn(
"The decimal column {} type decimal({},{}) is out
of range, "
+ "which is precision less than 0, "
@@ -320,6 +335,20 @@ public abstract class AbstractDorisTypeConverter
implements TypeConverter<BasicT
break;
}
+ if (scale > getMaxDecimalScale()) {
+ log.warn(
+ "The decimal column {} type decimal({},{}) is out
of range, "
+ + "which exceeds the maximum scale of {}
supported by this "
+ + "Doris version, it will be converted to
decimal({},{})",
+ column.getName(),
+ decimalType.getPrecision(),
+ decimalType.getScale(),
+ getMaxDecimalScale(),
+ precision,
+ getMaxDecimalScale());
+ scale = getMaxDecimalScale();
+ }
+
if (scale < 0) {
scale = 0;
log.warn(
diff --git
a/seatunnel-connectors-v2/connector-doris/src/main/java/org/apache/seatunnel/connectors/doris/datatype/DorisTypeConverterV1.java
b/seatunnel-connectors-v2/connector-doris/src/main/java/org/apache/seatunnel/connectors/doris/datatype/DorisTypeConverterV1.java
index d74362676a..b334754f0c 100644
---
a/seatunnel-connectors-v2/connector-doris/src/main/java/org/apache/seatunnel/connectors/doris/datatype/DorisTypeConverterV1.java
+++
b/seatunnel-connectors-v2/connector-doris/src/main/java/org/apache/seatunnel/connectors/doris/datatype/DorisTypeConverterV1.java
@@ -46,6 +46,16 @@ public class DorisTypeConverterV1 extends
AbstractDorisTypeConverter {
return IDENTIFIER;
}
+ /**
+ * Doris 1.x decimals are DecimalV2, which is limited to a scale of 9
regardless of the
+ * precision. Emitting a larger scale makes the generated DDL fail with
"Scale of decimal must
+ * between 0 and 9".
+ */
+ @Override
+ protected int getMaxDecimalScale() {
+ return MAX_DECIMALV2_SCALE;
+ }
+
@Override
public Column convert(BasicTypeDefine typeDefine) {
return convert(typeDefine, true);
diff --git
a/seatunnel-connectors-v2/connector-doris/src/test/java/org/apache/seatunnel/connectors/doris/datatype/DorisTypeConvertorV1Test.java
b/seatunnel-connectors-v2/connector-doris/src/test/java/org/apache/seatunnel/connectors/doris/datatype/DorisTypeConvertorV1Test.java
index f91c478f46..79636f8d41 100644
---
a/seatunnel-connectors-v2/connector-doris/src/test/java/org/apache/seatunnel/connectors/doris/datatype/DorisTypeConvertorV1Test.java
+++
b/seatunnel-connectors-v2/connector-doris/src/test/java/org/apache/seatunnel/connectors/doris/datatype/DorisTypeConvertorV1Test.java
@@ -489,6 +489,8 @@ public class DorisTypeConvertorV1Test {
Column column =
PhysicalColumn.builder().name("test").dataType(new
DecimalType(0, 0)).build();
+ // Doris 1.x decimals are DecimalV2, so the fallback scale is capped
at 9 rather than
+ // MAX_SCALE.
BasicTypeDefine<?> typeDefine =
DorisTypeConverterV1.INSTANCE.reconvert(column);
Assertions.assertEquals(column.getName(), typeDefine.getName());
Assertions.assertEquals(
@@ -496,7 +498,7 @@ public class DorisTypeConvertorV1Test {
"%s(%s,%s)",
DorisTypeConverterV1.DORIS_DECIMALV3,
DorisTypeConverterV1.MAX_PRECISION,
- DorisTypeConverterV1.MAX_SCALE),
+ 9),
typeDefine.getColumnType());
Assertions.assertEquals(DorisTypeConverterV1.DORIS_DECIMALV3,
typeDefine.getDataType());
@@ -517,6 +519,18 @@ public class DorisTypeConvertorV1Test {
Assertions.assertEquals(
String.format("%s(%s)", DorisTypeConverterV1.DORIS_VARCHAR,
200),
typeDefine.getColumnType());
+
+ // A scale above 9 is valid for DECIMALV3 but rejected by Doris 1.x
with
+ // "Scale of decimal must between 0 and 9", so it must be capped.
+ column = PhysicalColumn.builder().name("test").dataType(new
DecimalType(20, 10)).build();
+
+ typeDefine = DorisTypeConverterV1.INSTANCE.reconvert(column);
+ Assertions.assertEquals(column.getName(), typeDefine.getName());
+ Assertions.assertEquals(DorisTypeConverterV1.DORIS_DECIMALV3,
typeDefine.getDataType());
+ Assertions.assertEquals(
+ String.format("%s(%s,%s)",
DorisTypeConverterV1.DORIS_DECIMALV3, 20, 9),
+ typeDefine.getColumnType());
+ Assertions.assertEquals(9, typeDefine.getScale());
}
@Test
diff --git
a/seatunnel-connectors-v2/connector-doris/src/test/java/org/apache/seatunnel/connectors/doris/datatype/DorisTypeConvertorV2Test.java
b/seatunnel-connectors-v2/connector-doris/src/test/java/org/apache/seatunnel/connectors/doris/datatype/DorisTypeConvertorV2Test.java
index 40cac91f28..f48ff23f5b 100644
---
a/seatunnel-connectors-v2/connector-doris/src/test/java/org/apache/seatunnel/connectors/doris/datatype/DorisTypeConvertorV2Test.java
+++
b/seatunnel-connectors-v2/connector-doris/src/test/java/org/apache/seatunnel/connectors/doris/datatype/DorisTypeConvertorV2Test.java
@@ -779,6 +779,18 @@ public class DorisTypeConvertorV2Test {
Assertions.assertEquals(
String.format("%s(%s)", DorisTypeConverterV2.DORIS_VARCHAR,
200),
typeDefine.getColumnType());
+
+ // DECIMALV3 only requires scale <= precision, so a scale above 9 is
kept as declared.
+ // This is the behaviour the Doris 1.x cap must not change.
+ column = PhysicalColumn.builder().name("test").dataType(new
DecimalType(20, 10)).build();
+
+ typeDefine = DorisTypeConverterV2.INSTANCE.reconvert(column);
+ Assertions.assertEquals(column.getName(), typeDefine.getName());
+ Assertions.assertEquals(DorisTypeConverterV2.DORIS_DECIMALV3,
typeDefine.getDataType());
+ Assertions.assertEquals(
+ String.format("%s(%s,%s)",
DorisTypeConverterV2.DORIS_DECIMALV3, 20, 10),
+ typeDefine.getColumnType());
+ Assertions.assertEquals(10, typeDefine.getScale());
}
@Test