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

dataroaring pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new ee24667b9f1 [fix](group commit) Fix some group commit problems (#28319)
ee24667b9f1 is described below

commit ee24667b9f16d81c61e21ba1202a76716ca6f74f
Author: meiyi <[email protected]>
AuthorDate: Thu Dec 14 14:38:56 2023 +0800

    [fix](group commit) Fix some group commit problems (#28319)
---
 be/src/http/action/http_stream.cpp                 | 31 +++++-----
 be/src/http/action/stream_load.cpp                 | 32 +++++++----
 .../main/java/org/apache/doris/common/Config.java  |  4 ++
 .../org/apache/doris/analysis/ArrayLiteral.java    |  8 ++-
 .../java/org/apache/doris/analysis/MapLiteral.java | 12 +++-
 .../apache/doris/analysis/NativeInsertStmt.java    | 13 ++++-
 .../org/apache/doris/analysis/StructLiteral.java   | 13 ++++-
 .../apache/doris/common/util/PropertyAnalyzer.java |  3 +-
 .../plans/commands/InsertIntoTableCommand.java     | 16 +++---
 .../apache/doris/planner/GroupCommitPlanner.java   |  4 ++
 .../org/apache/doris/planner/OlapTableSink.java    |  1 +
 .../java/org/apache/doris/qe/StmtExecutor.java     | 14 ++++-
 .../apache/doris/service/FrontendServiceImpl.java  |  2 +-
 .../data/insert_p0/insert_with_null.out            | 67 +++++++++++++++-------
 .../suites/insert_p0/insert_with_null.groovy       | 19 +++---
 15 files changed, 165 insertions(+), 74 deletions(-)

diff --git a/be/src/http/action/http_stream.cpp 
b/be/src/http/action/http_stream.cpp
index a1515194710..ef4decb0381 100644
--- a/be/src/http/action/http_stream.cpp
+++ b/be/src/http/action/http_stream.cpp
@@ -179,23 +179,28 @@ int HttpStreamAction::on_header(HttpRequest* req) {
             group_commit_mode = "";
         }
     }
-    if (!group_commit_mode.empty() || 
config::wait_internal_group_commit_finish) {
-        ctx->group_commit = load_size_smaller_than_wal_limit(req);
-        if (!ctx->group_commit) {
-            LOG(WARNING) << "The data size for this http load("
-                         << std::stol(req->header(HttpHeaders::CONTENT_LENGTH))
-                         << " Bytes) exceeds the WAL (Write-Ahead Log) limit ("
-                         << config::wal_max_disk_size * 0.8
-                         << " Bytes). Please set this load to \"group 
commit\"=false.";
-            st = Status::InternalError("Http load size too large.");
+    ctx->two_phase_commit = req->header(HTTP_TWO_PHASE_COMMIT) == "true";
+    auto temp_partitions = !req->header(HTTP_TEMP_PARTITIONS).empty();
+    auto partitions = !req->header(HTTP_PARTITIONS).empty();
+    if (!temp_partitions && !partitions && !ctx->two_phase_commit &&
+        (!group_commit_mode.empty() || 
config::wait_internal_group_commit_finish)) {
+        if (config::wait_internal_group_commit_finish) {
+            ctx->group_commit = true;
+        } else {
+            ctx->group_commit = load_size_smaller_than_wal_limit(req);
+            if (!ctx->group_commit) {
+                LOG(WARNING) << "The data size for this http load("
+                             << req->header(HttpHeaders::CONTENT_LENGTH)
+                             << " Bytes) exceeds the WAL (Write-Ahead Log) 
limit ("
+                             << config::wal_max_disk_size * 0.8
+                             << " Bytes). Please set this load to \"group 
commit\"=false.";
+                st = Status::InternalError("Http load size too large.");
+            }
         }
     }
 
-    ctx->two_phase_commit = req->header(HTTP_TWO_PHASE_COMMIT) == "true";
-
     LOG(INFO) << "new income streaming load request." << ctx->brief()
-              << " sql : " << req->header(HTTP_SQL);
-
+              << " sql : " << req->header(HTTP_SQL) << ", group_commit=" << 
ctx->group_commit;
     if (st.ok()) {
         st = _on_header(req, ctx);
     }
diff --git a/be/src/http/action/stream_load.cpp 
b/be/src/http/action/stream_load.cpp
index ad476ee08ec..846bbbdc1ca 100644
--- a/be/src/http/action/stream_load.cpp
+++ b/be/src/http/action/stream_load.cpp
@@ -199,28 +199,36 @@ int StreamLoadAction::on_header(HttpRequest* req) {
             group_commit_mode = "";
         }
     }
-    if (!group_commit_mode.empty() || 
config::wait_internal_group_commit_finish) {
+    auto partial_columns = !req->header(HTTP_PARTIAL_COLUMNS).empty() &&
+                           iequal(req->header(HTTP_PARTIAL_COLUMNS), "true");
+    ctx->two_phase_commit = req->header(HTTP_TWO_PHASE_COMMIT) == "true";
+    auto temp_partitions = !req->header(HTTP_TEMP_PARTITIONS).empty();
+    auto partitions = !req->header(HTTP_PARTITIONS).empty();
+    if (!partial_columns && !partitions && !temp_partitions && 
!ctx->two_phase_commit &&
+        (!group_commit_mode.empty() || 
config::wait_internal_group_commit_finish)) {
         if (!group_commit_mode.empty() && !ctx->label.empty()) {
             st = Status::InternalError("label and group_commit can't be set at 
the same time");
         }
-        ctx->group_commit = load_size_smaller_than_wal_limit(req);
-        if (!ctx->group_commit) {
-            LOG(WARNING) << "The data size for this stream load("
-                         << std::stol(req->header(HttpHeaders::CONTENT_LENGTH))
-                         << " Bytes) exceeds the WAL (Write-Ahead Log) limit ("
-                         << config::wal_max_disk_size * 0.8
-                         << " Bytes). Please set this load to \"group 
commit\"=false.";
-            st = Status::InternalError("Stream load size too large.");
+        if (config::wait_internal_group_commit_finish) {
+            ctx->group_commit = true;
+        } else {
+            ctx->group_commit = load_size_smaller_than_wal_limit(req);
+            if (!ctx->group_commit) {
+                LOG(WARNING) << "The data size for this stream load("
+                             << req->header(HttpHeaders::CONTENT_LENGTH)
+                             << " Bytes) exceeds the WAL (Write-Ahead Log) 
limit ("
+                             << config::wal_max_disk_size * 0.8
+                             << " Bytes). Please set this load to \"group 
commit\"=false.";
+                st = Status::InternalError("Stream load size too large.");
+            }
         }
     }
     if (!ctx->group_commit && ctx->label.empty()) {
         ctx->label = generate_uuid_string();
     }
 
-    ctx->two_phase_commit = req->header(HTTP_TWO_PHASE_COMMIT) == "true";
-
     LOG(INFO) << "new income streaming load request." << ctx->brief() << ", 
db=" << ctx->db
-              << ", tbl=" << ctx->table;
+              << ", tbl=" << ctx->table << ", group_commit=" << 
ctx->group_commit;
 
     if (st.ok()) {
         st = _on_header(req, ctx);
diff --git a/fe/fe-common/src/main/java/org/apache/doris/common/Config.java 
b/fe/fe-common/src/main/java/org/apache/doris/common/Config.java
index 9421364b482..486e2bfdfb0 100644
--- a/fe/fe-common/src/main/java/org/apache/doris/common/Config.java
+++ b/fe/fe-common/src/main/java/org/apache/doris/common/Config.java
@@ -507,6 +507,10 @@ public class Config extends ConfigBase {
                     + "insert into and stream load use group commit by 
default."})
     public static boolean wait_internal_group_commit_finish = false;
 
+    @ConfField(mutable = false, masterOnly = true, description = 
{"攒批的默认提交时间,单位是毫秒",
+            "Default commit interval in ms for group commit"})
+    public static int group_commit_interval_ms_default_value = 10000;
+
     @ConfField(mutable = true, masterOnly = true, description = {"Stream load 
的默认超时时间,单位是秒。",
             "Default timeout for stream load job, in seconds."})
     public static int stream_load_default_timeout_second = 86400 * 3; // 3days
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/ArrayLiteral.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ArrayLiteral.java
index c9661a55273..540a0747b49 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ArrayLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ArrayLiteral.java
@@ -136,8 +136,14 @@ public class ArrayLiteral extends LiteralExpr {
     public String getStringValueInFe() {
         List<String> list = new ArrayList<>(children.size());
         children.forEach(v -> {
+            String stringLiteral;
+            if (v instanceof NullLiteral) {
+                stringLiteral = "null";
+            } else {
+                stringLiteral = getStringLiteralForComplexType(v);
+            }
             // we should use type to decide we output array is suitable for 
json format
-            list.add(getStringLiteralForComplexType(v));
+            list.add(stringLiteral);
         });
         return "[" + StringUtils.join(list, ", ") + "]";
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/MapLiteral.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/MapLiteral.java
index d35f825d6aa..e55519101cf 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/MapLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/MapLiteral.java
@@ -155,11 +155,21 @@ public class MapLiteral extends LiteralExpr {
     public String getStringValue() {
         List<String> list = new ArrayList<>(children.size());
         for (int i = 0; i < children.size() && i + 1 < children.size(); i += 
2) {
-            list.add(children.get(i).getStringValue() + ":" + children.get(i + 
1).getStringValue());
+            list.add(getStringValue(children.get(i)) + ":" + 
getStringValue(children.get(i + 1)));
         }
         return "{" + StringUtils.join(list, ", ") + "}";
     }
 
+    private String getStringValue(Expr expr) {
+        if (expr instanceof NullLiteral) {
+            return "null";
+        }
+        if (expr instanceof StringLiteral) {
+            return "\"" + expr.getStringValue() + "\"";
+        }
+        return expr.getStringValue();
+    }
+
     @Override
     public String getStringValueForArray() {
         List<String> list = new ArrayList<>(children.size());
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/NativeInsertStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/NativeInsertStmt.java
index 3937e5a6749..b339b042542 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/NativeInsertStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/NativeInsertStmt.java
@@ -54,6 +54,7 @@ import org.apache.doris.planner.GroupCommitPlanner;
 import org.apache.doris.planner.OlapTableSink;
 import org.apache.doris.planner.external.jdbc.JdbcTableSink;
 import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.SqlModeHelper;
 import org.apache.doris.rewrite.ExprRewriter;
 import org.apache.doris.service.FrontendOptions;
 import org.apache.doris.thrift.TQueryOptions;
@@ -1106,7 +1107,9 @@ public class NativeInsertStmt extends InsertStmt {
             LOG.warn("analyze group commit failed", e);
             return;
         }
-        if 
(ConnectContext.get().getSessionVariable().isEnableInsertGroupCommit()
+        boolean partialUpdate = 
ConnectContext.get().getSessionVariable().isEnableUniqueKeyPartialUpdate();
+        if (!partialUpdate && 
ConnectContext.get().getSessionVariable().isEnableInsertGroupCommit()
+                && ConnectContext.get().getSessionVariable().getSqlMode() != 
SqlModeHelper.MODE_NO_BACKSLASH_ESCAPES
                 && targetTable instanceof OlapTable
                 && !ConnectContext.get().isTxnModel()
                 && getQueryStmt() instanceof SelectStmt
@@ -1117,18 +1120,22 @@ public class NativeInsertStmt extends InsertStmt {
             if (selectStmt.getValueList() != null) {
                 for (List<Expr> row : selectStmt.getValueList().getRows()) {
                     for (Expr expr : row) {
-                        if (!expr.isLiteralOrCastExpr()) {
+                        if (!(expr instanceof LiteralExpr)) {
                             return;
                         }
                     }
                 }
+                // Does not support: insert into tbl values();
+                if (selectStmt.getValueList().getFirstRow().isEmpty() && 
CollectionUtils.isEmpty(targetColumnNames)) {
+                    return;
+                }
             } else {
                 SelectList selectList = selectStmt.getSelectList();
                 if (selectList != null) {
                     List<SelectListItem> items = selectList.getItems();
                     if (items != null) {
                         for (SelectListItem item : items) {
-                            if (item.getExpr() != null && 
!item.getExpr().isLiteralOrCastExpr()) {
+                            if (item.getExpr() != null && !(item.getExpr() 
instanceof LiteralExpr)) {
                                 return;
                             }
                         }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/StructLiteral.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/StructLiteral.java
index 4645bd9edc2..effd5c7d61f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/StructLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/StructLiteral.java
@@ -71,10 +71,21 @@ public class StructLiteral extends LiteralExpr {
         return "STRUCT(" + StringUtils.join(list, ", ") + ")";
     }
 
+    private String getStringValue(Expr expr) {
+        String stringValue = expr.getStringValue();
+        if (stringValue.isEmpty()) {
+            return "''";
+        }
+        if (expr instanceof StringLiteral) {
+            return "\"" + stringValue + "\"";
+        }
+        return stringValue;
+    }
+
     @Override
     public String getStringValue() {
         List<String> list = new ArrayList<>(children.size());
-        children.forEach(v -> list.add(v.getStringValue()));
+        children.forEach(v -> list.add(getStringValue(v)));
         return "{" + StringUtils.join(list, ", ") + "}";
     }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/common/util/PropertyAnalyzer.java 
b/fe/fe-core/src/main/java/org/apache/doris/common/util/PropertyAnalyzer.java
index 6fb93756f65..279eba12c1d 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/common/util/PropertyAnalyzer.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/common/util/PropertyAnalyzer.java
@@ -171,7 +171,8 @@ public class PropertyAnalyzer {
     private static final double MIN_FPP = 0.0001;
 
     public static final String PROPERTIES_GROUP_COMMIT_INTERVAL_MS = 
"group_commit_interval_ms";
-    public static final int PROPERTIES_GROUP_COMMIT_INTERVAL_MS_DEFAULT_VALUE 
= 10000;
+    public static final int PROPERTIES_GROUP_COMMIT_INTERVAL_MS_DEFAULT_VALUE
+            = Config.group_commit_interval_ms_default_value;
 
     // compaction policy
     public static final String SIZE_BASED_COMPACTION_POLICY = "size_based";
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/InsertIntoTableCommand.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/InsertIntoTableCommand.java
index 9dcba2ce9ae..eaee75936d3 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/InsertIntoTableCommand.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/InsertIntoTableCommand.java
@@ -46,6 +46,7 @@ import org.apache.doris.planner.UnionNode;
 import org.apache.doris.proto.InternalService;
 import org.apache.doris.proto.InternalService.PGroupCommitInsertResponse;
 import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.SqlModeHelper;
 import org.apache.doris.qe.StmtExecutor;
 import org.apache.doris.rpc.RpcException;
 import org.apache.doris.thrift.TStatusCode;
@@ -219,17 +220,14 @@ public class InsertIntoTableCommand extends Command 
implements ForwardWithSync,
 
     private boolean analyzeGroupCommit(ConnectContext ctx, DataSink sink,
             PhysicalOlapTableSink<?> physicalOlapTableSink) {
-        if (!(sink instanceof OlapTableSink)) {
+        if (!(sink instanceof OlapTableSink) || 
!ctx.getSessionVariable().isEnableInsertGroupCommit()
+                || ctx.getSessionVariable().isEnableUniqueKeyPartialUpdate()) {
             return false;
         }
-        if (!ctx.getSessionVariable().isEnableInsertGroupCommit()) {
-            return false;
-        }
-        return 
ConnectContext.get().getSessionVariable().isEnableInsertGroupCommit()
-            && physicalOlapTableSink.getTargetTable() instanceof OlapTable
-            && !ConnectContext.get().isTxnModel()
-            && sink.getFragment().getPlanRoot() instanceof UnionNode
-            && physicalOlapTableSink.getPartitionIds().isEmpty();
+        return ConnectContext.get().getSessionVariable().getSqlMode() != 
SqlModeHelper.MODE_NO_BACKSLASH_ESCAPES
+                && physicalOlapTableSink.getTargetTable() instanceof OlapTable 
&& !ConnectContext.get().isTxnModel()
+                && sink.getFragment().getPlanRoot() instanceof UnionNode && 
physicalOlapTableSink.getPartitionIds()
+                .isEmpty();
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/planner/GroupCommitPlanner.java 
b/fe/fe-core/src/main/java/org/apache/doris/planner/GroupCommitPlanner.java
index bc99d771d91..65931426309 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/GroupCommitPlanner.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/GroupCommitPlanner.java
@@ -212,6 +212,8 @@ public class GroupCommitPlanner {
         if (selectStmt.getValueList() != null) {
             for (List<Expr> row : selectStmt.getValueList().getRows()) {
                 InternalService.PDataRow data = 
StmtExecutor.getRowStringValue(row);
+                LOG.debug("add row: [{}]", data.getColList().stream().map(c -> 
c.getValue())
+                        .collect(Collectors.joining(",")));
                 rows.add(data);
             }
         } else {
@@ -224,6 +226,8 @@ public class GroupCommitPlanner {
                 }
             }
             InternalService.PDataRow data = 
StmtExecutor.getRowStringValue(exprList);
+            LOG.debug("add row: [{}]", data.getColList().stream().map(c -> 
c.getValue())
+                    .collect(Collectors.joining(",")));
             rows.add(data);
         }
         return rows;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapTableSink.java 
b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapTableSink.java
index 357876c81c8..610404e03ad 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapTableSink.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapTableSink.java
@@ -387,6 +387,7 @@ public class OlapTableSink extends DataSink {
                         exprs.add(e.clone());
                     }
                     for (Expr e : exprs) {
+                        e.reset();
                         e.analyze(funcAnalyzer);
                     }
                     
partitionParam.setPartitionFunctionExprs(Expr.treesToThrift(exprs));
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
index 0aabb8d7f34..d19f68a6cae 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
@@ -293,9 +293,15 @@ public class StmtExecutor {
             if (expr instanceof NullLiteral) {
                 row.addColBuilder().setValue(NULL_VALUE_FOR_LOAD);
             } else if (expr instanceof ArrayLiteral) {
-                row.addColBuilder().setValue(String.format("\"%s\"", 
expr.getStringValueForArray()));
+                row.addColBuilder().setValue(String.format("\"%s\"", 
expr.getStringValueInFe()));
             } else {
-                row.addColBuilder().setValue(String.format("\"%s\"", 
expr.getStringValue()));
+                String stringValue = expr.getStringValueInFe();
+                if (stringValue.equals(NULL_VALUE_FOR_LOAD) || 
stringValue.startsWith("\"") || stringValue.endsWith(
+                        "\"")) {
+                    row.addColBuilder().setValue(String.format("\"%s\"", 
stringValue));
+                } else {
+                    row.addColBuilder().setValue(String.format("%s", 
stringValue));
+                }
             }
         }
         return row.build();
@@ -452,8 +458,10 @@ public class StmtExecutor {
                     // try to fall back to legacy planner
                     LOG.debug("nereids cannot process statement\n" + 
originStmt.originStmt
                             + "\n because of " + e.getMessage(), e);
+                    boolean isInsertIntoCommand = parsedStmt != null && 
parsedStmt instanceof LogicalPlanAdapter
+                            && ((LogicalPlanAdapter) 
parsedStmt).getLogicalPlan() instanceof InsertIntoTableCommand;
                     if (e instanceof NereidsException
-                            && 
!context.getSessionVariable().enableFallbackToOriginalPlanner) {
+                            && 
!context.getSessionVariable().enableFallbackToOriginalPlanner && 
!isInsertIntoCommand) {
                         LOG.warn("Analyze failed. {}", 
context.getQueryIdentifier(), e);
                         throw ((NereidsException) e).getException();
                     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java 
b/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java
index a8fdbf60cf1..85048cf605e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java
@@ -1994,7 +1994,7 @@ public class FrontendServiceImpl implements 
FrontendService.Iface {
             parsedStmt.setOrigStmt(new OriginStatement(originStmt, 0));
             parsedStmt.setUserInfo(ctx.getCurrentUserIdentity());
             if (!StringUtils.isEmpty(request.getGroupCommitMode())) {
-                if (parsedStmt.getLabel() != null) {
+                if (!Config.wait_internal_group_commit_finish && 
parsedStmt.getLabel() != null) {
                     throw new AnalysisException("label and group_commit can't 
be set at the same time");
                 }
                 ctx.getSessionVariable().groupCommit = 
request.getGroupCommitMode();
diff --git a/regression-test/data/insert_p0/insert_with_null.out 
b/regression-test/data/insert_p0/insert_with_null.out
index 7ee81a10bc4..c4f2e363aa5 100644
--- a/regression-test/data/insert_p0/insert_with_null.out
+++ b/regression-test/data/insert_p0/insert_with_null.out
@@ -2,54 +2,77 @@
 -- !sql --
 1      "b"     ["k1=v1, k2=v2"]
 2      N       ["k3=v3, k4=v4"]
-4      null    []
-5      NULL    ["k5, k6"]
-6      \N      ["k7", "k8"]
-7      abc     \N
+3      null    []
+4      NULL    ["k5, k6"]
+5      \N      ["k7", "k8"]
+6      \n      ["k7", "k8"]
+7              ["k7", "k8"]
+8              ["k7", "k8"]
+9      "a      ["k7", "k8"]
+10     a"      ["k7", "k8"]
+22     \N      \N
 
 -- !sql --
-6      \N      ["k7", "k8"]
+5      \N      ["k7", "k8"]
+22     \N      \N
 
 -- !sql --
-7      abc     \N
+22     \N      \N
 
 -- !sql --
 1      "b"     ["k1=v1, k2=v2"]
 2      N       ["k3=v3, k4=v4"]
-4      null    []
-5      NULL    ["k5, k6"]
-6      \N      ["k7", "k8"]
+3      null    []
+4      NULL    ["k5, k6"]
+5      \N      ["k7", "k8"]
+6      \n      ["k7", "k8"]
+7              ["k7", "k8"]
+8              ["k7", "k8"]
+9      "a      ["k7", "k8"]
+10     a"      ["k7", "k8"]
 
 -- !sql --
-6      \N      ["k7", "k8"]
+5      \N      ["k7", "k8"]
 
 -- !sql --
 
 -- !sql --
 1      "b"     ["k1=v1, k2=v2"]
 2      N       ["k3=v3, k4=v4"]
-4      null    []
-5      NULL    ["k5, k6"]
-6      \N      ["k7", "k8"]
-7      abc     \N
+3      null    []
+4      NULL    ["k5, k6"]
+5      \N      ["k7", "k8"]
+6      \n      ["k7", "k8"]
+7              ["k7", "k8"]
+8              ["k7", "k8"]
+9      "a      ["k7", "k8"]
+10     a"      ["k7", "k8"]
+22     \N      \N
 
 -- !sql --
-6      \N      ["k7", "k8"]
+5      \N      ["k7", "k8"]
+22     \N      \N
 
 -- !sql --
-7      abc     \N
+22     \N      \N
 
 -- !sql --
 1      "b"     ["k1=v1, k2=v2"]
 2      N       ["k3=v3, k4=v4"]
-4      null    []
-5      NULL    ["k5, k6"]
-6      \N      ["k7", "k8"]
-7      abc     \N
+3      null    []
+4      NULL    ["k5, k6"]
+5      \N      ["k7", "k8"]
+6      \n      ["k7", "k8"]
+7              ["k7", "k8"]
+8              ["k7", "k8"]
+9      "a      ["k7", "k8"]
+10     a"      ["k7", "k8"]
+22     \N      \N
 
 -- !sql --
-6      \N      ["k7", "k8"]
+5      \N      ["k7", "k8"]
+22     \N      \N
 
 -- !sql --
-7      abc     \N
+22     \N      \N
 
diff --git a/regression-test/suites/insert_p0/insert_with_null.groovy 
b/regression-test/suites/insert_p0/insert_with_null.groovy
index 5a7a19f82e6..e93fa8eb410 100644
--- a/regression-test/suites/insert_p0/insert_with_null.groovy
+++ b/regression-test/suites/insert_p0/insert_with_null.groovy
@@ -78,16 +78,21 @@ suite("insert_with_null") {
 
         sql """ insert into ${table} values(1, '"b"', ["k1=v1, k2=v2"]); """
         sql """ insert into ${table} values(2, "\\N", ['k3=v3, k4=v4']); """
-        // sql """ insert into ${table} values(3, "\\\\N", []); """
-        sql """ insert into ${table} values(4, 'null', []); """
-        sql """ insert into ${table} values(5, 'NULL', ['k5, k6']); """
-        sql """ insert into ${table} values(6, null, ["k7", "k8"]); """
+        sql """ insert into ${table} values(3, 'null', []); """
+        sql """ insert into ${table} values(4, 'NULL', ['k5, k6']); """
+        sql """ insert into ${table} values(5, null, ["k7", "k8"]); """
+        sql """ insert into ${table} values(6, "\\n", ["k7", "k8"]); """
+        sql """ insert into ${table} values(7, "", ["k7", "k8"]); """
+        sql """ insert into ${table} values(8, '', ["k7", "k8"]); """
+        sql """ insert into ${table} values(9, '"a', ["k7", "k8"]); """
+        sql """ insert into ${table} values(10, 'a"', ["k7", "k8"]); """
+        // sql """ insert into ${table} values(21, "\\\\N", []); """
         if (write_mode != "txn_insert") {
-            sql """ insert into ${table}(id, name) values(7, 'abc'); """
-            getRowCount(6)
+            sql """ insert into ${table}(id) values(22); """
+            getRowCount(11)
         } else {
             sql "commit"
-            getRowCount(5)
+            getRowCount(10)
         }
 
         qt_sql """ select * from ${table} order by id asc; """


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

Reply via email to