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

Reply via email to