This is an automated email from the ASF dual-hosted git repository.

morrysnow pushed a commit to branch branch-3.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-3.1 by this push:
     new a909b83135f branch-3.1: [feat](nereids) Add session variable 
enable_insert_value_auto_cast for insert value truncate long string #55325 
(#55414)
a909b83135f is described below

commit a909b83135f9b008062cf2a3d54f3fb9f65e8d5d
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Thu Sep 4 09:54:44 2025 +0800

    branch-3.1: [feat](nereids) Add session variable 
enable_insert_value_auto_cast for insert value truncate long string #55325 
(#55414)
    
    Cherry-picked from #55325
    
    Co-authored-by: yujun <[email protected]>
---
 .../doris/nereids/rules/analysis/BindSink.java     |   5 +++-
 .../java/org/apache/doris/qe/SessionVariable.java  |  12 +++++++++
 .../nereids_p0/insert_into_table/insert_values.out | Bin 2621 -> 2606 bytes
 .../insert_into_table/insert_values.groovy         |  28 +++++++++++++++------
 4 files changed, 37 insertions(+), 8 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSink.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSink.java
index 760783359d0..5cd0c166329 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSink.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSink.java
@@ -252,6 +252,9 @@ public class BindSink implements AnalysisRuleFactory {
 
         // add cast project
         List<NamedExpression> castExprs = Lists.newArrayList();
+        ConnectContext connCtx = ConnectContext.get();
+        final boolean truncateString = needTruncateStringWhenInsert
+                && (connCtx == null || 
connCtx.getSessionVariable().enableInsertValueAutoCast);
         for (int i = 0; i < tableSchema.size(); ++i) {
             Column col = tableSchema.get(i);
             NamedExpression expr = columnToOutput.get(col.getName());
@@ -271,7 +274,7 @@ public class BindSink implements AnalysisRuleFactory {
                 int targetLength = ((CharacterType) targetType).getLen();
                 if (sourceLength == targetLength) {
                     castExpr = TypeCoercionUtils.castIfNotSameType(castExpr, 
targetType);
-                } else if (needTruncateStringWhenInsert && sourceLength > 
targetLength && targetLength >= 0) {
+                } else if (truncateString && sourceLength > targetLength && 
targetLength >= 0) {
                     castExpr = new Substring(castExpr, Literal.of(1), 
Literal.of(targetLength));
                 } else if (targetType.isStringType()) {
                     castExpr = new Cast(castExpr, StringType.INSTANCE);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
index 89ec74518f6..c625573a4ab 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
@@ -140,6 +140,7 @@ public class SessionVariable implements Serializable, 
Writable {
     public static final String MAX_INSTANCE_NUM = "max_instance_num";
     public static final String DML_PLAN_RETRY_TIMES = "DML_PLAN_RETRY_TIMES";
     public static final String ENABLE_INSERT_STRICT = "enable_insert_strict";
+    public static final String ENABLE_INSERT_VALUE_AUTO_CAST = 
"enable_insert_value_auto_cast";
     public static final String INSERT_MAX_FILTER_RATIO = 
"insert_max_filter_ratio";
 
     public static final String ENABLE_SERVER_SIDE_PREPARED_STATEMENT = 
"enable_server_side_prepared_statement";
@@ -1064,6 +1065,13 @@ public class SessionVariable implements Serializable, 
Writable {
     @VariableMgr.VarAttr(name = ENABLE_INSERT_STRICT, needForward = true)
     public boolean enableInsertStrict = true;
 
+    @VariableMgr.VarAttr(name = ENABLE_INSERT_VALUE_AUTO_CAST, needForward = 
true, description = {
+            "INSERT VALUE 语句是否自动类型转换。当前只针对长字符串自动截短。默认开。",
+            "INSERT VALUE statement whether to automatically type cast. Only 
use for truncate long string. "
+                    + "ON by default."
+    })
+    public boolean enableInsertValueAutoCast = true;
+
     @VariableMgr.VarAttr(name = INSERT_MAX_FILTER_RATIO, needForward = true)
     public double insertMaxFilterRatio = 1.0;
 
@@ -3289,6 +3297,10 @@ public class SessionVariable implements Serializable, 
Writable {
         this.enableInsertStrict = enableInsertStrict;
     }
 
+    public boolean getEnableInsertValueAutoCast() {
+        return enableInsertValueAutoCast;
+    }
+
     public double getInsertMaxFilterRatio() {
         return insertMaxFilterRatio;
     }
diff --git 
a/regression-test/data/nereids_p0/insert_into_table/insert_values.out 
b/regression-test/data/nereids_p0/insert_into_table/insert_values.out
index 62d824e5e6f..59ba6ff19ac 100644
Binary files 
a/regression-test/data/nereids_p0/insert_into_table/insert_values.out and 
b/regression-test/data/nereids_p0/insert_into_table/insert_values.out differ
diff --git 
a/regression-test/suites/nereids_p0/insert_into_table/insert_values.groovy 
b/regression-test/suites/nereids_p0/insert_into_table/insert_values.groovy
index d6da58ea4fd..42aa9bd7111 100644
--- a/regression-test/suites/nereids_p0/insert_into_table/insert_values.groovy
+++ b/regression-test/suites/nereids_p0/insert_into_table/insert_values.groovy
@@ -21,8 +21,6 @@ suite('nereids_insert_into_values') {
     sql 'set enable_nereids_dml=true'
     sql 'set enable_strict_consistency_dml=true'
 
-    sql 'use nereids_insert_into_table_test'
-
     def t1 = 'value_t1'
     def t2 = 'value_t2'
     def t3 = 'value_t3'
@@ -165,16 +163,32 @@ suite('nereids_insert_into_values') {
         drop table if exists test_insert_more_string;
         CREATE TABLE test_insert_more_string (
             `r_regionkey` int NULL,
-            `r_name` varchar(25) NULL,
-            `r_comment` varchar(152) NULL
+            `r_name` varchar(4) NULL
         )
         DUPLICATE KEY(`r_regionkey`)
         DISTRIBUTED BY HASH(`r_regionkey`)
         BUCKETS 1 PROPERTIES (
             "replication_allocation" = "tag.location.default: 1"
         );
-        insert into test_insert_more_string values (3, 
"akljalkjbalkjsldkrjewokjfalksdjflaksjfdlaskjfalsdkfjalsdfjkasfdl", "aa")
         """
 
-    qt_select_test_insert_more_string "select * from test_insert_more_string"
-}
\ No newline at end of file
+    // shorter varchar is ok
+    sql "insert into test_insert_more_string values (1, 'ab')"
+
+    // set enable_insert_value_auto_cast = true
+    // longer varchar will truncate
+    sql "insert into test_insert_more_string values (2, 'abcdefg')"
+
+    // when disable string auto cast and in insert strict mode, insert will 
failed
+    sql 'set enable_insert_value_auto_cast = false'
+    test {
+        sql "insert into test_insert_more_string values (3, 'hi'), (4, 
'jklmn')"
+        exception 'Insert has filtered data in strict mode'
+    }
+
+    // when disable insert strict, the longer varchar row will be filtered, 
other rows will succ
+    sql 'set enable_insert_strict = false'
+    sql "insert into test_insert_more_string values (5, 'o'), (6, 'pqrst')"
+
+    order_qt_select_test_insert_more_string "select * from 
test_insert_more_string"
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to