Repository: matrixorigin/matrixone
Pull request #4177 (2022-07-23 02:26:24)

delete mo tech design
**What type of PR is this?**

- [ ] API-change
- [ ] BUG
- [ ] Improvement
- [x] Documentation
- [ ] Feature
- [ ] Test and CI
- [ ] Code Refactoring

**Which issue(s) this PR fixes:**

issue #

**What this PR does / why we need it:**

Not Available

**Special notes for your reviewer:**

Not Available

**Additional documentation (e.g. design docs, usage docs, etc.):**

Not Available



Patch:
diff --git a/.licenserc.yml b/.licenserc.yml
index 2501e95bd..d65421c96 100644
--- a/.licenserc.yml
+++ b/.licenserc.yml
@@ -23,4 +23,13 @@ header:
     - '**/goyacc.go'
     - 'pkg/sql/parsers/dialect/postgresql/postgresql_sql.go'
     - 'pkg/sql/parsers/dialect/mysql/mysql_sql.go'
-  comment: on-failure
\ No newline at end of file
+  comment: on-failure
+dependency:
+  files:
+    - go.mod
+  licenses:
+    # assuming go-queue is apache-2.0 licensed
+    # https://github.com/yireyun/go-queue/issues/16
+    - name: github.com/yireyun/go-queue
+      version: v0.0.0-20210520035143-72b190eafcba
+      license: Apache-2.0
diff --git a/Makefile b/Makefile
index 8fa6eb063..850e64e42 100644
--- a/Makefile
+++ b/Makefile
@@ -15,13 +15,17 @@
 #
 # Examples
 #
-# To build MO -
+# By default, make builds the mo-server
+#
+# make
+#
+# To re-build MO -
 #	
 #	make clean
 #	make config
 #	make build
 #
-# To build MO in debug mode also with race detector enabled -
+# To re-build MO in debug mode also with race detector enabled -
 #
 # make clean
 # make config
@@ -51,6 +55,11 @@ ifneq ($(GOARCH)$(TARGET_ARCH)$(GOOS)$(TARGET_OS),)
 $(error cross compilation has been disabled)
 endif
 
+###############################################################################
+# default target
+###############################################################################
+all: build
+
 ###############################################################################
 # code generation
 ###############################################################################
@@ -158,10 +167,6 @@ install-static-check-tools:
 	@go install github.com/apache/skywalking-eyes/cmd/license-eye@latest
 	@go install honnef.co/go/tools/cmd/staticcheck@latest
 
-# TODO: tracking https://github.com/golangci/golangci-lint/issues/2649
-DIRS=pkg/... \
-	 cmd/...
-
 EXTRA_LINTERS=-E exportloopref -E rowserrcheck -E depguard -D unconvert \
 	-E prealloc -E gofmt
 
@@ -169,9 +174,8 @@ STATICCHECK_CHECKS=QF1001,QF1002,QF1003,QF1004,QF1005,QF1006,QF1007,QF1008,QF100
 
 .PHONY: static-check
 static-check: config cgo
-	@$(CGO_OPTS) staticcheck -checks $(STATICCHECK_CHECKS) ./...
-	@$(CGO_OPTS) go vet -vettool=$(which molint) ./...
-	@$(CGO_OPTS) license-eye -c .licenserc.yml header check
-	@for p in $(DIRS); do \
-    $(CGO_OPTS) golangci-lint run $(EXTRA_LINTERS) $$p ; \
-done;
+	$(CGO_OPTS) staticcheck -checks $(STATICCHECK_CHECKS) ./...
+	$(CGO_OPTS) go vet -vettool=`which molint` ./...
+	$(CGO_OPTS) license-eye -c .licenserc.yml header check
+	$(CGO_OPTS) license-eye -c .licenserc.yml dep check
+	$(CGO_OPTS) golangci-lint run $(EXTRA_LINTERS) ./...
diff --git a/cgo/Makefile b/cgo/Makefile
index 27a5f71a5..b7f4205f6 100644
--- a/cgo/Makefile
+++ b/cgo/Makefile
@@ -10,6 +10,7 @@ all: $(LIBS) $(OBJS)
 	ar -rcs libmo.a *.o
 	ranlib libmo.a
 	rm -f *.o
+	rm -f $(LIBS)
 
 libdecnumber.a:
 	(cd external; bash ./build.sh)
diff --git a/cmd/generate-config/config_template.go b/cmd/generate-config/config_template.go
index f455222b6..298dc9f8a 100644
--- a/cmd/generate-config/config_template.go
+++ b/cmd/generate-config/config_template.go
@@ -16,7 +16,7 @@ package main
 
 import (
 	"fmt"
-	"io/ioutil"
+	"io"
 	"os"
 	"path/filepath"
 	"sort"
@@ -145,7 +145,7 @@ func (params *parameters) LoadParametersDefinitionFromFile(filename string) erro
 	}
 	defer pfile.Close()
 
-	fbytes, err := ioutil.ReadAll(pfile)
+	fbytes, err := io.ReadAll(pfile)
 	if err != nil {
 		return err
 	}
diff --git a/docs/cn/MatrixOne/Contribution-Guide/Code-Style/code-comment-style.md b/docs/cn/MatrixOne/Contribution-Guide/Code-Style/code-comment-style.md
index 9c8cd4c8f..ce58f5c06 100644
--- a/docs/cn/MatrixOne/Contribution-Guide/Code-Style/code-comment-style.md
+++ b/docs/cn/MatrixOne/Contribution-Guide/Code-Style/code-comment-style.md
@@ -25,7 +25,7 @@
 - Package (Go)
 - File
 - Type
-- Constant 
+- Constant
 - Function
 - Method
 - Variable
@@ -58,18 +58,18 @@
     - 请统一使用 **美式英语**       
         - color, canceling, synchronize     (推荐)
         - colour, cancelling, synchronise   (不推荐)
- 
+
     - 注意拼写正确
 
     - 使用**标准或官方的大写**
-        
-        - MatrixOne, MatrixCube, Raft, SQL  (正确)
-        - matrixone, matrixcube, RAFT, sql  (错误)
+
+        - MatrixOne, Raft, SQL  (正确)
+        - matrixone, RAFT, sql  (错误)
 
     - 使用一致性的短语和词汇
-        
+
         - "dead link" vs. "broken link" （在一篇文章或文件中只能出现其中一个）
-    
+
     - 不要使用冗长的复合词
 
     - 尽量不使用缩写
@@ -82,11 +82,11 @@
     - 尽量使用短句
 
 - 句子首字母大写，并以句号结尾
-    
+
     - 如果一个小写的标识符位于句子开头，可以不用大写
 
         ```
-        // enterGame causes Players to enter the 
+        // enterGame causes Players to enter the
         // video game, which is about a romantic
         // story in ancient China.
         func enterGame() os.Error {
@@ -99,13 +99,13 @@
     - Opens the file   (正确)
     - Open the file    (错误)       
 
-- 使用 "this" 而非"the"来指代当前事物 
-    
+- 使用 "this" 而非"the"来指代当前事物
+
     - Gets the toolkit for this component   (推荐)
     - Gets the toolkit for the component    (不推荐)
 
 - 允许使用Markdown语法格式
-    
+
     - Opens the `log` file  
 
 ### Tips
@@ -117,4 +117,4 @@
 - 确保及时更新注释
 - 保证注释清楚易懂
 
-感谢您的贡献!
\ No newline at end of file
+感谢您的贡献!
diff --git a/docs/cn/MatrixOne/Contribution-Guide/How-to-Contribute/preparation.md b/docs/cn/MatrixOne/Contribution-Guide/How-to-Contribute/preparation.md
index f2ff28bcd..7ff10acad 100644
--- a/docs/cn/MatrixOne/Contribution-Guide/How-to-Contribute/preparation.md
+++ b/docs/cn/MatrixOne/Contribution-Guide/How-to-Contribute/preparation.md
@@ -9,7 +9,7 @@
 ### 特点与框架
 
 在[MatrixOne简介](./../../Overview/matrixone-introduction.md)中您可以了解到MO的超融合、云边协同特性以及其所创造的优异表现与独特价值。
-此外，在[MatrixOne框架](./../../Overview/matrixone-architecture.md)中您可以详细地了解MO的整体架构，以及存储层、计算层、负责分布式管理的MatrixCube的具体组成情况。
+此外，在[MatrixOne框架](./../../Overview/matrixone-architecture.md)中您可以详细地了解 MatrixOne 的整体架构，以及存储层、日志层等具体组成情况。
 同时，你也可以查阅[MatrixOne术语表](../../Glossary/glossary.md)来了解一些复杂的词汇。
 在技术层面，[SQL参考指南](./../../Reference/SQL-Reference/Data-Definition-Statements/create-database.md) 为您提供了详细的SQL语言的参考，其中对语法和示例都有详细解释；同样，[自定义函数](./../../Reference/Builtin-Functions/Datetime/year.md)提供了MO中自定义函数的相关解释。
 
@@ -39,7 +39,7 @@
 | **optools** | 测试与部署工具 |
 | **pkg** | MatrixOne项目的主要代码库  |
 
-对于不同的技术模块，`/pkg`喜爱的代码结构如下表所示。详情请参照[MatrixOne技术架构](../../Overview/MatrixOne-Tech-Design/matrixone-techdesign.md)。
+对于不同的技术模块，`/pkg`喜爱的代码结构如下表所示。
 
 | 目录            | 模块    |
 | ------------------------------ | ------------------------------------------------------------ |
@@ -48,7 +48,6 @@
 | **sql/** | MPP SQL Execution  |
 | **sql/vectorize** | SQL的向量化执行   |
 | **catalog/** | 存储元数据的Catalog |
-| **github.com/matrixorigin/matrixcube** | MatrixCube  |
 | **vm/engine** |存储引擎 |
 | **vm/engine/aoe** |  AOE引擎（分析优化引擎） |
 | **vm/engine/tpe** |  TPE引擎（事务处理引擎）  |
diff --git a/docs/cn/MatrixOne/Overview/matrixone-architecture.md b/docs/cn/MatrixOne/Overview/matrixone-architecture.md
index d36f27661..bf2589830 100644
--- a/docs/cn/MatrixOne/Overview/matrixone-architecture.md
+++ b/docs/cn/MatrixOne/Overview/matrixone-architecture.md
@@ -40,10 +40,7 @@ Serverless 层是一系列无状态节点的总称，整体上包含三类：
 
 ## **相关信息**
 
-本节介绍了MatrixOne的整体架构概览。若您想了解更详细的模块技术设计问题，可阅读：
-[MatrixOne模块概览](MatrixOne-Tech-Design/matrixone-techdesign.md)  
-
-其他信息可参见：
+本节介绍了MatrixOne的整体架构概览。其他信息可参见：
 
 * [安装MatrixOne](../Get-Started/install-standalone-matrixone.md)
 * [MySQL兼容性](mysql-compatibility.md)
diff --git a/docs/cn/MatrixOne/glossary.md b/docs/cn/MatrixOne/glossary.md
index dc2bb870a..ad754a8b7 100644
--- a/docs/cn/MatrixOne/glossary.md
+++ b/docs/cn/MatrixOne/glossary.md
@@ -11,7 +11,7 @@
 | C  |  |
 | Cluster  | MatrixOne的分布式部署形式，由多台主机组成，在逻辑上构成一个整体。|
 | D  |  |
- | Data Storage  | DataStorage接口实现了分布式存储服务，必须在使用MatrixCube之前就预先定义。并且，DataStorage的实现依赖于存储引擎的具体特性 |
+ | Data Storage  | DataStorage接口实现了分布式存储服务<!--，必须在使用MatrixCube之前就预先定义-->。并且，DataStorage的实现依赖于存储引擎的具体特性 |
 | E  |  |
   | Event Notify | 将心跳(Hearbeat)信息同步到所有节点的机制称为Event Notify。|
   | Explicit Transactions| 显式事务，即是一种指定的事务，这种事务需要由你自己决定哪批工作必须成功完成，否则所有部分都不完成。可以使用 `BEGIN TRANSACTION` 和
@@ -23,17 +23,16 @@
   |I|  |
   | Implicit transactions| 隐式事务，即自动提交事务。 |
  | M  |  |
-  | MatrixCube | MatrixCube是一个构建分布式系统的框架，保证了集群的可用性、一致性以及可扩展性。MatrixCube的设计目标是让开发人员只需要关注一个节点上的业务逻辑但却能够轻松实现各种强一致的分布式存储服务。|
  | P  |  |
-  | Prophet | Prophet是MatrixCube中的调度模块，执行Auto-Rebalance操作来维持集群中各个节点的存储量、读写负载均衡。集群中最初的三个节点将作为Prophet节点。|
+  | Prophet | Prophet是<!--MatrixCube中的-->调度模块，执行Auto-Rebalance操作来维持集群中各个节点的存储量、读写负载均衡。集群中最初的三个节点将作为Prophet节点。|
    | Pure Storage | 与Prophet相对, pure storage是另一种类型的节点，并不执行调度工作，只进行普通的存储工作。|
 | R  |  |
   | Replica | 为了保证存储服务的高可用性，每部分数据需要存储多份，并且分布在不同的节点上，因此将一个数据副本称之为一个Replica。同一部分的数据会包含多个Replica，并且每个Replica中的数据都是相同的。 |
   | S  |  |
   | Snapshot Isolation (SI) | Snapshot Isolation是一种在实践中广泛应用的多版本并发控制技术，MatrixOne支持Snapshot隔离级别的分布式事务。|
- | Store |MatrixCube分布式系统包括一定数量的主机，数据正是存放在这些机器中，而我们把集群中的每台主机称之为Store。|
-  | Shard | 数据库中的数据按逻辑组织成表，而数据又可以按照不同的分区进行存储，如此可以得到更好的扩展性。因此，数据在MatrixCube集群中分片存储，每个数据分片我们称之为一个Shard，而一个Store中可以管理多个Shard；当Shard的存储容量超过限制时，会进行分裂(Split)。 |
- | Shard Splitting | 当一个Shard超过了规定的存储容量限制时，MatrixCube将会把该Shard分裂（Split）为两个存储量相当的Shard。 |
+ | Store |<!--MatrixCube-->分布式系统包括一定数量的主机，数据正是存放在这些机器中，而我们把集群中的每台主机称之为Store。|
+  | Shard | 数据库中的数据按逻辑组织成表，而数据又可以按照不同的分区进行存储，如此可以得到更好的扩展性。因此，数据在<!--MatrixCube-->集群中分片存储，每个数据分片我们称之为一个Shard，而一个Store中可以管理多个Shard；当Shard的存储容量超过限制时，会进行分裂(Split)。 |
+ | Shard Splitting | 当一个Shard超过了规定的存储容量限制时，<!--MatrixCube-->集群将会把该Shard分裂（Split）为两个存储量相当的Shard。 |
   | Shard Proxy | Shard Proxy是接受用户读写请求的中心模块，在收到请求后将其发送到相应的节点以做出回应|
 
 ### **重要概念**
diff --git a/docs/cn/README.md b/docs/cn/README.md
index f35ba2175..d035143bc 100644
--- a/docs/cn/README.md
+++ b/docs/cn/README.md
@@ -14,4 +14,4 @@ MatrixOne通过超融合数据引擎实现单一数据库系统支持事务性
 |  ----  | ----  |  ----  
 | [MatrixOne简介](MatrixOne/Overview/matrixone-introduction.md)  | [MatrixOne安装部署](MatrixOne/Get-Started/install-standalone-matrixone.md) | 	[SQL参考指南](MatrixOne/Reference/SQL-Reference/Data-Definition-Statements/create-database.md)
 | [MatrixOne架构](MatrixOne/Overview/matrixone-architecture.md)  | [连接MatrixOne服务](MatrixOne/Get-Started/connect-to-matrixone-server.md) | [v0.5.0发布公告](MatrixOne/Release-Notes/v0.5.0.md)
-| [MatrixCube简介](MatrixOne/Overview/matrixcube/matrixcube-introduction.md)  | [使用MatrixOne完成SSB测试](MatrixOne/Get-Started/Tutorial/SSB-test-with-matrixone.md)
+| [MySQL兼容性](MatrixOne/Overview/mysql-compatibility.md)  | [使用MatrixOne完成SSB测试](MatrixOne/Get-Started/Tutorial/SSB-test-with-matrixone.md)
diff --git a/docs/en/MatrixOne/Contribution-Guide/Code-Style/code-comment-style.md b/docs/en/MatrixOne/Contribution-Guide/Code-Style/code-comment-style.md
index 7fed04a43..df5dbec06 100644
--- a/docs/en/MatrixOne/Contribution-Guide/Code-Style/code-comment-style.md
+++ b/docs/en/MatrixOne/Contribution-Guide/Code-Style/code-comment-style.md
@@ -26,7 +26,7 @@ A comment is generally required for:
 - Package (Go)
 - File
 - Type
-- Constant 
+- Constant
 - Function
 - Method
 - Variable
@@ -41,7 +41,7 @@ A comment is generally required for:
 ### Format of a good comment
 
 - Go
-    
+
     - Use `//` for a single-line comment and trailing comment
     - Use `/* ... */` for a block comment (used only when needed)
     - Use **gofmt** to format your code
@@ -57,23 +57,23 @@ A comment is generally required for:
 ### Language for a good comment
 
 - Word
-    
+
     - Use **American English** rather than British English
-        
+
         - color, canceling, synchronize     (Recommended)
         - colour, cancelling, synchronise   (Not recommended)
-    
+
     - Use correct spelling
 
     - Use **standard or official capitalization**
-        
-        - MatrixOne, MatrixCube, Raft, SQL  (Right)
-        - matrixone, matrixcube, RAFT, sql  (Wrong)
+
+        - MatrixOne, Raft, SQL  (Right)
+        - matrixone, RAFT, sql  (Wrong)
 
     - Use words and expressions consistently
-        
+
         - "dead link" vs. "broken link" (Only one of them can appear in a single document)
-    
+
     - Do not use lengthy compound words
 
     - Do not abbreviate unless it is absolutely necessary
@@ -86,11 +86,11 @@ A comment is generally required for:
     - Use relatively short sentences
 
 - Capitalize the first letter of sentences and end them with periods
-    
+
     - If a lower-case identifier comes at the beginning of a sentence, don't capitalize it
 
         ```
-        // enterGame causes Players to enter the 
+        // enterGame causes Players to enter the
         // video game, which is about a romantic
         // story in ancient China.
         func enterGame() os.Error {
@@ -104,12 +104,12 @@ A comment is generally required for:
     - Open the file    (Wrong)       
 
 - Use "this" instead of "the" to refer to the current thing
-    
+
     - Gets the toolkit for this component   (Recommended)
     - Gets the toolkit for the component    (Not recommended)
 
 - The Markdown format is allowed
-    
+
     - Opens the `log` file  
 
 ### Tips for a good comment
@@ -121,4 +121,4 @@ A comment is generally required for:
 - Make sure the comment is up-to-date
 - Let the code speak for itself
 
-Thanks for your contribution!
\ No newline at end of file
+Thanks for your contribution!
diff --git a/docs/en/MatrixOne/Contribution-Guide/Code-Style/code-of-conduct.md b/docs/en/MatrixOne/Contribution-Guide/Code-Style/code-of-conduct.md
index 058451091..a5806994a 100644
--- a/docs/en/MatrixOne/Contribution-Guide/Code-Style/code-of-conduct.md
+++ b/docs/en/MatrixOne/Contribution-Guide/Code-Style/code-of-conduct.md
@@ -5,7 +5,7 @@
 In the interest of fostering an open and welcoming environment, we as
 contributors and maintainers pledge to make participation in our project and
 our community a harassment-free experience for everyone, regardless of age, body
-size, disability, ethnicity, sex characteristics, gender identity and expression,
+size, disability, ethnicity, sex characteristics, gender identity, and expression,
 level of experience, education, socio-economic status, nationality, personal
 appearance, race, religion, or sexual identity and orientation.
 
@@ -45,7 +45,7 @@ threatening, offensive, or harmful.
 
 ## **Scope**
 
-This Code of Conduct applies within all project spaces, and it also applies when
+This Code of Conduct applies within all project spaces, and when
 an individual is representing the project or its community in public spaces.
 Examples of representing a project or community include using an official
 project e-mail address, posting via an official social media account, or acting
@@ -56,14 +56,13 @@ a project may be further defined and clarified by project maintainers.
 
 Instances of abusive, harassing, or otherwise unacceptable behavior may be
 reported by contacting the project team at hai.jin@matrixorigin.io. All
-complaints will be reviewed and investigated and will result in a response that
-is deemed necessary and appropriate to the circumstances. The project team is
+complaints will be reviewed and investigated and resulting in a response deemed necessary and appropriate to the circumstances. The project team is
 obligated to maintain confidentiality with regard to the reporter of an incident.
 Further details of specific enforcement policies may be posted separately.
 
 Project maintainers who do not follow or enforce the Code of Conduct in good
 faith may face temporary or permanent repercussions as determined by other
-members of the project's leadership.
+the project leadership members.
 
 ## **Attribution**
 
@@ -73,4 +72,4 @@ available at <https://www.contributor-covenant.org/version/1/4/code-of-conduct.h
 [homepage]: https://www.contributor-covenant.org
 
 For answers to common questions about this code of conduct, see
-<https://www.contributor-covenant.org/faq>
\ No newline at end of file
+<https://www.contributor-covenant.org/faq>
diff --git a/docs/en/MatrixOne/Contribution-Guide/Code-Style/commit-pr-style.md b/docs/en/MatrixOne/Contribution-Guide/Code-Style/commit-pr-style.md
index 980ab1ead..e8fac5f33 100644
--- a/docs/en/MatrixOne/Contribution-Guide/Code-Style/commit-pr-style.md
+++ b/docs/en/MatrixOne/Contribution-Guide/Code-Style/commit-pr-style.md
@@ -1,6 +1,6 @@
 # Commit Message and Pull Request Style
 
-This document describes the commit message and Pull Request style applied to all MatrixOrigin repositories. When you are ready to commit, be sure to follow the style guide to write a good commit message, a good Pull Request title, and description.
+This document describes the commit message and Pull Request style applied to all MatrixOrigin repositories. When you are ready to commit, be sure to follow the style guide to write a good commit message, a good Pull Request title, and a description.
 
 ## Why a good commit message matters
 
@@ -17,7 +17,7 @@ Elements of a good commit message:
 
 1. **What is your change? (mandatory)**
 
-    It can be fixing a specific bug, adding a feature, improving performance, reliability and stability, or just be a change for the sake of correctness.
+    It can be fixing a specific bug, adding a feature, improving performance, reliability, and stability, or just being a change for the sake of correctness.
 
 2. **Why was this change made? (mandatory)**
 
@@ -29,7 +29,7 @@ Elements of a good commit message:
 
 ## How to write a good commit message
 
-To write a good commit message, we suggest following good format, cultivating good habits, and using good language.
+To write a good commitment message, we suggest following a good format, cultivating good habits, and using good language.
 
 ### Format of a good commit message
 
@@ -45,7 +45,7 @@ Please follow the following style for **all your commits**:
 
 + For the first subject line:
     - Use no more than 70 characters.
-    - If the changes affect two subsystems, use a comma (and a whitespace) to separate them like `util/codec, util/types:`.
+    - If the changes affect two subsystems, use a comma (and whitespace) to separate them like `util/codec, util/types:`.
     - If the changes affect three or more subsystems, you can use `*` instead, like `*:`.
     - Use a lowercase letter on the text that immediately follows the colon. For example: "media: **update** the DM architecture image"
     - Do not add a period at the end of a commit message.
@@ -75,7 +75,7 @@ Please follow the following style for **all your commits**:
 
 ## Pull Request description style
 
-For Pull Request description in the `Conversation` box, please refer to the following Pull Request description template and include necessary information:
+For the Pull Request description in the `Conversation` box, please refer to the following Pull Request description template and include the necessary information:
 
 ```
 **What type of PR is this?**
@@ -111,4 +111,4 @@ You may also use the checklist style to list contents if needed. The Markdown sy
 
 For short and obvious Pull Requests, you can omit some of the above information.
 
-Thanks for your contribution！
\ No newline at end of file
+Thanks for your contribution！
diff --git a/docs/en/MatrixOne/Contribution-Guide/How-to-Contribute/contribute-code.md b/docs/en/MatrixOne/Contribution-Guide/How-to-Contribute/contribute-code.md
index 679bda0be..5a278819f 100644
--- a/docs/en/MatrixOne/Contribution-Guide/How-to-Contribute/contribute-code.md
+++ b/docs/en/MatrixOne/Contribution-Guide/How-to-Contribute/contribute-code.md
@@ -1,13 +1,13 @@
 # **Contribute Code**
 
 MatrixOne is an open-source project maintained, improved, and extended by code contributors.  
-This document describes the conventions about development workflow, and some styles and templates you need while contributing code to MatrixOne. If you encounter any problem or find some mistakes in participating in contribution to MatrixOne, please [file an issue](https://github.com/matrixorigin/matrixone/issues) in GitHub or contact us on other platforms we support.
+This document describes the conventions of development workflow, and some styles and templates you need while contributing code to MatrixOne. If you encounter any problems or find some mistakes in participating in contribution to MatrixOne, please [file an issue](https://github.com/matrixorigin/matrixone/issues) on GitHub or contact us on other platforms we support.
 
 ## **Before Contributions**
 
-Before you start developing, make sure you have read [Preparation](preparation.md) where you can follow the instructions to learn more about MatrixOne, development knowledge and how to set up the development environment.
+Before you start developing, make sure you have read [Preparation](preparation.md) where you can follow the instructions to learn more about MatrixOne, development knowledge, and how to set up the development environment.
 
-## **Get familiar with style** <a name="get-familiar-with-style"></a>
+## **Get familiar with the style** <a name="get-familiar-with-style"></a>
 
 It's necessary to keep a consistent style for code, code comments, commit messages, and pull requests when contributing to MatrixOne. When you put together your pull request, we highly recommend you comply with the following style guides which make MatrixOne easy to review, maintain, and develop.
 
@@ -15,11 +15,11 @@ It's necessary to keep a consistent style for code, code comments, commit messag
 The coding style suggested by the Golang community is used in MatrixOne. See the [style doc](https://github.com/golang/go/wiki/CodeReviewComments) for details.
 
 * **Code Comment Style**
-  
+
   See the [code comment style](../Code-Style/code-comment-style.md) for details.
 
-* **Commit Message & Pull Request Style** 
-   
+* **Commit Message & Pull Request Style**
+
    See the [Commit Message & Pull Request Style](../Code-Style/code-comment-style.md) for details.
 
 ## **Workflow<c name="workflow"></c>**
@@ -39,7 +39,7 @@ And add MatrixOne repo as a remote repository with:
 git remote add upstream https://github.com/matrixorigin/matrixone.git
 ```  
 
-*3.* Create a new branch, the branch name is up to you.
+*3.* Create a new branch. The branch name is up to you.
 
 ```
 git checkout -b topic-branch
@@ -55,13 +55,13 @@ git push origin main:NEW_BRANCH
 
 *6.* Go back to GitHub, and submit a pull request in `NEW_BRANCH` so that we can review your changes. Add some labels if needed, and don't forget to [refer to the related issue](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue).
 
-*7.* Once your PR get approved, it would be merged sooner. After merging, synchronize your local repository. 
+*7.* Once your PR gets approved, it will be merged sooner. After merging, synchronize your local repository.
 
 ```
 git pull --force upstream main:main
 ```
 
-*8.*Synchronized the `main` branch of your remote repository in Github.
+*8.* Synchronized the `main` branch of your remote repository in Github.
 
 ```
 git push --force origin main:main
@@ -71,6 +71,6 @@ If you still have some trouble, please refer to [GitHub Docs](https://docs.githu
 
 ## **Code review**
 
-When you open a pull request, you can assign some reviewers, or just leave it blank. And you can add some related labels so that it would be easier to recognize the PR's type/priority/etc. During review, reviewers would comment on your code snippet, and you can modify the code on your topic branch locally, commit the changes, and push to GitHub where the new commits would be attached to the PR automatically.
+When you open a pull request, you can assign some reviewers, or just leave it blank. And you can add some related labels to make it easier to recognize the PR's type/priority/etc. During the review, reviewers would comment on your code snippet, and you can modify the code on your topic branch locally, commit the changes, and push it to GitHub where the new commits would be attached to the PR automatically.
 
-For detailed code review tips, See [Review a pull request](review-a-pull-request.md) for details. 
+For detailed code review tips, See [Review a pull request](review-a-pull-request.md) for details.
diff --git a/docs/en/MatrixOne/Contribution-Guide/How-to-Contribute/contribute-documentation.md b/docs/en/MatrixOne/Contribution-Guide/How-to-Contribute/contribute-documentation.md
index cdee33729..5279e59c7 100644
--- a/docs/en/MatrixOne/Contribution-Guide/How-to-Contribute/contribute-documentation.md
+++ b/docs/en/MatrixOne/Contribution-Guide/How-to-Contribute/contribute-documentation.md
@@ -4,17 +4,17 @@ Contributions to the MatrixOne documentation are welcome from everyone. The Matr
 
 ## **Before you start**
 
-Before you contribute please take a minute to familiarize yourself with basic [Markdown](https://www.markdownguide.org/basic-syntax/) syntax and have a look at our [Code of Conduct](../Code-Style/code-of-conduct.md) and the [Google Developer Documentation Style Guide](https://developers.google.com/style/) for some guidance on how to write accessible, consistent, and inclusive documentation.
+Before you contribute, please take a minute to familiarize yourself with basic [Markdown](https://www.markdownguide.org/basic-syntax/) syntax and look at our [Code of Conduct](../Code-Style/code-of-conduct.md) and the [Google Developer Documentation Style Guide](https://developers.google.com/style/) for some guidance on writing accessible, consistent, and inclusive documentation.
 
 ## **How is MatrixOne documentation project organized?**
 
 The MatrixOne documentation is managed in 3 repositories:
 
-* The main project framework and CI&CD settings are in the [matrixorigin.io](https://github.com/matrixorigin/matrixorigin.io) repo. 
+* The main project framework and CI&CD settings are in the [matrixorigin.io](https://github.com/matrixorigin/matrixorigin.io) repo.
 
-* The markdown contents are in the docs/en/MatrixOne folder of [matrixone](https://github.com/matrixorigin/matrixone) repo. 
+* The markdown contents are in the docs/en/MatrixOne folder of [matrixone](https://github.com/matrixorigin/matrixone) repo.
 
-* The images and unstructured data are located in the [artwork](https://github.com/matrixorigin/artwork) repo. 
+* The images and unstructured data are located in the [artwork](https://github.com/matrixorigin/artwork) repo.
 
 The `matrixorigin.io` repo contains a submodule that links to `matrixone` repo contents. The images are referred to as web image links from `artwork` repo. The `matrixorigin.io` has implemented a CI&CD project, which will be triggered by a new code merge and manual launch. This CI&CD workflow publishes the documentation to [https://docs.matrixorigin.io/](https://docs.matrixorigin.io/).  
 
@@ -24,7 +24,7 @@ The documentation project is based on the [mkdocs-material](https://github.com/s
 
 The MatrixOne documentation content is planned with 6 main modules.  
 
-* **Overview**: MatrixOne's introduction, features, architecture, tech design. 
+* **Overview**: MatrixOne's introduction, features, architecture.
 
 * **Get Started**: How to quickly deploy and run a MatrixOne in a standalone or a distributed environment.
 
@@ -42,7 +42,7 @@ The MatrixOne documentation content is planned with 6 main modules.
 
 ## **Lift a finger**
 
-If you are just correcting a typo or grammatical error, feel free to go ahead and [create a pull request](https://github.com/matrixorigin/matrixone/pulls). 
+If you are just correcting a typo or grammatical error, feel free to go ahead and [create a pull request](https://github.com/matrixorigin/matrixone/pulls).
 
 ### **Contribute Workflow**
 
@@ -79,9 +79,9 @@ git remote add upstream https://github.com/matrixorigin/matrixorigin.io.git
 mkdocs serve
 ```
 
-*6*. Make your modification. If the modification is about the project settings, updating the sitemap with new pages, or updating the CI&CD workflow code. You can always check `http://localhost:8000` to see if your modification is effective. If your modification is about the markdown contents, after you update the `docs` submodule of `matrixorigin.io`, the same modifcation should be applied to the `matrixone` repo.
+*6*. Make your modification. If the modification concerns the project settings, update the sitemap with new pages, or update the CI&CD workflow code. You can always check `http://localhost:8000` to see if your modification is effective. If your modification is about the markdown contents, after you update the `docs` submodule of `matrixorigin.io`, the same modification should be applied to the `matrixone` repository.
 
-*7*. Push your git commits to your remote Github `matrixorigin.io` and `matrixone` repos. We recommend you to push to a new branch using the following commands:
+*7*. Push your git commits to your remote Github `matrixorigin.io` and `matrixone` repos. We recommend you push to a new branch using the following commands:
 
 ```
 git push origin main:NEW_BRANCH
@@ -89,10 +89,10 @@ git push origin main:NEW_BRANCH
 
 *8*. Go back to GitHub, and submit a pull request in `NEW_BRANCH` so that we can review your changes.  
 
-*9*. Once your code for both repos is merged, you'll wait for a CI&CD workflow to restart running until the documentation website being updated.
+*9*. Once your code for both repositories is merged, you'll wait for a CI&CD workflow to restart running until the documentation website being updated.
 
 !!! note  
-    So once your pull requests are merged, the update to the website is not immediate. We'll need to run a manual launch to update it. 
+    So once your pull requests are merged, the update to the website is not immediate. We'll need to run a manual launch to update it.
 
 *10*. At last, you should update your local and remote repo to help keep committing history clean. Override your local committing repo with:  
 
@@ -111,4 +111,4 @@ git push --force origin main:main
 
 ## **Contribute a blog article**
 
-If you would like to write an article for our blog, please [file an issue](https://github.com/matrixorigin/matrixone/issues/new/choose) or send it to [dengnan@matrixorigin.io](mailto:dengnan@matrixorigin.io). Feel free to submit either a completed draft or any article ideas. All submissions will be reviewed as quickly as possible. If your article or idea seems like a good fit for the blog, we will reach out to you directly.
\ No newline at end of file
+If you would like to write an article for our blog, please [file an issue](https://github.com/matrixorigin/matrixone/issues/new/choose) or send it to [dengnan@matrixorigin.io](mailto:dengnan@matrixorigin.io). Feel free to submit either a completed draft or any article ideas. All submissions will be reviewed as quickly as possible. If your article or idea seems like a good fit for the blog, we will reach out to you directly.
diff --git a/docs/en/MatrixOne/Contribution-Guide/How-to-Contribute/make-a-design.md b/docs/en/MatrixOne/Contribution-Guide/How-to-Contribute/make-a-design.md
index c54dbc0de..f0cde66bb 100644
--- a/docs/en/MatrixOne/Contribution-Guide/How-to-Contribute/make-a-design.md
+++ b/docs/en/MatrixOne/Contribution-Guide/How-to-Contribute/make-a-design.md
@@ -1,16 +1,16 @@
 # **Make a Design Proposal**
 
 Many changes including bug fixes and documentation improvements, can be implemented and reviewed via the normal GitHub pull request workflow, which we have already introduced in the previous chapter.  
-However, when you come up with a new feature you need or expect MatrixOne to achieve, we encourage you to propose your idea and express it as a technique design document. 
+However, when you come up with a new feature you need or expect MatrixOne to achieve, we encourage you to propose your idea and express it as a technical design document.
 Therefore, this page is intended to guide you to provide a consistent and controlled path for new features to enter the MatrixOne projects, so that all stakeholders can fully understand the direction the project is evolving towards.
 This page defines the best practices procedure for making a proposal in MatrixOne projects.
 
 ## **Before writing a design document**
 
-Making enough preparations ahead of the design document can not only promote your working efficiency but increase the likelihood of it being accepted. Oppositely, a rough and casual design document may be rejected quickly.  
+Making enough preparations ahead of the design document can promote your working efficiency and increase the likelihood of it being accepted. Oppositely, a rough and casual design document may be rejected quickly.  
 We motivate you to ask for help from experienced developers in order to obtain valuable suggestions to frame your design architecture or fill in details, which undoubtedly will upgrade the document to be desirable.
 
-The most common channel for preparing for writing a design document is on the Github issue. You can file a `Feature Request` or `Refactoring Request` to discuss about your ideas.
+The most common channel for preparing for writing a design document is the Github issue. You can file a `Feature Request` or `Refactoring Request` to discuss your ideas.
 
 ## **Process**
 
@@ -19,10 +19,10 @@ Generally, you can follow these steps to finish the whole process:
 * Create an issue describing the problem, goal, and solution.
 * Get responses from other contributors to see if your proposal is generally acceptable and whether or not you should make some modifications.
 * Create a pull request with a design document based on the [design template](https://github.com/matrixorigin/matrixone/blob/main/docs/rfcs/00000000-template.md).
-* Make conversation with reviewers, revise the text in response.
-* The design document is accepted or rejected when at least two committers reach consensus and no objection from the committer.  
-* If accepted, create a tracking issue for the design document or convert one from a previous discussion issue. The tracking issue basically tracks subtasks and progress. And refer the tracking issue in the design document replacing placeholder in the template.
+* Make conversation with reviewers, and revise the text in response.
+* The design document is accepted or rejected when at least two committers reach a consensus and there is no objection from the committer.  
+* If accepted, create a tracking issue for the design document or convert one from a previous discussion issue. The tracking issue basically tracks subtasks and progress. And refer to the tracking issue in the design document replacing the placeholder in the template.
 * Merge the pull request of design.
 * Start the implementation.
 
-Please refer to the tracking issue from subtasks to track the progress.
\ No newline at end of file
+Please refer to the tracking issue from subtasks to track the progress.
diff --git a/docs/en/MatrixOne/Contribution-Guide/How-to-Contribute/preparation.md b/docs/en/MatrixOne/Contribution-Guide/How-to-Contribute/preparation.md
index 4ff072bb4..56cf1ec09 100644
--- a/docs/en/MatrixOne/Contribution-Guide/How-to-Contribute/preparation.md
+++ b/docs/en/MatrixOne/Contribution-Guide/How-to-Contribute/preparation.md
@@ -1,14 +1,14 @@
 # **Preparation**
 
-Before contributing, it's necessary to make some preparations to learn more about MatrixOne and other revalant information which can improve developing and reviewing efficiency.
+Before contributing, it's necessary to make some preparations to learn more about MatrixOne and other prerevalant information which can improve developing and reviewing efficiency.
 
-Thanks for understanding that English is used as a shared language in this repository. Maintainers do not use machine translation to avoid miscommunication due to errors in translation. If the description of an issue / PR are written in non-English languages, those may be closed. If English is not your native language and you aren't sure about any of these, don't hesitate to ask for help in your pull request!
+Thanks for understanding that this repository uses English as a shared language. Maintainers do not use machine translation to avoid miscommunication due to errors in translation. If the description of an issue / PR is written in non-English languages, it may be closed. If English is not your native language and you aren't sure about any of these, don't hesitate to ask for help in your pull request!
 
 ## **What is MatrixOne**
 
 ### Basic Information
 
-You can see [MatrixOne Introduction](../../Overview/matrixone-introduction.md) for key features of MatrixOne, [MatrixOne Architecture](../../Overview/matrixone-architecture.md) for MatrixOne architecture and operational logic.  For our distributed framework, see [MatrixCube Tech Design](./../../Overview/matrixcube/matrixcube-introduction.md).
+You can see [MatrixOne Introduction](../../Overview/matrixone-introduction.md) for key features of MatrixOne, [MatrixOne Architecture](../../Overview/matrixone-architecture.md) for MatrixOne architecture, and operational logic.
 
 Besides, you can browse [SQL Reference](../../Reference/SQL-Reference/Data-Definition-Statements/create-database.md) and [Custom Functions](../../Reference/Builtin-Functions/Datetime/year.md) to know more about our interactive details.
 
@@ -16,9 +16,9 @@ These introductions will help you go through you the key concepts and user detai
 
 ### Roadmap
 
-MatrixOne v0.3.0 has been released, you can see [Release Notes](../../Release-Notes/v0.4.0.md) to know more information.
+MatrixOne v0.3.0 has been released, you can see [Release Notes](../../Release-Notes/v0.4.0.md) know more information.
 
-Currently, we are working at v0.4.0 and v0.5.0 releases, the job tasks of these releases are listed in the Github milestones [0.4.0](https://github.com/matrixorigin/matrixone/milestone/5).
+Currently, we are working on v0.4.0 and v0.5.0 releases, the job tasks of these releases are listed in the Github milestones [0.4.0](https://github.com/matrixorigin/matrixone/milestone/5).
 
 For the long-term project roadmap, please refer to [MatrixOne roadmap](https://github.com/matrixorigin/matrixone/issues/613) for a more general overview.
 
@@ -26,7 +26,7 @@ For the long-term project roadmap, please refer to [MatrixOne roadmap](https://g
 
 Contributions to MatrixOne are not limited to writing code. What follows are different ways to participate in the MatrixOne project and engage with our vibrant open-source community. See [Types of Contributions](types-of-contributions.md) for more details.  
 
-* To report a bug or a problem with documentation, please file an [issue](https://github.com/matrixorigin/matrixone/issues/new/choose) providing the details of the problem. Don't forget to add a proper label for your issue, and follow the [issue templates](report-an-issue.md#issue-templates).  
+* To report a bug or a problem with the documentation, please file an [issue](https://github.com/matrixorigin/matrixone/issues/new/choose) providing the details of the problem. Don't forget to add a proper label for your issue, and follow the [issue templates](report-an-issue.md#issue-templates).  
 * To propose a new feature, please file a [new feature request](https://github.com/matrixorigin/matrixone/issues/new/choose). Describe the intended feature and discuss the design and implementation with the team and community. Once the team agrees on the plan, you can follow the [Contribution Workflow](contribute-code.md#workflow) to implement it.  
 * To implement a feature or bug-fix for an existing outstanding issue, follow the [Contribution workflow](contribute-code.md#workflow). If you need more context on a particular issue, comment on the issue to let people know.
 
@@ -41,7 +41,7 @@ For contributing code, [matrixone](https://github.com/matrixorigin/matrixone) is
 | **optools** | The test and deployment utilities  |
 | **pkg** | The main codebase of MatrixOne project  |
 
-For different technical modules, a code structure under `/pkg` is as following table. Please refer to [MatrixOne tech design](../../Overview/MatrixOne-Tech-Design/matrixone-techdesign.md) for a better overview.  
+For different technical modules, a code structure under `/pkg` is as shown in the following table.  
 
 | Directory              | Modules                                                 |
 | ------------------------------ | ------------------------------------------------------------ |
@@ -50,7 +50,6 @@ For different technical modules, a code structure under `/pkg` is as following t
 | **sql/** | MPP SQL Execution  |
 | **sql/vectorize** | Vectorization of SQL Execution   |
 | **catalog/** | Catalog for storing metadata  |
-| **github.com/matrixorigin/matrixcube** | MatrixCube  |
 | **vm/engine** | Storage engine  |
 | **vm/engine/aoe** |  Analytics Optimized Engine  |
 | **vm/engine/tpe** |  Transaction Processing Engine  |
@@ -62,7 +61,7 @@ For contributing documentation, [matrixone](https://github.com/matrixorigin/matr
 | ------------------------------ | ------------------------------------------------------------ |
 | **matrixone/docs/en/MatrixOne** | The content files of MatrixOne documentation website  |
 | **matrixone/docs/rfcs** | The design docs of MatrixOne project |
-| **matrixorigin.io/mkdocs.yml** | The configuration file of documentation website |
+| **matrixorigin.io/mkdocs.yml** | The configuration file of the documentation website |
 | **artwork/docs** | The images, screenshots and diagrams of documentation webstie |
 
 ## **Set up your Development Environment**  
diff --git a/docs/en/MatrixOne/Contribution-Guide/How-to-Contribute/report-an-issue.md b/docs/en/MatrixOne/Contribution-Guide/How-to-Contribute/report-an-issue.md
index 248161c77..2cb12da13 100644
--- a/docs/en/MatrixOne/Contribution-Guide/How-to-Contribute/report-an-issue.md
+++ b/docs/en/MatrixOne/Contribution-Guide/How-to-Contribute/report-an-issue.md
@@ -1,48 +1,48 @@
 # **Report Issues**
 
-Any problem is encouraged to be published when you participate in MatrixOne, and you can [report issues](https://github.com/matrixorigin/matrixone/issues/new/choose) about this problem in GitHub with templates and labels we suggest.  
+Any problem is encouraged to be published when you participate in MatrixOne, and you can [report issues](https://github.com/matrixorigin/matrixone/issues/new/choose) about this problem on GitHub with templates and labels we suggest.  
 This page is intended to introduce templates, labels, and precautions you will follow when you report issues.
 
 ## **Avoid Duplicated Issues**
 
-Before reporting an issue, you should see whether the problem has already been reported. You can use the [search bar](https://docs.github.com/en/issues/tracking-your-work-with-issues/filtering-and-searching-issues-and-pull-requests) to search existing issues.
+Before reporting an issue, you should see whether the problem has already been reported. You can use the [search bar](https://docs.github.com/en/issues/tracking-your-work-with-issues/filtering-and-searching-issues-and-pull-requests) to search for existing issues.
 
 ## **Issue Templates**
 
 If the problem you're reporting is not already in the issue tracker, you can file an issue with your GitHub account. MatrixOne uses issue templates for different kinds of issues. Issue templates are a bundle of questions to collect necessary information about the problem to make it easy for other contributors to participate.
 MatrixOne suggests 6 types of issue templates:
 
-A `Bug report` issue template consists of information below:  
+A `Bug report` issue template consists of the information below:  
 
 * **Detail Environment**  
-  Describe the details about the operating environment including version, hardware parameters, OS type and so on.
+  Describe the details about the operating environment including version, hardware parameters, OS type, and so on.
 * **Steps to Reproduce**  
   List steps to reproduce what you encountered.
 * **Actual & Expected Behavior**  
   Describe what's the observed and your expected behavior respectively.
 
-A `Feature Request` consists of information below:  
+A `Feature Request` consists of the information below:  
 
 * **Is your feature request related to a problem?**  
-A clear and concise description of what the problem is and state your reasons why you need this feature.
+A clear and concise description of the problem and state why you need this feature.
 * **Describe the feature you'd like:**  
 A clear and concise description of what you want to happen.
 * **Describe alternatives you've considered:**  
 A clear and concise description of any alternative solutions or features you've considered.
 * **Teachability, Documentation, Adoption, Migration Strategy:**  
-If you can, explain some scenarios how users might use this, situations it would be helpful in. Any API designs, mockups, or diagrams are also helpful.
+If you can, explain some scenarios in how users might use this, and situations it would be helpful. Any API designs, mockups, or diagrams are also helpful.
 
-A `Documentation Issue` consists of information below:  
+A `Documentation Issue` consists of the information below:  
 
 * **Describe the issue**  
-  A clear and concise description of what's wrong in documentation.
+  A clear and concise description of what's wrong in the documentation.
 * **Additional context**  
   Add any other context about the problem here.
 
-A `Performance Question` consists of information below:  
+A `Performance Question` consists of the information below:  
 
 * **Detail Environment**  
-  Describe the details about the operation environment including version, hardware parameters, OS type and so on.
+  Describe the details about the operating environment including version, hardware parameters, OS type, and so on.
 * **Steps to Reproduce**  
   List steps detailedly to reproduce the operations to test performance.
 * **Expected & Actual Performance**  
@@ -51,29 +51,29 @@ A `Performance Question` consists of information below:
   Add any other context about the problem here. For example:  
     * Have you compared MatrixOne with other databases? If yes, what's their difference?
 
-An `Enhancement` consists of information below:  
+An `Enhancement` consists of the information below:  
 
 * **What would you like to be added**  
 A concise description of what you're expecting/suggesting.
 * **Why is this needed**  
 A concise description of the reason/motivation.
 * **Anything else**  
-Anything that will give us more dectail about your issue!
+Anything that will give us more details about your issue!
 
-A `Refactoring Request` consists of information below:  
+A `Refactoring Request` consists of the information below:  
 
 * **Is your refactoring request related to a problem?**  
 A clear and concise description of what the problem is.
 * **Describe the solution you'd like**  
-A clear and concise description of the refactoring you want to.
+A clear and concise description of the refactoring you want to do.
 * **Describe alternatives you've considered**  
-A clear and concise description of any alternative solutions or refactoring method you've considered.
+A clear and concise description of any alternative solutions or refactoring methods you've considered.
 * **Additional context**  
 Add any other context or screenshots about the refactoring request here.
 
 A `General Question`:
 
-If the previous templates don't fit with what you'd like to report or ask, please use this general question template to file issue.
+If the previous templates don't fit with what you'd like to report or ask, please use this general question template to file the issue.
 
 Before asking a question, make sure you have:
 
@@ -84,10 +84,10 @@ Before asking a question, make sure you have:
 
 ## **Issue Labels**
 
-Once your issue is submitted, it will automatically be labeled with `needs-triage`, a MatrixOne maintainer will look at the issue, tag it with more suitable labels, and assign it to a suitable developer. 
-If you'd like to work on the issue by yourself, you can comment `/assign` on the issue you would like to work on, and you will be automatically assigned to the issue. You can then find yourself listed under Assignees section.
+Once your issue is submitted, it will automatically be labeled with `needs-triage`, a MatrixOne maintainer will look at the issue, tag it with more suitable labels, and assign it to a suitable developer.
+If you'd like to work on the issue by yourself, you can comment `/assign` on the issue you would like to work on, and you will be automatically assigned to the issue. You can then find yourself listed under the Assignees section.
 
 ## **Good First Issues**
 
 When you make the first contribution to MatrixOne, you can select one of the issues labeled [`good-first-issues`](https://github.com/matrixorigin/matrixone/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) each of which is relatively approachable for first-time contributors.
-For detailed suggestions you need when you make the first contribution, you can see [Make Your First Contribution](../make-your-first-contribution.md).
+For detailed suggestions, you need when you make the first contribution, you can see [Make Your First Contribution](../make-your-first-contribution.md).
diff --git a/docs/en/MatrixOne/Contribution-Guide/How-to-Contribute/review-a-pull-request.md b/docs/en/MatrixOne/Contribution-Guide/How-to-Contribute/review-a-pull-request.md
index 6dc9dc41b..af8ddce48 100644
--- a/docs/en/MatrixOne/Contribution-Guide/How-to-Contribute/review-a-pull-request.md
+++ b/docs/en/MatrixOne/Contribution-Guide/How-to-Contribute/review-a-pull-request.md
@@ -1,7 +1,7 @@
 # **Reviews**
 
-For MatrixOne, any type of review for a pull request is crucial, where you can classify the pull request to help look for more suitable experts to solve related problems or propose your suggestions to code for not only contents but style.
-It's not necessary to doubt whether your review is constructive and useful enough because no matter how tiny, a suggestion may make a profound influence on MatrixOne. Certainly, before reviewing we ask that you browse this page to learn basic requirements and relative methods.
+For MatrixOne, any type of review for a pull request is crucial, where you can classify the pull request to help look for more suitable experts to solve related problems or propose your suggestions to code for not only content but style.
+It's not necessary to doubt whether your review is constructive and useful enough because no matter how tiny, a suggestion may profoundly influence MatrixOne. Certainly, before reviewing we ask that you browse this page to learn basic requirements and relative methods.
 
 ## **Principles of the code review**
 
@@ -13,14 +13,14 @@ Be respectful to every pull request author and other reviewers. Code review is a
 * **Be careful with tone**    
 Try to frame your comments as suggestions or questions instead of commands. If the tone is softer, your reviews will be easier to accept.   
 * **Be generous with your compliments**  
-We recommended you offer encouragement and appreciation to the authors for their good practices in the code segments. In many cases, telling the authors what they did is right is even more valuable than telling them what they did is wrong.
+We recommend you offer encouragement and appreciation to the authors for their good practices in the code segments. In many cases, telling the authors what they did is right is even more valuable than telling them what they did is wrong.
 
 Additionally, here are some suggestions in terms of content:  
 
 * **Provide more**  
 We encourage you to provide additional details and context of your review process as much as you can. Undoubtedly, the more detailed your review, the more useful it will be to others. If you test the pull request, please report the result and your test environment details. If you request some changes, try to suggest how.
 * **Keep objective**  
-Avoid individual biased opinions and subjective emotions. Of course, everyone will comment with more or less subjective opinions, however, as a good reviewer you should consider the technique and data facts rather than your own personal preferences.
+Avoid individual biased opinions and subjective emotions. Of course, everyone will comment with more or less subjective opinions. However, as a good reviewer, you should consider the technique and data facts rather than your own personal preferences.
 * **Case by case**  
 It's difficult to decide whether it's more reasonable to accept or reject when you are faced with a complex problem. Regrettably, we can't provide a certain answer because it always depends on the specific situation, which asks you to balance the pros and cons.  
 
@@ -35,11 +35,11 @@ There are some basic aspects to check when you review a pull request:
 * **Concentration**  
   One pull request should only do one thing. No matter how small it is, the change does exactly one thing and gets it right. Don't mix other changes into it.
 * **Tests**  
-  A pull request should be test covered, whether the tests are unit tests, integration tests, or end-to-end tests. Tests should be sufficient, correct and don't slow down the CI pipeline largely.
+  A pull request should be test covered, whether the tests are unit tests, integration tests, or end-to-end tests. Tests should be sufficient, correct, and don't slow down the CI pipeline largely.
 * **Functionality**  
-  The pull request should implement what the author intends to do, fit well in the existing code base, and resolve a real problem for users. Thus you should check whether or not the pull request achieve the intention and you could follow the discussions in the corresponding [GitHub issue](https://github.com/matrixorigin/matrixone/issues/new/choose).  
+  The pull request should implement what the author intends to do, fit well in the existing code base, and resolve a real problem for users. Thus you should check whether or not the pull request achieves the intention and you could follow the discussions in the corresponding [GitHub issue](https://github.com/matrixorigin/matrixone/issues/new/choose).  
 * **Style**  
-  Code in the pull request should follow common programming [style](contribute-code.md#get-familiar-with-style). However, sometimes the existing code is inconsistent with the style guide, you should maintain consistency with the existing code or file a new issue to fix the existing code style first.
+  Code in the pull request should follow a common programming [style](contribute-code.md#get-familiar-with-style). However, sometimes the existing code is inconsistent with the style guide. You should maintain consistency with the existing code or file a new issue to fix the existing code style first.
 * **Documentation**  
   If a pull request changes how users build, test, interact with, or release code, you must check whether it also updates the related documentation such as `README.md` and any generated reference docs. Similarly, if a pull request deletes or deprecates code, you must check whether or not the corresponding documentation should also be deleted.
 * **Performance**  
diff --git a/docs/en/MatrixOne/Contribution-Guide/make-your-first-contribution.md b/docs/en/MatrixOne/Contribution-Guide/make-your-first-contribution.md
index cd76e6589..2eba7e4d6 100644
--- a/docs/en/MatrixOne/Contribution-Guide/make-your-first-contribution.md
+++ b/docs/en/MatrixOne/Contribution-Guide/make-your-first-contribution.md
@@ -6,7 +6,7 @@ This document will help you get started on your first contribution to MatrixOne.
 
 ## **How to Contribute?**
 
-Before setting about contribution, you need figure out what area you are trying to help us in. You can see [Types of contributions](How-to-Contribute/types-of-contributions.md) for more details.
+Before setting out contributions, you need to figure out what area you are trying to help us in. You can see [Types of contributions](How-to-Contribute/types-of-contributions.md) for more details.
 
 As your first-ever contribution, it can be selected from the following categories which require little technical background of the contributor:
 
@@ -14,16 +14,16 @@ As your first-ever contribution, it can be selected from the following categorie
 
 * To improve the MatrixOne documentation
 
-File an issue to describe the problem before working on it. In addition, you will also find issues labelled with `good-first-issue`, which represents issues suitable for new contributors. Such Issues contain clear steps and expected output. You may start your first contribution based on these issues.
+File an issue to describe the problem before working on it. In addition, you will also find issues labeled with `good-first-issue`, which represents issues suitable for new contributors. Such Issues contain clear steps and expected output. You may start your first contribution based on these issues.
 
 ## **Assign Your Issue**
 
 It's difficult to report an issue when you are just a newcomer on account of little knowledge of MatrixOne or relative contents, so we list [`good-first-issues`](https://github.com/matrixorigin/matrixone/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) suitable for new contributors to work with and be easy to fix.
-After deciding a suitable issue to work on, you can comment `/assign` on the issue you would like to work on, you will be automatically assigned to the issue. You can then find yourself listed under Assignees section.
+After deciding on a suitable issue to work on, you can comment `/assign` on the issue you would like to work on, and you will be automatically assigned to the issue. You can then find yourself listed under the Assignees section.
 
 ## **Prerequisite**
 
-Before working on the issue you are assigned, please make sure you have set up development environment and installed MatrixOne.  
+Before working on the issue you are assigned, please make sure you have set up a development environment and installed MatrixOne.  
 You can see [Preparation](How-to-Contribute/preparation.md) for more details.
 
 ## **Workflow**
@@ -83,7 +83,7 @@ git add <filename>
 ```
 
 `<filename>` is the name of the file you just modified.
-And you can use following command to add all the files in the current folder:
+And you can use the following command to add all the files in the current folder:
 
 ```
 git add .
@@ -106,11 +106,11 @@ After committing your modification, you should push your local branch to GitHub
 git push origin main:NEW_BRANCH
 ```
 
-`NEW_BRANCH` is the name of new branch you created and push to. Also, you can replace it with another name you want.
+`NEW_BRANCH` is the name of the new branch you created and push to. Also, you can replace it with another name you want.
 
 ### **Step 7 Create a pull request**
 
-Having pushed your changes, you can visit your folk at `https://github.com/$user/matrixone`, and click the **Compare & Pull Request** button to create a pull request in `NEW_BRANCH` for your modification to the MatrixOne repository. 
+Having pushed your changes, you can visit your folk at `https://github.com/$user/matrixone`, and click the **Compare & Pull Request** button to create a pull request in `NEW_BRANCH` for your modification to the MatrixOne repository.
 
 !!! Note
     You should fill in the required information based on the PR template.
@@ -118,13 +118,13 @@ Having pushed your changes, you can visit your folk at `https://github.com/$user
 ![Pull Request](https://github.com/matrixorigin/artwork/blob/main/docs/contribution-guide/contribution-guide-pr.png?raw=true)
 ![Pull Request Template](https://github.com/matrixorigin/artwork/blob/main/docs/contribution-guide/contribution-guide-pr-template.png?raw=true)
 
-Once your PR is opened, it will be assigned to reviewers. These reviewers will check your contribution and make a detail review according to correctness, bugs, style and so on.
+Once your PR is opened, it will be assigned to reviewers. These reviewers will check your contribution and do a detailed review according to the correctness, bugs, style, sand so on.
 
 ### **Step 8 After merging, Keep your repo in sync**
 
-Congratulations on that your contributions are accepted and merged to the project!  
-And there are some operations left to do, which helps keep project committing history clean and keep your local and remote repo synchronized with MatrixOne repo.  
-Overrides local commiting history with following command:  
+Congratulations that your contributions are accepted and merged into the project!  
+And there are some operations left to do, which help keep project committing history clean and keep your local and remote repo synchronized with MatrixOne repo.  
+Overrides local committing history with the following command:  
 
 ```
 git pull --force upstream main:main
@@ -134,4 +134,4 @@ Lastly, upgrade the `main` branch of your folk in Github:
 
 ```
 git push --force origin main:main
-```
\ No newline at end of file
+```
diff --git a/docs/en/MatrixOne/Develop/develop_python_application.md b/docs/en/MatrixOne/Develop/develop_python_application.md
index 398e3989d..eba5422bc 100644
--- a/docs/en/MatrixOne/Develop/develop_python_application.md
+++ b/docs/en/MatrixOne/Develop/develop_python_application.md
@@ -6,36 +6,36 @@ This tutorial shows you how to build a simple Python application with MatrixOne.
 
 This demo will store the historical stock data of the China stock market and make a simple analysis to find the best stocks to buy.
 
-The basic idea is that we track the P/E (Price-to-Earnings) and P/B (Price-to-Book) level of each stock since these can represent a company's market capitalization. If you are not familiar with these two concepts, please refer to [P/E](https://www.investopedia.com/terms/p/price-earningsratio.asp) and [P/B](https://www.investopedia.com/terms/p/price-to-bookratio.asp).
+The basic idea is that we track the P/E (Price-to-Earnings) and P/B (Price-to-Book) levels of each stock since these can represent a company's market capitalization. If you are not familiar with these two concepts, please refer to [P/E](https://www.investopedia.com/terms/p/price-earningsratio.asp) and [P/B](https://www.investopedia.com/terms/p/price-to-bookratio.asp).
 
-Every day after the market closes, we compare the P/E and P/B value with the historical lowest P/E and P/B. If the current P/E or P/B is even lower than the historical lowest, the stock is very likely under-estimated. We can further investigate its reason of falling and judge if it's a good time to buy it. 
+Every day after the market closes, we compare the P/E and P/B values with the historical lowest P/E and P/B. If the current P/E or P/B is even lower than the historical lowest, the stock is very likely underestimated. We can further investigate its reason for falling and judge if it's a good time to buy it.
 
 ## **Before you start**
 
 Before you start, you need to have a Tushare account and get an API token. If you haven't signed up for Tushare, you can sign up for it at [https://tushare.pro/](https://tushare.pro/) and you can find your API token at [https://tushare.pro/user/token#](https://tushare.pro/user/token#).
 
-!!! info 
-    Tushare is an open source utility for crawling historical data of China stocks. It has a complete dataset, but pay attention to their rules of API access limit and frequency. 
+!!! info
+    Tushare is an open-source utility for crawling historical data of China stocks. It has a complete dataset, but pay attention to their rules of API access limit and frequency.
 
-Besides the data source account, you need to at least have these two basic software installed:
+Besides the data source account, you need to at least have this two basic software installed:
 
-* Python 3.x 
+* Python 3.x
 * MatrixOne
 
 You may refer to [Python 3 installation tutorial](https://realpython.com/installing-python/) and [MatrixOne installation](../Get-Started/install-standalone-matrixone.md) for more details.
 
-Moreover, we need to install dependant `Tushare` and `pymysql` python libraries to use Tushare and access MatrixOne. 
+Moreover, we need to install dependent `Tushare` and `pymysql` python libraries to use Tushare and access MatrixOne.
 
 ```bash
 pip3 install -r requirements.txt
 ```
 
-!!! info 
+!!! info
     `Pymysql` is the only ORM tool supported by MatrixOne. The other python MySQL ORM tools as `SQLAlchemy`, `mysql-connector`, `MySQLdb` are not supported yet.
 
-## **Step1: prepare and load historical dataset**
+## **Step1: prepare and load the historical dataset**
 
-First, we need to load the historical stock data in MatrixOne. 
+First, we need to load the historical stock data in MatrixOne.
 
 As `Tushare` interface only allows a fetch of 5000 rows of data at once, we only have to collect the latest 5000 trade days data for each stock. Each year there are roughly 250 trade dates. 5000 makes almost 20 years of data, which largely satisfies our demo.
 
@@ -54,7 +54,7 @@ pool = pro.stock_basic(exchange = '',
                         list_status = 'L',
                         adj = 'qfq',
                         fields = 'ts_code,symbol,name,area,industry,fullname,list_date, market,exchange,is_hs')
-                        
+
 
 ```
 
@@ -95,7 +95,7 @@ mysql> CREATE DATABASE stock.
 
 ```
 
-Python: 
+Python:
 
 ```
 import pymysql
@@ -106,12 +106,12 @@ db = pymysql.connect(host='127.0.0.1',
                      user='dump',
                      password='111',
                      database='stock')
- 
+
 # Create a cursor object
 cursor = db.cursor()
 
 # Create PE table
-cursor.execute('CREATE TABLE IF NOT EXISTS pe(ts_code VARCHAR(255), trade_date VARCHAR(255), pe FLOAT, pb FLOAT)') 
+cursor.execute('CREATE TABLE IF NOT EXISTS pe(ts_code VARCHAR(255), trade_date VARCHAR(255), pe FLOAT, pb FLOAT)')
 
 ```
 
@@ -124,12 +124,12 @@ if df.empty == False:
         df = df.fillna(0.0)
         val_to_insert = df.values.tolist()
         cursor.executemany(" insert into pe (ts_code, trade_date,pe,pb) values (%s, %s,%s,%s)", val_to_insert)
-        
+
 ```
 
 ## **Step2: find the historical lowest P/E or P/B stock**
 
-After we load the historical stock data into MatrixOne, we have about 11 millions records. 
+After we load the historical stock data into MatrixOne, we have about 11 million records.
 
 ```sql
 mysql> select count(*) from pe;
@@ -141,18 +141,18 @@ mysql> select count(*) from pe;
 1 row in set (0.16 sec)
 ```
 
-Now we run a sql to calculate the lowest P/E and P/B of each stock. 
+Now we run a SQL to calculate the lowest P/E and P/B of each stock.
 
 ```python
 # Find stocks that the current P/E is even lower than the historical lowest
 cursor.execute('select ts_code,min(pe) from pe where pe>0 group by ts_code order by ts_code')
 # Fetch the result as python object
-value = cursor.fetchall() 
+value = cursor.fetchall()
 
 # Find stocks that the current P/B is even lower than the historical lowest
 cursor.execute('select ts_code,min(pb) from pe where pb>0 group by ts_code order by ts_code')
 # Fetch the result as python object
-value = cursor.fetchall() 
+value = cursor.fetchall()
 ```
 
 Then we call Tushare `daily_basic` interface again to get the current P/E and P/B level and make a search to locate the stock whose current P/E or P/B is even lower than the historical lowest. You could of course switch any trade date you want for comparison. We take P/E as an example.
@@ -181,13 +181,13 @@ for i in range(0,len(value)):
             logging.getLogger().info("current PE found: %f", df.pe[j])
 ```
 
-This will print every stock with the lowest ever P/E or P/B. They are usually good choices to buy if they are not experiencing big trouble. 
+This will print every stock with the lowest ever P/E or P/B. They are usually good choices to buy if they are not experiencing big trouble.
 
 ## **Step3: Update our dataset**
 
-We already have a lot of historical data stored in MatrixOne, each time we run a n analysis, we usually have been through a new trading day. The dataset need to be updated with the latest data, otherwise next time you will still compare yourself with the old data. 
+We already have a lot of historical data stored in MatrixOne; each time we run an analysis, we usually have been through a new trading day. The dataset needs to be updated with the latest data, otherwise next time you will still compare yourself with the old data.
 
-We don't need to insert all data again, we just insert the data with the lastest trading dates. 
+We don't need to insert all data again, we just insert the data with the latest trading dates.
 
 ```python
 # get updating trading dates by user argument inputs
@@ -211,9 +211,9 @@ if df.empty == False:
             val_to_insert = df.values.tolist()
             print(val_to_insert)
             cursor.executemany(" insert into pe (ts_code, trade_date,pe,pb) values (%s, %s,%s,%s)", val_to_insert)
-            
-``` 
+
+```
 
 ## Source Code
 
-You can find the source code of this demo at [matrix_one_app](https://github.com/matrixorigin/matrixone_python_app).
\ No newline at end of file
+You can find the source code of this demo at [matrix_one_app](https://github.com/matrixorigin/matrixone_python_app).
diff --git a/docs/en/MatrixOne/FAQs/deployment-faqs.md b/docs/en/MatrixOne/FAQs/deployment-faqs.md
index c85f014ad..860c14827 100644
--- a/docs/en/MatrixOne/FAQs/deployment-faqs.md
+++ b/docs/en/MatrixOne/FAQs/deployment-faqs.md
@@ -32,7 +32,7 @@ For standalone installation, MatrixOne 0.5.0 can be running on the 64-bit generi
 | :------ | :----- | :-------------- |
 | 4 core+ | 16 GB+ | SSD/HDD 200 GB+ |
 
-The Macbook M1/M2 with ARM architecture is also a good fit for development environment.
+The Macbook M1/M2 with ARM architecture is also a good fit for a development environment.
 
 ##### Production environment
 
@@ -60,7 +60,7 @@ Then the `make build` should be fast enough to finish.
 
 ##### When I was testing MatrixOne with MO-tester, I got an error of `too many open files`?
 
-MO-tester will open and close many SQL files in a high speed to test MatrixOne, this kind of usage will easily reach the maximum open file limit of Linux and MacOS, which is the reason for the `too many open files` error.
+MO-tester will open and close many SQL files in a high speed to test MatrixOne, this kind of usage will easily reach the maximum open file limit of Linux and macOS, which is the reason for the `too many open files` error.
 
 * For MacOS, you can just set the open file limit by a simple command:
 
diff --git a/docs/en/MatrixOne/FAQs/product-faqs.md b/docs/en/MatrixOne/FAQs/product-faqs.md
index 908ceffd9..d8be13a0e 100644
--- a/docs/en/MatrixOne/FAQs/product-faqs.md
+++ b/docs/en/MatrixOne/FAQs/product-faqs.md
@@ -2,7 +2,7 @@
 
 * **What is MatrixOne?**
 
-  MatrixOne is a future-oriented hyperconverged cloud & edge native DBMS that supports transactional, analytical, and streaming workload with a simplified and distributed database engine, across multiple datacenters, clouds, edges and other heterogenous infrastructures. The all-in-one architecture of MatrixOne will significantly simplify database management and maintenance, creating a single database that can serve multiple data applications.
+  MatrixOne is a future-oriented hyperconverged cloud & edge native DBMS that supports transactional, analytical, and streaming workload with a simplified and distributed database engine, across multiple data centers, clouds, edges, and other heterogenous infrastructures. The all-in-one architecture of MatrixOne will significantly simplify database management and maintenance, creating a single database that can serve multiple data applications.
   For information about MatrixOne, you can see [MatrixOne Introduction](../Overview/matrixone-introduction.md).
 
 * **Where can I apply MatrxOne?**
@@ -14,17 +14,17 @@
   MatrixOne is a completely redesigned database. It's compatible with part of MySQL syntax and semantics. We are currently working to support more database semantics such as PostgreSQL, Hive, Clickhouse, since we intend to develop MatrixOne as a hyperconverged database.  
   To learn more about the compatibility with MySQL, you can visit [MySQL-Compatibility](../Overview/mysql-compatibility.md).
 
-* **Which programming language is MatrixOne developed with ?**
+* **Which programming language is MatrixOne developed with?**
 
-  Currently, the primary programming language used for our programming is **Golang**.
+  Currently, the primary programming language used for our programming in **Golang**.
 
 * **What operating system does MatrixOne support?**
 
-  MatrixOne supports Linux and MacOS. Please refer to [deployment FAQ](deployment-faqs.md) for more details.
+  MatrixOne supports Linux and macOS. Please refer to [deployment FAQ](deployment-faqs.md) for more details.
 
 * **Which MatrixOne data types are supported?**
 
-  You can see [data tpyes in MatrixOne](../Reference/Data-Types/data-types.md) to learn more about the data types we support.
+  You can see [data types in MatrixOne](../Reference/Data-Types/data-types.md) to learn more about the data types we support.
 
 * **Where can I deploy MatrixOne?**
 
@@ -36,4 +36,4 @@
 
 * **In addition to the MatrixOne documentation, are there any other ways to acquire MatrixOne knowledge?**
 
-  Currently [MatrixOne documentation](https://docs.matrixorigin.io/) is the most important and timely way to get MatrixOne related knowledge. In addition, we also have some technical communication groups in Slack and WeChat. If you have any needs, contact [opensource@matrixorigin.io](mailto:opensource@matrixorigin.io).
+  Currently, [MatrixOne documentation](https://docs.matrixorigin.io/) is the most important and timely way to get MatrixOne related knowledge. In addition, we also have some technical communication groups in Slack and WeChat. If you have any needs, contact [opensource@matrixorigin.io](mailto:opensource@matrixorigin.io).
diff --git a/docs/en/MatrixOne/FAQs/sql-faqs.md b/docs/en/MatrixOne/FAQs/sql-faqs.md
index a21a660f1..eb3c3e98c 100644
--- a/docs/en/MatrixOne/FAQs/sql-faqs.md
+++ b/docs/en/MatrixOne/FAQs/sql-faqs.md
@@ -2,7 +2,7 @@
 
 * **Are functions and other keywords case sensitive？**
 
-  No, they are not case sensitive. Only in one case case is sensitive in MatrixOne, if user creates table and attributes with ``, the name in`` is case sensitive. To find this table name or attribute name in your query, it needs to be in `` as well.
+  No, they are not case sensitive. Only in one case case is sensitive in MatrixOne, if user creates table and attributes with \`\`, the name in\`\` is case sensitive. To find this table name or attribute name in your query, it needs to be in \`\` as well.
 
 * **How do I export data from MatrixOne to a file?**
 
@@ -11,7 +11,7 @@
 
 * **What is the size limit of a transaction in MatrixOne?**
 
-  The transaction size is limited to the memory size you have for hardware environment. 
+  The transaction size is limited to the memory size you have for hardware environment.
 
 * **What kind of character set does MatrixOne support?**
 
@@ -23,7 +23,7 @@
 
 * **How do I bulk load data into MatrixOne?**
 
-  MatrixOne provides two methods of bulk load data: 1. Using `source filename` command from shell, user can load the SQL file with all DDL and insert data statements. 2. Using `load data infile...into table...` command from shell, user can load an existing .csv file to MatrixOne. 
+  MatrixOne provides two methods of bulk load data: 1. Using `source filename` command from shell, user can load the SQL file with all DDL and insert data statements. 2. Using `load data infile...into table...` command from shell, user can load an existing .csv file to MatrixOne.
 
 * **How do I know how my query is executed?**
 
@@ -31,4 +31,4 @@
 
   ```
   EXPLAIN SELECT col1 FROM tbl1;
-  ```
\ No newline at end of file
+  ```
diff --git a/docs/en/MatrixOne/Get-Started/connect-to-matrixone-server.md b/docs/en/MatrixOne/Get-Started/connect-to-matrixone-server.md
index 82ef84866..bab36029b 100644
--- a/docs/en/MatrixOne/Get-Started/connect-to-matrixone-server.md
+++ b/docs/en/MatrixOne/Get-Started/connect-to-matrixone-server.md
@@ -5,10 +5,10 @@
 Make sure you have already [installed MatrixOne](install-standalone-matrixone.md).
 
 ## **1. Install MySQL client**
-   
-MatrixOne supports the MySQL wire protocol, so you can use MySQL client drivers to connect from various languages. 
 
-Currently, MatrixOne is only compatible with Oracle MySQL client. This means that some features might not work with MariaDB client or Percona client.
+MatrixOne supports the MySQL wire protocol, so you can use MySQL client drivers to connect from various languages.
+
+Currently, MatrixOne is only compatible with the Oracle MySQL client. This means that some features might not work with the MariaDB client or Percona client.
 
 ## **2. Connect to MatrixOne server**
 
@@ -18,7 +18,7 @@ You can use the MySQL command-line client to connect to MatrixOne server:
 mysql -h IP -P PORT -uUsername -p
 ```
 
-The connection string is the same format as MySQL accepts. You need to provide a user name and a password. 
+The connection string is the same format as MySQL accepts. You need to provide a user name and a password.
 
 Use the built-in test account for example:
 
@@ -30,4 +30,4 @@ mysql -h 127.0.0.1 -P 6001 -udump -p
 Enter password:
 ```
 
-Currently, MatrixOne only supports the TCP listener. 
\ No newline at end of file
+Currently, MatrixOne only supports the TCP listener.
diff --git a/docs/en/MatrixOne/Get-Started/install-standalone-matrixone.md b/docs/en/MatrixOne/Get-Started/install-standalone-matrixone.md
index 4a83254a5..8063cf06a 100644
--- a/docs/en/MatrixOne/Get-Started/install-standalone-matrixone.md
+++ b/docs/en/MatrixOne/Get-Started/install-standalone-matrixone.md
@@ -1,8 +1,8 @@
 # **Install standalone MatrixOne**
 
-MatrixOne supports Linux and MacOS. You can install a standalone MatrixOne version by 3 methods:
+MatrixOne supports Linux and macOS. You can install a standalone MatrixOne version by 3 methods:
 
-* Building from source.
+* Building from the source.
 * Using binary package.
 * Using Docker.
 
@@ -10,7 +10,7 @@ Recommended hardware specification: x86 CPU with 4 cores and 32GB memory, with C
 
 ## **Method 1: Building from source**
 
-#### 1. Install Go as necessary dependancy
+#### 1. Install Go as necessary dependency
 
 Go version 1.18 is required.
 
@@ -20,7 +20,7 @@ Depending on your needs, choose whether you want to keep your code up to date, o
 
 ##### Option 1: Get the MatrixOne(Preview Version) code
 
-The **main** branch is the default branch, the code on the main branch is always up-to-date but not stable enough.
+The **main** branch is the default branch. The code on the main branch is always up-to-date but not stable enough.
 
 ```
 git clone https://github.com/matrixorigin/matrixone.git
@@ -71,14 +71,14 @@ wget https://github.com/matrixorigin/matrixone/releases/download/v0.5.0/mo-serve
 unzip mo-server-v0.5.0-linux-amd64.zip
 ```
 
-MacOS Environment
+macOS Environment
 
 ```bash
 wget https://github.com/matrixorigin/matrixone/releases/download/v0.5.0/mo-server-v0.5.0-darwin-x86_64.zip
 unzip mo-server-v0.5.0-darwin-x86_64.zip
 ```
 
-#### 2.Launch MatrixOne server
+#### 2. Launch MatrixOne server
 
 ```
 $./mo-server system_vars_config.toml
@@ -94,7 +94,7 @@ See [Connect to MatrixOne server](connect-to-matrixone-server.md).
 
 #### 1. Install Docker
 
-Please verify that Docker daemon is running in the background:
+Please verify that the docker daemon is running in the background:
 
 ```
 docker --version
@@ -102,7 +102,7 @@ docker --version
 
 #### 2. Create and run the container of MatrixOne
 
-It will pull the image from Docker Hub if not exists. You can choose to pull the latest image or a stable version.
+It will pull the image from Docker Hub if it does not exist. You can choose to pull the latest image or a stable version.
 
 Latest Image
 
@@ -116,7 +116,7 @@ docker run -d -p 6001:6001 --name matrixone matrixorigin/matrixone:latest
 docker run -d -p 6001:6001 --name matrixone matrixorigin/matrixone:0.5.0
 ```
 
-For the information on the user name and password, see the next step - Connect to MatrixOne Server.
+For the user name and password information, see the next step - Connect to MatrixOne Server.
 
 #### 3. Connect to MatrixOne Server
 
diff --git a/docs/en/MatrixOne/Overview/matrixone-architecture.md b/docs/en/MatrixOne/Overview/matrixone-architecture.md
index 0f119d152..f90ae4796 100644
--- a/docs/en/MatrixOne/Overview/matrixone-architecture.md
+++ b/docs/en/MatrixOne/Overview/matrixone-architecture.md
@@ -2,20 +2,19 @@
 
 ## **Architecture**
 
-MatrixOne is the first open-source distributed HSTAP database that supports OLTP, OLAP and Streaming with a single auto-tuning storage engine.
-As a redefinition of HTAP database, HSTAP aims to meet all the needs of Transactional Processing (TP) and Analytical Processing (AP) within a single database. Compared with the traditional HTAP, HSTAP emphasizes its built-in streaming capability used for connecting TP and AP tables. This provides users with an experience that database can be used just like a Big Data platform, with which many users are already familiar thanks to the Big Data boom.
+MatrixOne is the first open-source distributed HSTAP database that supports OLTP, OLAP, and Streaming with a single auto-tuning storage engine.
+As a redefinition of the HTAP database, HSTAP aims to meet all the needs of Transactional Processing (TP) and Analytical Processing (AP) within a single database. Compared with the traditional HTAP, HSTAP emphasizes its built-in streaming capability used for connecting TP and AP tables. This provides users with an experience that a database can be used just like a Big Data platform, with which many users are already familiar thanks to the Big Data boom.
 
-With minimal integration efforts, MatrixOne frees users from the limitations of Big Data and provides one-
-stop coverage for all TP and AP scenarios for enterprises.
+With minimal integration efforts, MatrixOne frees users from the limitations of Big Data and provides one-stop coverage for all TP and AP scenarios for enterprises.
 
-MatrixOne is redesigned from scratch and introducing many innovations as well as many best practices in the other DBMS. It adopts a disaggregated storage and compute architecture, where data are stored on S3 object storage in the cloud to achieve low cost, and the compute nodes are stateless and can be started at will to achieve the ultimate elasticity. In the case of on-premises deployment, when available, MatrixOne can utilize user's HDFS or other supported distributed file system to save data. MatrixOne also comes with a S3-compatible built-in alternative to ensure the elasticity, high reliability, and high performance of its storage without relying on any external components. The architecture is as follows:
+MatrixOne is redesigned from scratch and introduces many innovations as well as many best practices in the other DBMS. It adopts a disaggregated storage and computes architecture, where data are stored on S3 object storage in the cloud to achieve low cost, and the compute nodes are stateless and can be started at will to achieve the ultimate elasticity. In the case of on-premises deployment, MatrixOne can utilize the user's HDFS or other supported distributed file system to save data. MatrixOne also comes with an S3-compatible built-in alternative to ensure the elasticity, high reliability, and high performance of its storage without relying on any external components. The architecture is as follows:
 ![MatrixOne Architecture](https://github.com/matrixorigin/artwork/blob/main/docs/overview/matrixone_new_arch.png?raw=true)
 
 The architecture of MatrixOne is divided into several layers:
 
 ## **Cluster Management Layer**
 
-Being responsible for cluster management, it interacts with Kubernetes to obtain resources dynamically when in the cloud-native environment, while in the on-premises deployment, it gets hold of resources based on the configuration. Cluster status is continuously monitored with the role of each node allocated based on resource information. Maintenance works are carried out to ensure that all system components are up and running despite occasional node and network failures, it rebalances the loads on nodes when necessary as well. Major components in this layer are:
+Being responsible for cluster management, it interacts with Kubernetes to obtain resources dynamically when in the cloud-native environment, while in the on-premises deployment, it gets hold of resources based on the configuration. Cluster status is continuously monitored with the role of each node allocated based on resource information. Maintenance works are carried out to ensure that all system components are up and running despite occasional node and network failures. It rebalances the loads on nodes when necessary as well. Major components in this layer are:
 
 * Prophet Scheduler: take charge of load balancing and node keep-alive.
 * Resource Manager: being responsible for physical resources provision.
@@ -25,12 +24,12 @@ Being responsible for cluster management, it interacts with Kubernetes to obtain
 Serverless Layer is a general term for a series of stateless nodes, which, as a whole, contains three categories:
 
 * Background tasks: the most important one is called Offload Worker, which is responsible for offloading expensive compaction tasks and flushing data to S3 storage.
-* SQL compute nodes: responsible for executing SQL requests, here divided into write nodes and read nodes, the former also provides the ability to read the freshest data.
+* SQL compute nodes: responsible for executing SQL requests, here divided into write nodes and read nodes. The former also provides the ability to read the freshest data.
 * Stream task processing node: responsible for executing stream processing requests.
 
 ## **Log(Reliability) Layer**
 
-As MatrixOne's Single Source of Truth, data is considered as persistently stored in MatrixOne once it is written into the Log Layer. It is built upon our world-class expertise in the Replicated State Machine model to guarantee state-of-the-art high throughput, high availability and strong consistency for our data. Following a fully modular and disaggregated design by itself, it is also the central component that helps to decouple the storage and compute layers, this in turn earns our architecture much higher elasticity when compared with traditional NewSQL architecture.
+As MatrixOne's Single Source of Truth, data is considered as persistently stored in MatrixOne once it is written into the Log Layer. It is built upon our world-class expertise in the Replicated State Machine model to guarantee state-of-the-art high throughput, high availability, and strong consistency for our data. Following a fully modular and disaggregated design by itself, it is also the central component that helps to decouple the storage and compute layers. This in turn earns our architecture much higher elasticity when compared with traditional NewSQL architecture.
 
 ## **Storage Layer**
 
@@ -38,13 +37,12 @@ The storage layer transforms the incoming data from the Log Layer into an effici
 
 ## **Storage Provision Layer**
 
-As an infrastructure agnostic DBMS, MatrixOne stores data in shared storage of S3 / HDFS, or local disks, on-premise servers, hybrid and any cloud, or even smart devices. The Storage Provision Layer hides such complexity from upper layers by just presenting them with a unified interface for accessing such diversified storage resources.
+As an infrastructure agnostic DBMS, MatrixOne stores data in shared storage of S3 / HDFS, or local disks, on-premise servers, hybrid, and any cloud, or even smart devices. The Storage Provision Layer hides such complexity from upper layers by just presenting them with a unified interface for accessing such diversified storage resources.
 
 ## **Learn More**
 
 This page outlines the overall architecture design of MatrixOne. For information on other options that are available when trying out MatrixOne, see the following:
 
-* [MatrixOne Tech Design](MatrixOne-Tech-Design/matrixone-techdesign.md)
 * [Install MatrixOne](../Get-Started/install-standalone-matrixone.md)
 * [MySQL Compatibility](mysql-compatibility.md)
-* [What's New](whats-new.md)
\ No newline at end of file
+* [What's New](whats-new.md)
diff --git a/docs/en/MatrixOne/Overview/matrixone-introduction.md b/docs/en/MatrixOne/Overview/matrixone-introduction.md
index 077d29a0b..a1e141bf4 100644
--- a/docs/en/MatrixOne/Overview/matrixone-introduction.md
+++ b/docs/en/MatrixOne/Overview/matrixone-introduction.md
@@ -42,7 +42,7 @@ MatrixOne is a future-oriented hyperconverged cloud & edge native DBMS that supp
 
 * **Simplify Database Management and Maintenance**
 
-     To solve the problem of high and unpredictable costs of the database selection process, management & maintenance due to database overabundance, MatrixOne's all-in-one architecture will significantly simplify database management and maintenance, a single database can serve multiple data applications.
+     To solve the problem of high and unpredictable costs of the database selection process, management & maintenance due to database overabundance, MatrixOne's all-in-one architecture will significantly simplify database management and maintenance. A single database can serve multiple data applications.
 
 * **Reduce Data Fragmentation and Inconsistency**
 
@@ -69,4 +69,3 @@ MatrixOne is a future-oriented hyperconverged cloud & edge native DBMS that supp
 This page outlines the overall introduction of MatrixOne. For information on other options that are available when you what to know more about MatrixOne product design, see the following:
 
 * [MatrixOne Architecture](matrixone-architecture.md)
-* [MatrixOne Tech Design](MatrixOne-Tech-Design/matrixone-techdesign.md)
diff --git a/docs/en/MatrixOne/glossary.md b/docs/en/MatrixOne/glossary.md
index 8027645f9..c25b837d6 100644
--- a/docs/en/MatrixOne/glossary.md
+++ b/docs/en/MatrixOne/glossary.md
@@ -11,7 +11,7 @@ It's helpful to understand a few terms before reading our architecture documenta
 | C  |  |
 | Cluster  | A distributed MatrixOne deployment, which acts as a single logical application.|
 | D  |  |
- | Data Storage  | A DataStorage is an interface for implementing distributed storage service. It must be defined in prior to using MatrixCube. DataStorage needs to be implemented based on the characteristics of storage engine.|
+ | Data Storage  | A DataStorage is an interface for implementing distributed storage service. <!--It must be defined in prior to using MatrixCube.--> DataStorage needs to be implemented based on the characteristics of storage engine.|
 | E  |  |
   | Event Notify | The machanism of synchronizing heartbeat information to all nodes is called an event notify. |
   | Explicit Transactions| Explicit Transaction has the beginning, ending and rollback of transactions with the command Begin Transaction, Commit Transaction and Rollback Transaction. |
@@ -22,17 +22,16 @@ It's helpful to understand a few terms before reading our architecture documenta
   |I|  |
   | Implicit Transactions| Implicit Transaction is the auto commit. There is no beginning or ending of the transaction. |
  | M  |  |
-  | MatrixCube | MatrixCube is a framework for building distributed systems, which offers guarantees about reliability, consistency, and scalability. It is designed to facilitate distributed, stateful application building to allow developers only need to focus on the business logic on a single node. |
  | P  |  |
-  | Prophet | Prophet is a scheduling module in MatrixCube. It takes charge of Auto-Rebalance, which keeps the system storage level and read/write throughput level balanced across Stores. The initial 3 Stores of a MatrixCube cluster are all Prophet Nodes. |
+  | Prophet | Prophet is a scheduling module<!-- in MatrixCube-->. It takes charge of Auto-Rebalance, which keeps the system storage level and read/write throughput level balanced across Stores. The initial 3 Stores of a MatrixCube cluster are all Prophet Nodes. |
    | Pure Storage | In contrast to Prophet, pure storage is another type of node, which doesn't handle any scheduling job and works as simple storage. |
 | R  |  |
   | Replica | To provide reliable service, each shard is stored not only once, it will have several copy stored in different stores. Every copy of a shard is called a Replica. |
   | S  |  |
   | Snapshot Isolation (SI) | Snapshot Isolation is a multi-version concurrency control approach that is widely used in practice. MatrixOne supports distributed transaction of snapshot isolation level. |
- | Store | A MatrixCube distributed system consists of several physical servers, our data are stored across these physical server. We call each server inside this cluster a Store. |
+ | Store | A <!--MatrixCube-->distributed system consists of several physical servers, our data are stored across these physical server. We call each server inside this cluster a Store. |
   | Shard | In MatrixOne, the data are split into different partitions to store in order to get better scalability. Each partition is called a Shard. In our design, a new created table is initially a Shard. When the size of the table exceeds the Shard size limit, the Shard will split. |
- | Shard Splitting | There is a certain limit to a Shard size. Whenever a Shard exceeds its storage limit, MatrixCube splits a Shard into two Shards and keep each Shard with the same storage level. |
+ | Shard Splitting | There is a certain limit to a Shard size. Whenever a Shard exceeds its storage limit,<!--MatrixCube-->Distributed system splits a Shard into two Shards and keep each Shard with the same storage level. |
   | Shard Proxy | The Shard Proxy is a central module to accept all user read/write requests and route requests to corresponding nodes.|
 
 ### **Concepts**
diff --git a/go.mod b/go.mod
index 78ec04e36..94fba1b9c 100644
--- a/go.mod
+++ b/go.mod
@@ -21,7 +21,7 @@ require (
 	github.com/google/btree v1.0.1
 	github.com/google/gofuzz v1.2.0
 	github.com/google/uuid v1.3.0
-	github.com/lni/dragonboat/v4 v4.0.0-20220701152125-8521aeb79dc1
+	github.com/lni/dragonboat/v4 v4.0.0-20220724134658-ed44d312daa2
 	github.com/lni/goutils v1.3.1-0.20220604063047-388d67b4dbc4
 	github.com/matrixorigin/matrixcube v0.3.1-0.20220606032431-c944d801f1e5
 	github.com/matrixorigin/simdcsv v0.0.0-20210926114300-591bf748a770
@@ -98,7 +98,6 @@ require (
 	github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
 	github.com/jtolds/gls v4.20.0+incompatible // indirect
-	github.com/juju/ratelimit v1.0.2-0.20191002062651-f60b32039441 // indirect
 	github.com/klauspost/compress v1.13.6 // indirect
 	github.com/klauspost/cpuid/v2 v2.0.3 // indirect
 	github.com/kr/pretty v0.3.0 // indirect
diff --git a/go.sum b/go.sum
index ece25af0f..f4e516c73 100644
--- a/go.sum
+++ b/go.sum
@@ -344,8 +344,6 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV
 github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q=
 github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U=
 github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk=
-github.com/juju/ratelimit v1.0.2-0.20191002062651-f60b32039441 h1:b5Jqi7ir58EzfeZDyp7OSYQG/IVgyY4JWfHuJUF2AZI=
-github.com/juju/ratelimit v1.0.2-0.20191002062651-f60b32039441/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk=
 github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA=
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
@@ -388,8 +386,8 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g=
 github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y=
 github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
-github.com/lni/dragonboat/v4 v4.0.0-20220701152125-8521aeb79dc1 h1:sdggo4f2ZA5QVxM/ZRjdK7yILhaBfK4T22x+Cu/GFEw=
-github.com/lni/dragonboat/v4 v4.0.0-20220701152125-8521aeb79dc1/go.mod h1:WP8A02nnGsVufaXvcEhLrfqttsz6Xc1zTei1cAQqKhU=
+github.com/lni/dragonboat/v4 v4.0.0-20220724134658-ed44d312daa2 h1:cPICPrExab17TUc6v40REOfhLh7L/LKlV380+bZTEyE=
+github.com/lni/dragonboat/v4 v4.0.0-20220724134658-ed44d312daa2/go.mod h1:bR6ZGoUwApH4/P4+AezNGT0xehljg+j+Z/Q2Fz+Y4a0=
 github.com/lni/goutils v1.3.0/go.mod h1:PUPtBAnZlRPUKWUXCsYkIRWubJbtNHpTAee0sczhlf4=
 github.com/lni/goutils v1.3.1-0.20220604063047-388d67b4dbc4 h1:6gzI38ZJmbzZ7oZebXz6jII0uVK+MZ3+ds+7mIt1ioI=
 github.com/lni/goutils v1.3.1-0.20220604063047-388d67b4dbc4/go.mod h1:LIHvF0fflR+zyXUQFQOiHPpKANf3UIr7DFIv5CBPOoU=
diff --git a/pkg/common/hashmap/strhashmap.go b/pkg/common/hashmap/strhashmap.go
index fd1e9f7e5..59bd020c0 100644
--- a/pkg/common/hashmap/strhashmap.go
+++ b/pkg/common/hashmap/strhashmap.go
@@ -61,6 +61,9 @@ func (m *StrHashMap) AddGroup() {
 // never handle null
 func (m *StrHashMap) InsertValue(val any) bool {
 	defer func() { m.keys[0] = m.keys[0][:0] }()
+	if m.hasNull {
+		m.keys[0] = append(m.keys[0], byte(0))
+	}
 	switch v := val.(type) {
 	case uint8:
 		m.keys[0] = append(m.keys[0], encoding.EncodeFixed(v)...)
@@ -70,12 +73,24 @@ func (m *StrHashMap) InsertValue(val any) bool {
 		m.keys[0] = append(m.keys[0], encoding.EncodeFixed(v)...)
 	case uint64:
 		m.keys[0] = append(m.keys[0], encoding.EncodeFixed(v)...)
+	case int8:
+		m.keys[0] = append(m.keys[0], encoding.EncodeFixed(v)...)
+	case int16:
+		m.keys[0] = append(m.keys[0], encoding.EncodeFixed(v)...)
+	case int32:
+		m.keys[0] = append(m.keys[0], encoding.EncodeFixed(v)...)
+	case int64:
+		m.keys[0] = append(m.keys[0], encoding.EncodeFixed(v)...)
+	case float32:
+		m.keys[0] = append(m.keys[0], encoding.EncodeFixed(v)...)
+	case float64:
+		m.keys[0] = append(m.keys[0], encoding.EncodeFixed(v)...)
 	case []byte:
 		m.keys[0] = append(m.keys[0], v...)
-	case types.Decimal128:
-		m.keys[0] = append(m.keys[0], encoding.EncodeFixed(v)...)
 	case types.Decimal64:
 		m.keys[0] = append(m.keys[0], encoding.EncodeFixed(v)...)
+	case types.Decimal128:
+		m.keys[0] = append(m.keys[0], encoding.EncodeFixed(v)...)
 	}
 	if l := len(m.keys[0]); l < 16 {
 		m.keys[0] = append(m.keys[0], hashtable.StrKeyPadding[l:]...)
diff --git a/pkg/common/stopper/stopper.go b/pkg/common/stopper/stopper.go
index 5ec7799ac..f2d6bd314 100644
--- a/pkg/common/stopper/stopper.go
+++ b/pkg/common/stopper/stopper.go
@@ -245,9 +245,6 @@ func (s *Stopper) shutdownTask(id uint64) {
 func (s *Stopper) doRunCancelableTask(ctx context.Context, taskID uint64, name string, task func(context.Context)) {
 	s.setupTask(taskID, name)
 	go func() {
-		if err := recover(); err != nil {
-			panic(err)
-		}
 		defer func() {
 			s.shutdownTask(taskID)
 		}()
diff --git a/pkg/fileservice/etl_file_service.go b/pkg/fileservice/etl_file_service.go
new file mode 100644
index 000000000..712c795cf
--- /dev/null
+++ b/pkg/fileservice/etl_file_service.go
@@ -0,0 +1,24 @@
+// Copyright 2022 Matrix Origin
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package fileservice
+
+// ETLFileService is an extension to the FileService
+type ETLFileService interface {
+	FileService
+
+	// ETLCompatible marks the implementation to be compatible to ETL operations
+	// implementations must save file contents as-is
+	ETLCompatible()
+}
diff --git a/pkg/fileservice/io.go b/pkg/fileservice/io.go
new file mode 100644
index 000000000..38e5fcc60
--- /dev/null
+++ b/pkg/fileservice/io.go
@@ -0,0 +1,32 @@
+// Copyright 2022 Matrix Origin
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package fileservice
+
+import "io"
+
+type readCloser struct {
+	r         io.Reader
+	closeFunc func() error
+}
+
+var _ io.ReadCloser = new(readCloser)
+
+func (r *readCloser) Read(data []byte) (int, error) {
+	return r.r.Read(data)
+}
+
+func (r *readCloser) Close() error {
+	return r.closeFunc()
+}
diff --git a/pkg/fileservice/local_etl_fs.go b/pkg/fileservice/local_etl_fs.go
new file mode 100644
index 000000000..c9e008169
--- /dev/null
+++ b/pkg/fileservice/local_etl_fs.go
@@ -0,0 +1,373 @@
+// Copyright 2022 Matrix Origin
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package fileservice
+
+import (
+	"context"
+	"io"
+	"os"
+	"path/filepath"
+	"sort"
+	"strings"
+	"sync"
+)
+
+// LocalETLFS is a FileService implementation backed by local file system and suitable for ETL operations
+type LocalETLFS struct {
+	rootPath string
+
+	sync.RWMutex
+	dirFiles map[string]*os.File
+
+	createTempDirOnce sync.Once
+}
+
+var _ FileService = new(LocalETLFS)
+
+func NewLocalETLFS(rootPath string) (*LocalETLFS, error) {
+	return &LocalETLFS{
+		rootPath: rootPath,
+		dirFiles: make(map[string]*os.File),
+	}, nil
+}
+
+func (l *LocalETLFS) ensureTempDir() (err error) {
+	l.createTempDirOnce.Do(func() {
+		err = os.MkdirAll(filepath.Join(l.rootPath, ".tmp"), 0755)
+	})
+	return
+}
+
+func (l *LocalETLFS) Write(ctx context.Context, vector IOVector) error {
+	nativePath := l.toNativeFilePath(vector.FilePath)
+
+	// check existence
+	_, err := os.Stat(nativePath)
+	if err == nil {
+		// existed
+		return ErrFileExisted
+	}
+
+	return l.write(ctx, vector)
+}
+
+func (l *LocalETLFS) write(ctx context.Context, vector IOVector) error {
+
+	nativePath := l.toNativeFilePath(vector.FilePath)
+
+	// sort
+	sort.Slice(vector.Entries, func(i, j int) bool {
+		return vector.Entries[i].Offset < vector.Entries[j].Offset
+	})
+
+	// size
+	var size int64
+	if len(vector.Entries) > 0 {
+		last := vector.Entries[len(vector.Entries)-1]
+		size = int64(last.Offset + last.Size)
+	}
+
+	// write
+	if err := l.ensureTempDir(); err != nil {
+		return err
+	}
+	f, err := os.CreateTemp(
+		filepath.Join(l.rootPath, ".tmp"),
+		"*.tmp",
+	)
+	if err != nil {
+		return err
+	}
+	n, err := io.Copy(f, newIOEntriesReader(vector.Entries))
+	if err != nil {
+		return err
+	}
+	if n != size {
+		return ErrSizeNotMatch
+	}
+	if err := f.Close(); err != nil {
+		return err
+	}
+
+	// ensure parent dir
+	parentDir, _ := filepath.Split(nativePath)
+	err = l.ensureDir(parentDir)
+	if err != nil {
+		return err
+	}
+
+	// move
+	if err := os.Rename(f.Name(), nativePath); err != nil {
+		return err
+	}
+
+	if err := l.syncDir(parentDir); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (l *LocalETLFS) Read(ctx context.Context, vector *IOVector) error {
+
+	nativePath := l.toNativeFilePath(vector.FilePath)
+	_, err := os.Stat(nativePath)
+	if os.IsNotExist(err) {
+		return ErrFileNotFound
+	}
+	if err != nil {
+		return err
+	}
+
+	for i, entry := range vector.Entries {
+		if entry.Size == 0 {
+			return ErrEmptyRange
+		}
+
+		if entry.WriterForRead != nil {
+			f, err := os.Open(nativePath)
+			if os.IsNotExist(err) {
+				return ErrFileNotFound
+			}
+			if err != nil {
+				return nil
+			}
+			defer f.Close()
+			if entry.Offset > 0 {
+				if _, err := f.Seek(int64(entry.Offset), io.SeekStart); err != nil {
+					return err
+				}
+			}
+			r := (io.Reader)(f)
+			if entry.Size > 0 {
+				r = io.LimitReader(r, int64(entry.Size))
+			}
+			n, err := io.Copy(entry.WriterForRead, r)
+			if err != nil {
+				return err
+			}
+			if n != int64(entry.Size) {
+				return ErrUnexpectedEOF
+			}
+
+		} else if entry.ReadCloserForRead != nil {
+			f, err := os.Open(nativePath)
+			if os.IsNotExist(err) {
+				return ErrFileNotFound
+			}
+			if err != nil {
+				return nil
+			}
+			if entry.Offset > 0 {
+				if _, err := f.Seek(int64(entry.Offset), io.SeekStart); err != nil {
+					return err
+				}
+			}
+			r := (io.Reader)(f)
+			if entry.Size > 0 {
+				r = io.LimitReader(r, int64(entry.Size))
+			}
+			*entry.ReadCloserForRead = &readCloser{
+				r:         r,
+				closeFunc: f.Close,
+			}
+
+		} else {
+			f, err := os.Open(nativePath)
+			if os.IsNotExist(err) {
+				return ErrFileNotFound
+			}
+			if err != nil {
+				return nil
+			}
+			defer f.Close()
+
+			_, err = f.Seek(int64(entry.Offset), io.SeekStart)
+			if err != nil {
+				return err
+			}
+			r := (io.Reader)(f)
+			if entry.Size > 0 {
+				r = io.LimitReader(r, int64(entry.Size))
+			}
+
+			if entry.Size < 0 {
+				data, err := io.ReadAll(r)
+				if err != nil {
+					return err
+				}
+				entry.Data = data
+
+			} else {
+				if len(entry.Data) < entry.Size {
+					entry.Data = make([]byte, entry.Size)
+				}
+				n, err := io.ReadFull(r, entry.Data)
+				if err != nil {
+					return err
+				}
+				if n != entry.Size {
+					return ErrUnexpectedEOF
+				}
+			}
+
+			vector.Entries[i] = entry
+		}
+
+	}
+
+	return nil
+
+}
+
+func (l *LocalETLFS) List(ctx context.Context, dirPath string) (ret []DirEntry, err error) {
+
+	nativePath := l.toNativeFilePath(dirPath)
+	f, err := os.Open(nativePath)
+	if os.IsNotExist(err) {
+		err = nil
+		return
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer f.Close()
+
+	entries, err := f.ReadDir(-1)
+	for _, entry := range entries {
+		name := entry.Name()
+		if strings.HasPrefix(name, ".") {
+			continue
+		}
+		info, err := entry.Info()
+		if err != nil {
+			return nil, err
+		}
+		ret = append(ret, DirEntry{
+			Name:  name,
+			IsDir: entry.IsDir(),
+			Size:  int(info.Size()),
+		})
+	}
+
+	sort.Slice(ret, func(i, j int) bool {
+		return ret[i].Name < ret[j].Name
+	})
+
+	if err != nil {
+		return ret, err
+	}
+
+	return
+}
+
+func (l *LocalETLFS) Delete(ctx context.Context, filePath string) error {
+	nativePath := l.toNativeFilePath(filePath)
+	_, err := os.Stat(nativePath)
+	if os.IsNotExist(err) {
+		return ErrFileNotFound
+	}
+	if err != nil {
+		return err
+	}
+	err = os.Remove(nativePath)
+	if err != nil {
+		return err
+	}
+	parentDir, _ := filepath.Split(nativePath)
+	err = l.syncDir(parentDir)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func (l *LocalETLFS) ensureDir(nativePath string) error {
+	nativePath = filepath.Clean(nativePath)
+	if nativePath == "" {
+		return nil
+	}
+
+	// check existence by l.dirFiles
+	l.RLock()
+	_, ok := l.dirFiles[nativePath]
+	if ok {
+		// dir existed
+		l.RUnlock()
+		return nil
+	}
+	l.RUnlock()
+
+	// check existence by fstat
+	_, err := os.Stat(nativePath)
+	if err == nil {
+		// existed
+		return nil
+	}
+
+	// ensure parent
+	parent, _ := filepath.Split(nativePath)
+	if parent != nativePath {
+		if err := l.ensureDir(parent); err != nil {
+			return err
+		}
+	}
+
+	// create
+	if err := os.Mkdir(nativePath, 0755); err != nil {
+		return err
+	}
+
+	// sync parent dir
+	if err := l.syncDir(parent); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (l *LocalETLFS) toOSPath(filePath string) string {
+	if os.PathSeparator == '/' {
+		return filePath
+	}
+	return strings.ReplaceAll(filePath, "/", osPathSeparatorStr)
+}
+
+func (l *LocalETLFS) syncDir(nativePath string) error {
+	l.Lock()
+	f, ok := l.dirFiles[nativePath]
+	if !ok {
+		var err error
+		f, err = os.Open(nativePath)
+		if err != nil {
+			l.Unlock()
+			return err
+		}
+		l.dirFiles[nativePath] = f
+	}
+	l.Unlock()
+	if err := f.Sync(); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (l *LocalETLFS) toNativeFilePath(filePath string) string {
+	return filepath.Join(l.rootPath, l.toOSPath(filePath))
+}
+
+var _ ETLFileService = new(LocalETLFS)
+
+func (l *LocalETLFS) ETLCompatible() {}
diff --git a/pkg/fileservice/memory_fs.go b/pkg/fileservice/memory_fs.go
index 811bac013..9ddd1927c 100644
--- a/pkg/fileservice/memory_fs.go
+++ b/pkg/fileservice/memory_fs.go
@@ -18,7 +18,6 @@ import (
 	"bytes"
 	"context"
 	"io"
-	"io/ioutil"
 	"sort"
 	"strings"
 	"sync"
@@ -112,7 +111,7 @@ func (m *MemoryFS) write(ctx context.Context, vector IOVector) error {
 	})
 
 	r := newIOEntriesReader(vector.Entries)
-	data, err := ioutil.ReadAll(r)
+	data, err := io.ReadAll(r)
 	if err != nil {
 		return err
 	}
diff --git a/pkg/fileservice/s3_fs.go b/pkg/fileservice/s3_fs.go
index d38d34b15..7b9d80ee6 100644
--- a/pkg/fileservice/s3_fs.go
+++ b/pkg/fileservice/s3_fs.go
@@ -320,3 +320,7 @@ func (m *S3FS) mapError(err error) error {
 	}
 	return err
 }
+
+var _ ETLFileService = new(S3FS)
+
+func (*S3FS) ETLCompatible() {}
diff --git a/pkg/fileservice/s3_fs_minio.go b/pkg/fileservice/s3_fs_minio.go
index 1e3917cde..f0368cabf 100644
--- a/pkg/fileservice/s3_fs_minio.go
+++ b/pkg/fileservice/s3_fs_minio.go
@@ -281,3 +281,7 @@ func (m *S3FSMinio) _mapS3Error(err error) error {
 	}
 	return err
 }
+
+var _ ETLFileService = new(S3FSMinio)
+
+func (*S3FSMinio) ETLCompatible() {}
diff --git a/pkg/logservice/hakeeper_client.go b/pkg/logservice/hakeeper_client.go
index 1937f70f3..4ac5043b9 100644
--- a/pkg/logservice/hakeeper_client.go
+++ b/pkg/logservice/hakeeper_client.go
@@ -109,12 +109,14 @@ func (c *managedHAKeeperClient) Close() error {
 
 func (c *managedHAKeeperClient) GetClusterDetails(ctx context.Context) (pb.ClusterDetails, error) {
 	for {
+		if err := c.prepareClient(ctx); err != nil {
+			return pb.ClusterDetails{}, err
+		}
 		cd, err := c.client.getClusterDetails(ctx)
+		if err != nil {
+			c.resetClient()
+		}
 		if c.isInternalError(err) {
-			if cerr := c.prepareClient(ctx); cerr != nil {
-				plog.Errorf("failed to prepare HAKeeper client %v", cerr)
-				return pb.ClusterDetails{}, cerr
-			}
 			continue
 		}
 		return cd, err
@@ -124,12 +126,14 @@ func (c *managedHAKeeperClient) GetClusterDetails(ctx context.Context) (pb.Clust
 func (c *managedHAKeeperClient) SendCNHeartbeat(ctx context.Context,
 	hb pb.CNStoreHeartbeat) error {
 	for {
+		if err := c.prepareClient(ctx); err != nil {
+			return err
+		}
 		err := c.client.sendCNHeartbeat(ctx, hb)
+		if err != nil {
+			c.resetClient()
+		}
 		if c.isInternalError(err) {
-			if cerr := c.prepareClient(ctx); cerr != nil {
-				plog.Errorf("failed to prepare HAKeeper client %v", cerr)
-				return cerr
-			}
 			continue
 		}
 		return err
@@ -139,12 +143,14 @@ func (c *managedHAKeeperClient) SendCNHeartbeat(ctx context.Context,
 func (c *managedHAKeeperClient) SendDNHeartbeat(ctx context.Context,
 	hb pb.DNStoreHeartbeat) (pb.CommandBatch, error) {
 	for {
+		if err := c.prepareClient(ctx); err != nil {
+			return pb.CommandBatch{}, err
+		}
 		cb, err := c.client.sendDNHeartbeat(ctx, hb)
+		if err != nil {
+			c.resetClient()
+		}
 		if c.isInternalError(err) {
-			if cerr := c.prepareClient(ctx); cerr != nil {
-				plog.Errorf("failed to prepare HAKeeper client %v", cerr)
-				return pb.CommandBatch{}, cerr
-			}
 			continue
 		}
 		return cb, err
@@ -154,12 +160,14 @@ func (c *managedHAKeeperClient) SendDNHeartbeat(ctx context.Context,
 func (c *managedHAKeeperClient) SendLogHeartbeat(ctx context.Context,
 	hb pb.LogStoreHeartbeat) (pb.CommandBatch, error) {
 	for {
+		if err := c.prepareClient(ctx); err != nil {
+			return pb.CommandBatch{}, err
+		}
 		cb, err := c.client.sendLogHeartbeat(ctx, hb)
+		if err != nil {
+			c.resetClient()
+		}
 		if c.isInternalError(err) {
-			if cerr := c.prepareClient(ctx); cerr != nil {
-				plog.Errorf("failed to prepare HAKeeper client %v", cerr)
-				return pb.CommandBatch{}, cerr
-			}
 			continue
 		}
 		return cb, err
@@ -170,14 +178,24 @@ func (c *managedHAKeeperClient) isInternalError(err error) bool {
 	return errors.Is(err, ErrNotHAKeeper)
 }
 
+func (c *managedHAKeeperClient) resetClient() {
+	if c.client != nil {
+		cc := c.client
+		c.client = nil
+		if err := cc.close(); err != nil {
+			plog.Errorf("failed to close client %v", err)
+		}
+	}
+}
+
 func (c *managedHAKeeperClient) prepareClient(ctx context.Context) error {
+	if c.client != nil {
+		return nil
+	}
 	cc, err := newHAKeeperClient(ctx, c.cfg)
 	if err != nil {
 		return err
 	}
-	if err := c.client.close(); err != nil {
-		plog.Errorf("failed to close the client %v", err)
-	}
 	c.client = cc
 	return nil
 }
@@ -233,7 +251,14 @@ func newHAKeeperClient(ctx context.Context,
 }
 
 func (c *hakeeperClient) close() error {
-	return c.client.Close()
+	if c == nil {
+		panic("!!!")
+	}
+
+	if c.client != nil {
+		return c.client.Close()
+	}
+	return nil
 }
 
 func (c *hakeeperClient) getClusterDetails(ctx context.Context) (pb.ClusterDetails, error) {
diff --git a/pkg/sql/colexec/agg/bit_or/bit_or.go b/pkg/sql/colexec/agg/bit_or/bit_or.go
index e9659ccd0..b3366b149 100644
--- a/pkg/sql/colexec/agg/bit_or/bit_or.go
+++ b/pkg/sql/colexec/agg/bit_or/bit_or.go
@@ -43,13 +43,6 @@ func (bo *BitOr[T1]) Fill(_ int64, v1 T1, v2 int64, z int64, IsEmpty bool, hasNu
 	if hasNull {
 		return v2, IsEmpty
 	} else if IsEmpty {
-		if z%2 == 0 {
-			return (any)(0).(int64), false
-		} else {
-			return int64(v1), false
-		}
-	}
-	if z%2 == 0 {
 		return int64(v1), false
 	} else {
 		return int64(v1) | v2, false
diff --git a/pkg/sql/colexec/agg/bit_xor/bit_xor.go b/pkg/sql/colexec/agg/bit_xor/bit_xor.go
index 0ada2f272..cc0e4f7fa 100644
--- a/pkg/sql/colexec/agg/bit_xor/bit_xor.go
+++ b/pkg/sql/colexec/agg/bit_xor/bit_xor.go
@@ -44,13 +44,13 @@ func (bx *BitXor[T1]) Fill(_ int64, v1 T1, v2 int64, z int64, IsEmpty bool, hasN
 		return v2, IsEmpty
 	} else if IsEmpty {
 		if z%2 == 0 {
-			return (any)(0).(int64), false
+			return int64(0), false
 		} else {
 			return int64(v1), false
 		}
 	}
 	if z%2 == 0 {
-		return int64(v1), false
+		return int64(v2), false
 	} else {
 		return int64(v1) ^ v2, false
 	}
diff --git a/pkg/sql/parsers/goyacc/goyacc.go b/pkg/sql/parsers/goyacc/goyacc.go
index be232bf48..cf574416c 100644
--- a/pkg/sql/parsers/goyacc/goyacc.go
+++ b/pkg/sql/parsers/goyacc/goyacc.go
@@ -52,7 +52,6 @@ import (
 	"flag"
 	"fmt"
 	"go/format"
-	"io/ioutil"
 	"os"
 	"regexp"
 	"sort"
@@ -3459,7 +3458,7 @@ func exit(status int) {
 }
 
 func gofmt() {
-	src, err := ioutil.ReadFile(oflag)
+	src, err := os.ReadFile(oflag)
 	if err != nil {
 		return
 	}
@@ -3467,9 +3466,9 @@ func gofmt() {
 	if err != nil {
 		return
 	}
-	err = ioutil.WriteFile(oflag, src, 0666)
+	err = os.WriteFile(oflag, src, 0666)
 	if err != nil {
-		panic("ioutil write file failed")
+		panic("write file failed")
 	}
 }
 
diff --git a/pkg/sql/plan/function/builtin/binary/typecast.go b/pkg/sql/plan/function/builtin/binary/typecast.go
index ebae57d38..683576eb0 100644
--- a/pkg/sql/plan/function/builtin/binary/typecast.go
+++ b/pkg/sql/plan/function/builtin/binary/typecast.go
@@ -585,7 +585,13 @@ func Decimal128ToDecimal64(xs []types.Decimal128, xsScale int32, ysPrecision, ys
 
 func NumericToBool[T constraints.Integer | constraints.Float](xs []T, rs []bool) ([]bool, error) {
 	for i, x := range xs {
-		rs[i] = (x != 0)
+		if x == 0 {
+			rs[i] = false
+		} else if x == 1 {
+			rs[i] = true
+		} else {
+			return nil, moerr.NewError(moerr.INVALID_ARGUMENT, fmt.Sprintf("Can't cast '%v' as boolean type.", x))
+		}
 	}
 	return rs, nil
 }
diff --git a/pkg/sql/plan/function/type_check.go b/pkg/sql/plan/function/type_check.go
index 8d07b2821..2d7bcfc9d 100644
--- a/pkg/sql/plan/function/type_check.go
+++ b/pkg/sql/plan/function/type_check.go
@@ -343,7 +343,7 @@ func initTypeCheckRelated() {
 		types.T_uint8:      {types.T_uint64, types.T_uint32, types.T_uint16, types.T_float64},
 		types.T_uint16:     {types.T_uint64, types.T_uint32, types.T_float64},
 		types.T_uint32:     {types.T_uint64, types.T_float64},
-		types.T_uint64:     {types.T_float64},
+		types.T_uint64:     {types.T_int64, types.T_float64},
 		types.T_float32:    {types.T_float64},
 		types.T_char:       {types.T_varchar},
 		types.T_varchar:    {types.T_char},
diff --git a/pkg/sql/plan/visit_query.go b/pkg/sql/plan/visit_query.go
index 17511a91d..90d525453 100644
--- a/pkg/sql/plan/visit_query.go
+++ b/pkg/sql/plan/visit_query.go
@@ -33,7 +33,9 @@ func NewVisitQuery(qry *Query, rules []VisitRule) *VisitQuery {
 
 func (vq *VisitQuery) exploreNode(node *Node) error {
 	for i := range node.Children {
-		vq.exploreNode(vq.qry.Nodes[node.Children[i]])
+		if err := vq.exploreNode(vq.qry.Nodes[node.Children[i]]); err != nil {
+			return err
+		}
 	}
 
 	for _, rule := range vq.rules {
diff --git a/pkg/vm/engine/tae/db/replay.go b/pkg/vm/engine/tae/db/replay.go
index 791719d64..e30b03694 100644
--- a/pkg/vm/engine/tae/db/replay.go
+++ b/pkg/vm/engine/tae/db/replay.go
@@ -17,7 +17,6 @@ package db
 import (
 	"bytes"
 	"fmt"
-	"io/ioutil"
 	"os"
 	"path"
 	"sync"
@@ -82,7 +81,7 @@ func (replayer *Replayer) PreReplayWal() {
 
 func (replayer *Replayer) scanFiles() map[uint64]string {
 	files := make(map[uint64]string)
-	infos, err := ioutil.ReadDir(replayer.db.Dir)
+	infos, err := os.ReadDir(replayer.db.Dir)
 	if err != nil {
 		panic(err)
 	}
diff --git a/pkg/vm/engine/tae/logstore/store/file.go b/pkg/vm/engine/tae/logstore/store/file.go
index afbab44de..d0a43d403 100644
--- a/pkg/vm/engine/tae/logstore/store/file.go
+++ b/pkg/vm/engine/tae/logstore/store/file.go
@@ -18,7 +18,6 @@ import (
 	"context"
 	"errors"
 	"fmt"
-	"io/ioutil"
 	"os"
 	"path"
 	"path/filepath"
@@ -108,7 +107,7 @@ func OpenRotateFile(dir, name string, mu *sync.RWMutex, rotateChecker RotateChec
 		postCommitFunc:  postCommitFunc,
 	}
 	if !newDir {
-		files, err := ioutil.ReadDir(dir)
+		files, err := os.ReadDir(dir)
 		if err != nil {
 			return nil, err
 		}
@@ -123,14 +122,18 @@ func OpenRotateFile(dir, name string, mu *sync.RWMutex, rotateChecker RotateChec
 			if err != nil {
 				return nil, err
 			}
+			info, err := f.Info()
+			if err != nil {
+				return nil, err
+			}
 			vf := &vFile{
 				RWMutex:    &sync.RWMutex{},
 				File:       file,
 				version:    version,
 				commitCond: *sync.NewCond(new(sync.Mutex)),
 				history:    rf.history,
-				size:       int(f.Size()),
-				syncpos:    int(f.Size()),
+				size:       int(info.Size()),
+				syncpos:    int(info.Size()),
 			}
 			vf.vInfo = newVInfo(vf)
 			// vf.ReadMeta()


Test patch:
diff --git a/docs/en/MatrixOne/Test/mo-tester.md b/docs/en/MatrixOne/Test/mo-tester.md
index b02e55c0e..a449f6cb3 100644
--- a/docs/en/MatrixOne/Test/mo-tester.md
+++ b/docs/en/MatrixOne/Test/mo-tester.md
@@ -12,7 +12,7 @@ MO-Tester content locations:
 
 * *Result*: <https://github.com/matrixorigin/mo-tester/tree/main/result>
 
-* *Report*: once finished running, a `mo-tester/report` will be generated in local directory.
+* *Report*: once finished running, a `mo-tester/report` will be generated in the local directory.
 
 The Cases and Results are 1-1 correspondence, and they are actually `git submodules` from MatrixOne repository. Adding new cases and results should be in MatrixOne repo: <https://github.com/matrixorigin/matrixone/tree/main/test>
 
@@ -35,7 +35,7 @@ MO-Tester includes testing cases in the following table.
 
 # How to use MO-Tester?
 
-## 1. Prepare testing environment
+## 1. Prepare the testing environment
 
 * Make sure you have installed jdk8.
 
@@ -114,7 +114,8 @@ Note: every time running `run.sh` will overwrite the `error`, `report`, and `suc
 
 * An example of `report.txt`  looks like this:
 
-```[SUMMARY] TOTAL : 486, SUCCESS : 486, ERROR :0, NOEXE :0, SUCCESS RATE : 100%
+```
+[SUMMARY] TOTAL : 486, SUCCESS : 486, ERROR :0, NOEXE :0, SUCCESS RATE : 100%
 [SUMMARY] TOTAL : 486, SUCCESS : 485, ERROR :1, NOEXE :0, SUCCESS RATE : 99%
 [cases/transaction/atomicity.sql] TOTAL : 67, SUCCESS : 66, ERROR :1, NOEXE :0, SUCCESS RATE : 98%
 [cases/transaction/isolation.sql] TOTAL : 202, SUCCESS : 202, ERROR :0, NOEXE :0, SUCCESS RATE : 100%
diff --git a/pkg/config/test/config_template.go b/pkg/config/test/config_template.go
index 0122d0288..f37406be3 100644
--- a/pkg/config/test/config_template.go
+++ b/pkg/config/test/config_template.go
@@ -16,7 +16,7 @@ package config
 
 import (
 	"fmt"
-	"io/ioutil"
+	"io"
 	"os"
 	"path/filepath"
 	"sort"
@@ -145,7 +145,7 @@ func (params *parameters) LoadParametersDefinitionFromFile(filename string) erro
 	}
 	defer pfile.Close()
 
-	fbytes, err := ioutil.ReadAll(pfile)
+	fbytes, err := io.ReadAll(pfile)
 	if err != nil {
 		return err
 	}
diff --git a/pkg/fileservice/local_etl_fs_test.go b/pkg/fileservice/local_etl_fs_test.go
new file mode 100644
index 000000000..3de1f30ed
--- /dev/null
+++ b/pkg/fileservice/local_etl_fs_test.go
@@ -0,0 +1,34 @@
+// Copyright 2022 Matrix Origin
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package fileservice
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+)
+
+func TestLocalETLFS(t *testing.T) {
+
+	t.Run("file service", func(t *testing.T) {
+		testFileService(t, func() FileService {
+			dir := t.TempDir()
+			fs, err := NewLocalETLFS(dir)
+			assert.Nil(t, err)
+			return fs
+		})
+	})
+
+}
diff --git a/pkg/logservice/hakeeper_client_test.go b/pkg/logservice/hakeeper_client_test.go
index 4d8e3c5e9..2a8b29a8e 100644
--- a/pkg/logservice/hakeeper_client_test.go
+++ b/pkg/logservice/hakeeper_client_test.go
@@ -78,6 +78,12 @@ func TestHAKeeperClientSendCNHeartbeat(t *testing.T) {
 		defer func() {
 			assert.NoError(t, c1.Close())
 		}()
+
+		// should be transparently handled
+		cc := c1.(*managedHAKeeperClient)
+		assert.NoError(t, cc.client.close())
+		cc.client = nil
+
 		hb := pb.CNStoreHeartbeat{
 			UUID:           s.ID(),
 			ServiceAddress: "addr1",
@@ -89,6 +95,12 @@ func TestHAKeeperClientSendCNHeartbeat(t *testing.T) {
 		defer func() {
 			assert.NoError(t, c2.Close())
 		}()
+
+		// should be transparently handled
+		cc = c2.(*managedHAKeeperClient)
+		assert.NoError(t, cc.client.close())
+		cc.client = nil
+
 		hb2 := pb.DNStoreHeartbeat{
 			UUID:           s.ID(),
 			ServiceAddress: "addr2",
@@ -97,6 +109,11 @@ func TestHAKeeperClientSendCNHeartbeat(t *testing.T) {
 		require.NoError(t, err)
 		assert.Equal(t, 0, len(cb.Commands))
 
+		// should be transparently handled
+		cc = c1.(*managedHAKeeperClient)
+		assert.NoError(t, cc.client.close())
+		cc.client = nil
+
 		cd, err := c1.GetClusterDetails(ctx)
 		require.NoError(t, err)
 		cn := pb.CNNode{
@@ -160,6 +177,12 @@ func TestHAKeeperClientSendLogHeartbeat(t *testing.T) {
 		defer func() {
 			assert.NoError(t, c.Close())
 		}()
+
+		// should be transparently handled
+		cc := c.(*managedHAKeeperClient)
+		assert.NoError(t, cc.client.close())
+		cc.client = nil
+
 		hb := s.store.getHeartbeatMessage()
 		cb, err := c.SendLogHeartbeat(ctx, hb)
 		require.NoError(t, err)
diff --git a/pkg/sql/colexec/agg/bit_or/bit_or_test.go b/pkg/sql/colexec/agg/bit_or/bit_or_test.go
index 9f06b8825..e80ca1624 100644
--- a/pkg/sql/colexec/agg/bit_or/bit_or_test.go
+++ b/pkg/sql/colexec/agg/bit_or/bit_or_test.go
@@ -47,6 +47,19 @@ func TestBitOr(t *testing.T) {
 		require.Equal(t, []int64{15}, vector.GetColumn[int64](v))
 		v.Free(m)
 	}
+	{
+		vec0 := testutil.NewVector(2, types.New(types.T_int8, 0, 0, 0), m, false, []int8{2, 2})
+		agg := agg.NewUnaryAgg(nil, true, types.New(types.T_int8, 0, 0, 0), types.New(types.T_int64, 0, 0, 0), bo.Grows, bo.Eval, bo.Merge, bo.Fill)
+		err := agg.Grows(1, m)
+		require.NoError(t, err)
+		agg.Fill(0, int64(0), 2, []*vector.Vector{vec0})
+		v, err := agg.Eval(m)
+		require.NoError(t, err)
+		// 2 BIT_OR 2 --> 2
+		require.Equal(t, []int64{2}, vector.GetColumn[int64](v))
+		v.Free(m)
+		vec0.Free(m)
+	}
 	{
 		agg0 := agg.NewUnaryAgg(nil, true, types.New(types.T_int8, 0, 0, 0), types.New(types.T_int64, 0, 0, 0), bo.Grows, bo.Eval, bo.Merge, bo.Fill)
 		err := agg0.Grows(1, m)
diff --git a/pkg/sql/colexec/agg/bit_xor/bit_xor_test.go b/pkg/sql/colexec/agg/bit_xor/bit_xor_test.go
index 69e700c9a..6dedefd19 100644
--- a/pkg/sql/colexec/agg/bit_xor/bit_xor_test.go
+++ b/pkg/sql/colexec/agg/bit_xor/bit_xor_test.go
@@ -47,6 +47,33 @@ func TestBitXor(t *testing.T) {
 		require.Equal(t, []int64{1}, vector.GetColumn[int64](v))
 		v.Free(m)
 	}
+	{
+		vec0 := testutil.NewVector(2, types.New(types.T_int8, 0, 0, 0), m, false, []int8{2, 2})
+		agg := agg.NewUnaryAgg(nil, true, types.New(types.T_int8, 0, 0, 0), types.New(types.T_int64, 0, 0, 0), bx.Grows, bx.Eval, bx.Merge, bx.Fill)
+		err := agg.Grows(1, m)
+		require.NoError(t, err)
+		agg.Fill(0, int64(0), 2, []*vector.Vector{vec0})
+		v, err := agg.Eval(m)
+		require.NoError(t, err)
+		// 2 XOR 2 --> 0
+		require.Equal(t, []int64{0}, vector.GetColumn[int64](v))
+		v.Free(m)
+		vec0.Free(m)
+	}
+	{
+		vec0 := testutil.NewVector(3, types.New(types.T_int8, 0, 0, 0), m, false, []int8{1, 2, 2})
+		agg := agg.NewUnaryAgg(nil, true, types.New(types.T_int8, 0, 0, 0), types.New(types.T_int64, 0, 0, 0), bx.Grows, bx.Eval, bx.Merge, bx.Fill)
+		err := agg.Grows(1, m)
+		require.NoError(t, err)
+		agg.Fill(0, int64(0), 1, []*vector.Vector{vec0})
+		agg.Fill(0, int64(1), 2, []*vector.Vector{vec0})
+		v, err := agg.Eval(m)
+		require.NoError(t, err)
+		// 1 XOR 2 XOR 2 --> 1
+		require.Equal(t, []int64{1}, vector.GetColumn[int64](v))
+		v.Free(m)
+		vec0.Free(m)
+	}
 	{
 		agg0 := agg.NewUnaryAgg(nil, true, types.New(types.T_int8, 0, 0, 0), types.New(types.T_int64, 0, 0, 0), bx.Grows, bx.Eval, bx.Merge, bx.Fill)
 		err := agg0.Grows(1, m)
diff --git a/pkg/sql/plan/build_test.go b/pkg/sql/plan/build_test.go
index bc040b8a8..d6d1b9734 100644
--- a/pkg/sql/plan/build_test.go
+++ b/pkg/sql/plan/build_test.go
@@ -17,7 +17,7 @@ package plan
 import (
 	"bytes"
 	"encoding/json"
-	"io/ioutil"
+	"os"
 	"strings"
 	"testing"
 
@@ -834,7 +834,7 @@ func outPutPlan(logicPlan *Plan, toFile bool, t *testing.T) {
 		json = getJSON(logicPlan.GetDcl(), t)
 	}
 	if toFile {
-		err := ioutil.WriteFile("/tmp/mo_plan_test.json", json, 0777)
+		err := os.WriteFile("/tmp/mo_plan_test.json", json, 0777)
 		if err != nil {
 			t.Logf("%+v", err)
 		}
diff --git a/pkg/vm/engine/tae/db/base_test.go b/pkg/vm/engine/tae/db/base_test.go
index db6721260..97184cbe4 100644
--- a/pkg/vm/engine/tae/db/base_test.go
+++ b/pkg/vm/engine/tae/db/base_test.go
@@ -16,7 +16,7 @@ package db
 
 import (
 	"errors"
-	"io/ioutil"
+	"os"
 	"sync"
 	"testing"
 
@@ -191,7 +191,7 @@ func withTestAllPKType(t *testing.T, tae *DB, test func(*testing.T, *DB, *catalo
 
 func getSegmentFileNames(e *DB) (names map[uint64]string) {
 	names = make(map[uint64]string)
-	files, err := ioutil.ReadDir(e.Dir)
+	files, err := os.ReadDir(e.Dir)
 	if err != nil {
 		panic(err)
 	}
diff --git a/test/result/expression/case_when.result b/test/result/expression/case_when.result
index 2eff6b82b..f1df95ba0 100755
--- a/test/result/expression/case_when.result
+++ b/test/result/expression/case_when.result
@@ -112,14 +112,10 @@ insert into t1 (a, b) values (1,4572794622775114594), (2,18196094287899841997),
 insert into t2 (c) values (1), (2), (3);
 select t1.a, (case t1.a when 0 then 0 else t1.b end) d from t1
 join t2 on t1.a=t2.c order by d;
-a	d
-1	4572794622775114594
-3	11120436154190595086
-2	18196094287899841997
+Can't cast column from BIGINT UNSIGNED type to BIGINT type because of one or more values in that column. Reason: overflow
 select t1.a, (case t1.a when 0 then 0 else t1.b end) d from t1
 join t2 on t1.a=t2.c where b=11120436154190595086 order by d;
-a	d
-3	11120436154190595086
+Can't cast column from BIGINT UNSIGNED type to BIGINT type because of one or more values in that column. Reason: overflow
 drop table if exists small;
 drop table if exists big;
 CREATE TABLE small (id int not null,PRIMARY KEY (id));
diff --git a/test/result/operator/operator.result b/test/result/operator/operator.result
index 6de3a90f6..70a3f46f3 100755
--- a/test/result/operator/operator.result
+++ b/test/result/operator/operator.result
@@ -157,26 +157,11 @@ Database (%aa%)
 drop database likedb;
 drop database dblike;
 SELECT * FROM t1 where t1.userID<6 OR NOT t1.userID;
-spid	userid	score
-1	1	1
-2	2	2
-2	1	4
-3	3	3
-1	1	5
+Can't cast column from BIGINT type to BOOL type because of one or more values in that column.
 SELECT * FROM t1 where NOT t1.userID OR t1.userID<6;
-spid	userid	score
-1	1	1
-2	2	2
-2	1	4
-3	3	3
-1	1	5
+Can't cast column from BIGINT type to BOOL type because of one or more values in that column.
 SELECT * FROM t1 where NOT t1.userID || t1.userID<6;
-spid	userid	score
-1	1	1
-2	2	2
-2	1	4
-3	3	3
-1	1	5
+Can't cast column from BIGINT type to BOOL type because of one or more values in that column.
 drop table if exists t1;
 create table t1 (a int);
 insert into t1 values (0),(1),(NULL);