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]