From 908361046394e1f557754936c75d42da08353509 Mon Sep 17 00:00:00 2001 From: hantmac Date: Thu, 2 Jan 2025 19:57:38 +0800 Subject: [PATCH 01/18] fix: upgrade jdbc version for tableau --- docs/cn/guides/31-visualize/tableau.md | 14 +++++++------- docs/en/guides/31-visualize/tableau.md | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/cn/guides/31-visualize/tableau.md b/docs/cn/guides/31-visualize/tableau.md index 8e605ecec1..a6dc63da3d 100644 --- a/docs/cn/guides/31-visualize/tableau.md +++ b/docs/cn/guides/31-visualize/tableau.md @@ -2,7 +2,7 @@ title: Tableau --- -[Tableau](https://www.tableau.com/) 是一个可视化分析平台,正在改变我们使用数据解决问题的方式——赋予个人和组织充分利用其数据的能力。通过利用 [databend-jdbc 驱动程序](https://github.com/databendcloud/databend-jdbc)(版本 0.0.8 或更高),Databend 和 Databend Cloud 都可以与 Tableau 集成,实现无缝的数据访问和高效的分析。需要注意的是,为了获得最佳兼容性,建议使用 Tableau 版本 2022.3 或更高,以避免潜在的兼容性问题。 +[Tableau](https://www.tableau.com/) 是一个可视化分析平台,正在改变我们使用数据解决问题的方式——赋予个人和组织充分利用其数据的能力。通过利用 [databend-jdbc 驱动程序](https://github.com/databendcloud/databend-jdbc)(版本 0.3.4 或更高),Databend 和 Databend Cloud 都可以与 Tableau 集成,实现无缝的数据访问和高效的分析。需要注意的是,为了获得最佳兼容性,建议使用 Tableau 版本 2022.3 或更高,以避免潜在的兼容性问题。 Databend 目前提供了两种与 Tableau 的集成方法。第一种方法利用 Tableau 中的 Other Databases (JDBC) 接口,适用于 Databend 和 Databend Cloud。第二种方法推荐使用 Databend 专门为与 Databend 最佳连接而开发的 [databend-tableau-connector-jdbc](https://github.com/databendcloud/databend-tableau-connector-jdbc) 连接器。 @@ -24,9 +24,9 @@ GRANT ALL ON *.* TO tableau; ### 步骤 2. 安装 databend-jdbc -1. 从 Maven Central Repository 下载 databend-jdbc 驱动程序(版本 0.0.8 或更高),地址为 https://repo1.maven.org/maven2/com/databend/databend-jdbc/ +1. 从 Maven Central Repository 下载 databend-jdbc 驱动程序(版本 0.3.4 或更高),地址为 https://repo1.maven.org/maven2/com/databend/databend-jdbc/ -2. 要安装 databend-jdbc 驱动程序,请将 jar 文件(例如,databend-jdbc-0.0.8.jar)移动到 Tableau 的驱动程序文件夹。Tableau 的驱动程序文件夹因操作系统而异: +2. 要安装 databend-jdbc 驱动程序,请将 jar 文件(例如,databend-jdbc-0.3.4.jar)移动到 Tableau 的驱动程序文件夹。Tableau 的驱动程序文件夹因操作系统而异: | 操作系统 | Tableau 的驱动程序文件夹 | | -------- | -------------------------------- | @@ -70,9 +70,9 @@ GRANT ALL ON *.* TO tableau; ### 步骤 2. 安装 databend-jdbc -1. 从 Maven Central Repository 下载 databend-jdbc 驱动程序(版本 0.0.8 或更高),地址为 https://repo1.maven.org/maven2/com/databend/databend-jdbc/ +1. 从 Maven Central Repository 下载 databend-jdbc 驱动程序(版本 0.3.4 或更高),地址为 https://repo1.maven.org/maven2/com/databend/databend-jdbc/ -2. 要安装 databend-jdbc 驱动程序,请将 jar 文件(例如,databend-jdbc-0.0.8.jar)移动到 Tableau 的驱动程序文件夹。Tableau 的驱动程序文件夹因操作系统而异: +2. 要安装 databend-jdbc 驱动程序,请将 jar 文件(例如,databend-jdbc-0.3.4.jar)移动到 Tableau 的驱动程序文件夹。Tableau 的驱动程序文件夹因操作系统而异: | 操作系统 | Tableau 的驱动程序文件夹 | | -------- | -------------------------------- | @@ -118,9 +118,9 @@ GRANT ALL ON *.* TO tableau; ### 步骤 2. 安装 databend-jdbc -1. 从 Maven Central Repository 下载 databend-jdbc 驱动程序(版本 0.0.8 或更高),地址为 https://repo1.maven.org/maven2/com/databend/databend-jdbc/ +1. 从 Maven Central Repository 下载 databend-jdbc 驱动程序(版本 0.3.4 或更高),地址为 https://repo1.maven.org/maven2/com/databend/databend-jdbc/ -2. 要安装 databend-jdbc 驱动程序,请将 jar 文件(例如,databend-jdbc-0.0.8.jar)移动到 Tableau 的驱动程序文件夹。Tableau 的驱动程序文件夹因操作系统而异: +2. 要安装 databend-jdbc 驱动程序,请将 jar 文件(例如,databend-jdbc-0.3.4.jar)移动到 Tableau 的驱动程序文件夹。Tableau 的驱动程序文件夹因操作系统而异: | 操作系统 | Tableau 的驱动程序文件夹 | | -------- | -------------------------------- | diff --git a/docs/en/guides/31-visualize/tableau.md b/docs/en/guides/31-visualize/tableau.md index a4bd3598c6..adad792520 100644 --- a/docs/en/guides/31-visualize/tableau.md +++ b/docs/en/guides/31-visualize/tableau.md @@ -2,7 +2,7 @@ title: Tableau --- -[Tableau](https://www.tableau.com/) is a visual analytics platform transforming the way we use data to solve problems—empowering people and organizations to make the most of their data. By leveraging the [databend-jdbc driver](https://github.com/databendcloud/databend-jdbc) (version 0.0.8 or higher), both Databend and Databend Cloud can integrate with Tableau, enabling seamless data access and efficient analysis. It is important to note that for optimal compatibility, it is advisable to use Tableau version 2022.3 or higher to avoid potential compatibility issues. +[Tableau](https://www.tableau.com/) is a visual analytics platform transforming the way we use data to solve problems—empowering people and organizations to make the most of their data. By leveraging the [databend-jdbc driver](https://github.com/databendcloud/databend-jdbc) (version 0.3.4 or higher), both Databend and Databend Cloud can integrate with Tableau, enabling seamless data access and efficient analysis. It is important to note that for optimal compatibility, it is advisable to use Tableau version 2022.3 or higher to avoid potential compatibility issues. Databend currently provides two integration methods with Tableau. The first approach utilizes the Other Databases (JDBC) interface within Tableau and is applicable to both Databend and Databend Cloud. The second method recommends using the [databend-tableau-connector-jdbc](https://github.com/databendcloud/databend-tableau-connector-jdbc) connector specifically developed by Databend for optimal connectivity with Databend. @@ -24,9 +24,9 @@ GRANT ALL ON *.* TO tableau; ### Step 2. Install databend-jdbc -1. Download the databend-jdbc driver (version 0.0.8 or higher) from the Maven Central Repository at https://repo1.maven.org/maven2/com/databend/databend-jdbc/ +1. Download the databend-jdbc driver (version 0.3.4 or higher) from the Maven Central Repository at https://repo1.maven.org/maven2/com/databend/databend-jdbc/ -2. To install the databend-jdbc driver, move the jar file (for example, databend-jdbc-0.0.8.jar) to Tableau's driver folder. Tableau's driver folder varies depending on the operating system: +2. To install the databend-jdbc driver, move the jar file (for example, databend-jdbc-0.3.4.jar) to Tableau's driver folder. Tableau's driver folder varies depending on the operating system: | Operating System | Tableau's Driver Folder | | ---------------- | -------------------------------- | @@ -70,9 +70,9 @@ GRANT ALL ON *.* TO tableau; ### Step 2. Install databend-jdbc -1. Download the databend-jdbc driver (version 0.0.8 or higher) from the Maven Central Repository at https://repo1.maven.org/maven2/com/databend/databend-jdbc/ +1. Download the databend-jdbc driver (version 0.3.4 or higher) from the Maven Central Repository at https://repo1.maven.org/maven2/com/databend/databend-jdbc/ -2. To install the databend-jdbc driver, move the jar file (for example, databend-jdbc-0.0.8.jar) to Tableau's driver folder. Tableau's driver folder varies depending on the operating system: +2. To install the databend-jdbc driver, move the jar file (for example, databend-jdbc-0.3.4.jar) to Tableau's driver folder. Tableau's driver folder varies depending on the operating system: | Operating System | Tableau's Driver Folder | | ---------------- | -------------------------------- | @@ -118,9 +118,9 @@ Obtain the connection information from Databend Cloud. For how to do that, refer ### Step 2. Install databend-jdbc -1. Download the databend-jdbc driver (version 0.0.8 or higher) from the Maven Central Repository at https://repo1.maven.org/maven2/com/databend/databend-jdbc/ +1. Download the databend-jdbc driver (version 0.3.4 or higher) from the Maven Central Repository at https://repo1.maven.org/maven2/com/databend/databend-jdbc/ -2. To install the databend-jdbc driver, move the jar file (for example, databend-jdbc-0.0.8.jar) to Tableau's driver folder. Tableau's driver folder varies depending on the operating system: +2. To install the databend-jdbc driver, move the jar file (for example, databend-jdbc-0.3.4.jar) to Tableau's driver folder. Tableau's driver folder varies depending on the operating system: | Operating System | Tableau's Driver Folder | | ---------------- | -------------------------------- | From d79b8a03463857c1c5ee4e398ca9f41495b259e1 Mon Sep 17 00:00:00 2001 From: Quan <787025321@qq.com> Date: Fri, 3 Jan 2025 14:10:40 +0800 Subject: [PATCH 02/18] fix: twitter links --- README.md | 2 +- docs/cn/guides/90-community/index.md | 2 +- docs/en/guides/90-community/index.md | 2 +- docusaurus.config.ts | 4 ++-- i18n/en/docusaurus-theme-classic/footer.json | 2 +- i18n/zh/docusaurus-theme-classic/footer.json | 2 +- src/components/JoinCommunity/index.tsx | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 3c86b3ba9f..9f9bdcf4a4 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![GitHub contributors](https://img.shields.io/github/contributors/datafuselabs/databend-docs.svg)](https://github.com/datafuselabs/databend-docs/graphs/contributors) [![GitHub pull requests](https://img.shields.io/github/issues-pr/datafuselabs/databend-docs.svg)](https://github.com/datafuselabs/databend-docs/pulls) [![GitHub issues](https://img.shields.io/github/issues/datafuselabs/databend-docs.svg)](https://github.com/datafuselabs/databend-docs/issues) -[![Twitter Follow](https://img.shields.io/twitter/follow/DatabendLabs?style=social)](https://twitter.com/DatabendLabs) +[![Twitter Follow](https://img.shields.io/twitter/follow/DatabendLabs?style=social)](https://x.com/DatabendLabs) [![YouTube Channel](https://img.shields.io/badge/YouTube-Subscribe-red?style=flat&logo=youtube)](https://www.youtube.com/@DatabendLabs) Welcome to the official documentation repository for Databend! We invite you to contribute and help improve the Databend Docs. diff --git a/docs/cn/guides/90-community/index.md b/docs/cn/guides/90-community/index.md index 41c93ec7fd..3feaefa3cc 100644 --- a/docs/cn/guides/90-community/index.md +++ b/docs/cn/guides/90-community/index.md @@ -20,6 +20,6 @@ title: 社区 - **Slack**: [加入我们的频道](https://link.databend.com/join-slack) 进行实时讨论。 - **GitHub**: [访问我们的仓库](https://github.com/databendlabs/databend) 并帮助开发 Databend。 -- **Twitter**: [关注我们](https://twitter.com/DatabendLabs) 获取更新和讨论。 +- **Twitter**: [关注我们](https://x.com/DatabendLabs) 获取更新和讨论。 - **LinkedIn**: [连接](https://www.linkedin.com/company/datafuselabs) 进行网络交流和新闻。 - **YouTube**: [订阅](https://www.youtube.com/@DatabendLabs) 获取教程和亮点。 diff --git a/docs/en/guides/90-community/index.md b/docs/en/guides/90-community/index.md index 3e1f1c08b1..16416414a3 100644 --- a/docs/en/guides/90-community/index.md +++ b/docs/en/guides/90-community/index.md @@ -20,6 +20,6 @@ Become part of our vibrant community, open to all data enthusiasts. Connect with - **Slack**: [Join our channel](https://link.databend.com/join-slack) for real-time discussions. - **GitHub**: [Visit our repository](https://github.com/databendlabs/databend) and help develop Databend. -- **Twitter**: [Follow us](https://twitter.com/DatabendLabs) for updates and discussions. +- **Twitter**: [Follow us](https://x.com/DatabendLabs) for updates and discussions. - **LinkedIn**: [Connect](https://www.linkedin.com/company/datafuselabs) for networking and news. - **YouTube**: [Subscribe](https://www.youtube.com/@DatabendLabs) for tutorials and highlights. diff --git a/docusaurus.config.ts b/docusaurus.config.ts index d07b1894a1..2b09a42102 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -227,7 +227,7 @@ const config: Config = { }, announcementBar: { id: "announcementBar-2", // Increment on change - content: `⭐️ If you like Databend, give it a star on GitHub and follow us on Twitter ${TwitterSvg}`, + content: `⭐️ If you like Databend, give it a star on GitHub and follow us on Twitter ${TwitterSvg}`, }, navbar: { title: "Databend", @@ -317,7 +317,7 @@ const config: Config = { }, { label: "Twitter", - href: "https://twitter.com/DatabendLabs", + href: "https://x.com/DatabendLabs", }, ], }, diff --git a/i18n/en/docusaurus-theme-classic/footer.json b/i18n/en/docusaurus-theme-classic/footer.json index b4c6a6002a..cd87383909 100644 --- a/i18n/en/docusaurus-theme-classic/footer.json +++ b/i18n/en/docusaurus-theme-classic/footer.json @@ -37,7 +37,7 @@ }, "link.item.label.Twitter": { "message": "Twitter", - "description": "The label of footer link with label=Twitter linking to https://twitter.com/DatabendLabs" + "description": "The label of footer link with label=Twitter linking to https://x.com/DatabendLabs" }, "link.item.label.GitHub": { "message": "GitHub", diff --git a/i18n/zh/docusaurus-theme-classic/footer.json b/i18n/zh/docusaurus-theme-classic/footer.json index 4df4740eaf..9b5e229b65 100644 --- a/i18n/zh/docusaurus-theme-classic/footer.json +++ b/i18n/zh/docusaurus-theme-classic/footer.json @@ -25,7 +25,7 @@ }, "link.item.label.Twitter": { "message": "Twitter", - "description": "The label of footer link with label=Twitter linking to https://twitter.com/DatabendLabs" + "description": "The label of footer link with label=Twitter linking to https://x.com/DatabendLabs" }, "copyright": { "message": "Copyright © 2023 Datafuse Labs, Inc. Built with Docusaurus.

", diff --git a/src/components/JoinCommunity/index.tsx b/src/components/JoinCommunity/index.tsx index b26658c638..740e43b5e2 100644 --- a/src/components/JoinCommunity/index.tsx +++ b/src/components/JoinCommunity/index.tsx @@ -79,7 +79,7 @@ const JoinCommunity: FC = ({ { icon: , title: "Twitter", - link: "https://twitter.com/DatabendLabs", + link: "https://x.com/DatabendLabs", }, { icon: , From 6bec467507a418bb37258a5a6df685a2c85bd7b9 Mon Sep 17 00:00:00 2001 From: BohuTANG Date: Thu, 2 Jan 2025 06:54:12 +0000 Subject: [PATCH 03/18] chore(docs): Update Release Notes - 2025-01-02 --- docs/release-stable/2025-01-02_v1.2.680.md | 595 +++++++++++++++++++++ 1 file changed, 595 insertions(+) create mode 100644 docs/release-stable/2025-01-02_v1.2.680.md diff --git a/docs/release-stable/2025-01-02_v1.2.680.md b/docs/release-stable/2025-01-02_v1.2.680.md new file mode 100644 index 0000000000..15bbe7db3b --- /dev/null +++ b/docs/release-stable/2025-01-02_v1.2.680.md @@ -0,0 +1,595 @@ +--- +title: v1.2.680 +tag: v1.2.680 +draft: true +prerelease: false +author: everpcpc +created: 2025-01-02T06:53:47Z +url: https://github.com/databendlabs/databend/releases/tag/untagged-1b11c0ceda233224ae41 +--- + + +## What's Changed +### Exciting New Features ✨ +* feat(query): optimize min/max aggregation use accurate column stats by @sundy-li in [#16270](https://github.com/databendlabs/databend/pull/16270) +* feat: new table option `data_retention_period_in_hours` by @dantengsky in [#16266](https://github.com/databendlabs/databend/pull/16266) +* feat(query): add config udf_server_allow_insecure by @everpcpc in [#16290](https://github.com/databendlabs/databend/pull/16290) +* feat(query): Inverted index search function support options by @b41sh in [#16256](https://github.com/databendlabs/databend/pull/16256) +* feat(geo): add geography data type by @forsaken628 in [#16286](https://github.com/databendlabs/databend/pull/16286) +* feat(query): Support create/drop dictionary ddl. by @Winnie-Hong0927 in [#16280](https://github.com/databendlabs/databend/pull/16280) +* feat: add endpoint /v1/session/logout and record client session ID in meta. by @youngsofun in [#16281](https://github.com/databendlabs/databend/pull/16281) +* feat(query): ST_GEOGRAPHYFROMEWKT by @forsaken628 in [#16302](https://github.com/databendlabs/databend/pull/16302) +* feat: support temporary table by @SkyFan2002 in [#16250](https://github.com/databendlabs/databend/pull/16250) +* feat(query): Add jq set returning function for processing Variant data with jq filters by @maxjustus in [#16288](https://github.com/databendlabs/databend/pull/16288) +* feat: Add `KVPbApi::get_id_and_value()` by @drmingdrmer in [#16325](https://github.com/databendlabs/databend/pull/16325) +* feat: Check essential permissions when creating table with external location by @dantengsky in [#16315](https://github.com/databendlabs/databend/pull/16315) +* feat(query): add is_local to admin /v1/tables info by @everpcpc in [#16329](https://github.com/databendlabs/databend/pull/16329) +* feat(query): add is_external to /v1/tables info by @everpcpc in [#16336](https://github.com/databendlabs/databend/pull/16336) +* feat(query): add plan cache by @sundy-li in [#16333](https://github.com/databendlabs/databend/pull/16333) +* feat: login and renew return session_token_validity_in_secs too. by @youngsofun in [#16313](https://github.com/databendlabs/databend/pull/16313) +* feat(query): add discovery nodes api by @zhang2014 in [#16353](https://github.com/databendlabs/databend/pull/16353) +* feat: hilbert clustering by @zhyass in [#16296](https://github.com/databendlabs/databend/pull/16296) +* feat: add error stack to ErrorCode by @andylokandy in [#16343](https://github.com/databendlabs/databend/pull/16343) +* feat: support vacuum temporary table by @SkyFan2002 in [#16364](https://github.com/databendlabs/databend/pull/16364) +* feat: http handler support temp table. by @youngsofun in [#16375](https://github.com/databendlabs/databend/pull/16375) +* feat: batch size hint of stream consumption by @zhyass in [#16372](https://github.com/databendlabs/databend/pull/16372) +* feat(query): make external server parallel by batch by @sundy-li in [#16390](https://github.com/databendlabs/databend/pull/16390) +* feat: estimate selectivity by table sample by @xudong963 in [#16362](https://github.com/databendlabs/databend/pull/16362) +* feat: introduce an intermediate version that is compatible with vacuum2 by @SkyFan2002 in [#16354](https://github.com/databendlabs/databend/pull/16354) +* feat(query): Procedure (Part1) by @TCeason in [#16348](https://github.com/databendlabs/databend/pull/16348) +* feat: add limit push down rule by @xudong963 in [#16403](https://github.com/databendlabs/databend/pull/16403) +* feat: discovery_nodes not need auth. by @youngsofun in [#16392](https://github.com/databendlabs/databend/pull/16392) +* feat(query): Support SHOW VARIABLES by @TCeason in [#16409](https://github.com/databendlabs/databend/pull/16409) +* feat: compact after merge sort by @zhyass in [#16401](https://github.com/databendlabs/databend/pull/16401) +* feat(query): Support access Redis data from dictionaries via the `dict_get` function. by @Winnie-Hong0927 in [#16389](https://github.com/databendlabs/databend/pull/16389) +* feat: continue vacuum drop table on per-table cleanup failures by @SkyFan2002 in [#16424](https://github.com/databendlabs/databend/pull/16424) +* feat: Load DATABEND_ENTERPRISE_LICENSE_EMBEDDED while building by @Xuanwo in [#16440](https://github.com/databendlabs/databend/pull/16440) +* feat(query): Support access Mysql data from dictionaries via the `dict_get` function. by @Winnie-Hong0927 in [#16444](https://github.com/databendlabs/databend/pull/16444) +* feat: Auto compact(re-cluster) for multiple table insertion statement by @SkyFan2002 in [#16443](https://github.com/databendlabs/databend/pull/16443) +* feat(query): Procedure Part2 support arguments by @TCeason in [#16453](https://github.com/databendlabs/databend/pull/16453) +* feat(query): refactor window spill by @Dousir9 in [#16448](https://github.com/databendlabs/databend/pull/16448) +* feat(query): push rank limit into aggregate partial node by @sundy-li in [#16466](https://github.com/databendlabs/databend/pull/16466) +* feat: add eliminate union optimizer rule by @xudong963 in [#16478](https://github.com/databendlabs/databend/pull/16478) +* feat(query): parallel k way merge sort by @forsaken628 in [#16340](https://github.com/databendlabs/databend/pull/16340) +* feat: add fast path for cross join to optimize tpcds q23 (~50x) by @xudong963 in [#16504](https://github.com/databendlabs/databend/pull/16504) +* feat(catalog): ignore error when listing databases by @BohuTANG in [#16514](https://github.com/databendlabs/databend/pull/16514) +* feat: limit stage name to plain_identifier by @youngsofun in [#16522](https://github.com/databendlabs/databend/pull/16522) +* feat(query): Initial implementation of postgres-compatible number `to_char` function by @forsaken628 in [#16507](https://github.com/databendlabs/databend/pull/16507) +* feat(query): Procedure support drop if exists and create or replace by @TCeason in [#16500](https://github.com/databendlabs/databend/pull/16500) +* feat(query): DATE_ADD Functions to support week as a unit by @TracyZYJ in [#16530](https://github.com/databendlabs/databend/pull/16530) +* feat: http handler add X-DATABEND-VERSION in each response. by @youngsofun in [#16518](https://github.com/databendlabs/databend/pull/16518) +* feat: short sql length setting by @arkzuse in [#16502](https://github.com/databendlabs/databend/pull/16502) +* feat: unset table options by @dantengsky in [#16544](https://github.com/databendlabs/databend/pull/16544) +* feat(query): window partition by spill to disk by @forsaken628 in [#16441](https://github.com/databendlabs/databend/pull/16441) +* feat(query): Simplified version Pattern S/L/D/G for number `to_char` by @forsaken628 in [#16569](https://github.com/databendlabs/databend/pull/16569) +* feat(query): add json array lambda functions by @sundy-li in [#16573](https://github.com/databendlabs/databend/pull/16573) +* feat(query): support `describe user` statement by @b41sh in [#16579](https://github.com/databendlabs/databend/pull/16579) +* feat: copy option 'pattern' support variable. by @youngsofun in [#16525](https://github.com/databendlabs/databend/pull/16525) +* feat(query): support json array functions by @b41sh in [#16571](https://github.com/databendlabs/databend/pull/16571) +* feat(query): add date_diff function by @chagelo in [#16560](https://github.com/databendlabs/databend/pull/16560) +* feat(query): Reduce serialisation memory usage when spilling to local disk by @forsaken628 in [#16580](https://github.com/databendlabs/databend/pull/16580) +* feat(query): Support `show dictionaries` DQL. by @Winnie-Hong0927 in [#16602](https://github.com/databendlabs/databend/pull/16602) +* feat: support sampling table with block and row level simultaneously by @xudong963 in [#16613](https://github.com/databendlabs/databend/pull/16613) +* feat: add unload options `overwrite`, `include_query_id` and `use_raw_path`. by @youngsofun in [#16614](https://github.com/databendlabs/databend/pull/16614) +* feat(function): Add mode Aggregate function. by @Freejww in [#16627](https://github.com/databendlabs/databend/pull/16627) +* feat(query): Support use parquet format when spilling by @forsaken628 in [#16612](https://github.com/databendlabs/databend/pull/16612) +* feat(query): support `json_object_insert` function by @b41sh in [#16636](https://github.com/databendlabs/databend/pull/16636) +* feat: http handler support request forwarding. by @youngsofun in [#16637](https://github.com/databendlabs/databend/pull/16637) +* feat: Implemented a new sql `explain analyze graphical` by @Maricaya in [#16543](https://github.com/databendlabs/databend/pull/16543) +* feat: add deterministic block level sampling for small datasets by @xudong963 in [#16670](https://github.com/databendlabs/databend/pull/16670) +* feat: support explain decorrelated plan by @xudong963 in [#16681](https://github.com/databendlabs/databend/pull/16681) +* feat: add ARRAY_SIZE alias for ARRAY_LENGTH by @ding-young in [#16685](https://github.com/databendlabs/databend/pull/16685) +* feat(query): support `json_object_delete` and `json_object_pick` function by @b41sh in [#16682](https://github.com/databendlabs/databend/pull/16682) +* feat: Bump OpenDAL to 0.50.1 by @Xuanwo in [#16661](https://github.com/databendlabs/databend/pull/16661) +* feat: support map lambda functions by @Dragonliu2018 in [#16683](https://github.com/databendlabs/databend/pull/16683) +* feat(query): add api /v1/verify by @everpcpc in [#16665](https://github.com/databendlabs/databend/pull/16665) +* feat: support calculating table storage size(including time travel) by @SkyFan2002 in [#16698](https://github.com/databendlabs/databend/pull/16698) +* feat(query): add table function udf_echo && expose more metrics of udf client by @sundy-li in [#16696](https://github.com/databendlabs/databend/pull/16696) +* feat(query): Settings clause by @TCeason in [#16669](https://github.com/databendlabs/databend/pull/16669) +* feat: implement `is_not_null` selectivity based on null count in stats by @xudong963 in [#16730](https://github.com/databendlabs/databend/pull/16730) +* feat: HTTP handler use cookie to pass session id to and from clients. by @youngsofun in [#16735](https://github.com/databendlabs/databend/pull/16735) +* feat: impl opendal::HttpFetch for StorageHttpClient by @everpcpc in [#16738](https://github.com/databendlabs/databend/pull/16738) +* feat(query): function about convert_timezone #16177 by @florann in [#16181](https://github.com/databendlabs/databend/pull/16181) +* feat(functions): add new function: map_pick by @hanxuanliang in [#15573](https://github.com/databendlabs/databend/pull/15573) +* feat(metrics): new storage_http_requests_count by @everpcpc in [#16769](https://github.com/databendlabs/databend/pull/16769) +* feat(functions): add map_insert function by @hanxuanliang in [#15567](https://github.com/databendlabs/databend/pull/15567) +* feat: filter null value before join by @xudong963 in [#16722](https://github.com/databendlabs/databend/pull/16722) +* feat(query): Support rename dictionary ddl. by @Winnie-Hong0927 in [#16754](https://github.com/databendlabs/databend/pull/16754) +* feat(query): add last_day, previous_day, next_day function by @Freejww in [#16740](https://github.com/databendlabs/databend/pull/16740) +* feat: implement StringColumn using StringViewArray by @andylokandy in [#16610](https://github.com/databendlabs/databend/pull/16610) +* feat: Implement WAL-based RaftLog storage by @drmingdrmer in [#16776](https://github.com/databendlabs/databend/pull/16776) +* feat(query): expand trim/ltrim/rtrim by @TCeason in [#16802](https://github.com/databendlabs/databend/pull/16802) +* feat: support pushdown predicate into iceberg engine by @sundy-li in [#16650](https://github.com/databendlabs/databend/pull/16650) +* feat(query): TopN window operator by @forsaken628 in [#16726](https://github.com/databendlabs/databend/pull/16726) +* feat(query): support SHOW DROP DATABASES by @TCeason in [#16811](https://github.com/databendlabs/databend/pull/16811) +* feat: uuid function from v4 to v7 by @BohuTANG in [#16827](https://github.com/databendlabs/databend/pull/16827) +* feat: refine the rule `PushDownFilterWindowTopN` in case top n is equal to 0. by @forsaken628 in [#16830](https://github.com/databendlabs/databend/pull/16830) +* feat: add aws glue as an iceberg connection type by @Rowlandev in [#16824](https://github.com/databendlabs/databend/pull/16824) +* feat(query): add distributed pruning settings by @zhang2014 in [#16864](https://github.com/databendlabs/databend/pull/16864) +* feat: databend-meta adds more metrics about raft-log by @drmingdrmer in [#16884](https://github.com/databendlabs/databend/pull/16884) +* feat(query): speed up fetching redis data from dictionaries via mget. by @Dragonliu2018 in [#16766](https://github.com/databendlabs/databend/pull/16766) +* feat(query): add new function TO_TIMESTAMP by @TCeason in [#16924](https://github.com/databendlabs/databend/pull/16924) +* feat: disable specifying copy options when create stage. by @youngsofun in [#16925](https://github.com/databendlabs/databend/pull/16925) +* feat(doc): Introducing Databend Guru on Gurubase.io by @kursataktas in [#16773](https://github.com/databendlabs/databend/pull/16773) +* feat(query): Support geometry relation functions by @b41sh in [#16927](https://github.com/databendlabs/databend/pull/16927) +* feat(query): virtual column allow cast to other type by @b41sh in [#16903](https://github.com/databendlabs/databend/pull/16903) +* feat: copy support option COLUMN_MATCH_MODE by @youngsofun in [#16963](https://github.com/databendlabs/databend/pull/16963) +* feat(query): speed up fetching mysql data from dictionaries via batch processing. by @Dragonliu2018 in [#16948](https://github.com/databendlabs/databend/pull/16948) +* feat: Support USE CATALOG syntax and current_catalog() function by @flashmouse in [#16926](https://github.com/databendlabs/databend/pull/16926) +* feat(query): Support `st_collect` aggregate function by @b41sh in [#16996](https://github.com/databendlabs/databend/pull/16996) +* feat(query): Support `flight_connection_max_retry_times` and `flight_connection_retry_interval` setting by @b41sh in [#16856](https://github.com/databendlabs/databend/pull/16856) +* feat: show dropped table and data_retention_time_in_hours in fuse_tim… by @SkyFan2002 in [#17015](https://github.com/databendlabs/databend/pull/17015) +* feat(rbac): add GrantObject::Warehouse by @TCeason in [#17029](https://github.com/databendlabs/databend/pull/17029) +* feat(query): partition sort spill by @forsaken628 in [#16987](https://github.com/databendlabs/databend/pull/16987) +* feat: support vacuum leaked table data by @SkyFan2002 in [#17022](https://github.com/databendlabs/databend/pull/17022) +* feat(query): `to_binary` function support variant, bitmap, geometry, geography types by @b41sh in [#17026](https://github.com/databendlabs/databend/pull/17026) +* feat(query): add interval type by @TCeason in [#16990](https://github.com/databendlabs/databend/pull/16990) +* feat: add key prefix count assertions to transactions by @drmingdrmer in [#17053](https://github.com/databendlabs/databend/pull/17053) +* feat(query): null type infer as Nullabel(String) by default in create as statement by @TCeason in [#17052](https://github.com/databendlabs/databend/pull/17052) +* feat(query): support global network policy by @everpcpc in [#17050](https://github.com/databendlabs/databend/pull/17050) +* feat(query): add config network_policy_whitelist by @everpcpc in [#17065](https://github.com/databendlabs/databend/pull/17065) +* feat(query): pre-check cast type by @andylokandy in [#16836](https://github.com/databendlabs/databend/pull/16836) +* feat(functions): add jaro_winkler string similarity function by @maxjustus in [#16993](https://github.com/databendlabs/databend/pull/16993) +* feat(query): add config jwks_refresh_interval & jwks_refresh_timeout by @everpcpc in [#17087](https://github.com/databendlabs/databend/pull/17087) +* feat: databend-meta transaction support generic bool-expression and else-if chain by @drmingdrmer in [#17064](https://github.com/databendlabs/databend/pull/17064) +* feat(query): refactor vacuum temp files by @sundy-li in [#17089](https://github.com/databendlabs/databend/pull/17089) +* refactor: Serialize iceberg table inside engine options to reduce catalog requests by @Xuanwo in [#17049](https://github.com/databendlabs/databend/pull/17049) +* feat(query): support interval function by @TCeason in [#17093](https://github.com/databendlabs/databend/pull/17093) +* feat: new settings `stream_consume_batch_size_hint` by @dantengsky in [#17102](https://github.com/databendlabs/databend/pull/17102) +* feat(query): support javascript/python script User Defined Aggregate Function by @forsaken628 in [#17054](https://github.com/databendlabs/databend/pull/17054) +* feat: databend-meta watch API provides `initial_flush` field by @drmingdrmer in [#17098](https://github.com/databendlabs/databend/pull/17098) +* feat(query): support javascript/python script User Defined Aggregate Function by @forsaken628 in [#17108](https://github.com/databendlabs/databend/pull/17108) +* feat(query): support interval 'string' by @TCeason in [#17105](https://github.com/databendlabs/databend/pull/17105) +* feat(query): Add `external_block_rows` metrics by @b41sh in [#17116](https://github.com/databendlabs/databend/pull/17116) +* feat: support vacuum leaked table data (#17022)-Revert by @dantengsky in [#17123](https://github.com/databendlabs/databend/pull/17123) +### Thoughtful Bug Fix 🔧 +* fix: max_wait_time in http handler not work when result set is large … by @youngsofun in [#16267](https://github.com/databendlabs/databend/pull/16267) +* fix(query): enable distribute query for system log table by @zhang2014 in [#16300](https://github.com/databendlabs/databend/pull/16300) +* fix(query): fix child_has_window by @sundy-li in [#16301](https://github.com/databendlabs/databend/pull/16301) +* fix: uri path used as both path and root. by @youngsofun in [#16321](https://github.com/databendlabs/databend/pull/16321) +* fix: vacuum dry run should carry on when target objects are missing by @dantengsky in [#16322](https://github.com/databendlabs/databend/pull/16322) +* fix(query): fix session leak in ctas by @zhang2014 in [#16337](https://github.com/databendlabs/databend/pull/16337) +* fix: When Replacing column mask, old `name->id->value` should be completely deleted by @drmingdrmer in [#16328](https://github.com/databendlabs/databend/pull/16328) +* fix: reduce sample possibility to avoid flaky test by @xudong963 in [#16330](https://github.com/databendlabs/databend/pull/16330) +* fix(query): fix IFNULL by @sundy-li in [#16339](https://github.com/databendlabs/databend/pull/16339) +* fix(query): fix wrong result for join system tables in cluster mode by @zhang2014 in [#16342](https://github.com/databendlabs/databend/pull/16342) +* fix(query): fix try cast by @sundy-li in [#16341](https://github.com/databendlabs/databend/pull/16341) +* fix(query): fix binary default string by @sundy-li in [#16345](https://github.com/databendlabs/databend/pull/16345) +* fix: push filter down join with materialized cte by @xudong963 in [#16349](https://github.com/databendlabs/databend/pull/16349) +* fix(query): fix aggregate panic in cluster mode by @zhang2014 in [#16319](https://github.com/databendlabs/databend/pull/16319) +* fix(query): fix incorrect alias of select items by @sundy-li in [#16368](https://github.com/databendlabs/databend/pull/16368) +* fix: separate sessions for temporary tables with memory engine by @SkyFan2002 in [#16374](https://github.com/databendlabs/databend/pull/16374) +* fix(executor): enable backpressure for union all by @zhang2014 in [#16388](https://github.com/databendlabs/databend/pull/16388) +* fix: hilbert_index function panic by @zhyass in [#16393](https://github.com/databendlabs/databend/pull/16393) +* fix(iceberg): Handling options like "s3.region" by @Xuanwo in [#16404](https://github.com/databendlabs/databend/pull/16404) +* fix: non-default catalog should not call get_table_function by @Xuanwo in [#16410](https://github.com/databendlabs/databend/pull/16410) +* fix(query): fix stack overflow for optimizer by @zhang2014 in [#16420](https://github.com/databendlabs/databend/pull/16420) +* fix: add custom (de)serialization methods for special float value by @dqhl76 in [#16258](https://github.com/databendlabs/databend/pull/16258) +* fix: table lock flaky test by @zhyass in [#16429](https://github.com/databendlabs/databend/pull/16429) +* fix(query): The columns permission of the system library is misjudged. by @TCeason in [#16431](https://github.com/databendlabs/databend/pull/16431) +* fix: restore parser backrtace when map_res failed by @andylokandy in [#16434](https://github.com/databendlabs/databend/pull/16434) +* fix(iceberg): Table desc should allow nested db_name by @Xuanwo in [#16414](https://github.com/databendlabs/databend/pull/16414) +* fix: split if block too big during append by @zhyass in [#16435](https://github.com/databendlabs/databend/pull/16435) +* fix: flaky test 09_0036_merge_into_without_dist by @dantengsky in [#16457](https://github.com/databendlabs/databend/pull/16457) +* fix: wrong order by result by @xudong963 in [#16422](https://github.com/databendlabs/databend/pull/16422) +* fix: Multi-thread recreate view/table gives error by @zhyass in [#16465](https://github.com/databendlabs/databend/pull/16465) +* fix: log query detail and profile with identical format by @everpcpc in [#16469](https://github.com/databendlabs/databend/pull/16469) +* fix: revert log format breakage from #16249 by @andylokandy in [#16470](https://github.com/databendlabs/databend/pull/16470) +* fix: typo for query & profile logging config by @everpcpc in [#16476](https://github.com/databendlabs/databend/pull/16476) +* chore: add extra bracket for `and` and `or` to make explain clear by @xudong963 in [#16494](https://github.com/databendlabs/databend/pull/16494) +* fix(query): fix planner cache cause modify async function does not take effect by @b41sh in [#16510](https://github.com/databendlabs/databend/pull/16510) +* fix: `ignore_result` doesn't have an effect on union by @xudong963 in [#16515](https://github.com/databendlabs/databend/pull/16515) +* fix(query): fix copy into table with disable distributed copy into by @zhang2014 in [#16529](https://github.com/databendlabs/databend/pull/16529) +* fix(query): fix column leaf_index by @Dousir9 in [#16537](https://github.com/databendlabs/databend/pull/16537) +* fix: Only when all tables are included, the db can be dropped by @drmingdrmer in [#16539](https://github.com/databendlabs/databend/pull/16539) +* fix: move TableInfo building out of SchemaApi by @drmingdrmer in [#16548](https://github.com/databendlabs/databend/pull/16548) +* fix: identify failed vacuum db by id by @drmingdrmer in [#16553](https://github.com/databendlabs/databend/pull/16553) +* fix(query): fix json object compare cause panic by @b41sh in [#16555](https://github.com/databendlabs/databend/pull/16555) +* fix: direct io syscall not available on mac by @forsaken628 in [#16574](https://github.com/databendlabs/databend/pull/16574) +* fix: window in scalar subquery returns wrong results by @xudong963 in [#16567](https://github.com/databendlabs/databend/pull/16567) +* fix: avoid eliminating the left child of union in `RuleEliminateUnion` by @xudong963 in [#16584](https://github.com/databendlabs/databend/pull/16584) +* fix(query): fix inverted index panic caused by null value by @b41sh in [#16576](https://github.com/databendlabs/databend/pull/16576) +* fix(query): fix cannot obtain stack trace when segmentation fault by @zhang2014 in [#16566](https://github.com/databendlabs/databend/pull/16566) +* fix: merge into panic by @zhyass in [#16581](https://github.com/databendlabs/databend/pull/16581) +* fix(query): list_dictionaries should not ignore db_id by @TCeason in [#16587](https://github.com/databendlabs/databend/pull/16587) +* fix(iceberg): Make sure iceberg table has been loaded by @Xuanwo in [#16593](https://github.com/databendlabs/databend/pull/16593) +* fix: Disable `prewhere` for iceberg table for now by @Xuanwo in [#16597](https://github.com/databendlabs/databend/pull/16597) +* fix(query): fix left outer join wrong result by @Dousir9 in [#16601](https://github.com/databendlabs/databend/pull/16601) +* fix: subquery returns wrong results under cluster by @xudong963 in [#16606](https://github.com/databendlabs/databend/pull/16606) +* fix(query): ntile frame should be unbounded by @TCeason in [#16604](https://github.com/databendlabs/databend/pull/16604) +* fix: lock mgr may failed to release lock in time by @dantengsky in [#16611](https://github.com/databendlabs/databend/pull/16611) +* fix(query): support subquery in pivot by @Dragonliu2018 in [#16631](https://github.com/databendlabs/databend/pull/16631) +* fix(query): check_timestamp/date -> clamp_timestamp/date by @TCeason in [#16634](https://github.com/databendlabs/databend/pull/16634) +* fix: deadlock in table lock by @zhyass in [#16632](https://github.com/databendlabs/databend/pull/16632) +* fix(query): sort spilling use arrow file format painc by @forsaken628 in [#16658](https://github.com/databendlabs/databend/pull/16658) +* fix(query): create table need fail if storage format is invalid by @TCeason in [#16663](https://github.com/databendlabs/databend/pull/16663) +* fix(query): forbid explain explain statement by @TCeason in [#16654](https://github.com/databendlabs/databend/pull/16654) +* fix(storage): fix refresh virtual column using async api by @b41sh in [#16656](https://github.com/databendlabs/databend/pull/16656) +* fix(query): insert with long sql parse error by @sundy-li in [#16678](https://github.com/databendlabs/databend/pull/16678) +* fix(ci): flaky test by @zhyass in [#16664](https://github.com/databendlabs/databend/pull/16664) +* fix: insert long sql again by @sundy-li in [#16684](https://github.com/databendlabs/databend/pull/16684) +* fix(query): sort spilling may hang by @forsaken628 in [#16672](https://github.com/databendlabs/databend/pull/16672) +* fix: `JEAllocator` should properly handle nullptr returned by @dantengsky in [#16692](https://github.com/databendlabs/databend/pull/16692) +* fix(metrics): use f64::MAX as histogram bound to display +Inf properly by @flaneur2020 in [#16701](https://github.com/databendlabs/databend/pull/16701) +* fix(query): use custom connector for udf client by @everpcpc in [#16697](https://github.com/databendlabs/databend/pull/16697) +* fix: MetaGrpcClient deadlock when drop by @drmingdrmer in [#16727](https://github.com/databendlabs/databend/pull/16727) +* fix: date_add/sub need respect timezone by @TCeason in [#16721](https://github.com/databendlabs/databend/pull/16721) +* fix(query): remove single quotes for system.columns comment by @TCeason in [#16732](https://github.com/databendlabs/databend/pull/16732) +* fix: HTTP handle lost rows when result set is wide and large. by @youngsofun in [#16748](https://github.com/databendlabs/databend/pull/16748) +* fix: keep column statistics of all NULL column by @dantengsky in [#16753](https://github.com/databendlabs/databend/pull/16753) +* fix: `Files::remove_file_in_batch` should not swallow errors by @dantengsky in [#16761](https://github.com/databendlabs/databend/pull/16761) +* fix(query): add tls config for udf client by @everpcpc in [#16782](https://github.com/databendlabs/databend/pull/16782) +* fix: token and cookie session id miss match. by @youngsofun in [#16786](https://github.com/databendlabs/databend/pull/16786) +* fix: clustering_information panic if string domain is none by @zhyass in [#16792](https://github.com/databendlabs/databend/pull/16792) +* fix(query): fix broken file log layout by @zhang2014 in [#16803](https://github.com/databendlabs/databend/pull/16803) +* fix: re-ensure dir before upgrading by @drmingdrmer in [#16805](https://github.com/databendlabs/databend/pull/16805) +* fix: purge may not work on tables after a flash back operation by @SkyFan2002 in [#16812](https://github.com/databendlabs/databend/pull/16812) +* fix(storage): recluster endless loop by @zhyass in [#16831](https://github.com/databendlabs/databend/pull/16831) +* fix: incorrect table data disk cache key by @dantengsky in [#16837](https://github.com/databendlabs/databend/pull/16837) +* fix(query): fix group by with alias column can't bind the column by @b41sh in [#16804](https://github.com/databendlabs/databend/pull/16804) +* fix(cluster): fix the possibility of connection leak when the cluster state is broken. by @zhang2014 in [#16842](https://github.com/databendlabs/databend/pull/16842) +* fix(query): fix aggregator_groups_builder to work with string view by @sundy-li in [#16843](https://github.com/databendlabs/databend/pull/16843) +* fix(query): check storage request method with arg list-type by @everpcpc in [#16849](https://github.com/databendlabs/databend/pull/16849) +* fix: replace risky `dma_buffer_as_vec` implementations by @forsaken628 in [#16829](https://github.com/databendlabs/databend/pull/16829) +* fix(query): fix and check total_buffer_len and total_bytes_len by @sundy-li in [#16854](https://github.com/databendlabs/databend/pull/16854) +* fix: raft-log wont write when exceeding 256M by @drmingdrmer in [#16876](https://github.com/databendlabs/databend/pull/16876) +* fix(query): fix distinct set-returning function by @b41sh in [#16883](https://github.com/databendlabs/databend/pull/16883) +* fix(query): fix incorrect total_bytes_len in string view by @sundy-li in [#16877](https://github.com/databendlabs/databend/pull/16877) +* fix: StreamVersionMismatched when using CTAS in multi statement trans… by @SkyFan2002 in [#16889](https://github.com/databendlabs/databend/pull/16889) +* fix(ci): flaky test by @zhyass in [#16898](https://github.com/databendlabs/databend/pull/16898) +* fix(storge): write progress in compact hook by @zhyass in [#16901](https://github.com/databendlabs/databend/pull/16901) +* fix: ensure atomicity in create_lock_revision by @zhyass in [#16907](https://github.com/databendlabs/databend/pull/16907) +* fix: dropped temporary table should not be shown in system.temporary_tables by @SkyFan2002 in [#16911](https://github.com/databendlabs/databend/pull/16911) +* fix(query): join predict use cast_expr_to_non_null_boolean by @sundy-li in [#16937](https://github.com/databendlabs/databend/pull/16937) +* fix(ci): flaky test by @zhyass in [#16933](https://github.com/databendlabs/databend/pull/16933) +* fix(query): add_hours function may panic if the argument is too big by @TCeason in [#16929](https://github.com/databendlabs/databend/pull/16929) +* fix: lock attach table's snapshot location by @dantengsky in [#16952](https://github.com/databendlabs/databend/pull/16952) +* fix(ci): fix release dbg upload path by @zhang2014 in [#16958](https://github.com/databendlabs/databend/pull/16958) +* fix(query): make memory engine as non-local table by @sundy-li in [#16955](https://github.com/databendlabs/databend/pull/16955) +* fix: solve some inconsistencies between code and comments by @YichiZhang0613 in [#16974](https://github.com/databendlabs/databend/pull/16974) +* fix: fix segfault in list_domain by @forsaken628 in [#16979](https://github.com/databendlabs/databend/pull/16979) +* fix(query): keep remaining_predicates when filtering grouping sets by @sundy-li in [#16971](https://github.com/databendlabs/databend/pull/16971) +* fix(query): fix bug while mysql external dictionary table contains null values by @Dragonliu2018 in [#16978](https://github.com/databendlabs/databend/pull/16978) +* fix(sqlparser): fix order by followed by scalar by @chagelo in [#16967](https://github.com/databendlabs/databend/pull/16967) +* fix(query): group by item allow set returning functions by @b41sh in [#16986](https://github.com/databendlabs/databend/pull/16986) +* fix: http handler set cookie only when cookie_enabled=true. by @youngsofun in [#16992](https://github.com/databendlabs/databend/pull/16992) +* fix: need_sticky field was incorrectly set to true. by @youngsofun in [#16997](https://github.com/databendlabs/databend/pull/16997) +* fix(ci): fix benchmark ci failure by @zhang2014 in [#17005](https://github.com/databendlabs/databend/pull/17005) +* fix: insert and mutation progress by @zhyass in [#17014](https://github.com/databendlabs/databend/pull/17014) +* fix(query): reuse connection to fix dictionary mysql flaky test by @b41sh in [#17016](https://github.com/databendlabs/databend/pull/17016) +* fix(ci): flaky test by @zhyass in [#17030](https://github.com/databendlabs/databend/pull/17030) +* fix: filter push down union in r cte by @xudong963 in [#17031](https://github.com/databendlabs/databend/pull/17031) +* fix: drop channel if partition receiver finished by @dqhl76 in [#17037](https://github.com/databendlabs/databend/pull/17037) +* fix: handle trailing zeros in Raft log WAL with EXT4 writeback mode by @drmingdrmer in [#17042](https://github.com/databendlabs/databend/pull/17042) +* fix(query): fix read small parquet files in cluster mode by @sundy-li in [#17063](https://github.com/databendlabs/databend/pull/17063) +* fix(query): fix thread leak by @zhang2014 in [#17077](https://github.com/databendlabs/databend/pull/17077) +* fix(query): fix thread leak and remove all usage by @dqhl76 in [#17081](https://github.com/databendlabs/databend/pull/17081) +* fix: change tracking stream failed by @zhyass in [#17072](https://github.com/databendlabs/databend/pull/17072) +* fix(query): fix join on not null column cause panic by @b41sh in [#17069](https://github.com/databendlabs/databend/pull/17069) +* fix: create as query respect ddl_column_type_nullable by @TCeason in [#17071](https://github.com/databendlabs/databend/pull/17071) +* fix: check if the table option is valid according to the engine by @SkyFan2002 in [#17076](https://github.com/databendlabs/databend/pull/17076) +* fix(ci): flaky test by @zhyass in [#17090](https://github.com/databendlabs/databend/pull/17090) +* fix(query): double panic if broken state in block builder by @zhang2014 in [#17091](https://github.com/databendlabs/databend/pull/17091) +* fix(query): Correct sign extension handling in months_days_micros struct by @TCeason in [#17086](https://github.com/databendlabs/databend/pull/17086) +* fix(query): union all panic in mysql client by @zhyass in [#17095](https://github.com/databendlabs/databend/pull/17095) +* fix: name resolution bug in case-sensitive mode by @zhyass in [#17097](https://github.com/databendlabs/databend/pull/17097) +* fix(query): fix a number of bugs in the spill config. by @forsaken628 in [#17103](https://github.com/databendlabs/databend/pull/17103) +* fix(query): uri path should not be percent-encoded by @youngsofun in [#17109](https://github.com/databendlabs/databend/pull/17109) +* fix(query): fix default values of `SpillConfig` may not take effect by @forsaken628 in [#17113](https://github.com/databendlabs/databend/pull/17113) +* fix(query): table field data type in `show create table` incorrect by @forsaken628 in [#17112](https://github.com/databendlabs/databend/pull/17112) +* fix(query): fix udf script return type is arrow `DataType::LargeList` caused failed by @b41sh in [#17127](https://github.com/databendlabs/databend/pull/17127) +* fix: ignore case when matching function name by @notauserx in [#16912](https://github.com/databendlabs/databend/pull/16912) +* fix: analyze table contain keyword bug by @zhyass in [#17131](https://github.com/databendlabs/databend/pull/17131) +* fix(query): Disabled the shrink_scalar optimization for cast expressions during the resolve procedure args by @TCeason in [#17119](https://github.com/databendlabs/databend/pull/17119) +* fix(log): prefix_filter not working. by @youngsofun in [#17136](https://github.com/databendlabs/databend/pull/17136) +### Code Refactor 🎉 +* refactor: replace absolute expiration time with relative TTL in schema API by @drmingdrmer in [#16268](https://github.com/databendlabs/databend/pull/16268) +* refactor(query): remove lru cache meter by @zhang2014 in [#16260](https://github.com/databendlabs/databend/pull/16260) +* refactor: Use global http client to share the connection pool by @Xuanwo in [#16276](https://github.com/databendlabs/databend/pull/16276) +* refactor(query): refactor hash join spill by @Dousir9 in [#15746](https://github.com/databendlabs/databend/pull/15746) +* refactor: change `DatabaseInfo.meta` to `SeqV` by @drmingdrmer in [#16295](https://github.com/databendlabs/databend/pull/16295) +* refactor: change value of meta-service key `DatabaseNameIdent` from `DatabaseId` to `Id` by @drmingdrmer in [#16299](https://github.com/databendlabs/databend/pull/16299) +* refactor: adopt `get_pb()` for get_background_task by @drmingdrmer in [#16308](https://github.com/databendlabs/databend/pull/16308) +* refactor: Reduce parallelism when vacuuming dropped tables by @dantengsky in [#16312](https://github.com/databendlabs/databend/pull/16312) +* refactor(query): add setting external_server_request_retry_times by @sundy-li in [#16307](https://github.com/databendlabs/databend/pull/16307) +* refactor(query): refactor bind set returning functions by @b41sh in [#16316](https://github.com/databendlabs/databend/pull/16316) +* refactor(query): add config enable_meta_data_upgrade_json_to_pb_from_v307 by @TCeason in [#16306](https://github.com/databendlabs/databend/pull/16306) +* refactor: add associated type kvapi::Value::KeyType by @drmingdrmer in [#16320](https://github.com/databendlabs/databend/pull/16320) +* refactor: kv-app-errors does not need serde by @drmingdrmer in [#16324](https://github.com/databendlabs/databend/pull/16324) +* refactor(query): refactor bind async functions by @b41sh in [#16331](https://github.com/databendlabs/databend/pull/16331) +* refactor: Catalog Manager API improvements for create and drop operations by @drmingdrmer in [#16338](https://github.com/databendlabs/databend/pull/16338) +* refactor: Add BaseApi to abstract usually used meta-service access pattern by @drmingdrmer in [#16351](https://github.com/databendlabs/databend/pull/16351) +* refactor: simplify SchemaApi::list_indexes(), get_index() list_background_jobs() by @drmingdrmer in [#16357](https://github.com/databendlabs/databend/pull/16357) +* chore(query): optimize window sort by @sundy-li in [#16355](https://github.com/databendlabs/databend/pull/16355) +* chore(query): reduce hash join memory usage by @Dousir9 in [#16359](https://github.com/databendlabs/databend/pull/16359) +* refactor: simplify drop_index() with NameIdValueApi by @drmingdrmer in [#16366](https://github.com/databendlabs/databend/pull/16366) +* refactor: simplify dictionary API by @drmingdrmer in [#16371](https://github.com/databendlabs/databend/pull/16371) +* refactor: Add item count check to `KVPbApi::get_pb_stream()` by @drmingdrmer in [#16377](https://github.com/databendlabs/databend/pull/16377) +* refactor(query): optimize show drop tables by @TCeason in [#16370](https://github.com/databendlabs/databend/pull/16370) +* chore(query): Simplified sort simple rows implementation by @forsaken628 in [#16382](https://github.com/databendlabs/databend/pull/16382) +* refactor(query): refactor some codes of parquet2 by @sundy-li in [#16386](https://github.com/databendlabs/databend/pull/16386) +* refactor: remove all share related functions by @drmingdrmer in [#16383](https://github.com/databendlabs/databend/pull/16383) +* refactor: replace get_pb_value() with get_pb() by @drmingdrmer in [#16395](https://github.com/databendlabs/databend/pull/16395) +* refactor: Add NameValueApi, simplify virtual column APIs by @drmingdrmer in [#16398](https://github.com/databendlabs/databend/pull/16398) +* refactor: simplify catalog API by @drmingdrmer in [#16406](https://github.com/databendlabs/databend/pull/16406) +* refactor: Simplify table lock API. by @drmingdrmer in [#16413](https://github.com/databendlabs/databend/pull/16413) +* chore(query): introduce EmptyResultScan plan by @sundy-li in [#16411](https://github.com/databendlabs/databend/pull/16411) +* refactor: remove unused `TableInfo.tenant` by @drmingdrmer in [#16416](https://github.com/databendlabs/databend/pull/16416) +* refactor: simplify least-visible-time schema API, add LeastVisibleTimeIdent by @drmingdrmer in [#16418](https://github.com/databendlabs/databend/pull/16418) +* refactor: add mget_id_value_compat() by @drmingdrmer in [#16425](https://github.com/databendlabs/databend/pull/16425) +* refactor(query): first check privilege in SystemEngine get_full_data by @TCeason in [#16421](https://github.com/databendlabs/databend/pull/16421) +* chore(query): limit max concurrency of spill io requests by @zhang2014 in [#16442](https://github.com/databendlabs/databend/pull/16442) +* chore(query): make string to int respect behavior like PG by @sundy-li in [#16428](https://github.com/databendlabs/databend/pull/16428) +* refactor: simplify vacuum drop table handling by @drmingdrmer in [#16446](https://github.com/databendlabs/databend/pull/16446) +* chore: use logforth to replace fern by @andylokandy in [#16249](https://github.com/databendlabs/databend/pull/16249) +* refactor(executor): use event cause to refactor shuffle processor by @zhang2014 in [#16445](https://github.com/databendlabs/databend/pull/16445) +* refactor: cleanup logic to get tables to vacuum by @drmingdrmer in [#16450](https://github.com/databendlabs/databend/pull/16450) +* refactor: enhancements of HTTP client session. by @youngsofun in [#16452](https://github.com/databendlabs/databend/pull/16452) +* refactor(query): sort kernel optimization by @sundy-li in [#16458](https://github.com/databendlabs/databend/pull/16458) +* refactor(storage): improve inverted index read fst file first to reduce load index by @b41sh in [#16385](https://github.com/databendlabs/databend/pull/16385) +* refactor: refactor vacuum by @drmingdrmer in [#16454](https://github.com/databendlabs/databend/pull/16454) +* chore: simplify get_sequence() and get_sequence_next_value() by @drmingdrmer in [#16463](https://github.com/databendlabs/databend/pull/16463) +* refactor: add DatabaseMeta.gc_in_progress by @drmingdrmer in [#16464](https://github.com/databendlabs/databend/pull/16464) +* refactor(query): use pipeline exchange to refactor window scatter by @zhang2014 in [#16471](https://github.com/databendlabs/databend/pull/16471) +* refactor(query): simplify expression kernel by @sundy-li in [#16482](https://github.com/databendlabs/databend/pull/16482) +* refactor: add KVPbCrudApi as abstraction layer for commonly used CRUD operations by @drmingdrmer in [#16479](https://github.com/databendlabs/databend/pull/16479) +* refactor: add KVPbCrudApi::crud_try_insert() and crud_try_upsert() by @drmingdrmer in [#16484](https://github.com/databendlabs/databend/pull/16484) +* refactor: SchemaApi::list_databases() by @drmingdrmer in [#16485](https://github.com/databendlabs/databend/pull/16485) +* refactor: SchemaApi::get_database_history() by @drmingdrmer in [#16487](https://github.com/databendlabs/databend/pull/16487) +* refactor: test SchemaApi::get_tenant_history_database() by @drmingdrmer in [#16488](https://github.com/databendlabs/databend/pull/16488) +* refactor(query): refactor license manager by @zhang2014 in [#16489](https://github.com/databendlabs/databend/pull/16489) +* refactor(query): refactor license manager by @zhang2014 in [#16492](https://github.com/databendlabs/databend/pull/16492) +* refactor: simplify `DroppedId`. Replace manual comparison with string comparison by @drmingdrmer in [#16495](https://github.com/databendlabs/databend/pull/16495) +* refactor: update dependency datafusion-orc. by @youngsofun in [#16491](https://github.com/databendlabs/databend/pull/16491) +* refactor: get_tableinfos_by_ids() by @drmingdrmer in [#16503](https://github.com/databendlabs/databend/pull/16503) +* chore(query): refactor like function by @sundy-li in [#16493](https://github.com/databendlabs/databend/pull/16493) +* chore: simplify SchemaApi::truncate_table() by @drmingdrmer in [#16506](https://github.com/databendlabs/databend/pull/16506) +* refactor: remove get_pb_value() by @drmingdrmer in [#16516](https://github.com/databendlabs/databend/pull/16516) +* refactor: Output whole error message with source while retry by @Xuanwo in [#16519](https://github.com/databendlabs/databend/pull/16519) +* refactor: unify path of write segment by @SkyFan2002 in [#16517](https://github.com/databendlabs/databend/pull/16517) +* refactor: Improve gc_dropped_table_by_id() method by @drmingdrmer in [#16528](https://github.com/databendlabs/databend/pull/16528) +* refactor: dropped table listing and GC by @drmingdrmer in [#16531](https://github.com/databendlabs/databend/pull/16531) +* refactor: gc_dropped_db_by_id() by @drmingdrmer in [#16538](https://github.com/databendlabs/databend/pull/16538) +* refactor: SchemaAPI::do_get_table_history by @drmingdrmer in [#16540](https://github.com/databendlabs/databend/pull/16540) +* refactor: `DroppedId` for listing db/tables for gc by @drmingdrmer in [#16542](https://github.com/databendlabs/databend/pull/16542) +* refactor: `get_history_tables_for_gc()` should not return `TableInfo`, but just table name, id and values by @drmingdrmer in [#16545](https://github.com/databendlabs/databend/pull/16545) +* refactor(storage): improve inverted index match phrase query by @b41sh in [#16547](https://github.com/databendlabs/databend/pull/16547) +* refactor: Automatically chunk large key sets in KVPbApi methods by @drmingdrmer in [#16561](https://github.com/databendlabs/databend/pull/16561) +* refactor: simplify get_tables_history() by @drmingdrmer in [#16572](https://github.com/databendlabs/databend/pull/16572) +* refactor(iceberg): Use iceberg file IO instead of our own operator by @Xuanwo in [#16577](https://github.com/databendlabs/databend/pull/16577) +* refactor: add SchemaApi::get_table_in_db by @drmingdrmer in [#16582](https://github.com/databendlabs/databend/pull/16582) +* refactor: SchemaApi::get_table_meta_history() by @drmingdrmer in [#16586](https://github.com/databendlabs/databend/pull/16586) +* refactor: fix error message. by @youngsofun in [#16578](https://github.com/databendlabs/databend/pull/16578) +* refactor(storage): inverted index use merge io to read data by @b41sh in [#16589](https://github.com/databendlabs/databend/pull/16589) +* refactor: isolate session_id and session states of diff users. by @youngsofun in [#16592](https://github.com/databendlabs/databend/pull/16592) +* refactor: Unify the set and unset structures by @TCeason in [#16622](https://github.com/databendlabs/databend/pull/16622) +* refactor(query): make delta table support partition prunning by @sundy-li in [#16621](https://github.com/databendlabs/databend/pull/16621) +* refactor(storage): inverted index support calculate the score by @b41sh in [#16609](https://github.com/databendlabs/databend/pull/16609) +* refactor: some http APIs do not need sticky. by @youngsofun in [#16644](https://github.com/databendlabs/databend/pull/16644) +* refactor: delete user_procedure and refactor procedure interpreter by @TCeason in [#16532](https://github.com/databendlabs/databend/pull/16532) +* refactor(query): use arrow-flight to exchange datas by @sundy-li in [#16657](https://github.com/databendlabs/databend/pull/16657) +* refactor: refine cast variant to map by @andylokandy in [#16691](https://github.com/databendlabs/databend/pull/16691) +* refactor: streamline system.temp_files table scan by @dantengsky in [#16659](https://github.com/databendlabs/databend/pull/16659) +* refactor: Align versions for arrow, opendal, hyper, tonic, prost by @Xuanwo in [#16704](https://github.com/databendlabs/databend/pull/16704) +* refactor: refine column statistic map serialization by @dantengsky in [#16728](https://github.com/databendlabs/databend/pull/16728) +* refactor: MetaGrpcClient needs to specify timeout to auto-reconnect to restarted server by @drmingdrmer in [#16733](https://github.com/databendlabs/databend/pull/16733) +* refactor: replace direct GitHub dependencies with published crates.io versions by @drmingdrmer in [#16700](https://github.com/databendlabs/databend/pull/16700) +* refactor: Enforce all deps must be declared at root by @Xuanwo in [#16741](https://github.com/databendlabs/databend/pull/16741) +* refactor: Remove not used `async-std` by @Xuanwo in [#16745](https://github.com/databendlabs/databend/pull/16745) +* refactor: change blocking pruning process to non-blocking channel by @dqhl76 in [#16718](https://github.com/databendlabs/databend/pull/16718) +* refactor: ensure last-purged log-id cursor in exported from databend-meta service by @drmingdrmer in [#16759](https://github.com/databendlabs/databend/pull/16759) +* refactor: Consolidate `MetaStorageError` variants by @drmingdrmer in [#16760](https://github.com/databendlabs/databend/pull/16760) +* refactor(storage): refactor read virtual columns by @b41sh in [#16758](https://github.com/databendlabs/databend/pull/16758) +* refactor: remove `location_prefix`, which is no longer supported by @dantengsky in [#16757](https://github.com/databendlabs/databend/pull/16757) +* refactor(base): add stacktrace to replace backtrace by @zhang2014 in [#16643](https://github.com/databendlabs/databend/pull/16643) +* refactor: when upgrading, do not import already purged garbage log entries by @drmingdrmer in [#16809](https://github.com/databendlabs/databend/pull/16809) +* refactor: align metrics field names with current behavior by @drmingdrmer in [#16826](https://github.com/databendlabs/databend/pull/16826) +* refactor(base): support stacktrace in cluster mode by @zhang2014 in [#16821](https://github.com/databendlabs/databend/pull/16821) +* refactor: refactor cte binder and fix materialized cte used in subquery by @xudong963 in [#16785](https://github.com/databendlabs/databend/pull/16785) +* refactor: remove EmbeddedMeta by @drmingdrmer in [#16847](https://github.com/databendlabs/databend/pull/16847) +* refactor: remove unused sled related codes by @drmingdrmer in [#16857](https://github.com/databendlabs/databend/pull/16857) +* refactor: make ListKV non-blocking by returning stream directly by @drmingdrmer in [#16868](https://github.com/databendlabs/databend/pull/16868) +* refactor: optimize query system.tables when query single table by @TCeason in [#16869](https://github.com/databendlabs/databend/pull/16869) +* refactor(query): refactor geometry functions by @b41sh in [#16870](https://github.com/databendlabs/databend/pull/16870) +* refactor: use jiff crate replace chrono in date/timestamp func by @TCeason in [#16787](https://github.com/databendlabs/databend/pull/16787) +* refactor: add new raft-log metrics to "metactl status" response by @drmingdrmer in [#16899](https://github.com/databendlabs/databend/pull/16899) +* refactor: remove obsolete gRPC read API by @drmingdrmer in [#16909](https://github.com/databendlabs/databend/pull/16909) +* refactor: deprecate: Operation::AsIs and will be removed by @drmingdrmer in [#16913](https://github.com/databendlabs/databend/pull/16913) +* refactor(sqlsmith): refactor sqlsmith using http client by @b41sh in [#16890](https://github.com/databendlabs/databend/pull/16890) +* refactor: remove ValueRef and use Value instead by @andylokandy in [#16891](https://github.com/databendlabs/databend/pull/16891) +* refactor: make test_watch_expired_events() less sensitive to inaccurate time by @drmingdrmer in [#16966](https://github.com/databendlabs/databend/pull/16966) +* refactor: use temp table to refactor materialized cte by @xudong963 in [#16900](https://github.com/databendlabs/databend/pull/16900) +* refactor: set path of cookie. by @youngsofun in [#17008](https://github.com/databendlabs/databend/pull/17008) +* refactor: replace `RangeMap` with `span-map` for better range lookup by @drmingdrmer in [#17006](https://github.com/databendlabs/databend/pull/17006) +* refactor: revert pr #16869 by @TCeason in [#17012](https://github.com/databendlabs/databend/pull/17012) +* refactor: auto split large mget_database_names_by_ids into chunks with `KVPbApi::get_pb_values_vec()` by @drmingdrmer in [#17011](https://github.com/databendlabs/databend/pull/17011) +* refactor: mget db names and table names remove duplicate ids to avoid too many parameters by @b41sh in [#17013](https://github.com/databendlabs/databend/pull/17013) +* refactor: integrate fuse table block pruning into pipeline by @dqhl76 in [#16841](https://github.com/databendlabs/databend/pull/16841) +* refactor: optimize query system.tables when query single table (#16869) by @TCeason in [#17021](https://github.com/databendlabs/databend/pull/17021) +* refactor(cluster): refactor cluster for dyn cluster [part 1] by @zhang2014 in [#17023](https://github.com/databendlabs/databend/pull/17023) +* refactor(query): refactor udf server batch rows by @b41sh in [#17092](https://github.com/databendlabs/databend/pull/17092) +* refactor: set name for all runtime worker threads. by @youngsofun in [#17084](https://github.com/databendlabs/databend/pull/17084) +* refactor(query): refactor udf server connection reuse endpoint by @b41sh in [#17106](https://github.com/databendlabs/databend/pull/17106) +* refactor: simplify alter and drop cluster key logic by @zhyass in [#17128](https://github.com/databendlabs/databend/pull/17128) +* refactor: integrate segment pruning into pipeline by @dqhl76 in [#17126](https://github.com/databendlabs/databend/pull/17126) +### Build/Testing/CI Infra Changes 🔌 +* ci: Add iceberg tpch sqllogictests by @Xuanwo in [#16598](https://github.com/databendlabs/databend/pull/16598) +* ci: Enable incremental back to see how it works by @Xuanwo in [#16817](https://github.com/databendlabs/databend/pull/16817) +* ci: fix flaky test by @youngsofun in [#16945](https://github.com/databendlabs/databend/pull/16945) +* ci: ignore RUSTSEC-2024-0402. by @youngsofun in [#16998](https://github.com/databendlabs/databend/pull/16998) +### Documentation 📔 +* docs: add stream to readme by @BohuTANG in [#16810](https://github.com/databendlabs/databend/pull/16810) +### Others 📒 +* chore(query): add more snapshot/segment serde tests by @sundy-li in [#16273](https://github.com/databendlabs/databend/pull/16273) +* chore: Use tagged iceberg crates by @Xuanwo in [#16278](https://github.com/databendlabs/databend/pull/16278) +* chore: add a setting to decide if table sample is deterministic by @xudong963 in [#16275](https://github.com/databendlabs/databend/pull/16275) +* chore(ci): tmp disable sharing test by @everpcpc in [#16285](https://github.com/databendlabs/databend/pull/16285) +* chore(ci): flaky test by @zhyass in [#16207](https://github.com/databendlabs/databend/pull/16207) +* chore: replace condition and if_then with txn in txn methods by @drmingdrmer in [#16289](https://github.com/databendlabs/databend/pull/16289) +* chore(query): bump ast 0.0.3 by @sundy-li in [#16283](https://github.com/databendlabs/databend/pull/16283) +* chore(query): avoid create query context each auth by @zhang2014 in [#16279](https://github.com/databendlabs/databend/pull/16279) +* chore(query): remove unused parquet2 codes by @sundy-li in [#16282](https://github.com/databendlabs/databend/pull/16282) +* chore: add setting auto_compaction_segments_limit by @zhyass in [#16298](https://github.com/databendlabs/databend/pull/16298) +* chore: remove the log about if histogram exists by @xudong963 in [#16303](https://github.com/databendlabs/databend/pull/16303) +* chore: simplify create_data_mask by @drmingdrmer in [#16309](https://github.com/databendlabs/databend/pull/16309) +* chore(ci): adjust release time by @everpcpc in [#16334](https://github.com/databendlabs/databend/pull/16334) +* chore(query): explain ast work like explain syntax by @sundy-li in [#16335](https://github.com/databendlabs/databend/pull/16335) +* chore: support temporary table with memory engine by @SkyFan2002 in [#16332](https://github.com/databendlabs/databend/pull/16332) +* chore(query): improve project set by @Dousir9 in [#16326](https://github.com/databendlabs/databend/pull/16326) +* chore: remove unused serde impl by @drmingdrmer in [#16347](https://github.com/databendlabs/databend/pull/16347) +* chore: remove empty reply struct by @drmingdrmer in [#16350](https://github.com/databendlabs/databend/pull/16350) +* chore(query): fix window index out of range by @Dousir9 in [#16352](https://github.com/databendlabs/databend/pull/16352) +* chore: separate test run for temp_table suite by @SkyFan2002 in [#16358](https://github.com/databendlabs/databend/pull/16358) +* chore(code): update the version of gix-path in Cargo.lock by @Dousir9 in [#16365](https://github.com/databendlabs/databend/pull/16365) +* chore(ci): add internal test by @TCeason in [#16369](https://github.com/databendlabs/databend/pull/16369) +* chore: improve Debug and Display for DataId and TIdent by @drmingdrmer in [#16379](https://github.com/databendlabs/databend/pull/16379) +* chore: add logging for embedded meta test by @drmingdrmer in [#16384](https://github.com/databendlabs/databend/pull/16384) +* chore(ci): fix cargo clippy by @TCeason in [#16397](https://github.com/databendlabs/databend/pull/16397) +* chore: add error stack to cmd entrence by @andylokandy in [#16391](https://github.com/databendlabs/databend/pull/16391) +* chore(query): add external server request profile by @zhang2014 in [#16400](https://github.com/databendlabs/databend/pull/16400) +* chore(query): refactor udf retry by @sundy-li in [#16405](https://github.com/databendlabs/databend/pull/16405) +* chore(query): add connect duration metric for udf by @zhang2014 in [#16407](https://github.com/databendlabs/databend/pull/16407) +* chore: add join type for explain analyze partial by @xudong963 in [#16408](https://github.com/databendlabs/databend/pull/16408) +* chore: bump quinn-proto to 0.11.8 for cargo audit pass by @dqhl76 in [#16419](https://github.com/databendlabs/databend/pull/16419) +* chore(planner): improve infer filter by @Dousir9 in [#16361](https://github.com/databendlabs/databend/pull/16361) +* chore: log remote addr when meta-service raft API recevies a message by @drmingdrmer in [#16438](https://github.com/databendlabs/databend/pull/16438) +* chore(query): add column: system.tables.total_columns by @TCeason in [#16447](https://github.com/databendlabs/databend/pull/16447) +* chore(ci): fix dataset domain by @everpcpc in [#16455](https://github.com/databendlabs/databend/pull/16455) +* chore(ci): release with musl by @everpcpc in [#16460](https://github.com/databendlabs/databend/pull/16460) +* chore(executor): support for data exchange between different processors within the pipeline by @zhang2014 in [#16467](https://github.com/databendlabs/databend/pull/16467) +* chore(executor): more edge detail for executing graph by @zhang2014 in [#16468](https://github.com/databendlabs/databend/pull/16468) +* chore(ci): remove hdfs release by @everpcpc in [#16477](https://github.com/databendlabs/databend/pull/16477) +* chore(query): null first behavior by @sundy-li in [#16475](https://github.com/databendlabs/databend/pull/16475) +* chore: update nom-rule by @andylokandy in [#16483](https://github.com/databendlabs/databend/pull/16483) +* chore: bump proj4rs 0.1.4 by @b41sh in [#16474](https://github.com/databendlabs/databend/pull/16474) +* chore: remove logs from block writer by @dantengsky in [#16497](https://github.com/databendlabs/databend/pull/16497) +* chore: simplify get_gc_table_info() by @drmingdrmer in [#16499](https://github.com/databendlabs/databend/pull/16499) +* chore(query): replace to datafuse-extras/dtparse by @TCeason in [#16509](https://github.com/databendlabs/databend/pull/16509) +* chore(storage): hook recluster avoid scan all segments by @zhyass in [#16498](https://github.com/databendlabs/databend/pull/16498) +* chore: update source repo for async-compression by @everpcpc in [#16513](https://github.com/databendlabs/databend/pull/16513) +* chore(query): move recursion & backtrace crate to datafuse-extras by @zhang2014 in [#16520](https://github.com/databendlabs/databend/pull/16520) +* chore(query): add more asserts by @sundy-li in [#16536](https://github.com/databendlabs/databend/pull/16536) +* chore: update repo for workflows by @everpcpc in [#16546](https://github.com/databendlabs/databend/pull/16546) +* chore(storage): refactor compact source by @zhyass in [#16527](https://github.com/databendlabs/databend/pull/16527) +* chore(query): SHOW/DESC is not DDL by @TCeason in [#16583](https://github.com/databendlabs/databend/pull/16583) +* chore: check lock revision before watch delete by @zhyass in [#16590](https://github.com/databendlabs/databend/pull/16590) +* chore(ci): flaky test by @zhyass in [#16596](https://github.com/databendlabs/databend/pull/16596) +* chore(query): improve variable parser by @sundy-li in [#16599](https://github.com/databendlabs/databend/pull/16599) +* chore: refine table sample tests by @xudong963 in [#16600](https://github.com/databendlabs/databend/pull/16600) +* chore(query): add more logs on aggregation by @sundy-li in [#16552](https://github.com/databendlabs/databend/pull/16552) +* chore: reset recluster block size by @zhyass in [#16623](https://github.com/databendlabs/databend/pull/16623) +* chore(query): add http address info to cluster node info by @zhang2014 in [#16620](https://github.com/databendlabs/databend/pull/16620) +* chore: drop guard when acquire lock failed by @zhyass in [#16616](https://github.com/databendlabs/databend/pull/16616) +* chore: revert “lock mgr may failed to release lock in time (#16611)" by @dantengsky in [#16630](https://github.com/databendlabs/databend/pull/16630) +* chore(query): reduce unsafe codes in kernels by @sundy-li in [#16633](https://github.com/databendlabs/databend/pull/16633) +* chore(query): add warn log if vacuum temporary file is error by @zhang2014 in [#16646](https://github.com/databendlabs/databend/pull/16646) +* chore: resolve todo in dynamic sample by @xudong963 in [#16629](https://github.com/databendlabs/databend/pull/16629) +* chore(query): enable loser tree merge sort default by @forsaken628 in [#16649](https://github.com/databendlabs/databend/pull/16649) +* chore(query): replace `arrow2` with `arrow-rs` in `serialize_column` and `deserialize_column` by @forsaken628 in [#16655](https://github.com/databendlabs/databend/pull/16655) +* chore(query): remove hash join build detail status by @zhang2014 in [#16674](https://github.com/databendlabs/databend/pull/16674) +* chore: upon startup, meta-service output human-readable error if trying to open future version on-disk data by @drmingdrmer in [#16679](https://github.com/databendlabs/databend/pull/16679) +* chore(query): modify rbac test result display by @TCeason in [#16686](https://github.com/databendlabs/databend/pull/16686) +* chore: adjust default value of setting `max_storage_io_requests` by @SkyFan2002 in [#16680](https://github.com/databendlabs/databend/pull/16680) +* chore(query): returns nan for aggregate_kurtosis and aggregate_skewness by @sundy-li in [#16688](https://github.com/databendlabs/databend/pull/16688) +* chore: display port number on error from bind to port failure by @lyang24 in [#16695](https://github.com/databendlabs/databend/pull/16695) +* chore: remove `SortColumnDescription.is_nullable` by @forsaken628 in [#16699](https://github.com/databendlabs/databend/pull/16699) +* chore: remove transaction keyword by @SkyFan2002 in [#16707](https://github.com/databendlabs/databend/pull/16707) +* chore: add timeout for `detect_region` operation to prevent hanging request by @dantengsky in [#16709](https://github.com/databendlabs/databend/pull/16709) +* chore(query): add current_query_id and database id for admin api by @zhang2014 in [#16703](https://github.com/databendlabs/databend/pull/16703) +* chore(query): index scalar support variant by @sundy-li in [#16719](https://github.com/databendlabs/databend/pull/16719) +* chore: display log.file.limit and prefix_filter by @TCeason in [#16713](https://github.com/databendlabs/databend/pull/16713) +* chore: avoid returning error during computing binary comparison selectivity by @xudong963 in [#16725](https://github.com/databendlabs/databend/pull/16725) +* chore: Simplifying BlockMetaInfo Definitions by @forsaken628 in [#16716](https://github.com/databendlabs/databend/pull/16716) +* chore: tweak cargo feature "jemalloc" by @dantengsky in [#16693](https://github.com/databendlabs/databend/pull/16693) +* chore: remove flaky test by @TCeason in [#16739](https://github.com/databendlabs/databend/pull/16739) +* chore: refine vacuum by @dantengsky in [#16743](https://github.com/databendlabs/databend/pull/16743) +* chore: Remove not used dep `config` by @Xuanwo in [#16746](https://github.com/databendlabs/databend/pull/16746) +* chore(query): Introduce VecExt and SliceExt to check unsafe bounds in debug mode by @sundy-li in [#16747](https://github.com/databendlabs/databend/pull/16747) +* chore: make VACUUM TEMPORARY FILES killable by @dantengsky in [#16751](https://github.com/databendlabs/databend/pull/16751) +* chore: tweak batch deletion concurrency by @dantengsky in [#16770](https://github.com/databendlabs/databend/pull/16770) +* chore: refine raft-types import path by @drmingdrmer in [#16764](https://github.com/databendlabs/databend/pull/16764) +* chore: remove obsolete version by @everpcpc in [#16789](https://github.com/databendlabs/databend/pull/16789) +* chore: add snapshot location cache for attached table by @dantengsky in [#16795](https://github.com/databendlabs/databend/pull/16795) +* chore: update meta-service version info and compatibility doc by @drmingdrmer in [#16800](https://github.com/databendlabs/databend/pull/16800) +* chore(query): embedded public key of license by @zhang2014 in [#16813](https://github.com/databendlabs/databend/pull/16813) +* chore(query): refactor common/arrow removes arrow/io crates by @sundy-li in [#16808](https://github.com/databendlabs/databend/pull/16808) +* chore: purge dropped view metadata during vacuum by @dantengsky in [#16819](https://github.com/databendlabs/databend/pull/16819) +* chore(query): keep queries detail and profile log format by @zhang2014 in [#16822](https://github.com/databendlabs/databend/pull/16822) +* chore(ci): test with different license by @everpcpc in [#16815](https://github.com/databendlabs/databend/pull/16815) +* chore(base): rollback to kernel signal handler after dump backtrace by @zhang2014 in [#16828](https://github.com/databendlabs/databend/pull/16828) +* chore: remove unused codes by @zhyass in [#16834](https://github.com/databendlabs/databend/pull/16834) +* chore: fix typo in `ColumnCacheKeyBuilder` by @dantengsky in [#16838](https://github.com/databendlabs/databend/pull/16838) +* chore(cluster): disable parallel commit of cluster tasks by @zhang2014 in [#16851](https://github.com/databendlabs/databend/pull/16851) +* chore(query): remove SliceExt by @sundy-li in [#16853](https://github.com/databendlabs/databend/pull/16853) +* chore(ci): separate build profile by @everpcpc in [#16855](https://github.com/databendlabs/databend/pull/16855) +* chore(query): remove useless new line for query log by @zhang2014 in [#16860](https://github.com/databendlabs/databend/pull/16860) +* chore: add some log by @SkyFan2002 in [#16863](https://github.com/databendlabs/databend/pull/16863) +* chore(query): improve distributed runtime filter by @Dousir9 in [#16862](https://github.com/databendlabs/databend/pull/16862) +* chore: enable stderr logging for `table_meta_inspector` by @dantengsky in [#16865](https://github.com/databendlabs/databend/pull/16865) +* chore(query): remove common/arrow crate by @sundy-li in [#16846](https://github.com/databendlabs/databend/pull/16846) +* chore(ci): adjust runner size by @everpcpc in [#16879](https://github.com/databendlabs/databend/pull/16879) +* chore(settings): enable spill by @Dousir9 in [#16888](https://github.com/databendlabs/databend/pull/16888) +* chore: remove unused config_id from RaftConfig by @drmingdrmer in [#16902](https://github.com/databendlabs/databend/pull/16902) +* chore(ci): flaky test by @zhyass in [#16917](https://github.com/databendlabs/databend/pull/16917) +* chore(ci): enable overflow-checks in ci profile by @sundy-li in [#16895](https://github.com/databendlabs/databend/pull/16895) +* chore(ci): flaky test by @zhyass in [#16919](https://github.com/databendlabs/databend/pull/16919) +* chore(query): add snapshot logs in read partitions by @sundy-li in [#16918](https://github.com/databendlabs/databend/pull/16918) +* chore: bump rustls version 0.23.18 by @TCeason in [#16936](https://github.com/databendlabs/databend/pull/16936) +* chore(query): spilt binary symbol by @zhang2014 in [#16861](https://github.com/databendlabs/databend/pull/16861) +* chore: `k way merge sort` add boundary check to prevent process crash by @forsaken628 in [#16934](https://github.com/databendlabs/databend/pull/16934) +* chore(ci): remove aarch64 musl in release by @zhang2014 in [#16946](https://github.com/databendlabs/databend/pull/16946) +* chore(planner): improve cardinality estimation by @Dousir9 in [#16938](https://github.com/databendlabs/databend/pull/16938) +* chore(planner): refine project set cardinality by @Dousir9 in [#16944](https://github.com/databendlabs/databend/pull/16944) +* chore: support recursive cte with normal cte by @xudong963 in [#16932](https://github.com/databendlabs/databend/pull/16932) +* chore(binder): add enable_materialized_cte settings by @Dousir9 in [#16950](https://github.com/databendlabs/databend/pull/16950) +* chore(storage): hook compact avoid scan all segments by @zhyass in [#16954](https://github.com/databendlabs/databend/pull/16954) +* chore(storage): do compact before recluster during compact hook by @zhyass in [#16949](https://github.com/databendlabs/databend/pull/16949) +* chore(ci): upgrade bendsql by @everpcpc in [#16965](https://github.com/databendlabs/databend/pull/16965) +* chore(storage): refine error message for stream read offset snapshot by @zhyass in [#16964](https://github.com/databendlabs/databend/pull/16964) +* chore: bump ruzstd from 0.7.2 to 0.7.3 by @dqhl76 in [#16969](https://github.com/databendlabs/databend/pull/16969) +* chore(ci): install bendsql from packages by @everpcpc in [#16970](https://github.com/databendlabs/databend/pull/16970) +* chore(planner): improve physical join by @Dousir9 in [#16962](https://github.com/databendlabs/databend/pull/16962) +* chore(ci): fix some flaky test by @TCeason in [#16980](https://github.com/databendlabs/databend/pull/16980) +* chore(query): improve decimal aggregate state by @sundy-li in [#16983](https://github.com/databendlabs/databend/pull/16983) +* chore(planner): refine physical join by @Dousir9 in [#16988](https://github.com/databendlabs/databend/pull/16988) +* chore: adjust fuse_time_travel_size() by @SkyFan2002 in [#16995](https://github.com/databendlabs/databend/pull/16995) +* chore(ci): use new dsn for create database by @zhang2014 in [#16968](https://github.com/databendlabs/databend/pull/16968) +* chore(ci): rust toolchain 2024-11-28 build image by @sundy-li in [#17001](https://github.com/databendlabs/databend/pull/17001) +* chore(query): fix topk in native by @sundy-li in [#17003](https://github.com/databendlabs/databend/pull/17003) +* chore(query): bump up rust toolchain to 2024-11-28 by @sundy-li in [#16981](https://github.com/databendlabs/databend/pull/16981) +* chore: tweak attach table refreshing by @dantengsky in [#17019](https://github.com/databendlabs/databend/pull/17019) +* chore(query): remove old aggregate codes by @sundy-li in [#17025](https://github.com/databendlabs/databend/pull/17025) +* chore: add more test to meta-service txn value-matching by @drmingdrmer in [#17033](https://github.com/databendlabs/databend/pull/17033) +* chore(cluster): disable parallel commit for cluster task by @zhang2014 in [#17034](https://github.com/databendlabs/databend/pull/17034) +* chore: improve error handling in partition sending loop by @dqhl76 in [#17035](https://github.com/databendlabs/databend/pull/17035) +* chore(ci): remove musl release by @everpcpc in [#17041](https://github.com/databendlabs/databend/pull/17041) +* chore(query): improve comparison functions by @sundy-li in [#17032](https://github.com/databendlabs/databend/pull/17032) +* chore(binder): fix bind materialized cte by @Dousir9 in [#17046](https://github.com/databendlabs/databend/pull/17046) +* chore: refmt crash log message by @TCeason in [#17059](https://github.com/databendlabs/databend/pull/17059) +* chore: bump dtparse by @TCeason in [#17073](https://github.com/databendlabs/databend/pull/17073) +* chore: remove unused dev by @zhyass in [#17088](https://github.com/databendlabs/databend/pull/17088) +* chore(query): Revert "feat(query): support javascript/python script User Defined Aggregate Function" by @sundy-li in [#17107](https://github.com/databendlabs/databend/pull/17107) +* chore: add more log by @SkyFan2002 in [#17110](https://github.com/databendlabs/databend/pull/17110) +* chore(planner): fix except and intersect operation by @Dousir9 in [#17111](https://github.com/databendlabs/databend/pull/17111) +* chore(query): add fuzz tests by @sundy-li in [#17100](https://github.com/databendlabs/databend/pull/17100) +* chore(query): bump federated mysql version by @TCeason in [#17118](https://github.com/databendlabs/databend/pull/17118) +* chore(query): reduce-functions-code-expand by @sundy-li in [#17114](https://github.com/databendlabs/databend/pull/17114) +* chore(query): improve hook vacuum temp after query by @sundy-li in [#17125](https://github.com/databendlabs/databend/pull/17125) +* chore(query): bump enum-as-inner 0.6 by @forsaken628 in [#17120](https://github.com/databendlabs/databend/pull/17120) +* chore: rename default_cluster_key_id to cluster_key_seq by @zhyass in [#17135](https://github.com/databendlabs/databend/pull/17135) +* chore(query): fix udf metrics by @sundy-li in [#17134](https://github.com/databendlabs/databend/pull/17134) + +## New Contributors +* @arkzuse made their first contribution in [#16502](https://github.com/databendlabs/databend/pull/16502) +* @chagelo made their first contribution in [#16560](https://github.com/databendlabs/databend/pull/16560) +* @Dragonliu2018 made their first contribution in [#16631](https://github.com/databendlabs/databend/pull/16631) +* @Maricaya made their first contribution in [#16543](https://github.com/databendlabs/databend/pull/16543) +* @ding-young made their first contribution in [#16685](https://github.com/databendlabs/databend/pull/16685) +* @lyang24 made their first contribution in [#16695](https://github.com/databendlabs/databend/pull/16695) +* @florann made their first contribution in [#16181](https://github.com/databendlabs/databend/pull/16181) +* @Rowlandev made their first contribution in [#16824](https://github.com/databendlabs/databend/pull/16824) +* @kursataktas made their first contribution in [#16773](https://github.com/databendlabs/databend/pull/16773) +* @flashmouse made their first contribution in [#16926](https://github.com/databendlabs/databend/pull/16926) +* @notauserx made their first contribution in [#16912](https://github.com/databendlabs/databend/pull/16912) + +**Full Changelog**: https://github.com/databendlabs/databend/compare/v1.2.615...v1.2.680 From 04de21a5098e168ecfae79b246e4beb1c4dfb6dd Mon Sep 17 00:00:00 2001 From: Quan <787025321@qq.com> Date: Fri, 3 Jan 2025 14:22:29 +0800 Subject: [PATCH 04/18] fix: special sign --- docs/release-stable/2025-01-02_v1.2.680.md | 1174 ++++++++++---------- 1 file changed, 594 insertions(+), 580 deletions(-) diff --git a/docs/release-stable/2025-01-02_v1.2.680.md b/docs/release-stable/2025-01-02_v1.2.680.md index 15bbe7db3b..e847810b43 100644 --- a/docs/release-stable/2025-01-02_v1.2.680.md +++ b/docs/release-stable/2025-01-02_v1.2.680.md @@ -1,595 +1,609 @@ --- -title: v1.2.680 -tag: v1.2.680 -draft: true -prerelease: false -author: everpcpc -created: 2025-01-02T06:53:47Z -url: https://github.com/databendlabs/databend/releases/tag/untagged-1b11c0ceda233224ae41 +title: v1.2.680 +tag: v1.2.680 +draft: true +prerelease: false +author: everpcpc +created: 2025-01-02T06:53:47Z +url: https://github.com/databendlabs/databend/releases/tag/untagged-1b11c0ceda233224ae41 --- + ## What's Changed + ### Exciting New Features ✨ -* feat(query): optimize min/max aggregation use accurate column stats by @sundy-li in [#16270](https://github.com/databendlabs/databend/pull/16270) -* feat: new table option `data_retention_period_in_hours` by @dantengsky in [#16266](https://github.com/databendlabs/databend/pull/16266) -* feat(query): add config udf_server_allow_insecure by @everpcpc in [#16290](https://github.com/databendlabs/databend/pull/16290) -* feat(query): Inverted index search function support options by @b41sh in [#16256](https://github.com/databendlabs/databend/pull/16256) -* feat(geo): add geography data type by @forsaken628 in [#16286](https://github.com/databendlabs/databend/pull/16286) -* feat(query): Support create/drop dictionary ddl. by @Winnie-Hong0927 in [#16280](https://github.com/databendlabs/databend/pull/16280) -* feat: add endpoint /v1/session/logout and record client session ID in meta. by @youngsofun in [#16281](https://github.com/databendlabs/databend/pull/16281) -* feat(query): ST_GEOGRAPHYFROMEWKT by @forsaken628 in [#16302](https://github.com/databendlabs/databend/pull/16302) -* feat: support temporary table by @SkyFan2002 in [#16250](https://github.com/databendlabs/databend/pull/16250) -* feat(query): Add jq set returning function for processing Variant data with jq filters by @maxjustus in [#16288](https://github.com/databendlabs/databend/pull/16288) -* feat: Add `KVPbApi::get_id_and_value()` by @drmingdrmer in [#16325](https://github.com/databendlabs/databend/pull/16325) -* feat: Check essential permissions when creating table with external location by @dantengsky in [#16315](https://github.com/databendlabs/databend/pull/16315) -* feat(query): add is_local to admin /v1/tables info by @everpcpc in [#16329](https://github.com/databendlabs/databend/pull/16329) -* feat(query): add is_external to /v1/tables info by @everpcpc in [#16336](https://github.com/databendlabs/databend/pull/16336) -* feat(query): add plan cache by @sundy-li in [#16333](https://github.com/databendlabs/databend/pull/16333) -* feat: login and renew return session_token_validity_in_secs too. by @youngsofun in [#16313](https://github.com/databendlabs/databend/pull/16313) -* feat(query): add discovery nodes api by @zhang2014 in [#16353](https://github.com/databendlabs/databend/pull/16353) -* feat: hilbert clustering by @zhyass in [#16296](https://github.com/databendlabs/databend/pull/16296) -* feat: add error stack to ErrorCode by @andylokandy in [#16343](https://github.com/databendlabs/databend/pull/16343) -* feat: support vacuum temporary table by @SkyFan2002 in [#16364](https://github.com/databendlabs/databend/pull/16364) -* feat: http handler support temp table. by @youngsofun in [#16375](https://github.com/databendlabs/databend/pull/16375) -* feat: batch size hint of stream consumption by @zhyass in [#16372](https://github.com/databendlabs/databend/pull/16372) -* feat(query): make external server parallel by batch by @sundy-li in [#16390](https://github.com/databendlabs/databend/pull/16390) -* feat: estimate selectivity by table sample by @xudong963 in [#16362](https://github.com/databendlabs/databend/pull/16362) -* feat: introduce an intermediate version that is compatible with vacuum2 by @SkyFan2002 in [#16354](https://github.com/databendlabs/databend/pull/16354) -* feat(query): Procedure (Part1) by @TCeason in [#16348](https://github.com/databendlabs/databend/pull/16348) -* feat: add limit push down rule by @xudong963 in [#16403](https://github.com/databendlabs/databend/pull/16403) -* feat: discovery_nodes not need auth. by @youngsofun in [#16392](https://github.com/databendlabs/databend/pull/16392) -* feat(query): Support SHOW VARIABLES by @TCeason in [#16409](https://github.com/databendlabs/databend/pull/16409) -* feat: compact after merge sort by @zhyass in [#16401](https://github.com/databendlabs/databend/pull/16401) -* feat(query): Support access Redis data from dictionaries via the `dict_get` function. by @Winnie-Hong0927 in [#16389](https://github.com/databendlabs/databend/pull/16389) -* feat: continue vacuum drop table on per-table cleanup failures by @SkyFan2002 in [#16424](https://github.com/databendlabs/databend/pull/16424) -* feat: Load DATABEND_ENTERPRISE_LICENSE_EMBEDDED while building by @Xuanwo in [#16440](https://github.com/databendlabs/databend/pull/16440) -* feat(query): Support access Mysql data from dictionaries via the `dict_get` function. by @Winnie-Hong0927 in [#16444](https://github.com/databendlabs/databend/pull/16444) -* feat: Auto compact(re-cluster) for multiple table insertion statement by @SkyFan2002 in [#16443](https://github.com/databendlabs/databend/pull/16443) -* feat(query): Procedure Part2 support arguments by @TCeason in [#16453](https://github.com/databendlabs/databend/pull/16453) -* feat(query): refactor window spill by @Dousir9 in [#16448](https://github.com/databendlabs/databend/pull/16448) -* feat(query): push rank limit into aggregate partial node by @sundy-li in [#16466](https://github.com/databendlabs/databend/pull/16466) -* feat: add eliminate union optimizer rule by @xudong963 in [#16478](https://github.com/databendlabs/databend/pull/16478) -* feat(query): parallel k way merge sort by @forsaken628 in [#16340](https://github.com/databendlabs/databend/pull/16340) -* feat: add fast path for cross join to optimize tpcds q23 (~50x) by @xudong963 in [#16504](https://github.com/databendlabs/databend/pull/16504) -* feat(catalog): ignore error when listing databases by @BohuTANG in [#16514](https://github.com/databendlabs/databend/pull/16514) -* feat: limit stage name to plain_identifier by @youngsofun in [#16522](https://github.com/databendlabs/databend/pull/16522) -* feat(query): Initial implementation of postgres-compatible number `to_char` function by @forsaken628 in [#16507](https://github.com/databendlabs/databend/pull/16507) -* feat(query): Procedure support drop if exists and create or replace by @TCeason in [#16500](https://github.com/databendlabs/databend/pull/16500) -* feat(query): DATE_ADD Functions to support week as a unit by @TracyZYJ in [#16530](https://github.com/databendlabs/databend/pull/16530) -* feat: http handler add X-DATABEND-VERSION in each response. by @youngsofun in [#16518](https://github.com/databendlabs/databend/pull/16518) -* feat: short sql length setting by @arkzuse in [#16502](https://github.com/databendlabs/databend/pull/16502) -* feat: unset table options by @dantengsky in [#16544](https://github.com/databendlabs/databend/pull/16544) -* feat(query): window partition by spill to disk by @forsaken628 in [#16441](https://github.com/databendlabs/databend/pull/16441) -* feat(query): Simplified version Pattern S/L/D/G for number `to_char` by @forsaken628 in [#16569](https://github.com/databendlabs/databend/pull/16569) -* feat(query): add json array lambda functions by @sundy-li in [#16573](https://github.com/databendlabs/databend/pull/16573) -* feat(query): support `describe user` statement by @b41sh in [#16579](https://github.com/databendlabs/databend/pull/16579) -* feat: copy option 'pattern' support variable. by @youngsofun in [#16525](https://github.com/databendlabs/databend/pull/16525) -* feat(query): support json array functions by @b41sh in [#16571](https://github.com/databendlabs/databend/pull/16571) -* feat(query): add date_diff function by @chagelo in [#16560](https://github.com/databendlabs/databend/pull/16560) -* feat(query): Reduce serialisation memory usage when spilling to local disk by @forsaken628 in [#16580](https://github.com/databendlabs/databend/pull/16580) -* feat(query): Support `show dictionaries` DQL. by @Winnie-Hong0927 in [#16602](https://github.com/databendlabs/databend/pull/16602) -* feat: support sampling table with block and row level simultaneously by @xudong963 in [#16613](https://github.com/databendlabs/databend/pull/16613) -* feat: add unload options `overwrite`, `include_query_id` and `use_raw_path`. by @youngsofun in [#16614](https://github.com/databendlabs/databend/pull/16614) -* feat(function): Add mode Aggregate function. by @Freejww in [#16627](https://github.com/databendlabs/databend/pull/16627) -* feat(query): Support use parquet format when spilling by @forsaken628 in [#16612](https://github.com/databendlabs/databend/pull/16612) -* feat(query): support `json_object_insert` function by @b41sh in [#16636](https://github.com/databendlabs/databend/pull/16636) -* feat: http handler support request forwarding. by @youngsofun in [#16637](https://github.com/databendlabs/databend/pull/16637) -* feat: Implemented a new sql `explain analyze graphical` by @Maricaya in [#16543](https://github.com/databendlabs/databend/pull/16543) -* feat: add deterministic block level sampling for small datasets by @xudong963 in [#16670](https://github.com/databendlabs/databend/pull/16670) -* feat: support explain decorrelated plan by @xudong963 in [#16681](https://github.com/databendlabs/databend/pull/16681) -* feat: add ARRAY_SIZE alias for ARRAY_LENGTH by @ding-young in [#16685](https://github.com/databendlabs/databend/pull/16685) -* feat(query): support `json_object_delete` and `json_object_pick` function by @b41sh in [#16682](https://github.com/databendlabs/databend/pull/16682) -* feat: Bump OpenDAL to 0.50.1 by @Xuanwo in [#16661](https://github.com/databendlabs/databend/pull/16661) -* feat: support map lambda functions by @Dragonliu2018 in [#16683](https://github.com/databendlabs/databend/pull/16683) -* feat(query): add api /v1/verify by @everpcpc in [#16665](https://github.com/databendlabs/databend/pull/16665) -* feat: support calculating table storage size(including time travel) by @SkyFan2002 in [#16698](https://github.com/databendlabs/databend/pull/16698) -* feat(query): add table function udf_echo && expose more metrics of udf client by @sundy-li in [#16696](https://github.com/databendlabs/databend/pull/16696) -* feat(query): Settings clause by @TCeason in [#16669](https://github.com/databendlabs/databend/pull/16669) -* feat: implement `is_not_null` selectivity based on null count in stats by @xudong963 in [#16730](https://github.com/databendlabs/databend/pull/16730) -* feat: HTTP handler use cookie to pass session id to and from clients. by @youngsofun in [#16735](https://github.com/databendlabs/databend/pull/16735) -* feat: impl opendal::HttpFetch for StorageHttpClient by @everpcpc in [#16738](https://github.com/databendlabs/databend/pull/16738) -* feat(query): function about convert_timezone #16177 by @florann in [#16181](https://github.com/databendlabs/databend/pull/16181) -* feat(functions): add new function: map_pick by @hanxuanliang in [#15573](https://github.com/databendlabs/databend/pull/15573) -* feat(metrics): new storage_http_requests_count by @everpcpc in [#16769](https://github.com/databendlabs/databend/pull/16769) -* feat(functions): add map_insert function by @hanxuanliang in [#15567](https://github.com/databendlabs/databend/pull/15567) -* feat: filter null value before join by @xudong963 in [#16722](https://github.com/databendlabs/databend/pull/16722) -* feat(query): Support rename dictionary ddl. by @Winnie-Hong0927 in [#16754](https://github.com/databendlabs/databend/pull/16754) -* feat(query): add last_day, previous_day, next_day function by @Freejww in [#16740](https://github.com/databendlabs/databend/pull/16740) -* feat: implement StringColumn using StringViewArray by @andylokandy in [#16610](https://github.com/databendlabs/databend/pull/16610) -* feat: Implement WAL-based RaftLog storage by @drmingdrmer in [#16776](https://github.com/databendlabs/databend/pull/16776) -* feat(query): expand trim/ltrim/rtrim by @TCeason in [#16802](https://github.com/databendlabs/databend/pull/16802) -* feat: support pushdown predicate into iceberg engine by @sundy-li in [#16650](https://github.com/databendlabs/databend/pull/16650) -* feat(query): TopN window operator by @forsaken628 in [#16726](https://github.com/databendlabs/databend/pull/16726) -* feat(query): support SHOW DROP DATABASES by @TCeason in [#16811](https://github.com/databendlabs/databend/pull/16811) -* feat: uuid function from v4 to v7 by @BohuTANG in [#16827](https://github.com/databendlabs/databend/pull/16827) -* feat: refine the rule `PushDownFilterWindowTopN` in case top n is equal to 0. by @forsaken628 in [#16830](https://github.com/databendlabs/databend/pull/16830) -* feat: add aws glue as an iceberg connection type by @Rowlandev in [#16824](https://github.com/databendlabs/databend/pull/16824) -* feat(query): add distributed pruning settings by @zhang2014 in [#16864](https://github.com/databendlabs/databend/pull/16864) -* feat: databend-meta adds more metrics about raft-log by @drmingdrmer in [#16884](https://github.com/databendlabs/databend/pull/16884) -* feat(query): speed up fetching redis data from dictionaries via mget. by @Dragonliu2018 in [#16766](https://github.com/databendlabs/databend/pull/16766) -* feat(query): add new function TO_TIMESTAMP by @TCeason in [#16924](https://github.com/databendlabs/databend/pull/16924) -* feat: disable specifying copy options when create stage. by @youngsofun in [#16925](https://github.com/databendlabs/databend/pull/16925) -* feat(doc): Introducing Databend Guru on Gurubase.io by @kursataktas in [#16773](https://github.com/databendlabs/databend/pull/16773) -* feat(query): Support geometry relation functions by @b41sh in [#16927](https://github.com/databendlabs/databend/pull/16927) -* feat(query): virtual column allow cast to other type by @b41sh in [#16903](https://github.com/databendlabs/databend/pull/16903) -* feat: copy support option COLUMN_MATCH_MODE by @youngsofun in [#16963](https://github.com/databendlabs/databend/pull/16963) -* feat(query): speed up fetching mysql data from dictionaries via batch processing. by @Dragonliu2018 in [#16948](https://github.com/databendlabs/databend/pull/16948) -* feat: Support USE CATALOG syntax and current_catalog() function by @flashmouse in [#16926](https://github.com/databendlabs/databend/pull/16926) -* feat(query): Support `st_collect` aggregate function by @b41sh in [#16996](https://github.com/databendlabs/databend/pull/16996) -* feat(query): Support `flight_connection_max_retry_times` and `flight_connection_retry_interval` setting by @b41sh in [#16856](https://github.com/databendlabs/databend/pull/16856) -* feat: show dropped table and data_retention_time_in_hours in fuse_tim… by @SkyFan2002 in [#17015](https://github.com/databendlabs/databend/pull/17015) -* feat(rbac): add GrantObject::Warehouse by @TCeason in [#17029](https://github.com/databendlabs/databend/pull/17029) -* feat(query): partition sort spill by @forsaken628 in [#16987](https://github.com/databendlabs/databend/pull/16987) -* feat: support vacuum leaked table data by @SkyFan2002 in [#17022](https://github.com/databendlabs/databend/pull/17022) -* feat(query): `to_binary` function support variant, bitmap, geometry, geography types by @b41sh in [#17026](https://github.com/databendlabs/databend/pull/17026) -* feat(query): add interval type by @TCeason in [#16990](https://github.com/databendlabs/databend/pull/16990) -* feat: add key prefix count assertions to transactions by @drmingdrmer in [#17053](https://github.com/databendlabs/databend/pull/17053) -* feat(query): null type infer as Nullabel(String) by default in create as statement by @TCeason in [#17052](https://github.com/databendlabs/databend/pull/17052) -* feat(query): support global network policy by @everpcpc in [#17050](https://github.com/databendlabs/databend/pull/17050) -* feat(query): add config network_policy_whitelist by @everpcpc in [#17065](https://github.com/databendlabs/databend/pull/17065) -* feat(query): pre-check cast type by @andylokandy in [#16836](https://github.com/databendlabs/databend/pull/16836) -* feat(functions): add jaro_winkler string similarity function by @maxjustus in [#16993](https://github.com/databendlabs/databend/pull/16993) -* feat(query): add config jwks_refresh_interval & jwks_refresh_timeout by @everpcpc in [#17087](https://github.com/databendlabs/databend/pull/17087) -* feat: databend-meta transaction support generic bool-expression and else-if chain by @drmingdrmer in [#17064](https://github.com/databendlabs/databend/pull/17064) -* feat(query): refactor vacuum temp files by @sundy-li in [#17089](https://github.com/databendlabs/databend/pull/17089) -* refactor: Serialize iceberg table inside engine options to reduce catalog requests by @Xuanwo in [#17049](https://github.com/databendlabs/databend/pull/17049) -* feat(query): support interval function by @TCeason in [#17093](https://github.com/databendlabs/databend/pull/17093) -* feat: new settings `stream_consume_batch_size_hint` by @dantengsky in [#17102](https://github.com/databendlabs/databend/pull/17102) -* feat(query): support javascript/python script User Defined Aggregate Function by @forsaken628 in [#17054](https://github.com/databendlabs/databend/pull/17054) -* feat: databend-meta watch API provides `initial_flush` field by @drmingdrmer in [#17098](https://github.com/databendlabs/databend/pull/17098) -* feat(query): support javascript/python script User Defined Aggregate Function by @forsaken628 in [#17108](https://github.com/databendlabs/databend/pull/17108) -* feat(query): support interval 'string' by @TCeason in [#17105](https://github.com/databendlabs/databend/pull/17105) -* feat(query): Add `external_block_rows` metrics by @b41sh in [#17116](https://github.com/databendlabs/databend/pull/17116) -* feat: support vacuum leaked table data (#17022)-Revert by @dantengsky in [#17123](https://github.com/databendlabs/databend/pull/17123) + +- feat(query): optimize min/max aggregation use accurate column stats by @sundy-li in [#16270](https://github.com/databendlabs/databend/pull/16270) +- feat: new table option `data_retention_period_in_hours` by @dantengsky in [#16266](https://github.com/databendlabs/databend/pull/16266) +- feat(query): add config udf_server_allow_insecure by @everpcpc in [#16290](https://github.com/databendlabs/databend/pull/16290) +- feat(query): Inverted index search function support options by @b41sh in [#16256](https://github.com/databendlabs/databend/pull/16256) +- feat(geo): add geography data type by @forsaken628 in [#16286](https://github.com/databendlabs/databend/pull/16286) +- feat(query): Support create/drop dictionary ddl. by @Winnie-Hong0927 in [#16280](https://github.com/databendlabs/databend/pull/16280) +- feat: add endpoint /v1/session/logout and record client session ID in meta. by @youngsofun in [#16281](https://github.com/databendlabs/databend/pull/16281) +- feat(query): ST_GEOGRAPHYFROMEWKT by @forsaken628 in [#16302](https://github.com/databendlabs/databend/pull/16302) +- feat: support temporary table by @SkyFan2002 in [#16250](https://github.com/databendlabs/databend/pull/16250) +- feat(query): Add jq set returning function for processing Variant data with jq filters by @maxjustus in [#16288](https://github.com/databendlabs/databend/pull/16288) +- feat: Add `KVPbApi::get_id_and_value()` by @drmingdrmer in [#16325](https://github.com/databendlabs/databend/pull/16325) +- feat: Check essential permissions when creating table with external location by @dantengsky in [#16315](https://github.com/databendlabs/databend/pull/16315) +- feat(query): add is_local to admin /v1/tables info by @everpcpc in [#16329](https://github.com/databendlabs/databend/pull/16329) +- feat(query): add is_external to /v1/tables info by @everpcpc in [#16336](https://github.com/databendlabs/databend/pull/16336) +- feat(query): add plan cache by @sundy-li in [#16333](https://github.com/databendlabs/databend/pull/16333) +- feat: login and renew return session_token_validity_in_secs too. by @youngsofun in [#16313](https://github.com/databendlabs/databend/pull/16313) +- feat(query): add discovery nodes api by @zhang2014 in [#16353](https://github.com/databendlabs/databend/pull/16353) +- feat: hilbert clustering by @zhyass in [#16296](https://github.com/databendlabs/databend/pull/16296) +- feat: add error stack to ErrorCode by @andylokandy in [#16343](https://github.com/databendlabs/databend/pull/16343) +- feat: support vacuum temporary table by @SkyFan2002 in [#16364](https://github.com/databendlabs/databend/pull/16364) +- feat: http handler support temp table. by @youngsofun in [#16375](https://github.com/databendlabs/databend/pull/16375) +- feat: batch size hint of stream consumption by @zhyass in [#16372](https://github.com/databendlabs/databend/pull/16372) +- feat(query): make external server parallel by batch by @sundy-li in [#16390](https://github.com/databendlabs/databend/pull/16390) +- feat: estimate selectivity by table sample by @xudong963 in [#16362](https://github.com/databendlabs/databend/pull/16362) +- feat: introduce an intermediate version that is compatible with vacuum2 by @SkyFan2002 in [#16354](https://github.com/databendlabs/databend/pull/16354) +- feat(query): Procedure (Part1) by @TCeason in [#16348](https://github.com/databendlabs/databend/pull/16348) +- feat: add limit push down rule by @xudong963 in [#16403](https://github.com/databendlabs/databend/pull/16403) +- feat: discovery_nodes not need auth. by @youngsofun in [#16392](https://github.com/databendlabs/databend/pull/16392) +- feat(query): Support SHOW VARIABLES by @TCeason in [#16409](https://github.com/databendlabs/databend/pull/16409) +- feat: compact after merge sort by @zhyass in [#16401](https://github.com/databendlabs/databend/pull/16401) +- feat(query): Support access Redis data from dictionaries via the `dict_get` function. by @Winnie-Hong0927 in [#16389](https://github.com/databendlabs/databend/pull/16389) +- feat: continue vacuum drop table on per-table cleanup failures by @SkyFan2002 in [#16424](https://github.com/databendlabs/databend/pull/16424) +- feat: Load DATABEND_ENTERPRISE_LICENSE_EMBEDDED while building by @Xuanwo in [#16440](https://github.com/databendlabs/databend/pull/16440) +- feat(query): Support access Mysql data from dictionaries via the `dict_get` function. by @Winnie-Hong0927 in [#16444](https://github.com/databendlabs/databend/pull/16444) +- feat: Auto compact(re-cluster) for multiple table insertion statement by @SkyFan2002 in [#16443](https://github.com/databendlabs/databend/pull/16443) +- feat(query): Procedure Part2 support arguments by @TCeason in [#16453](https://github.com/databendlabs/databend/pull/16453) +- feat(query): refactor window spill by @Dousir9 in [#16448](https://github.com/databendlabs/databend/pull/16448) +- feat(query): push rank limit into aggregate partial node by @sundy-li in [#16466](https://github.com/databendlabs/databend/pull/16466) +- feat: add eliminate union optimizer rule by @xudong963 in [#16478](https://github.com/databendlabs/databend/pull/16478) +- feat(query): parallel k way merge sort by @forsaken628 in [#16340](https://github.com/databendlabs/databend/pull/16340) +- feat: add fast path for cross join to optimize tpcds q23 (~50x) by @xudong963 in [#16504](https://github.com/databendlabs/databend/pull/16504) +- feat(catalog): ignore error when listing databases by @BohuTANG in [#16514](https://github.com/databendlabs/databend/pull/16514) +- feat: limit stage name to plain_identifier by @youngsofun in [#16522](https://github.com/databendlabs/databend/pull/16522) +- feat(query): Initial implementation of postgres-compatible number `to_char` function by @forsaken628 in [#16507](https://github.com/databendlabs/databend/pull/16507) +- feat(query): Procedure support drop if exists and create or replace by @TCeason in [#16500](https://github.com/databendlabs/databend/pull/16500) +- feat(query): DATE_ADD Functions to support week as a unit by @TracyZYJ in [#16530](https://github.com/databendlabs/databend/pull/16530) +- feat: http handler add X-DATABEND-VERSION in each response. by @youngsofun in [#16518](https://github.com/databendlabs/databend/pull/16518) +- feat: short sql length setting by @arkzuse in [#16502](https://github.com/databendlabs/databend/pull/16502) +- feat: unset table options by @dantengsky in [#16544](https://github.com/databendlabs/databend/pull/16544) +- feat(query): window partition by spill to disk by @forsaken628 in [#16441](https://github.com/databendlabs/databend/pull/16441) +- feat(query): Simplified version Pattern S/L/D/G for number `to_char` by @forsaken628 in [#16569](https://github.com/databendlabs/databend/pull/16569) +- feat(query): add json array lambda functions by @sundy-li in [#16573](https://github.com/databendlabs/databend/pull/16573) +- feat(query): support `describe user` statement by @b41sh in [#16579](https://github.com/databendlabs/databend/pull/16579) +- feat: copy option 'pattern' support variable. by @youngsofun in [#16525](https://github.com/databendlabs/databend/pull/16525) +- feat(query): support json array functions by @b41sh in [#16571](https://github.com/databendlabs/databend/pull/16571) +- feat(query): add date_diff function by @chagelo in [#16560](https://github.com/databendlabs/databend/pull/16560) +- feat(query): Reduce serialisation memory usage when spilling to local disk by @forsaken628 in [#16580](https://github.com/databendlabs/databend/pull/16580) +- feat(query): Support `show dictionaries` DQL. by @Winnie-Hong0927 in [#16602](https://github.com/databendlabs/databend/pull/16602) +- feat: support sampling table with block and row level simultaneously by @xudong963 in [#16613](https://github.com/databendlabs/databend/pull/16613) +- feat: add unload options `overwrite`, `include_query_id` and `use_raw_path`. by @youngsofun in [#16614](https://github.com/databendlabs/databend/pull/16614) +- feat(function): Add mode Aggregate function. by @Freejww in [#16627](https://github.com/databendlabs/databend/pull/16627) +- feat(query): Support use parquet format when spilling by @forsaken628 in [#16612](https://github.com/databendlabs/databend/pull/16612) +- feat(query): support `json_object_insert` function by @b41sh in [#16636](https://github.com/databendlabs/databend/pull/16636) +- feat: http handler support request forwarding. by @youngsofun in [#16637](https://github.com/databendlabs/databend/pull/16637) +- feat: Implemented a new sql `explain analyze graphical` by @Maricaya in [#16543](https://github.com/databendlabs/databend/pull/16543) +- feat: add deterministic block level sampling for small datasets by @xudong963 in [#16670](https://github.com/databendlabs/databend/pull/16670) +- feat: support explain decorrelated plan by @xudong963 in [#16681](https://github.com/databendlabs/databend/pull/16681) +- feat: add ARRAY_SIZE alias for ARRAY_LENGTH by @ding-young in [#16685](https://github.com/databendlabs/databend/pull/16685) +- feat(query): support `json_object_delete` and `json_object_pick` function by @b41sh in [#16682](https://github.com/databendlabs/databend/pull/16682) +- feat: Bump OpenDAL to 0.50.1 by @Xuanwo in [#16661](https://github.com/databendlabs/databend/pull/16661) +- feat: support map lambda functions by @Dragonliu2018 in [#16683](https://github.com/databendlabs/databend/pull/16683) +- feat(query): add api /v1/verify by @everpcpc in [#16665](https://github.com/databendlabs/databend/pull/16665) +- feat: support calculating table storage size(including time travel) by @SkyFan2002 in [#16698](https://github.com/databendlabs/databend/pull/16698) +- feat(query): add table function udf_echo && expose more metrics of udf client by @sundy-li in [#16696](https://github.com/databendlabs/databend/pull/16696) +- feat(query): Settings clause by @TCeason in [#16669](https://github.com/databendlabs/databend/pull/16669) +- feat: implement `is_not_null` selectivity based on null count in stats by @xudong963 in [#16730](https://github.com/databendlabs/databend/pull/16730) +- feat: HTTP handler use cookie to pass session id to and from clients. by @youngsofun in [#16735](https://github.com/databendlabs/databend/pull/16735) +- feat: impl opendal::HttpFetch for StorageHttpClient by @everpcpc in [#16738](https://github.com/databendlabs/databend/pull/16738) +- feat(query): function about convert_timezone #16177 by @florann in [#16181](https://github.com/databendlabs/databend/pull/16181) +- feat(functions): add new function: map_pick by @hanxuanliang in [#15573](https://github.com/databendlabs/databend/pull/15573) +- feat(metrics): new storage_http_requests_count by @everpcpc in [#16769](https://github.com/databendlabs/databend/pull/16769) +- feat(functions): add map_insert function by @hanxuanliang in [#15567](https://github.com/databendlabs/databend/pull/15567) +- feat: filter null value before join by @xudong963 in [#16722](https://github.com/databendlabs/databend/pull/16722) +- feat(query): Support rename dictionary ddl. by @Winnie-Hong0927 in [#16754](https://github.com/databendlabs/databend/pull/16754) +- feat(query): add last_day, previous_day, next_day function by @Freejww in [#16740](https://github.com/databendlabs/databend/pull/16740) +- feat: implement StringColumn using StringViewArray by @andylokandy in [#16610](https://github.com/databendlabs/databend/pull/16610) +- feat: Implement WAL-based RaftLog storage by @drmingdrmer in [#16776](https://github.com/databendlabs/databend/pull/16776) +- feat(query): expand trim/ltrim/rtrim by @TCeason in [#16802](https://github.com/databendlabs/databend/pull/16802) +- feat: support pushdown predicate into iceberg engine by @sundy-li in [#16650](https://github.com/databendlabs/databend/pull/16650) +- feat(query): TopN window operator by @forsaken628 in [#16726](https://github.com/databendlabs/databend/pull/16726) +- feat(query): support SHOW DROP DATABASES by @TCeason in [#16811](https://github.com/databendlabs/databend/pull/16811) +- feat: uuid function from v4 to v7 by @BohuTANG in [#16827](https://github.com/databendlabs/databend/pull/16827) +- feat: refine the rule `PushDownFilterWindowTopN` in case top n is equal to 0. by @forsaken628 in [#16830](https://github.com/databendlabs/databend/pull/16830) +- feat: add aws glue as an iceberg connection type by @Rowlandev in [#16824](https://github.com/databendlabs/databend/pull/16824) +- feat(query): add distributed pruning settings by @zhang2014 in [#16864](https://github.com/databendlabs/databend/pull/16864) +- feat: databend-meta adds more metrics about raft-log by @drmingdrmer in [#16884](https://github.com/databendlabs/databend/pull/16884) +- feat(query): speed up fetching redis data from dictionaries via mget. by @Dragonliu2018 in [#16766](https://github.com/databendlabs/databend/pull/16766) +- feat(query): add new function `TO_TIMESTAMP` by @TCeason in [#16924](https://github.com/databendlabs/databend/pull/16924) +- feat: disable specifying copy options when create stage. by @youngsofun in [#16925](https://github.com/databendlabs/databend/pull/16925) +- feat(doc): Introducing Databend Guru on Gurubase.io by @kursataktas in [#16773](https://github.com/databendlabs/databend/pull/16773) +- feat(query): Support geometry relation functions by @b41sh in [#16927](https://github.com/databendlabs/databend/pull/16927) +- feat(query): virtual column allow cast to other type by @b41sh in [#16903](https://github.com/databendlabs/databend/pull/16903) +- feat: copy support option COLUMN_MATCH_MODE by @youngsofun in [#16963](https://github.com/databendlabs/databend/pull/16963) +- feat(query): speed up fetching mysql data from dictionaries via batch processing. by @Dragonliu2018 in [#16948](https://github.com/databendlabs/databend/pull/16948) +- feat: Support USE CATALOG syntax and current_catalog() function by @flashmouse in [#16926](https://github.com/databendlabs/databend/pull/16926) +- feat(query): Support `st_collect` aggregate function by @b41sh in [#16996](https://github.com/databendlabs/databend/pull/16996) +- feat(query): Support `flight_connection_max_retry_times` and `flight_connection_retry_interval` setting by @b41sh in [#16856](https://github.com/databendlabs/databend/pull/16856) +- feat: show dropped table and data_retention_time_in_hours in fuse_tim… by @SkyFan2002 in [#17015](https://github.com/databendlabs/databend/pull/17015) +- feat(rbac): add GrantObject::Warehouse by @TCeason in [#17029](https://github.com/databendlabs/databend/pull/17029) +- feat(query): partition sort spill by @forsaken628 in [#16987](https://github.com/databendlabs/databend/pull/16987) +- feat: support vacuum leaked table data by @SkyFan2002 in [#17022](https://github.com/databendlabs/databend/pull/17022) +- feat(query): `to_binary` function support variant, bitmap, geometry, geography types by @b41sh in [#17026](https://github.com/databendlabs/databend/pull/17026) +- feat(query): add interval type by @TCeason in [#16990](https://github.com/databendlabs/databend/pull/16990) +- feat: add key prefix count assertions to transactions by @drmingdrmer in [#17053](https://github.com/databendlabs/databend/pull/17053) +- feat(query): null type infer as Nullabel(String) by default in create as statement by @TCeason in [#17052](https://github.com/databendlabs/databend/pull/17052) +- feat(query): support global network policy by @everpcpc in [#17050](https://github.com/databendlabs/databend/pull/17050) +- feat(query): add config network_policy_whitelist by @everpcpc in [#17065](https://github.com/databendlabs/databend/pull/17065) +- feat(query): pre-check cast type by @andylokandy in [#16836](https://github.com/databendlabs/databend/pull/16836) +- feat(functions): add jaro_winkler string similarity function by @maxjustus in [#16993](https://github.com/databendlabs/databend/pull/16993) +- feat(query): add config jwks_refresh_interval & jwks_refresh_timeout by @everpcpc in [#17087](https://github.com/databendlabs/databend/pull/17087) +- feat: databend-meta transaction support generic bool-expression and else-if chain by @drmingdrmer in [#17064](https://github.com/databendlabs/databend/pull/17064) +- feat(query): refactor vacuum temp files by @sundy-li in [#17089](https://github.com/databendlabs/databend/pull/17089) +- refactor: Serialize iceberg table inside engine options to reduce catalog requests by @Xuanwo in [#17049](https://github.com/databendlabs/databend/pull/17049) +- feat(query): support interval function by @TCeason in [#17093](https://github.com/databendlabs/databend/pull/17093) +- feat: new settings `stream_consume_batch_size_hint` by @dantengsky in [#17102](https://github.com/databendlabs/databend/pull/17102) +- feat(query): support javascript/python script User Defined Aggregate Function by @forsaken628 in [#17054](https://github.com/databendlabs/databend/pull/17054) +- feat: databend-meta watch API provides `initial_flush` field by @drmingdrmer in [#17098](https://github.com/databendlabs/databend/pull/17098) +- feat(query): support javascript/python script User Defined Aggregate Function by @forsaken628 in [#17108](https://github.com/databendlabs/databend/pull/17108) +- feat(query): support interval 'string' by @TCeason in [#17105](https://github.com/databendlabs/databend/pull/17105) +- feat(query): Add `external_block_rows` metrics by @b41sh in [#17116](https://github.com/databendlabs/databend/pull/17116) +- feat: support vacuum leaked table data (#17022)-Revert by @dantengsky in [#17123](https://github.com/databendlabs/databend/pull/17123) + ### Thoughtful Bug Fix 🔧 -* fix: max_wait_time in http handler not work when result set is large … by @youngsofun in [#16267](https://github.com/databendlabs/databend/pull/16267) -* fix(query): enable distribute query for system log table by @zhang2014 in [#16300](https://github.com/databendlabs/databend/pull/16300) -* fix(query): fix child_has_window by @sundy-li in [#16301](https://github.com/databendlabs/databend/pull/16301) -* fix: uri path used as both path and root. by @youngsofun in [#16321](https://github.com/databendlabs/databend/pull/16321) -* fix: vacuum dry run should carry on when target objects are missing by @dantengsky in [#16322](https://github.com/databendlabs/databend/pull/16322) -* fix(query): fix session leak in ctas by @zhang2014 in [#16337](https://github.com/databendlabs/databend/pull/16337) -* fix: When Replacing column mask, old `name->id->value` should be completely deleted by @drmingdrmer in [#16328](https://github.com/databendlabs/databend/pull/16328) -* fix: reduce sample possibility to avoid flaky test by @xudong963 in [#16330](https://github.com/databendlabs/databend/pull/16330) -* fix(query): fix IFNULL by @sundy-li in [#16339](https://github.com/databendlabs/databend/pull/16339) -* fix(query): fix wrong result for join system tables in cluster mode by @zhang2014 in [#16342](https://github.com/databendlabs/databend/pull/16342) -* fix(query): fix try cast by @sundy-li in [#16341](https://github.com/databendlabs/databend/pull/16341) -* fix(query): fix binary default string by @sundy-li in [#16345](https://github.com/databendlabs/databend/pull/16345) -* fix: push filter down join with materialized cte by @xudong963 in [#16349](https://github.com/databendlabs/databend/pull/16349) -* fix(query): fix aggregate panic in cluster mode by @zhang2014 in [#16319](https://github.com/databendlabs/databend/pull/16319) -* fix(query): fix incorrect alias of select items by @sundy-li in [#16368](https://github.com/databendlabs/databend/pull/16368) -* fix: separate sessions for temporary tables with memory engine by @SkyFan2002 in [#16374](https://github.com/databendlabs/databend/pull/16374) -* fix(executor): enable backpressure for union all by @zhang2014 in [#16388](https://github.com/databendlabs/databend/pull/16388) -* fix: hilbert_index function panic by @zhyass in [#16393](https://github.com/databendlabs/databend/pull/16393) -* fix(iceberg): Handling options like "s3.region" by @Xuanwo in [#16404](https://github.com/databendlabs/databend/pull/16404) -* fix: non-default catalog should not call get_table_function by @Xuanwo in [#16410](https://github.com/databendlabs/databend/pull/16410) -* fix(query): fix stack overflow for optimizer by @zhang2014 in [#16420](https://github.com/databendlabs/databend/pull/16420) -* fix: add custom (de)serialization methods for special float value by @dqhl76 in [#16258](https://github.com/databendlabs/databend/pull/16258) -* fix: table lock flaky test by @zhyass in [#16429](https://github.com/databendlabs/databend/pull/16429) -* fix(query): The columns permission of the system library is misjudged. by @TCeason in [#16431](https://github.com/databendlabs/databend/pull/16431) -* fix: restore parser backrtace when map_res failed by @andylokandy in [#16434](https://github.com/databendlabs/databend/pull/16434) -* fix(iceberg): Table desc should allow nested db_name by @Xuanwo in [#16414](https://github.com/databendlabs/databend/pull/16414) -* fix: split if block too big during append by @zhyass in [#16435](https://github.com/databendlabs/databend/pull/16435) -* fix: flaky test 09_0036_merge_into_without_dist by @dantengsky in [#16457](https://github.com/databendlabs/databend/pull/16457) -* fix: wrong order by result by @xudong963 in [#16422](https://github.com/databendlabs/databend/pull/16422) -* fix: Multi-thread recreate view/table gives error by @zhyass in [#16465](https://github.com/databendlabs/databend/pull/16465) -* fix: log query detail and profile with identical format by @everpcpc in [#16469](https://github.com/databendlabs/databend/pull/16469) -* fix: revert log format breakage from #16249 by @andylokandy in [#16470](https://github.com/databendlabs/databend/pull/16470) -* fix: typo for query & profile logging config by @everpcpc in [#16476](https://github.com/databendlabs/databend/pull/16476) -* chore: add extra bracket for `and` and `or` to make explain clear by @xudong963 in [#16494](https://github.com/databendlabs/databend/pull/16494) -* fix(query): fix planner cache cause modify async function does not take effect by @b41sh in [#16510](https://github.com/databendlabs/databend/pull/16510) -* fix: `ignore_result` doesn't have an effect on union by @xudong963 in [#16515](https://github.com/databendlabs/databend/pull/16515) -* fix(query): fix copy into table with disable distributed copy into by @zhang2014 in [#16529](https://github.com/databendlabs/databend/pull/16529) -* fix(query): fix column leaf_index by @Dousir9 in [#16537](https://github.com/databendlabs/databend/pull/16537) -* fix: Only when all tables are included, the db can be dropped by @drmingdrmer in [#16539](https://github.com/databendlabs/databend/pull/16539) -* fix: move TableInfo building out of SchemaApi by @drmingdrmer in [#16548](https://github.com/databendlabs/databend/pull/16548) -* fix: identify failed vacuum db by id by @drmingdrmer in [#16553](https://github.com/databendlabs/databend/pull/16553) -* fix(query): fix json object compare cause panic by @b41sh in [#16555](https://github.com/databendlabs/databend/pull/16555) -* fix: direct io syscall not available on mac by @forsaken628 in [#16574](https://github.com/databendlabs/databend/pull/16574) -* fix: window in scalar subquery returns wrong results by @xudong963 in [#16567](https://github.com/databendlabs/databend/pull/16567) -* fix: avoid eliminating the left child of union in `RuleEliminateUnion` by @xudong963 in [#16584](https://github.com/databendlabs/databend/pull/16584) -* fix(query): fix inverted index panic caused by null value by @b41sh in [#16576](https://github.com/databendlabs/databend/pull/16576) -* fix(query): fix cannot obtain stack trace when segmentation fault by @zhang2014 in [#16566](https://github.com/databendlabs/databend/pull/16566) -* fix: merge into panic by @zhyass in [#16581](https://github.com/databendlabs/databend/pull/16581) -* fix(query): list_dictionaries should not ignore db_id by @TCeason in [#16587](https://github.com/databendlabs/databend/pull/16587) -* fix(iceberg): Make sure iceberg table has been loaded by @Xuanwo in [#16593](https://github.com/databendlabs/databend/pull/16593) -* fix: Disable `prewhere` for iceberg table for now by @Xuanwo in [#16597](https://github.com/databendlabs/databend/pull/16597) -* fix(query): fix left outer join wrong result by @Dousir9 in [#16601](https://github.com/databendlabs/databend/pull/16601) -* fix: subquery returns wrong results under cluster by @xudong963 in [#16606](https://github.com/databendlabs/databend/pull/16606) -* fix(query): ntile frame should be unbounded by @TCeason in [#16604](https://github.com/databendlabs/databend/pull/16604) -* fix: lock mgr may failed to release lock in time by @dantengsky in [#16611](https://github.com/databendlabs/databend/pull/16611) -* fix(query): support subquery in pivot by @Dragonliu2018 in [#16631](https://github.com/databendlabs/databend/pull/16631) -* fix(query): check_timestamp/date -> clamp_timestamp/date by @TCeason in [#16634](https://github.com/databendlabs/databend/pull/16634) -* fix: deadlock in table lock by @zhyass in [#16632](https://github.com/databendlabs/databend/pull/16632) -* fix(query): sort spilling use arrow file format painc by @forsaken628 in [#16658](https://github.com/databendlabs/databend/pull/16658) -* fix(query): create table need fail if storage format is invalid by @TCeason in [#16663](https://github.com/databendlabs/databend/pull/16663) -* fix(query): forbid explain explain statement by @TCeason in [#16654](https://github.com/databendlabs/databend/pull/16654) -* fix(storage): fix refresh virtual column using async api by @b41sh in [#16656](https://github.com/databendlabs/databend/pull/16656) -* fix(query): insert with long sql parse error by @sundy-li in [#16678](https://github.com/databendlabs/databend/pull/16678) -* fix(ci): flaky test by @zhyass in [#16664](https://github.com/databendlabs/databend/pull/16664) -* fix: insert long sql again by @sundy-li in [#16684](https://github.com/databendlabs/databend/pull/16684) -* fix(query): sort spilling may hang by @forsaken628 in [#16672](https://github.com/databendlabs/databend/pull/16672) -* fix: `JEAllocator` should properly handle nullptr returned by @dantengsky in [#16692](https://github.com/databendlabs/databend/pull/16692) -* fix(metrics): use f64::MAX as histogram bound to display +Inf properly by @flaneur2020 in [#16701](https://github.com/databendlabs/databend/pull/16701) -* fix(query): use custom connector for udf client by @everpcpc in [#16697](https://github.com/databendlabs/databend/pull/16697) -* fix: MetaGrpcClient deadlock when drop by @drmingdrmer in [#16727](https://github.com/databendlabs/databend/pull/16727) -* fix: date_add/sub need respect timezone by @TCeason in [#16721](https://github.com/databendlabs/databend/pull/16721) -* fix(query): remove single quotes for system.columns comment by @TCeason in [#16732](https://github.com/databendlabs/databend/pull/16732) -* fix: HTTP handle lost rows when result set is wide and large. by @youngsofun in [#16748](https://github.com/databendlabs/databend/pull/16748) -* fix: keep column statistics of all NULL column by @dantengsky in [#16753](https://github.com/databendlabs/databend/pull/16753) -* fix: `Files::remove_file_in_batch` should not swallow errors by @dantengsky in [#16761](https://github.com/databendlabs/databend/pull/16761) -* fix(query): add tls config for udf client by @everpcpc in [#16782](https://github.com/databendlabs/databend/pull/16782) -* fix: token and cookie session id miss match. by @youngsofun in [#16786](https://github.com/databendlabs/databend/pull/16786) -* fix: clustering_information panic if string domain is none by @zhyass in [#16792](https://github.com/databendlabs/databend/pull/16792) -* fix(query): fix broken file log layout by @zhang2014 in [#16803](https://github.com/databendlabs/databend/pull/16803) -* fix: re-ensure dir before upgrading by @drmingdrmer in [#16805](https://github.com/databendlabs/databend/pull/16805) -* fix: purge may not work on tables after a flash back operation by @SkyFan2002 in [#16812](https://github.com/databendlabs/databend/pull/16812) -* fix(storage): recluster endless loop by @zhyass in [#16831](https://github.com/databendlabs/databend/pull/16831) -* fix: incorrect table data disk cache key by @dantengsky in [#16837](https://github.com/databendlabs/databend/pull/16837) -* fix(query): fix group by with alias column can't bind the column by @b41sh in [#16804](https://github.com/databendlabs/databend/pull/16804) -* fix(cluster): fix the possibility of connection leak when the cluster state is broken. by @zhang2014 in [#16842](https://github.com/databendlabs/databend/pull/16842) -* fix(query): fix aggregator_groups_builder to work with string view by @sundy-li in [#16843](https://github.com/databendlabs/databend/pull/16843) -* fix(query): check storage request method with arg list-type by @everpcpc in [#16849](https://github.com/databendlabs/databend/pull/16849) -* fix: replace risky `dma_buffer_as_vec` implementations by @forsaken628 in [#16829](https://github.com/databendlabs/databend/pull/16829) -* fix(query): fix and check total_buffer_len and total_bytes_len by @sundy-li in [#16854](https://github.com/databendlabs/databend/pull/16854) -* fix: raft-log wont write when exceeding 256M by @drmingdrmer in [#16876](https://github.com/databendlabs/databend/pull/16876) -* fix(query): fix distinct set-returning function by @b41sh in [#16883](https://github.com/databendlabs/databend/pull/16883) -* fix(query): fix incorrect total_bytes_len in string view by @sundy-li in [#16877](https://github.com/databendlabs/databend/pull/16877) -* fix: StreamVersionMismatched when using CTAS in multi statement trans… by @SkyFan2002 in [#16889](https://github.com/databendlabs/databend/pull/16889) -* fix(ci): flaky test by @zhyass in [#16898](https://github.com/databendlabs/databend/pull/16898) -* fix(storge): write progress in compact hook by @zhyass in [#16901](https://github.com/databendlabs/databend/pull/16901) -* fix: ensure atomicity in create_lock_revision by @zhyass in [#16907](https://github.com/databendlabs/databend/pull/16907) -* fix: dropped temporary table should not be shown in system.temporary_tables by @SkyFan2002 in [#16911](https://github.com/databendlabs/databend/pull/16911) -* fix(query): join predict use cast_expr_to_non_null_boolean by @sundy-li in [#16937](https://github.com/databendlabs/databend/pull/16937) -* fix(ci): flaky test by @zhyass in [#16933](https://github.com/databendlabs/databend/pull/16933) -* fix(query): add_hours function may panic if the argument is too big by @TCeason in [#16929](https://github.com/databendlabs/databend/pull/16929) -* fix: lock attach table's snapshot location by @dantengsky in [#16952](https://github.com/databendlabs/databend/pull/16952) -* fix(ci): fix release dbg upload path by @zhang2014 in [#16958](https://github.com/databendlabs/databend/pull/16958) -* fix(query): make memory engine as non-local table by @sundy-li in [#16955](https://github.com/databendlabs/databend/pull/16955) -* fix: solve some inconsistencies between code and comments by @YichiZhang0613 in [#16974](https://github.com/databendlabs/databend/pull/16974) -* fix: fix segfault in list_domain by @forsaken628 in [#16979](https://github.com/databendlabs/databend/pull/16979) -* fix(query): keep remaining_predicates when filtering grouping sets by @sundy-li in [#16971](https://github.com/databendlabs/databend/pull/16971) -* fix(query): fix bug while mysql external dictionary table contains null values by @Dragonliu2018 in [#16978](https://github.com/databendlabs/databend/pull/16978) -* fix(sqlparser): fix order by followed by scalar by @chagelo in [#16967](https://github.com/databendlabs/databend/pull/16967) -* fix(query): group by item allow set returning functions by @b41sh in [#16986](https://github.com/databendlabs/databend/pull/16986) -* fix: http handler set cookie only when cookie_enabled=true. by @youngsofun in [#16992](https://github.com/databendlabs/databend/pull/16992) -* fix: need_sticky field was incorrectly set to true. by @youngsofun in [#16997](https://github.com/databendlabs/databend/pull/16997) -* fix(ci): fix benchmark ci failure by @zhang2014 in [#17005](https://github.com/databendlabs/databend/pull/17005) -* fix: insert and mutation progress by @zhyass in [#17014](https://github.com/databendlabs/databend/pull/17014) -* fix(query): reuse connection to fix dictionary mysql flaky test by @b41sh in [#17016](https://github.com/databendlabs/databend/pull/17016) -* fix(ci): flaky test by @zhyass in [#17030](https://github.com/databendlabs/databend/pull/17030) -* fix: filter push down union in r cte by @xudong963 in [#17031](https://github.com/databendlabs/databend/pull/17031) -* fix: drop channel if partition receiver finished by @dqhl76 in [#17037](https://github.com/databendlabs/databend/pull/17037) -* fix: handle trailing zeros in Raft log WAL with EXT4 writeback mode by @drmingdrmer in [#17042](https://github.com/databendlabs/databend/pull/17042) -* fix(query): fix read small parquet files in cluster mode by @sundy-li in [#17063](https://github.com/databendlabs/databend/pull/17063) -* fix(query): fix thread leak by @zhang2014 in [#17077](https://github.com/databendlabs/databend/pull/17077) -* fix(query): fix thread leak and remove all usage by @dqhl76 in [#17081](https://github.com/databendlabs/databend/pull/17081) -* fix: change tracking stream failed by @zhyass in [#17072](https://github.com/databendlabs/databend/pull/17072) -* fix(query): fix join on not null column cause panic by @b41sh in [#17069](https://github.com/databendlabs/databend/pull/17069) -* fix: create as query respect ddl_column_type_nullable by @TCeason in [#17071](https://github.com/databendlabs/databend/pull/17071) -* fix: check if the table option is valid according to the engine by @SkyFan2002 in [#17076](https://github.com/databendlabs/databend/pull/17076) -* fix(ci): flaky test by @zhyass in [#17090](https://github.com/databendlabs/databend/pull/17090) -* fix(query): double panic if broken state in block builder by @zhang2014 in [#17091](https://github.com/databendlabs/databend/pull/17091) -* fix(query): Correct sign extension handling in months_days_micros struct by @TCeason in [#17086](https://github.com/databendlabs/databend/pull/17086) -* fix(query): union all panic in mysql client by @zhyass in [#17095](https://github.com/databendlabs/databend/pull/17095) -* fix: name resolution bug in case-sensitive mode by @zhyass in [#17097](https://github.com/databendlabs/databend/pull/17097) -* fix(query): fix a number of bugs in the spill config. by @forsaken628 in [#17103](https://github.com/databendlabs/databend/pull/17103) -* fix(query): uri path should not be percent-encoded by @youngsofun in [#17109](https://github.com/databendlabs/databend/pull/17109) -* fix(query): fix default values of `SpillConfig` may not take effect by @forsaken628 in [#17113](https://github.com/databendlabs/databend/pull/17113) -* fix(query): table field data type in `show create table` incorrect by @forsaken628 in [#17112](https://github.com/databendlabs/databend/pull/17112) -* fix(query): fix udf script return type is arrow `DataType::LargeList` caused failed by @b41sh in [#17127](https://github.com/databendlabs/databend/pull/17127) -* fix: ignore case when matching function name by @notauserx in [#16912](https://github.com/databendlabs/databend/pull/16912) -* fix: analyze table contain keyword bug by @zhyass in [#17131](https://github.com/databendlabs/databend/pull/17131) -* fix(query): Disabled the shrink_scalar optimization for cast expressions during the resolve procedure args by @TCeason in [#17119](https://github.com/databendlabs/databend/pull/17119) -* fix(log): prefix_filter not working. by @youngsofun in [#17136](https://github.com/databendlabs/databend/pull/17136) + +- fix: max_wait_time in http handler not work when result set is large … by @youngsofun in [#16267](https://github.com/databendlabs/databend/pull/16267) +- fix(query): enable distribute query for system log table by @zhang2014 in [#16300](https://github.com/databendlabs/databend/pull/16300) +- fix(query): fix child_has_window by @sundy-li in [#16301](https://github.com/databendlabs/databend/pull/16301) +- fix: uri path used as both path and root. by @youngsofun in [#16321](https://github.com/databendlabs/databend/pull/16321) +- fix: vacuum dry run should carry on when target objects are missing by @dantengsky in [#16322](https://github.com/databendlabs/databend/pull/16322) +- fix(query): fix session leak in ctas by @zhang2014 in [#16337](https://github.com/databendlabs/databend/pull/16337) +- fix: When Replacing column mask, old `name->id->value` should be completely deleted by @drmingdrmer in [#16328](https://github.com/databendlabs/databend/pull/16328) +- fix: reduce sample possibility to avoid flaky test by @xudong963 in [#16330](https://github.com/databendlabs/databend/pull/16330) +- fix(query): fix IFNULL by @sundy-li in [#16339](https://github.com/databendlabs/databend/pull/16339) +- fix(query): fix wrong result for join system tables in cluster mode by @zhang2014 in [#16342](https://github.com/databendlabs/databend/pull/16342) +- fix(query): fix try cast by @sundy-li in [#16341](https://github.com/databendlabs/databend/pull/16341) +- fix(query): fix binary default string by @sundy-li in [#16345](https://github.com/databendlabs/databend/pull/16345) +- fix: push filter down join with materialized cte by @xudong963 in [#16349](https://github.com/databendlabs/databend/pull/16349) +- fix(query): fix aggregate panic in cluster mode by @zhang2014 in [#16319](https://github.com/databendlabs/databend/pull/16319) +- fix(query): fix incorrect alias of select items by @sundy-li in [#16368](https://github.com/databendlabs/databend/pull/16368) +- fix: separate sessions for temporary tables with memory engine by @SkyFan2002 in [#16374](https://github.com/databendlabs/databend/pull/16374) +- fix(executor): enable backpressure for union all by @zhang2014 in [#16388](https://github.com/databendlabs/databend/pull/16388) +- fix: hilbert_index function panic by @zhyass in [#16393](https://github.com/databendlabs/databend/pull/16393) +- fix(iceberg): Handling options like "s3.region" by @Xuanwo in [#16404](https://github.com/databendlabs/databend/pull/16404) +- fix: non-default catalog should not call get_table_function by @Xuanwo in [#16410](https://github.com/databendlabs/databend/pull/16410) +- fix(query): fix stack overflow for optimizer by @zhang2014 in [#16420](https://github.com/databendlabs/databend/pull/16420) +- fix: add custom (de)serialization methods for special float value by @dqhl76 in [#16258](https://github.com/databendlabs/databend/pull/16258) +- fix: table lock flaky test by @zhyass in [#16429](https://github.com/databendlabs/databend/pull/16429) +- fix(query): The columns permission of the system library is misjudged. by @TCeason in [#16431](https://github.com/databendlabs/databend/pull/16431) +- fix: restore parser backrtace when map_res failed by @andylokandy in [#16434](https://github.com/databendlabs/databend/pull/16434) +- fix(iceberg): Table desc should allow nested db_name by @Xuanwo in [#16414](https://github.com/databendlabs/databend/pull/16414) +- fix: split if block too big during append by @zhyass in [#16435](https://github.com/databendlabs/databend/pull/16435) +- fix: flaky test 09_0036_merge_into_without_dist by @dantengsky in [#16457](https://github.com/databendlabs/databend/pull/16457) +- fix: wrong order by result by @xudong963 in [#16422](https://github.com/databendlabs/databend/pull/16422) +- fix: Multi-thread recreate view/table gives error by @zhyass in [#16465](https://github.com/databendlabs/databend/pull/16465) +- fix: log query detail and profile with identical format by @everpcpc in [#16469](https://github.com/databendlabs/databend/pull/16469) +- fix: revert log format breakage from #16249 by @andylokandy in [#16470](https://github.com/databendlabs/databend/pull/16470) +- fix: typo for query & profile logging config by @everpcpc in [#16476](https://github.com/databendlabs/databend/pull/16476) +- chore: add extra bracket for `and` and `or` to make explain clear by @xudong963 in [#16494](https://github.com/databendlabs/databend/pull/16494) +- fix(query): fix planner cache cause modify async function does not take effect by @b41sh in [#16510](https://github.com/databendlabs/databend/pull/16510) +- fix: `ignore_result` doesn't have an effect on union by @xudong963 in [#16515](https://github.com/databendlabs/databend/pull/16515) +- fix(query): fix copy into table with disable distributed copy into by @zhang2014 in [#16529](https://github.com/databendlabs/databend/pull/16529) +- fix(query): fix column leaf_index by @Dousir9 in [#16537](https://github.com/databendlabs/databend/pull/16537) +- fix: Only when all tables are included, the db can be dropped by @drmingdrmer in [#16539](https://github.com/databendlabs/databend/pull/16539) +- fix: move TableInfo building out of SchemaApi by @drmingdrmer in [#16548](https://github.com/databendlabs/databend/pull/16548) +- fix: identify failed vacuum db by id by @drmingdrmer in [#16553](https://github.com/databendlabs/databend/pull/16553) +- fix(query): fix json object compare cause panic by @b41sh in [#16555](https://github.com/databendlabs/databend/pull/16555) +- fix: direct io syscall not available on mac by @forsaken628 in [#16574](https://github.com/databendlabs/databend/pull/16574) +- fix: window in scalar subquery returns wrong results by @xudong963 in [#16567](https://github.com/databendlabs/databend/pull/16567) +- fix: avoid eliminating the left child of union in `RuleEliminateUnion` by @xudong963 in [#16584](https://github.com/databendlabs/databend/pull/16584) +- fix(query): fix inverted index panic caused by null value by @b41sh in [#16576](https://github.com/databendlabs/databend/pull/16576) +- fix(query): fix cannot obtain stack trace when segmentation fault by @zhang2014 in [#16566](https://github.com/databendlabs/databend/pull/16566) +- fix: merge into panic by @zhyass in [#16581](https://github.com/databendlabs/databend/pull/16581) +- fix(query): list_dictionaries should not ignore db_id by @TCeason in [#16587](https://github.com/databendlabs/databend/pull/16587) +- fix(iceberg): Make sure iceberg table has been loaded by @Xuanwo in [#16593](https://github.com/databendlabs/databend/pull/16593) +- fix: Disable `prewhere` for iceberg table for now by @Xuanwo in [#16597](https://github.com/databendlabs/databend/pull/16597) +- fix(query): fix left outer join wrong result by @Dousir9 in [#16601](https://github.com/databendlabs/databend/pull/16601) +- fix: subquery returns wrong results under cluster by @xudong963 in [#16606](https://github.com/databendlabs/databend/pull/16606) +- fix(query): ntile frame should be unbounded by @TCeason in [#16604](https://github.com/databendlabs/databend/pull/16604) +- fix: lock mgr may failed to release lock in time by @dantengsky in [#16611](https://github.com/databendlabs/databend/pull/16611) +- fix(query): support subquery in pivot by @Dragonliu2018 in [#16631](https://github.com/databendlabs/databend/pull/16631) +- fix(query): check_timestamp/date -> clamp_timestamp/date by @TCeason in [#16634](https://github.com/databendlabs/databend/pull/16634) +- fix: deadlock in table lock by @zhyass in [#16632](https://github.com/databendlabs/databend/pull/16632) +- fix(query): sort spilling use arrow file format painc by @forsaken628 in [#16658](https://github.com/databendlabs/databend/pull/16658) +- fix(query): create table need fail if storage format is invalid by @TCeason in [#16663](https://github.com/databendlabs/databend/pull/16663) +- fix(query): forbid explain explain statement by @TCeason in [#16654](https://github.com/databendlabs/databend/pull/16654) +- fix(storage): fix refresh virtual column using async api by @b41sh in [#16656](https://github.com/databendlabs/databend/pull/16656) +- fix(query): insert with long sql parse error by @sundy-li in [#16678](https://github.com/databendlabs/databend/pull/16678) +- fix(ci): flaky test by @zhyass in [#16664](https://github.com/databendlabs/databend/pull/16664) +- fix: insert long sql again by @sundy-li in [#16684](https://github.com/databendlabs/databend/pull/16684) +- fix(query): sort spilling may hang by @forsaken628 in [#16672](https://github.com/databendlabs/databend/pull/16672) +- fix: `JEAllocator` should properly handle nullptr returned by @dantengsky in [#16692](https://github.com/databendlabs/databend/pull/16692) +- fix(metrics): use f64::MAX as histogram bound to display +Inf properly by @flaneur2020 in [#16701](https://github.com/databendlabs/databend/pull/16701) +- fix(query): use custom connector for udf client by @everpcpc in [#16697](https://github.com/databendlabs/databend/pull/16697) +- fix: MetaGrpcClient deadlock when drop by @drmingdrmer in [#16727](https://github.com/databendlabs/databend/pull/16727) +- fix: date_add/sub need respect timezone by @TCeason in [#16721](https://github.com/databendlabs/databend/pull/16721) +- fix(query): remove single quotes for system.columns comment by @TCeason in [#16732](https://github.com/databendlabs/databend/pull/16732) +- fix: HTTP handle lost rows when result set is wide and large. by @youngsofun in [#16748](https://github.com/databendlabs/databend/pull/16748) +- fix: keep column statistics of all NULL column by @dantengsky in [#16753](https://github.com/databendlabs/databend/pull/16753) +- fix: `Files::remove_file_in_batch` should not swallow errors by @dantengsky in [#16761](https://github.com/databendlabs/databend/pull/16761) +- fix(query): add tls config for udf client by @everpcpc in [#16782](https://github.com/databendlabs/databend/pull/16782) +- fix: token and cookie session id miss match. by @youngsofun in [#16786](https://github.com/databendlabs/databend/pull/16786) +- fix: clustering_information panic if string domain is none by @zhyass in [#16792](https://github.com/databendlabs/databend/pull/16792) +- fix(query): fix broken file log layout by @zhang2014 in [#16803](https://github.com/databendlabs/databend/pull/16803) +- fix: re-ensure dir before upgrading by @drmingdrmer in [#16805](https://github.com/databendlabs/databend/pull/16805) +- fix: purge may not work on tables after a flash back operation by @SkyFan2002 in [#16812](https://github.com/databendlabs/databend/pull/16812) +- fix(storage): recluster endless loop by @zhyass in [#16831](https://github.com/databendlabs/databend/pull/16831) +- fix: incorrect table data disk cache key by @dantengsky in [#16837](https://github.com/databendlabs/databend/pull/16837) +- fix(query): fix group by with alias column can't bind the column by @b41sh in [#16804](https://github.com/databendlabs/databend/pull/16804) +- fix(cluster): fix the possibility of connection leak when the cluster state is broken. by @zhang2014 in [#16842](https://github.com/databendlabs/databend/pull/16842) +- fix(query): fix aggregator_groups_builder to work with string view by @sundy-li in [#16843](https://github.com/databendlabs/databend/pull/16843) +- fix(query): check storage request method with arg list-type by @everpcpc in [#16849](https://github.com/databendlabs/databend/pull/16849) +- fix: replace risky `dma_buffer_as_vec` implementations by @forsaken628 in [#16829](https://github.com/databendlabs/databend/pull/16829) +- fix(query): fix and check total_buffer_len and total_bytes_len by @sundy-li in [#16854](https://github.com/databendlabs/databend/pull/16854) +- fix: raft-log wont write when exceeding 256M by @drmingdrmer in [#16876](https://github.com/databendlabs/databend/pull/16876) +- fix(query): fix distinct set-returning function by @b41sh in [#16883](https://github.com/databendlabs/databend/pull/16883) +- fix(query): fix incorrect total_bytes_len in string view by @sundy-li in [#16877](https://github.com/databendlabs/databend/pull/16877) +- fix: StreamVersionMismatched when using CTAS in multi statement trans… by @SkyFan2002 in [#16889](https://github.com/databendlabs/databend/pull/16889) +- fix(ci): flaky test by @zhyass in [#16898](https://github.com/databendlabs/databend/pull/16898) +- fix(storge): write progress in compact hook by @zhyass in [#16901](https://github.com/databendlabs/databend/pull/16901) +- fix: ensure atomicity in create_lock_revision by @zhyass in [#16907](https://github.com/databendlabs/databend/pull/16907) +- fix: dropped temporary table should not be shown in system.temporary_tables by @SkyFan2002 in [#16911](https://github.com/databendlabs/databend/pull/16911) +- fix(query): join predict use cast_expr_to_non_null_boolean by @sundy-li in [#16937](https://github.com/databendlabs/databend/pull/16937) +- fix(ci): flaky test by @zhyass in [#16933](https://github.com/databendlabs/databend/pull/16933) +- fix(query): add_hours function may panic if the argument is too big by @TCeason in [#16929](https://github.com/databendlabs/databend/pull/16929) +- fix: lock attach table's snapshot location by @dantengsky in [#16952](https://github.com/databendlabs/databend/pull/16952) +- fix(ci): fix release dbg upload path by @zhang2014 in [#16958](https://github.com/databendlabs/databend/pull/16958) +- fix(query): make memory engine as non-local table by @sundy-li in [#16955](https://github.com/databendlabs/databend/pull/16955) +- fix: solve some inconsistencies between code and comments by @YichiZhang0613 in [#16974](https://github.com/databendlabs/databend/pull/16974) +- fix: fix segfault in list_domain by @forsaken628 in [#16979](https://github.com/databendlabs/databend/pull/16979) +- fix(query): keep remaining_predicates when filtering grouping sets by @sundy-li in [#16971](https://github.com/databendlabs/databend/pull/16971) +- fix(query): fix bug while mysql external dictionary table contains null values by @Dragonliu2018 in [#16978](https://github.com/databendlabs/databend/pull/16978) +- fix(sqlparser): fix order by followed by scalar by @chagelo in [#16967](https://github.com/databendlabs/databend/pull/16967) +- fix(query): group by item allow set returning functions by @b41sh in [#16986](https://github.com/databendlabs/databend/pull/16986) +- fix: http handler set cookie only when cookie_enabled=true. by @youngsofun in [#16992](https://github.com/databendlabs/databend/pull/16992) +- fix: need_sticky field was incorrectly set to true. by @youngsofun in [#16997](https://github.com/databendlabs/databend/pull/16997) +- fix(ci): fix benchmark ci failure by @zhang2014 in [#17005](https://github.com/databendlabs/databend/pull/17005) +- fix: insert and mutation progress by @zhyass in [#17014](https://github.com/databendlabs/databend/pull/17014) +- fix(query): reuse connection to fix dictionary mysql flaky test by @b41sh in [#17016](https://github.com/databendlabs/databend/pull/17016) +- fix(ci): flaky test by @zhyass in [#17030](https://github.com/databendlabs/databend/pull/17030) +- fix: filter push down union in r cte by @xudong963 in [#17031](https://github.com/databendlabs/databend/pull/17031) +- fix: drop channel if partition receiver finished by @dqhl76 in [#17037](https://github.com/databendlabs/databend/pull/17037) +- fix: handle trailing zeros in Raft log WAL with EXT4 writeback mode by @drmingdrmer in [#17042](https://github.com/databendlabs/databend/pull/17042) +- fix(query): fix read small parquet files in cluster mode by @sundy-li in [#17063](https://github.com/databendlabs/databend/pull/17063) +- fix(query): fix thread leak by @zhang2014 in [#17077](https://github.com/databendlabs/databend/pull/17077) +- fix(query): fix thread leak and remove all usage by @dqhl76 in [#17081](https://github.com/databendlabs/databend/pull/17081) +- fix: change tracking stream failed by @zhyass in [#17072](https://github.com/databendlabs/databend/pull/17072) +- fix(query): fix join on not null column cause panic by @b41sh in [#17069](https://github.com/databendlabs/databend/pull/17069) +- fix: create as query respect ddl_column_type_nullable by @TCeason in [#17071](https://github.com/databendlabs/databend/pull/17071) +- fix: check if the table option is valid according to the engine by @SkyFan2002 in [#17076](https://github.com/databendlabs/databend/pull/17076) +- fix(ci): flaky test by @zhyass in [#17090](https://github.com/databendlabs/databend/pull/17090) +- fix(query): double panic if broken state in block builder by @zhang2014 in [#17091](https://github.com/databendlabs/databend/pull/17091) +- fix(query): Correct sign extension handling in months_days_micros struct by @TCeason in [#17086](https://github.com/databendlabs/databend/pull/17086) +- fix(query): union all panic in mysql client by @zhyass in [#17095](https://github.com/databendlabs/databend/pull/17095) +- fix: name resolution bug in case-sensitive mode by @zhyass in [#17097](https://github.com/databendlabs/databend/pull/17097) +- fix(query): fix a number of bugs in the spill config. by @forsaken628 in [#17103](https://github.com/databendlabs/databend/pull/17103) +- fix(query): uri path should not be percent-encoded by @youngsofun in [#17109](https://github.com/databendlabs/databend/pull/17109) +- fix(query): fix default values of `SpillConfig` may not take effect by @forsaken628 in [#17113](https://github.com/databendlabs/databend/pull/17113) +- fix(query): table field data type in `show create table` incorrect by @forsaken628 in [#17112](https://github.com/databendlabs/databend/pull/17112) +- fix(query): fix udf script return type is arrow `DataType::LargeList` caused failed by @b41sh in [#17127](https://github.com/databendlabs/databend/pull/17127) +- fix: ignore case when matching function name by @notauserx in [#16912](https://github.com/databendlabs/databend/pull/16912) +- fix: analyze table contain keyword bug by @zhyass in [#17131](https://github.com/databendlabs/databend/pull/17131) +- fix(query): Disabled the shrink_scalar optimization for cast expressions during the resolve procedure args by @TCeason in [#17119](https://github.com/databendlabs/databend/pull/17119) +- fix(log): prefix_filter not working. by @youngsofun in [#17136](https://github.com/databendlabs/databend/pull/17136) + ### Code Refactor 🎉 -* refactor: replace absolute expiration time with relative TTL in schema API by @drmingdrmer in [#16268](https://github.com/databendlabs/databend/pull/16268) -* refactor(query): remove lru cache meter by @zhang2014 in [#16260](https://github.com/databendlabs/databend/pull/16260) -* refactor: Use global http client to share the connection pool by @Xuanwo in [#16276](https://github.com/databendlabs/databend/pull/16276) -* refactor(query): refactor hash join spill by @Dousir9 in [#15746](https://github.com/databendlabs/databend/pull/15746) -* refactor: change `DatabaseInfo.meta` to `SeqV` by @drmingdrmer in [#16295](https://github.com/databendlabs/databend/pull/16295) -* refactor: change value of meta-service key `DatabaseNameIdent` from `DatabaseId` to `Id` by @drmingdrmer in [#16299](https://github.com/databendlabs/databend/pull/16299) -* refactor: adopt `get_pb()` for get_background_task by @drmingdrmer in [#16308](https://github.com/databendlabs/databend/pull/16308) -* refactor: Reduce parallelism when vacuuming dropped tables by @dantengsky in [#16312](https://github.com/databendlabs/databend/pull/16312) -* refactor(query): add setting external_server_request_retry_times by @sundy-li in [#16307](https://github.com/databendlabs/databend/pull/16307) -* refactor(query): refactor bind set returning functions by @b41sh in [#16316](https://github.com/databendlabs/databend/pull/16316) -* refactor(query): add config enable_meta_data_upgrade_json_to_pb_from_v307 by @TCeason in [#16306](https://github.com/databendlabs/databend/pull/16306) -* refactor: add associated type kvapi::Value::KeyType by @drmingdrmer in [#16320](https://github.com/databendlabs/databend/pull/16320) -* refactor: kv-app-errors does not need serde by @drmingdrmer in [#16324](https://github.com/databendlabs/databend/pull/16324) -* refactor(query): refactor bind async functions by @b41sh in [#16331](https://github.com/databendlabs/databend/pull/16331) -* refactor: Catalog Manager API improvements for create and drop operations by @drmingdrmer in [#16338](https://github.com/databendlabs/databend/pull/16338) -* refactor: Add BaseApi to abstract usually used meta-service access pattern by @drmingdrmer in [#16351](https://github.com/databendlabs/databend/pull/16351) -* refactor: simplify SchemaApi::list_indexes(), get_index() list_background_jobs() by @drmingdrmer in [#16357](https://github.com/databendlabs/databend/pull/16357) -* chore(query): optimize window sort by @sundy-li in [#16355](https://github.com/databendlabs/databend/pull/16355) -* chore(query): reduce hash join memory usage by @Dousir9 in [#16359](https://github.com/databendlabs/databend/pull/16359) -* refactor: simplify drop_index() with NameIdValueApi by @drmingdrmer in [#16366](https://github.com/databendlabs/databend/pull/16366) -* refactor: simplify dictionary API by @drmingdrmer in [#16371](https://github.com/databendlabs/databend/pull/16371) -* refactor: Add item count check to `KVPbApi::get_pb_stream()` by @drmingdrmer in [#16377](https://github.com/databendlabs/databend/pull/16377) -* refactor(query): optimize show drop tables by @TCeason in [#16370](https://github.com/databendlabs/databend/pull/16370) -* chore(query): Simplified sort simple rows implementation by @forsaken628 in [#16382](https://github.com/databendlabs/databend/pull/16382) -* refactor(query): refactor some codes of parquet2 by @sundy-li in [#16386](https://github.com/databendlabs/databend/pull/16386) -* refactor: remove all share related functions by @drmingdrmer in [#16383](https://github.com/databendlabs/databend/pull/16383) -* refactor: replace get_pb_value() with get_pb() by @drmingdrmer in [#16395](https://github.com/databendlabs/databend/pull/16395) -* refactor: Add NameValueApi, simplify virtual column APIs by @drmingdrmer in [#16398](https://github.com/databendlabs/databend/pull/16398) -* refactor: simplify catalog API by @drmingdrmer in [#16406](https://github.com/databendlabs/databend/pull/16406) -* refactor: Simplify table lock API. by @drmingdrmer in [#16413](https://github.com/databendlabs/databend/pull/16413) -* chore(query): introduce EmptyResultScan plan by @sundy-li in [#16411](https://github.com/databendlabs/databend/pull/16411) -* refactor: remove unused `TableInfo.tenant` by @drmingdrmer in [#16416](https://github.com/databendlabs/databend/pull/16416) -* refactor: simplify least-visible-time schema API, add LeastVisibleTimeIdent by @drmingdrmer in [#16418](https://github.com/databendlabs/databend/pull/16418) -* refactor: add mget_id_value_compat() by @drmingdrmer in [#16425](https://github.com/databendlabs/databend/pull/16425) -* refactor(query): first check privilege in SystemEngine get_full_data by @TCeason in [#16421](https://github.com/databendlabs/databend/pull/16421) -* chore(query): limit max concurrency of spill io requests by @zhang2014 in [#16442](https://github.com/databendlabs/databend/pull/16442) -* chore(query): make string to int respect behavior like PG by @sundy-li in [#16428](https://github.com/databendlabs/databend/pull/16428) -* refactor: simplify vacuum drop table handling by @drmingdrmer in [#16446](https://github.com/databendlabs/databend/pull/16446) -* chore: use logforth to replace fern by @andylokandy in [#16249](https://github.com/databendlabs/databend/pull/16249) -* refactor(executor): use event cause to refactor shuffle processor by @zhang2014 in [#16445](https://github.com/databendlabs/databend/pull/16445) -* refactor: cleanup logic to get tables to vacuum by @drmingdrmer in [#16450](https://github.com/databendlabs/databend/pull/16450) -* refactor: enhancements of HTTP client session. by @youngsofun in [#16452](https://github.com/databendlabs/databend/pull/16452) -* refactor(query): sort kernel optimization by @sundy-li in [#16458](https://github.com/databendlabs/databend/pull/16458) -* refactor(storage): improve inverted index read fst file first to reduce load index by @b41sh in [#16385](https://github.com/databendlabs/databend/pull/16385) -* refactor: refactor vacuum by @drmingdrmer in [#16454](https://github.com/databendlabs/databend/pull/16454) -* chore: simplify get_sequence() and get_sequence_next_value() by @drmingdrmer in [#16463](https://github.com/databendlabs/databend/pull/16463) -* refactor: add DatabaseMeta.gc_in_progress by @drmingdrmer in [#16464](https://github.com/databendlabs/databend/pull/16464) -* refactor(query): use pipeline exchange to refactor window scatter by @zhang2014 in [#16471](https://github.com/databendlabs/databend/pull/16471) -* refactor(query): simplify expression kernel by @sundy-li in [#16482](https://github.com/databendlabs/databend/pull/16482) -* refactor: add KVPbCrudApi as abstraction layer for commonly used CRUD operations by @drmingdrmer in [#16479](https://github.com/databendlabs/databend/pull/16479) -* refactor: add KVPbCrudApi::crud_try_insert() and crud_try_upsert() by @drmingdrmer in [#16484](https://github.com/databendlabs/databend/pull/16484) -* refactor: SchemaApi::list_databases() by @drmingdrmer in [#16485](https://github.com/databendlabs/databend/pull/16485) -* refactor: SchemaApi::get_database_history() by @drmingdrmer in [#16487](https://github.com/databendlabs/databend/pull/16487) -* refactor: test SchemaApi::get_tenant_history_database() by @drmingdrmer in [#16488](https://github.com/databendlabs/databend/pull/16488) -* refactor(query): refactor license manager by @zhang2014 in [#16489](https://github.com/databendlabs/databend/pull/16489) -* refactor(query): refactor license manager by @zhang2014 in [#16492](https://github.com/databendlabs/databend/pull/16492) -* refactor: simplify `DroppedId`. Replace manual comparison with string comparison by @drmingdrmer in [#16495](https://github.com/databendlabs/databend/pull/16495) -* refactor: update dependency datafusion-orc. by @youngsofun in [#16491](https://github.com/databendlabs/databend/pull/16491) -* refactor: get_tableinfos_by_ids() by @drmingdrmer in [#16503](https://github.com/databendlabs/databend/pull/16503) -* chore(query): refactor like function by @sundy-li in [#16493](https://github.com/databendlabs/databend/pull/16493) -* chore: simplify SchemaApi::truncate_table() by @drmingdrmer in [#16506](https://github.com/databendlabs/databend/pull/16506) -* refactor: remove get_pb_value() by @drmingdrmer in [#16516](https://github.com/databendlabs/databend/pull/16516) -* refactor: Output whole error message with source while retry by @Xuanwo in [#16519](https://github.com/databendlabs/databend/pull/16519) -* refactor: unify path of write segment by @SkyFan2002 in [#16517](https://github.com/databendlabs/databend/pull/16517) -* refactor: Improve gc_dropped_table_by_id() method by @drmingdrmer in [#16528](https://github.com/databendlabs/databend/pull/16528) -* refactor: dropped table listing and GC by @drmingdrmer in [#16531](https://github.com/databendlabs/databend/pull/16531) -* refactor: gc_dropped_db_by_id() by @drmingdrmer in [#16538](https://github.com/databendlabs/databend/pull/16538) -* refactor: SchemaAPI::do_get_table_history by @drmingdrmer in [#16540](https://github.com/databendlabs/databend/pull/16540) -* refactor: `DroppedId` for listing db/tables for gc by @drmingdrmer in [#16542](https://github.com/databendlabs/databend/pull/16542) -* refactor: `get_history_tables_for_gc()` should not return `TableInfo`, but just table name, id and values by @drmingdrmer in [#16545](https://github.com/databendlabs/databend/pull/16545) -* refactor(storage): improve inverted index match phrase query by @b41sh in [#16547](https://github.com/databendlabs/databend/pull/16547) -* refactor: Automatically chunk large key sets in KVPbApi methods by @drmingdrmer in [#16561](https://github.com/databendlabs/databend/pull/16561) -* refactor: simplify get_tables_history() by @drmingdrmer in [#16572](https://github.com/databendlabs/databend/pull/16572) -* refactor(iceberg): Use iceberg file IO instead of our own operator by @Xuanwo in [#16577](https://github.com/databendlabs/databend/pull/16577) -* refactor: add SchemaApi::get_table_in_db by @drmingdrmer in [#16582](https://github.com/databendlabs/databend/pull/16582) -* refactor: SchemaApi::get_table_meta_history() by @drmingdrmer in [#16586](https://github.com/databendlabs/databend/pull/16586) -* refactor: fix error message. by @youngsofun in [#16578](https://github.com/databendlabs/databend/pull/16578) -* refactor(storage): inverted index use merge io to read data by @b41sh in [#16589](https://github.com/databendlabs/databend/pull/16589) -* refactor: isolate session_id and session states of diff users. by @youngsofun in [#16592](https://github.com/databendlabs/databend/pull/16592) -* refactor: Unify the set and unset structures by @TCeason in [#16622](https://github.com/databendlabs/databend/pull/16622) -* refactor(query): make delta table support partition prunning by @sundy-li in [#16621](https://github.com/databendlabs/databend/pull/16621) -* refactor(storage): inverted index support calculate the score by @b41sh in [#16609](https://github.com/databendlabs/databend/pull/16609) -* refactor: some http APIs do not need sticky. by @youngsofun in [#16644](https://github.com/databendlabs/databend/pull/16644) -* refactor: delete user_procedure and refactor procedure interpreter by @TCeason in [#16532](https://github.com/databendlabs/databend/pull/16532) -* refactor(query): use arrow-flight to exchange datas by @sundy-li in [#16657](https://github.com/databendlabs/databend/pull/16657) -* refactor: refine cast variant to map by @andylokandy in [#16691](https://github.com/databendlabs/databend/pull/16691) -* refactor: streamline system.temp_files table scan by @dantengsky in [#16659](https://github.com/databendlabs/databend/pull/16659) -* refactor: Align versions for arrow, opendal, hyper, tonic, prost by @Xuanwo in [#16704](https://github.com/databendlabs/databend/pull/16704) -* refactor: refine column statistic map serialization by @dantengsky in [#16728](https://github.com/databendlabs/databend/pull/16728) -* refactor: MetaGrpcClient needs to specify timeout to auto-reconnect to restarted server by @drmingdrmer in [#16733](https://github.com/databendlabs/databend/pull/16733) -* refactor: replace direct GitHub dependencies with published crates.io versions by @drmingdrmer in [#16700](https://github.com/databendlabs/databend/pull/16700) -* refactor: Enforce all deps must be declared at root by @Xuanwo in [#16741](https://github.com/databendlabs/databend/pull/16741) -* refactor: Remove not used `async-std` by @Xuanwo in [#16745](https://github.com/databendlabs/databend/pull/16745) -* refactor: change blocking pruning process to non-blocking channel by @dqhl76 in [#16718](https://github.com/databendlabs/databend/pull/16718) -* refactor: ensure last-purged log-id cursor in exported from databend-meta service by @drmingdrmer in [#16759](https://github.com/databendlabs/databend/pull/16759) -* refactor: Consolidate `MetaStorageError` variants by @drmingdrmer in [#16760](https://github.com/databendlabs/databend/pull/16760) -* refactor(storage): refactor read virtual columns by @b41sh in [#16758](https://github.com/databendlabs/databend/pull/16758) -* refactor: remove `location_prefix`, which is no longer supported by @dantengsky in [#16757](https://github.com/databendlabs/databend/pull/16757) -* refactor(base): add stacktrace to replace backtrace by @zhang2014 in [#16643](https://github.com/databendlabs/databend/pull/16643) -* refactor: when upgrading, do not import already purged garbage log entries by @drmingdrmer in [#16809](https://github.com/databendlabs/databend/pull/16809) -* refactor: align metrics field names with current behavior by @drmingdrmer in [#16826](https://github.com/databendlabs/databend/pull/16826) -* refactor(base): support stacktrace in cluster mode by @zhang2014 in [#16821](https://github.com/databendlabs/databend/pull/16821) -* refactor: refactor cte binder and fix materialized cte used in subquery by @xudong963 in [#16785](https://github.com/databendlabs/databend/pull/16785) -* refactor: remove EmbeddedMeta by @drmingdrmer in [#16847](https://github.com/databendlabs/databend/pull/16847) -* refactor: remove unused sled related codes by @drmingdrmer in [#16857](https://github.com/databendlabs/databend/pull/16857) -* refactor: make ListKV non-blocking by returning stream directly by @drmingdrmer in [#16868](https://github.com/databendlabs/databend/pull/16868) -* refactor: optimize query system.tables when query single table by @TCeason in [#16869](https://github.com/databendlabs/databend/pull/16869) -* refactor(query): refactor geometry functions by @b41sh in [#16870](https://github.com/databendlabs/databend/pull/16870) -* refactor: use jiff crate replace chrono in date/timestamp func by @TCeason in [#16787](https://github.com/databendlabs/databend/pull/16787) -* refactor: add new raft-log metrics to "metactl status" response by @drmingdrmer in [#16899](https://github.com/databendlabs/databend/pull/16899) -* refactor: remove obsolete gRPC read API by @drmingdrmer in [#16909](https://github.com/databendlabs/databend/pull/16909) -* refactor: deprecate: Operation::AsIs and will be removed by @drmingdrmer in [#16913](https://github.com/databendlabs/databend/pull/16913) -* refactor(sqlsmith): refactor sqlsmith using http client by @b41sh in [#16890](https://github.com/databendlabs/databend/pull/16890) -* refactor: remove ValueRef and use Value instead by @andylokandy in [#16891](https://github.com/databendlabs/databend/pull/16891) -* refactor: make test_watch_expired_events() less sensitive to inaccurate time by @drmingdrmer in [#16966](https://github.com/databendlabs/databend/pull/16966) -* refactor: use temp table to refactor materialized cte by @xudong963 in [#16900](https://github.com/databendlabs/databend/pull/16900) -* refactor: set path of cookie. by @youngsofun in [#17008](https://github.com/databendlabs/databend/pull/17008) -* refactor: replace `RangeMap` with `span-map` for better range lookup by @drmingdrmer in [#17006](https://github.com/databendlabs/databend/pull/17006) -* refactor: revert pr #16869 by @TCeason in [#17012](https://github.com/databendlabs/databend/pull/17012) -* refactor: auto split large mget_database_names_by_ids into chunks with `KVPbApi::get_pb_values_vec()` by @drmingdrmer in [#17011](https://github.com/databendlabs/databend/pull/17011) -* refactor: mget db names and table names remove duplicate ids to avoid too many parameters by @b41sh in [#17013](https://github.com/databendlabs/databend/pull/17013) -* refactor: integrate fuse table block pruning into pipeline by @dqhl76 in [#16841](https://github.com/databendlabs/databend/pull/16841) -* refactor: optimize query system.tables when query single table (#16869) by @TCeason in [#17021](https://github.com/databendlabs/databend/pull/17021) -* refactor(cluster): refactor cluster for dyn cluster [part 1] by @zhang2014 in [#17023](https://github.com/databendlabs/databend/pull/17023) -* refactor(query): refactor udf server batch rows by @b41sh in [#17092](https://github.com/databendlabs/databend/pull/17092) -* refactor: set name for all runtime worker threads. by @youngsofun in [#17084](https://github.com/databendlabs/databend/pull/17084) -* refactor(query): refactor udf server connection reuse endpoint by @b41sh in [#17106](https://github.com/databendlabs/databend/pull/17106) -* refactor: simplify alter and drop cluster key logic by @zhyass in [#17128](https://github.com/databendlabs/databend/pull/17128) -* refactor: integrate segment pruning into pipeline by @dqhl76 in [#17126](https://github.com/databendlabs/databend/pull/17126) + +- refactor: replace absolute expiration time with relative TTL in schema API by @drmingdrmer in [#16268](https://github.com/databendlabs/databend/pull/16268) +- refactor(query): remove lru cache meter by @zhang2014 in [#16260](https://github.com/databendlabs/databend/pull/16260) +- refactor: Use global http client to share the connection pool by @Xuanwo in [#16276](https://github.com/databendlabs/databend/pull/16276) +- refactor(query): refactor hash join spill by @Dousir9 in [#15746](https://github.com/databendlabs/databend/pull/15746) +- refactor: change `DatabaseInfo.meta` to `SeqV` by @drmingdrmer in [#16295](https://github.com/databendlabs/databend/pull/16295) +- refactor: change value of meta-service key `DatabaseNameIdent` from `DatabaseId` to `Id` by @drmingdrmer in [#16299](https://github.com/databendlabs/databend/pull/16299) +- refactor: adopt `get_pb()` for get_background_task by @drmingdrmer in [#16308](https://github.com/databendlabs/databend/pull/16308) +- refactor: Reduce parallelism when vacuuming dropped tables by @dantengsky in [#16312](https://github.com/databendlabs/databend/pull/16312) +- refactor(query): add setting external_server_request_retry_times by @sundy-li in [#16307](https://github.com/databendlabs/databend/pull/16307) +- refactor(query): refactor bind set returning functions by @b41sh in [#16316](https://github.com/databendlabs/databend/pull/16316) +- refactor(query): add config enable_meta_data_upgrade_json_to_pb_from_v307 by @TCeason in [#16306](https://github.com/databendlabs/databend/pull/16306) +- refactor: add associated type kvapi::Value::KeyType by @drmingdrmer in [#16320](https://github.com/databendlabs/databend/pull/16320) +- refactor: kv-app-errors does not need serde by @drmingdrmer in [#16324](https://github.com/databendlabs/databend/pull/16324) +- refactor(query): refactor bind async functions by @b41sh in [#16331](https://github.com/databendlabs/databend/pull/16331) +- refactor: Catalog Manager API improvements for create and drop operations by @drmingdrmer in [#16338](https://github.com/databendlabs/databend/pull/16338) +- refactor: Add BaseApi to abstract usually used meta-service access pattern by @drmingdrmer in [#16351](https://github.com/databendlabs/databend/pull/16351) +- refactor: simplify SchemaApi::list_indexes(), get_index() list_background_jobs() by @drmingdrmer in [#16357](https://github.com/databendlabs/databend/pull/16357) +- chore(query): optimize window sort by @sundy-li in [#16355](https://github.com/databendlabs/databend/pull/16355) +- chore(query): reduce hash join memory usage by @Dousir9 in [#16359](https://github.com/databendlabs/databend/pull/16359) +- refactor: simplify drop_index() with NameIdValueApi by @drmingdrmer in [#16366](https://github.com/databendlabs/databend/pull/16366) +- refactor: simplify dictionary API by @drmingdrmer in [#16371](https://github.com/databendlabs/databend/pull/16371) +- refactor: Add item count check to `KVPbApi::get_pb_stream()` by @drmingdrmer in [#16377](https://github.com/databendlabs/databend/pull/16377) +- refactor(query): optimize show drop tables by @TCeason in [#16370](https://github.com/databendlabs/databend/pull/16370) +- chore(query): Simplified sort simple rows implementation by @forsaken628 in [#16382](https://github.com/databendlabs/databend/pull/16382) +- refactor(query): refactor some codes of parquet2 by @sundy-li in [#16386](https://github.com/databendlabs/databend/pull/16386) +- refactor: remove all share related functions by @drmingdrmer in [#16383](https://github.com/databendlabs/databend/pull/16383) +- refactor: replace get_pb_value() with get_pb() by @drmingdrmer in [#16395](https://github.com/databendlabs/databend/pull/16395) +- refactor: Add NameValueApi, simplify virtual column APIs by @drmingdrmer in [#16398](https://github.com/databendlabs/databend/pull/16398) +- refactor: simplify catalog API by @drmingdrmer in [#16406](https://github.com/databendlabs/databend/pull/16406) +- refactor: Simplify table lock API. by @drmingdrmer in [#16413](https://github.com/databendlabs/databend/pull/16413) +- chore(query): introduce EmptyResultScan plan by @sundy-li in [#16411](https://github.com/databendlabs/databend/pull/16411) +- refactor: remove unused `TableInfo.tenant` by @drmingdrmer in [#16416](https://github.com/databendlabs/databend/pull/16416) +- refactor: simplify least-visible-time schema API, add LeastVisibleTimeIdent by @drmingdrmer in [#16418](https://github.com/databendlabs/databend/pull/16418) +- refactor: add mget_id_value_compat() by @drmingdrmer in [#16425](https://github.com/databendlabs/databend/pull/16425) +- refactor(query): first check privilege in SystemEngine get_full_data by @TCeason in [#16421](https://github.com/databendlabs/databend/pull/16421) +- chore(query): limit max concurrency of spill io requests by @zhang2014 in [#16442](https://github.com/databendlabs/databend/pull/16442) +- chore(query): make string to int respect behavior like PG by @sundy-li in [#16428](https://github.com/databendlabs/databend/pull/16428) +- refactor: simplify vacuum drop table handling by @drmingdrmer in [#16446](https://github.com/databendlabs/databend/pull/16446) +- chore: use logforth to replace fern by @andylokandy in [#16249](https://github.com/databendlabs/databend/pull/16249) +- refactor(executor): use event cause to refactor shuffle processor by @zhang2014 in [#16445](https://github.com/databendlabs/databend/pull/16445) +- refactor: cleanup logic to get tables to vacuum by @drmingdrmer in [#16450](https://github.com/databendlabs/databend/pull/16450) +- refactor: enhancements of HTTP client session. by @youngsofun in [#16452](https://github.com/databendlabs/databend/pull/16452) +- refactor(query): sort kernel optimization by @sundy-li in [#16458](https://github.com/databendlabs/databend/pull/16458) +- refactor(storage): improve inverted index read fst file first to reduce load index by @b41sh in [#16385](https://github.com/databendlabs/databend/pull/16385) +- refactor: refactor vacuum by @drmingdrmer in [#16454](https://github.com/databendlabs/databend/pull/16454) +- chore: simplify get_sequence() and get_sequence_next_value() by @drmingdrmer in [#16463](https://github.com/databendlabs/databend/pull/16463) +- refactor: add DatabaseMeta.gc_in_progress by @drmingdrmer in [#16464](https://github.com/databendlabs/databend/pull/16464) +- refactor(query): use pipeline exchange to refactor window scatter by @zhang2014 in [#16471](https://github.com/databendlabs/databend/pull/16471) +- refactor(query): simplify expression kernel by @sundy-li in [#16482](https://github.com/databendlabs/databend/pull/16482) +- refactor: add KVPbCrudApi as abstraction layer for commonly used CRUD operations by @drmingdrmer in [#16479](https://github.com/databendlabs/databend/pull/16479) +- refactor: add KVPbCrudApi::crud_try_insert() and crud_try_upsert() by @drmingdrmer in [#16484](https://github.com/databendlabs/databend/pull/16484) +- refactor: SchemaApi::list_databases() by @drmingdrmer in [#16485](https://github.com/databendlabs/databend/pull/16485) +- refactor: SchemaApi::get_database_history() by @drmingdrmer in [#16487](https://github.com/databendlabs/databend/pull/16487) +- refactor: test SchemaApi::get_tenant_history_database() by @drmingdrmer in [#16488](https://github.com/databendlabs/databend/pull/16488) +- refactor(query): refactor license manager by @zhang2014 in [#16489](https://github.com/databendlabs/databend/pull/16489) +- refactor(query): refactor license manager by @zhang2014 in [#16492](https://github.com/databendlabs/databend/pull/16492) +- refactor: simplify `DroppedId`. Replace manual comparison with string comparison by @drmingdrmer in [#16495](https://github.com/databendlabs/databend/pull/16495) +- refactor: update dependency datafusion-orc. by @youngsofun in [#16491](https://github.com/databendlabs/databend/pull/16491) +- refactor: get_tableinfos_by_ids() by @drmingdrmer in [#16503](https://github.com/databendlabs/databend/pull/16503) +- chore(query): refactor like function by @sundy-li in [#16493](https://github.com/databendlabs/databend/pull/16493) +- chore: simplify SchemaApi::truncate_table() by @drmingdrmer in [#16506](https://github.com/databendlabs/databend/pull/16506) +- refactor: remove get_pb_value() by @drmingdrmer in [#16516](https://github.com/databendlabs/databend/pull/16516) +- refactor: Output whole error message with source while retry by @Xuanwo in [#16519](https://github.com/databendlabs/databend/pull/16519) +- refactor: unify path of write segment by @SkyFan2002 in [#16517](https://github.com/databendlabs/databend/pull/16517) +- refactor: Improve gc_dropped_table_by_id() method by @drmingdrmer in [#16528](https://github.com/databendlabs/databend/pull/16528) +- refactor: dropped table listing and GC by @drmingdrmer in [#16531](https://github.com/databendlabs/databend/pull/16531) +- refactor: gc_dropped_db_by_id() by @drmingdrmer in [#16538](https://github.com/databendlabs/databend/pull/16538) +- refactor: SchemaAPI::do_get_table_history by @drmingdrmer in [#16540](https://github.com/databendlabs/databend/pull/16540) +- refactor: `DroppedId` for listing db/tables for gc by @drmingdrmer in [#16542](https://github.com/databendlabs/databend/pull/16542) +- refactor: `get_history_tables_for_gc()` should not return `TableInfo`, but just table name, id and values by @drmingdrmer in [#16545](https://github.com/databendlabs/databend/pull/16545) +- refactor(storage): improve inverted index match phrase query by @b41sh in [#16547](https://github.com/databendlabs/databend/pull/16547) +- refactor: Automatically chunk large key sets in KVPbApi methods by @drmingdrmer in [#16561](https://github.com/databendlabs/databend/pull/16561) +- refactor: simplify get_tables_history() by @drmingdrmer in [#16572](https://github.com/databendlabs/databend/pull/16572) +- refactor(iceberg): Use iceberg file IO instead of our own operator by @Xuanwo in [#16577](https://github.com/databendlabs/databend/pull/16577) +- refactor: add SchemaApi::get_table_in_db by @drmingdrmer in [#16582](https://github.com/databendlabs/databend/pull/16582) +- refactor: SchemaApi::get_table_meta_history() by @drmingdrmer in [#16586](https://github.com/databendlabs/databend/pull/16586) +- refactor: fix error message. by @youngsofun in [#16578](https://github.com/databendlabs/databend/pull/16578) +- refactor(storage): inverted index use merge io to read data by @b41sh in [#16589](https://github.com/databendlabs/databend/pull/16589) +- refactor: isolate session_id and session states of diff users. by @youngsofun in [#16592](https://github.com/databendlabs/databend/pull/16592) +- refactor: Unify the set and unset structures by @TCeason in [#16622](https://github.com/databendlabs/databend/pull/16622) +- refactor(query): make delta table support partition prunning by @sundy-li in [#16621](https://github.com/databendlabs/databend/pull/16621) +- refactor(storage): inverted index support calculate the score by @b41sh in [#16609](https://github.com/databendlabs/databend/pull/16609) +- refactor: some http APIs do not need sticky. by @youngsofun in [#16644](https://github.com/databendlabs/databend/pull/16644) +- refactor: delete user_procedure and refactor procedure interpreter by @TCeason in [#16532](https://github.com/databendlabs/databend/pull/16532) +- refactor(query): use arrow-flight to exchange datas by @sundy-li in [#16657](https://github.com/databendlabs/databend/pull/16657) +- refactor: refine cast variant to map by @andylokandy in [#16691](https://github.com/databendlabs/databend/pull/16691) +- refactor: streamline system.temp_files table scan by @dantengsky in [#16659](https://github.com/databendlabs/databend/pull/16659) +- refactor: Align versions for arrow, opendal, hyper, tonic, prost by @Xuanwo in [#16704](https://github.com/databendlabs/databend/pull/16704) +- refactor: refine column statistic map serialization by @dantengsky in [#16728](https://github.com/databendlabs/databend/pull/16728) +- refactor: MetaGrpcClient needs to specify timeout to auto-reconnect to restarted server by @drmingdrmer in [#16733](https://github.com/databendlabs/databend/pull/16733) +- refactor: replace direct GitHub dependencies with published crates.io versions by @drmingdrmer in [#16700](https://github.com/databendlabs/databend/pull/16700) +- refactor: Enforce all deps must be declared at root by @Xuanwo in [#16741](https://github.com/databendlabs/databend/pull/16741) +- refactor: Remove not used `async-std` by @Xuanwo in [#16745](https://github.com/databendlabs/databend/pull/16745) +- refactor: change blocking pruning process to non-blocking channel by @dqhl76 in [#16718](https://github.com/databendlabs/databend/pull/16718) +- refactor: ensure last-purged log-id cursor in exported from databend-meta service by @drmingdrmer in [#16759](https://github.com/databendlabs/databend/pull/16759) +- refactor: Consolidate `MetaStorageError` variants by @drmingdrmer in [#16760](https://github.com/databendlabs/databend/pull/16760) +- refactor(storage): refactor read virtual columns by @b41sh in [#16758](https://github.com/databendlabs/databend/pull/16758) +- refactor: remove `location_prefix`, which is no longer supported by @dantengsky in [#16757](https://github.com/databendlabs/databend/pull/16757) +- refactor(base): add stacktrace to replace backtrace by @zhang2014 in [#16643](https://github.com/databendlabs/databend/pull/16643) +- refactor: when upgrading, do not import already purged garbage log entries by @drmingdrmer in [#16809](https://github.com/databendlabs/databend/pull/16809) +- refactor: align metrics field names with current behavior by @drmingdrmer in [#16826](https://github.com/databendlabs/databend/pull/16826) +- refactor(base): support stacktrace in cluster mode by @zhang2014 in [#16821](https://github.com/databendlabs/databend/pull/16821) +- refactor: refactor cte binder and fix materialized cte used in subquery by @xudong963 in [#16785](https://github.com/databendlabs/databend/pull/16785) +- refactor: remove EmbeddedMeta by @drmingdrmer in [#16847](https://github.com/databendlabs/databend/pull/16847) +- refactor: remove unused sled related codes by @drmingdrmer in [#16857](https://github.com/databendlabs/databend/pull/16857) +- refactor: make ListKV non-blocking by returning stream directly by @drmingdrmer in [#16868](https://github.com/databendlabs/databend/pull/16868) +- refactor: optimize query system.tables when query single table by @TCeason in [#16869](https://github.com/databendlabs/databend/pull/16869) +- refactor(query): refactor geometry functions by @b41sh in [#16870](https://github.com/databendlabs/databend/pull/16870) +- refactor: use jiff crate replace chrono in date/timestamp func by @TCeason in [#16787](https://github.com/databendlabs/databend/pull/16787) +- refactor: add new raft-log metrics to "metactl status" response by @drmingdrmer in [#16899](https://github.com/databendlabs/databend/pull/16899) +- refactor: remove obsolete gRPC read API by @drmingdrmer in [#16909](https://github.com/databendlabs/databend/pull/16909) +- refactor: deprecate: Operation::AsIs and will be removed by @drmingdrmer in [#16913](https://github.com/databendlabs/databend/pull/16913) +- refactor(sqlsmith): refactor sqlsmith using http client by @b41sh in [#16890](https://github.com/databendlabs/databend/pull/16890) +- refactor: remove ValueRef and use Value instead by @andylokandy in [#16891](https://github.com/databendlabs/databend/pull/16891) +- refactor: make test_watch_expired_events() less sensitive to inaccurate time by @drmingdrmer in [#16966](https://github.com/databendlabs/databend/pull/16966) +- refactor: use temp table to refactor materialized cte by @xudong963 in [#16900](https://github.com/databendlabs/databend/pull/16900) +- refactor: set path of cookie. by @youngsofun in [#17008](https://github.com/databendlabs/databend/pull/17008) +- refactor: replace `RangeMap` with `span-map` for better range lookup by @drmingdrmer in [#17006](https://github.com/databendlabs/databend/pull/17006) +- refactor: revert pr #16869 by @TCeason in [#17012](https://github.com/databendlabs/databend/pull/17012) +- refactor: auto split large mget_database_names_by_ids into chunks with `KVPbApi::get_pb_values_vec()` by @drmingdrmer in [#17011](https://github.com/databendlabs/databend/pull/17011) +- refactor: mget db names and table names remove duplicate ids to avoid too many parameters by @b41sh in [#17013](https://github.com/databendlabs/databend/pull/17013) +- refactor: integrate fuse table block pruning into pipeline by @dqhl76 in [#16841](https://github.com/databendlabs/databend/pull/16841) +- refactor: optimize query system.tables when query single table (#16869) by @TCeason in [#17021](https://github.com/databendlabs/databend/pull/17021) +- refactor(cluster): refactor cluster for dyn cluster [part 1] by @zhang2014 in [#17023](https://github.com/databendlabs/databend/pull/17023) +- refactor(query): refactor udf server batch rows by @b41sh in [#17092](https://github.com/databendlabs/databend/pull/17092) +- refactor: set name for all runtime worker threads. by @youngsofun in [#17084](https://github.com/databendlabs/databend/pull/17084) +- refactor(query): refactor udf server connection reuse endpoint by @b41sh in [#17106](https://github.com/databendlabs/databend/pull/17106) +- refactor: simplify alter and drop cluster key logic by @zhyass in [#17128](https://github.com/databendlabs/databend/pull/17128) +- refactor: integrate segment pruning into pipeline by @dqhl76 in [#17126](https://github.com/databendlabs/databend/pull/17126) + ### Build/Testing/CI Infra Changes 🔌 -* ci: Add iceberg tpch sqllogictests by @Xuanwo in [#16598](https://github.com/databendlabs/databend/pull/16598) -* ci: Enable incremental back to see how it works by @Xuanwo in [#16817](https://github.com/databendlabs/databend/pull/16817) -* ci: fix flaky test by @youngsofun in [#16945](https://github.com/databendlabs/databend/pull/16945) -* ci: ignore RUSTSEC-2024-0402. by @youngsofun in [#16998](https://github.com/databendlabs/databend/pull/16998) + +- ci: Add iceberg tpch sqllogictests by @Xuanwo in [#16598](https://github.com/databendlabs/databend/pull/16598) +- ci: Enable incremental back to see how it works by @Xuanwo in [#16817](https://github.com/databendlabs/databend/pull/16817) +- ci: fix flaky test by @youngsofun in [#16945](https://github.com/databendlabs/databend/pull/16945) +- ci: ignore RUSTSEC-2024-0402. by @youngsofun in [#16998](https://github.com/databendlabs/databend/pull/16998) + ### Documentation 📔 -* docs: add stream to readme by @BohuTANG in [#16810](https://github.com/databendlabs/databend/pull/16810) + +- docs: add stream to readme by @BohuTANG in [#16810](https://github.com/databendlabs/databend/pull/16810) + ### Others 📒 -* chore(query): add more snapshot/segment serde tests by @sundy-li in [#16273](https://github.com/databendlabs/databend/pull/16273) -* chore: Use tagged iceberg crates by @Xuanwo in [#16278](https://github.com/databendlabs/databend/pull/16278) -* chore: add a setting to decide if table sample is deterministic by @xudong963 in [#16275](https://github.com/databendlabs/databend/pull/16275) -* chore(ci): tmp disable sharing test by @everpcpc in [#16285](https://github.com/databendlabs/databend/pull/16285) -* chore(ci): flaky test by @zhyass in [#16207](https://github.com/databendlabs/databend/pull/16207) -* chore: replace condition and if_then with txn in txn methods by @drmingdrmer in [#16289](https://github.com/databendlabs/databend/pull/16289) -* chore(query): bump ast 0.0.3 by @sundy-li in [#16283](https://github.com/databendlabs/databend/pull/16283) -* chore(query): avoid create query context each auth by @zhang2014 in [#16279](https://github.com/databendlabs/databend/pull/16279) -* chore(query): remove unused parquet2 codes by @sundy-li in [#16282](https://github.com/databendlabs/databend/pull/16282) -* chore: add setting auto_compaction_segments_limit by @zhyass in [#16298](https://github.com/databendlabs/databend/pull/16298) -* chore: remove the log about if histogram exists by @xudong963 in [#16303](https://github.com/databendlabs/databend/pull/16303) -* chore: simplify create_data_mask by @drmingdrmer in [#16309](https://github.com/databendlabs/databend/pull/16309) -* chore(ci): adjust release time by @everpcpc in [#16334](https://github.com/databendlabs/databend/pull/16334) -* chore(query): explain ast work like explain syntax by @sundy-li in [#16335](https://github.com/databendlabs/databend/pull/16335) -* chore: support temporary table with memory engine by @SkyFan2002 in [#16332](https://github.com/databendlabs/databend/pull/16332) -* chore(query): improve project set by @Dousir9 in [#16326](https://github.com/databendlabs/databend/pull/16326) -* chore: remove unused serde impl by @drmingdrmer in [#16347](https://github.com/databendlabs/databend/pull/16347) -* chore: remove empty reply struct by @drmingdrmer in [#16350](https://github.com/databendlabs/databend/pull/16350) -* chore(query): fix window index out of range by @Dousir9 in [#16352](https://github.com/databendlabs/databend/pull/16352) -* chore: separate test run for temp_table suite by @SkyFan2002 in [#16358](https://github.com/databendlabs/databend/pull/16358) -* chore(code): update the version of gix-path in Cargo.lock by @Dousir9 in [#16365](https://github.com/databendlabs/databend/pull/16365) -* chore(ci): add internal test by @TCeason in [#16369](https://github.com/databendlabs/databend/pull/16369) -* chore: improve Debug and Display for DataId and TIdent by @drmingdrmer in [#16379](https://github.com/databendlabs/databend/pull/16379) -* chore: add logging for embedded meta test by @drmingdrmer in [#16384](https://github.com/databendlabs/databend/pull/16384) -* chore(ci): fix cargo clippy by @TCeason in [#16397](https://github.com/databendlabs/databend/pull/16397) -* chore: add error stack to cmd entrence by @andylokandy in [#16391](https://github.com/databendlabs/databend/pull/16391) -* chore(query): add external server request profile by @zhang2014 in [#16400](https://github.com/databendlabs/databend/pull/16400) -* chore(query): refactor udf retry by @sundy-li in [#16405](https://github.com/databendlabs/databend/pull/16405) -* chore(query): add connect duration metric for udf by @zhang2014 in [#16407](https://github.com/databendlabs/databend/pull/16407) -* chore: add join type for explain analyze partial by @xudong963 in [#16408](https://github.com/databendlabs/databend/pull/16408) -* chore: bump quinn-proto to 0.11.8 for cargo audit pass by @dqhl76 in [#16419](https://github.com/databendlabs/databend/pull/16419) -* chore(planner): improve infer filter by @Dousir9 in [#16361](https://github.com/databendlabs/databend/pull/16361) -* chore: log remote addr when meta-service raft API recevies a message by @drmingdrmer in [#16438](https://github.com/databendlabs/databend/pull/16438) -* chore(query): add column: system.tables.total_columns by @TCeason in [#16447](https://github.com/databendlabs/databend/pull/16447) -* chore(ci): fix dataset domain by @everpcpc in [#16455](https://github.com/databendlabs/databend/pull/16455) -* chore(ci): release with musl by @everpcpc in [#16460](https://github.com/databendlabs/databend/pull/16460) -* chore(executor): support for data exchange between different processors within the pipeline by @zhang2014 in [#16467](https://github.com/databendlabs/databend/pull/16467) -* chore(executor): more edge detail for executing graph by @zhang2014 in [#16468](https://github.com/databendlabs/databend/pull/16468) -* chore(ci): remove hdfs release by @everpcpc in [#16477](https://github.com/databendlabs/databend/pull/16477) -* chore(query): null first behavior by @sundy-li in [#16475](https://github.com/databendlabs/databend/pull/16475) -* chore: update nom-rule by @andylokandy in [#16483](https://github.com/databendlabs/databend/pull/16483) -* chore: bump proj4rs 0.1.4 by @b41sh in [#16474](https://github.com/databendlabs/databend/pull/16474) -* chore: remove logs from block writer by @dantengsky in [#16497](https://github.com/databendlabs/databend/pull/16497) -* chore: simplify get_gc_table_info() by @drmingdrmer in [#16499](https://github.com/databendlabs/databend/pull/16499) -* chore(query): replace to datafuse-extras/dtparse by @TCeason in [#16509](https://github.com/databendlabs/databend/pull/16509) -* chore(storage): hook recluster avoid scan all segments by @zhyass in [#16498](https://github.com/databendlabs/databend/pull/16498) -* chore: update source repo for async-compression by @everpcpc in [#16513](https://github.com/databendlabs/databend/pull/16513) -* chore(query): move recursion & backtrace crate to datafuse-extras by @zhang2014 in [#16520](https://github.com/databendlabs/databend/pull/16520) -* chore(query): add more asserts by @sundy-li in [#16536](https://github.com/databendlabs/databend/pull/16536) -* chore: update repo for workflows by @everpcpc in [#16546](https://github.com/databendlabs/databend/pull/16546) -* chore(storage): refactor compact source by @zhyass in [#16527](https://github.com/databendlabs/databend/pull/16527) -* chore(query): SHOW/DESC is not DDL by @TCeason in [#16583](https://github.com/databendlabs/databend/pull/16583) -* chore: check lock revision before watch delete by @zhyass in [#16590](https://github.com/databendlabs/databend/pull/16590) -* chore(ci): flaky test by @zhyass in [#16596](https://github.com/databendlabs/databend/pull/16596) -* chore(query): improve variable parser by @sundy-li in [#16599](https://github.com/databendlabs/databend/pull/16599) -* chore: refine table sample tests by @xudong963 in [#16600](https://github.com/databendlabs/databend/pull/16600) -* chore(query): add more logs on aggregation by @sundy-li in [#16552](https://github.com/databendlabs/databend/pull/16552) -* chore: reset recluster block size by @zhyass in [#16623](https://github.com/databendlabs/databend/pull/16623) -* chore(query): add http address info to cluster node info by @zhang2014 in [#16620](https://github.com/databendlabs/databend/pull/16620) -* chore: drop guard when acquire lock failed by @zhyass in [#16616](https://github.com/databendlabs/databend/pull/16616) -* chore: revert “lock mgr may failed to release lock in time (#16611)" by @dantengsky in [#16630](https://github.com/databendlabs/databend/pull/16630) -* chore(query): reduce unsafe codes in kernels by @sundy-li in [#16633](https://github.com/databendlabs/databend/pull/16633) -* chore(query): add warn log if vacuum temporary file is error by @zhang2014 in [#16646](https://github.com/databendlabs/databend/pull/16646) -* chore: resolve todo in dynamic sample by @xudong963 in [#16629](https://github.com/databendlabs/databend/pull/16629) -* chore(query): enable loser tree merge sort default by @forsaken628 in [#16649](https://github.com/databendlabs/databend/pull/16649) -* chore(query): replace `arrow2` with `arrow-rs` in `serialize_column` and `deserialize_column` by @forsaken628 in [#16655](https://github.com/databendlabs/databend/pull/16655) -* chore(query): remove hash join build detail status by @zhang2014 in [#16674](https://github.com/databendlabs/databend/pull/16674) -* chore: upon startup, meta-service output human-readable error if trying to open future version on-disk data by @drmingdrmer in [#16679](https://github.com/databendlabs/databend/pull/16679) -* chore(query): modify rbac test result display by @TCeason in [#16686](https://github.com/databendlabs/databend/pull/16686) -* chore: adjust default value of setting `max_storage_io_requests` by @SkyFan2002 in [#16680](https://github.com/databendlabs/databend/pull/16680) -* chore(query): returns nan for aggregate_kurtosis and aggregate_skewness by @sundy-li in [#16688](https://github.com/databendlabs/databend/pull/16688) -* chore: display port number on error from bind to port failure by @lyang24 in [#16695](https://github.com/databendlabs/databend/pull/16695) -* chore: remove `SortColumnDescription.is_nullable` by @forsaken628 in [#16699](https://github.com/databendlabs/databend/pull/16699) -* chore: remove transaction keyword by @SkyFan2002 in [#16707](https://github.com/databendlabs/databend/pull/16707) -* chore: add timeout for `detect_region` operation to prevent hanging request by @dantengsky in [#16709](https://github.com/databendlabs/databend/pull/16709) -* chore(query): add current_query_id and database id for admin api by @zhang2014 in [#16703](https://github.com/databendlabs/databend/pull/16703) -* chore(query): index scalar support variant by @sundy-li in [#16719](https://github.com/databendlabs/databend/pull/16719) -* chore: display log.file.limit and prefix_filter by @TCeason in [#16713](https://github.com/databendlabs/databend/pull/16713) -* chore: avoid returning error during computing binary comparison selectivity by @xudong963 in [#16725](https://github.com/databendlabs/databend/pull/16725) -* chore: Simplifying BlockMetaInfo Definitions by @forsaken628 in [#16716](https://github.com/databendlabs/databend/pull/16716) -* chore: tweak cargo feature "jemalloc" by @dantengsky in [#16693](https://github.com/databendlabs/databend/pull/16693) -* chore: remove flaky test by @TCeason in [#16739](https://github.com/databendlabs/databend/pull/16739) -* chore: refine vacuum by @dantengsky in [#16743](https://github.com/databendlabs/databend/pull/16743) -* chore: Remove not used dep `config` by @Xuanwo in [#16746](https://github.com/databendlabs/databend/pull/16746) -* chore(query): Introduce VecExt and SliceExt to check unsafe bounds in debug mode by @sundy-li in [#16747](https://github.com/databendlabs/databend/pull/16747) -* chore: make VACUUM TEMPORARY FILES killable by @dantengsky in [#16751](https://github.com/databendlabs/databend/pull/16751) -* chore: tweak batch deletion concurrency by @dantengsky in [#16770](https://github.com/databendlabs/databend/pull/16770) -* chore: refine raft-types import path by @drmingdrmer in [#16764](https://github.com/databendlabs/databend/pull/16764) -* chore: remove obsolete version by @everpcpc in [#16789](https://github.com/databendlabs/databend/pull/16789) -* chore: add snapshot location cache for attached table by @dantengsky in [#16795](https://github.com/databendlabs/databend/pull/16795) -* chore: update meta-service version info and compatibility doc by @drmingdrmer in [#16800](https://github.com/databendlabs/databend/pull/16800) -* chore(query): embedded public key of license by @zhang2014 in [#16813](https://github.com/databendlabs/databend/pull/16813) -* chore(query): refactor common/arrow removes arrow/io crates by @sundy-li in [#16808](https://github.com/databendlabs/databend/pull/16808) -* chore: purge dropped view metadata during vacuum by @dantengsky in [#16819](https://github.com/databendlabs/databend/pull/16819) -* chore(query): keep queries detail and profile log format by @zhang2014 in [#16822](https://github.com/databendlabs/databend/pull/16822) -* chore(ci): test with different license by @everpcpc in [#16815](https://github.com/databendlabs/databend/pull/16815) -* chore(base): rollback to kernel signal handler after dump backtrace by @zhang2014 in [#16828](https://github.com/databendlabs/databend/pull/16828) -* chore: remove unused codes by @zhyass in [#16834](https://github.com/databendlabs/databend/pull/16834) -* chore: fix typo in `ColumnCacheKeyBuilder` by @dantengsky in [#16838](https://github.com/databendlabs/databend/pull/16838) -* chore(cluster): disable parallel commit of cluster tasks by @zhang2014 in [#16851](https://github.com/databendlabs/databend/pull/16851) -* chore(query): remove SliceExt by @sundy-li in [#16853](https://github.com/databendlabs/databend/pull/16853) -* chore(ci): separate build profile by @everpcpc in [#16855](https://github.com/databendlabs/databend/pull/16855) -* chore(query): remove useless new line for query log by @zhang2014 in [#16860](https://github.com/databendlabs/databend/pull/16860) -* chore: add some log by @SkyFan2002 in [#16863](https://github.com/databendlabs/databend/pull/16863) -* chore(query): improve distributed runtime filter by @Dousir9 in [#16862](https://github.com/databendlabs/databend/pull/16862) -* chore: enable stderr logging for `table_meta_inspector` by @dantengsky in [#16865](https://github.com/databendlabs/databend/pull/16865) -* chore(query): remove common/arrow crate by @sundy-li in [#16846](https://github.com/databendlabs/databend/pull/16846) -* chore(ci): adjust runner size by @everpcpc in [#16879](https://github.com/databendlabs/databend/pull/16879) -* chore(settings): enable spill by @Dousir9 in [#16888](https://github.com/databendlabs/databend/pull/16888) -* chore: remove unused config_id from RaftConfig by @drmingdrmer in [#16902](https://github.com/databendlabs/databend/pull/16902) -* chore(ci): flaky test by @zhyass in [#16917](https://github.com/databendlabs/databend/pull/16917) -* chore(ci): enable overflow-checks in ci profile by @sundy-li in [#16895](https://github.com/databendlabs/databend/pull/16895) -* chore(ci): flaky test by @zhyass in [#16919](https://github.com/databendlabs/databend/pull/16919) -* chore(query): add snapshot logs in read partitions by @sundy-li in [#16918](https://github.com/databendlabs/databend/pull/16918) -* chore: bump rustls version 0.23.18 by @TCeason in [#16936](https://github.com/databendlabs/databend/pull/16936) -* chore(query): spilt binary symbol by @zhang2014 in [#16861](https://github.com/databendlabs/databend/pull/16861) -* chore: `k way merge sort` add boundary check to prevent process crash by @forsaken628 in [#16934](https://github.com/databendlabs/databend/pull/16934) -* chore(ci): remove aarch64 musl in release by @zhang2014 in [#16946](https://github.com/databendlabs/databend/pull/16946) -* chore(planner): improve cardinality estimation by @Dousir9 in [#16938](https://github.com/databendlabs/databend/pull/16938) -* chore(planner): refine project set cardinality by @Dousir9 in [#16944](https://github.com/databendlabs/databend/pull/16944) -* chore: support recursive cte with normal cte by @xudong963 in [#16932](https://github.com/databendlabs/databend/pull/16932) -* chore(binder): add enable_materialized_cte settings by @Dousir9 in [#16950](https://github.com/databendlabs/databend/pull/16950) -* chore(storage): hook compact avoid scan all segments by @zhyass in [#16954](https://github.com/databendlabs/databend/pull/16954) -* chore(storage): do compact before recluster during compact hook by @zhyass in [#16949](https://github.com/databendlabs/databend/pull/16949) -* chore(ci): upgrade bendsql by @everpcpc in [#16965](https://github.com/databendlabs/databend/pull/16965) -* chore(storage): refine error message for stream read offset snapshot by @zhyass in [#16964](https://github.com/databendlabs/databend/pull/16964) -* chore: bump ruzstd from 0.7.2 to 0.7.3 by @dqhl76 in [#16969](https://github.com/databendlabs/databend/pull/16969) -* chore(ci): install bendsql from packages by @everpcpc in [#16970](https://github.com/databendlabs/databend/pull/16970) -* chore(planner): improve physical join by @Dousir9 in [#16962](https://github.com/databendlabs/databend/pull/16962) -* chore(ci): fix some flaky test by @TCeason in [#16980](https://github.com/databendlabs/databend/pull/16980) -* chore(query): improve decimal aggregate state by @sundy-li in [#16983](https://github.com/databendlabs/databend/pull/16983) -* chore(planner): refine physical join by @Dousir9 in [#16988](https://github.com/databendlabs/databend/pull/16988) -* chore: adjust fuse_time_travel_size() by @SkyFan2002 in [#16995](https://github.com/databendlabs/databend/pull/16995) -* chore(ci): use new dsn for create database by @zhang2014 in [#16968](https://github.com/databendlabs/databend/pull/16968) -* chore(ci): rust toolchain 2024-11-28 build image by @sundy-li in [#17001](https://github.com/databendlabs/databend/pull/17001) -* chore(query): fix topk in native by @sundy-li in [#17003](https://github.com/databendlabs/databend/pull/17003) -* chore(query): bump up rust toolchain to 2024-11-28 by @sundy-li in [#16981](https://github.com/databendlabs/databend/pull/16981) -* chore: tweak attach table refreshing by @dantengsky in [#17019](https://github.com/databendlabs/databend/pull/17019) -* chore(query): remove old aggregate codes by @sundy-li in [#17025](https://github.com/databendlabs/databend/pull/17025) -* chore: add more test to meta-service txn value-matching by @drmingdrmer in [#17033](https://github.com/databendlabs/databend/pull/17033) -* chore(cluster): disable parallel commit for cluster task by @zhang2014 in [#17034](https://github.com/databendlabs/databend/pull/17034) -* chore: improve error handling in partition sending loop by @dqhl76 in [#17035](https://github.com/databendlabs/databend/pull/17035) -* chore(ci): remove musl release by @everpcpc in [#17041](https://github.com/databendlabs/databend/pull/17041) -* chore(query): improve comparison functions by @sundy-li in [#17032](https://github.com/databendlabs/databend/pull/17032) -* chore(binder): fix bind materialized cte by @Dousir9 in [#17046](https://github.com/databendlabs/databend/pull/17046) -* chore: refmt crash log message by @TCeason in [#17059](https://github.com/databendlabs/databend/pull/17059) -* chore: bump dtparse by @TCeason in [#17073](https://github.com/databendlabs/databend/pull/17073) -* chore: remove unused dev by @zhyass in [#17088](https://github.com/databendlabs/databend/pull/17088) -* chore(query): Revert "feat(query): support javascript/python script User Defined Aggregate Function" by @sundy-li in [#17107](https://github.com/databendlabs/databend/pull/17107) -* chore: add more log by @SkyFan2002 in [#17110](https://github.com/databendlabs/databend/pull/17110) -* chore(planner): fix except and intersect operation by @Dousir9 in [#17111](https://github.com/databendlabs/databend/pull/17111) -* chore(query): add fuzz tests by @sundy-li in [#17100](https://github.com/databendlabs/databend/pull/17100) -* chore(query): bump federated mysql version by @TCeason in [#17118](https://github.com/databendlabs/databend/pull/17118) -* chore(query): reduce-functions-code-expand by @sundy-li in [#17114](https://github.com/databendlabs/databend/pull/17114) -* chore(query): improve hook vacuum temp after query by @sundy-li in [#17125](https://github.com/databendlabs/databend/pull/17125) -* chore(query): bump enum-as-inner 0.6 by @forsaken628 in [#17120](https://github.com/databendlabs/databend/pull/17120) -* chore: rename default_cluster_key_id to cluster_key_seq by @zhyass in [#17135](https://github.com/databendlabs/databend/pull/17135) -* chore(query): fix udf metrics by @sundy-li in [#17134](https://github.com/databendlabs/databend/pull/17134) + +- chore(query): add more snapshot/segment serde tests by @sundy-li in [#16273](https://github.com/databendlabs/databend/pull/16273) +- chore: Use tagged iceberg crates by @Xuanwo in [#16278](https://github.com/databendlabs/databend/pull/16278) +- chore: add a setting to decide if table sample is deterministic by @xudong963 in [#16275](https://github.com/databendlabs/databend/pull/16275) +- chore(ci): tmp disable sharing test by @everpcpc in [#16285](https://github.com/databendlabs/databend/pull/16285) +- chore(ci): flaky test by @zhyass in [#16207](https://github.com/databendlabs/databend/pull/16207) +- chore: replace condition and if_then with txn in txn methods by @drmingdrmer in [#16289](https://github.com/databendlabs/databend/pull/16289) +- chore(query): bump ast 0.0.3 by @sundy-li in [#16283](https://github.com/databendlabs/databend/pull/16283) +- chore(query): avoid create query context each auth by @zhang2014 in [#16279](https://github.com/databendlabs/databend/pull/16279) +- chore(query): remove unused parquet2 codes by @sundy-li in [#16282](https://github.com/databendlabs/databend/pull/16282) +- chore: add setting auto_compaction_segments_limit by @zhyass in [#16298](https://github.com/databendlabs/databend/pull/16298) +- chore: remove the log about if histogram exists by @xudong963 in [#16303](https://github.com/databendlabs/databend/pull/16303) +- chore: simplify create_data_mask by @drmingdrmer in [#16309](https://github.com/databendlabs/databend/pull/16309) +- chore(ci): adjust release time by @everpcpc in [#16334](https://github.com/databendlabs/databend/pull/16334) +- chore(query): explain ast work like explain syntax by @sundy-li in [#16335](https://github.com/databendlabs/databend/pull/16335) +- chore: support temporary table with memory engine by @SkyFan2002 in [#16332](https://github.com/databendlabs/databend/pull/16332) +- chore(query): improve project set by @Dousir9 in [#16326](https://github.com/databendlabs/databend/pull/16326) +- chore: remove unused serde impl by @drmingdrmer in [#16347](https://github.com/databendlabs/databend/pull/16347) +- chore: remove empty reply struct by @drmingdrmer in [#16350](https://github.com/databendlabs/databend/pull/16350) +- chore(query): fix window index out of range by @Dousir9 in [#16352](https://github.com/databendlabs/databend/pull/16352) +- chore: separate test run for temp_table suite by @SkyFan2002 in [#16358](https://github.com/databendlabs/databend/pull/16358) +- chore(code): update the version of gix-path in Cargo.lock by @Dousir9 in [#16365](https://github.com/databendlabs/databend/pull/16365) +- chore(ci): add internal test by @TCeason in [#16369](https://github.com/databendlabs/databend/pull/16369) +- chore: improve Debug and Display for DataId and TIdent by @drmingdrmer in [#16379](https://github.com/databendlabs/databend/pull/16379) +- chore: add logging for embedded meta test by @drmingdrmer in [#16384](https://github.com/databendlabs/databend/pull/16384) +- chore(ci): fix cargo clippy by @TCeason in [#16397](https://github.com/databendlabs/databend/pull/16397) +- chore: add error stack to cmd entrence by @andylokandy in [#16391](https://github.com/databendlabs/databend/pull/16391) +- chore(query): add external server request profile by @zhang2014 in [#16400](https://github.com/databendlabs/databend/pull/16400) +- chore(query): refactor udf retry by @sundy-li in [#16405](https://github.com/databendlabs/databend/pull/16405) +- chore(query): add connect duration metric for udf by @zhang2014 in [#16407](https://github.com/databendlabs/databend/pull/16407) +- chore: add join type for explain analyze partial by @xudong963 in [#16408](https://github.com/databendlabs/databend/pull/16408) +- chore: bump quinn-proto to 0.11.8 for cargo audit pass by @dqhl76 in [#16419](https://github.com/databendlabs/databend/pull/16419) +- chore(planner): improve infer filter by @Dousir9 in [#16361](https://github.com/databendlabs/databend/pull/16361) +- chore: log remote addr when meta-service raft API recevies a message by @drmingdrmer in [#16438](https://github.com/databendlabs/databend/pull/16438) +- chore(query): add column: system.tables.total_columns by @TCeason in [#16447](https://github.com/databendlabs/databend/pull/16447) +- chore(ci): fix dataset domain by @everpcpc in [#16455](https://github.com/databendlabs/databend/pull/16455) +- chore(ci): release with musl by @everpcpc in [#16460](https://github.com/databendlabs/databend/pull/16460) +- chore(executor): support for data exchange between different processors within the pipeline by @zhang2014 in [#16467](https://github.com/databendlabs/databend/pull/16467) +- chore(executor): more edge detail for executing graph by @zhang2014 in [#16468](https://github.com/databendlabs/databend/pull/16468) +- chore(ci): remove hdfs release by @everpcpc in [#16477](https://github.com/databendlabs/databend/pull/16477) +- chore(query): null first behavior by @sundy-li in [#16475](https://github.com/databendlabs/databend/pull/16475) +- chore: update nom-rule by @andylokandy in [#16483](https://github.com/databendlabs/databend/pull/16483) +- chore: bump proj4rs 0.1.4 by @b41sh in [#16474](https://github.com/databendlabs/databend/pull/16474) +- chore: remove logs from block writer by @dantengsky in [#16497](https://github.com/databendlabs/databend/pull/16497) +- chore: simplify get_gc_table_info() by @drmingdrmer in [#16499](https://github.com/databendlabs/databend/pull/16499) +- chore(query): replace to datafuse-extras/dtparse by @TCeason in [#16509](https://github.com/databendlabs/databend/pull/16509) +- chore(storage): hook recluster avoid scan all segments by @zhyass in [#16498](https://github.com/databendlabs/databend/pull/16498) +- chore: update source repo for async-compression by @everpcpc in [#16513](https://github.com/databendlabs/databend/pull/16513) +- chore(query): move recursion & backtrace crate to datafuse-extras by @zhang2014 in [#16520](https://github.com/databendlabs/databend/pull/16520) +- chore(query): add more asserts by @sundy-li in [#16536](https://github.com/databendlabs/databend/pull/16536) +- chore: update repo for workflows by @everpcpc in [#16546](https://github.com/databendlabs/databend/pull/16546) +- chore(storage): refactor compact source by @zhyass in [#16527](https://github.com/databendlabs/databend/pull/16527) +- chore(query): SHOW/DESC is not DDL by @TCeason in [#16583](https://github.com/databendlabs/databend/pull/16583) +- chore: check lock revision before watch delete by @zhyass in [#16590](https://github.com/databendlabs/databend/pull/16590) +- chore(ci): flaky test by @zhyass in [#16596](https://github.com/databendlabs/databend/pull/16596) +- chore(query): improve variable parser by @sundy-li in [#16599](https://github.com/databendlabs/databend/pull/16599) +- chore: refine table sample tests by @xudong963 in [#16600](https://github.com/databendlabs/databend/pull/16600) +- chore(query): add more logs on aggregation by @sundy-li in [#16552](https://github.com/databendlabs/databend/pull/16552) +- chore: reset recluster block size by @zhyass in [#16623](https://github.com/databendlabs/databend/pull/16623) +- chore(query): add http address info to cluster node info by @zhang2014 in [#16620](https://github.com/databendlabs/databend/pull/16620) +- chore: drop guard when acquire lock failed by @zhyass in [#16616](https://github.com/databendlabs/databend/pull/16616) +- chore: revert "lock mgr may failed to release lock in time (#16611)" by @dantengsky in [#16630](https://github.com/databendlabs/databend/pull/16630) +- chore(query): reduce unsafe codes in kernels by @sundy-li in [#16633](https://github.com/databendlabs/databend/pull/16633) +- chore(query): add warn log if vacuum temporary file is error by @zhang2014 in [#16646](https://github.com/databendlabs/databend/pull/16646) +- chore: resolve todo in dynamic sample by @xudong963 in [#16629](https://github.com/databendlabs/databend/pull/16629) +- chore(query): enable loser tree merge sort default by @forsaken628 in [#16649](https://github.com/databendlabs/databend/pull/16649) +- chore(query): replace `arrow2` with `arrow-rs` in `serialize_column` and `deserialize_column` by @forsaken628 in [#16655](https://github.com/databendlabs/databend/pull/16655) +- chore(query): remove hash join build detail status by @zhang2014 in [#16674](https://github.com/databendlabs/databend/pull/16674) +- chore: upon startup, meta-service output human-readable error if trying to open future version on-disk data by @drmingdrmer in [#16679](https://github.com/databendlabs/databend/pull/16679) +- chore(query): modify rbac test result display by @TCeason in [#16686](https://github.com/databendlabs/databend/pull/16686) +- chore: adjust default value of setting `max_storage_io_requests` by @SkyFan2002 in [#16680](https://github.com/databendlabs/databend/pull/16680) +- chore(query): returns nan for aggregate_kurtosis and aggregate_skewness by @sundy-li in [#16688](https://github.com/databendlabs/databend/pull/16688) +- chore: display port number on error from bind to port failure by @lyang24 in [#16695](https://github.com/databendlabs/databend/pull/16695) +- chore: remove `SortColumnDescription.is_nullable` by @forsaken628 in [#16699](https://github.com/databendlabs/databend/pull/16699) +- chore: remove transaction keyword by @SkyFan2002 in [#16707](https://github.com/databendlabs/databend/pull/16707) +- chore: add timeout for `detect_region` operation to prevent hanging request by @dantengsky in [#16709](https://github.com/databendlabs/databend/pull/16709) +- chore(query): add current_query_id and database id for admin api by @zhang2014 in [#16703](https://github.com/databendlabs/databend/pull/16703) +- chore(query): index scalar support variant by @sundy-li in [#16719](https://github.com/databendlabs/databend/pull/16719) +- chore: display log.file.limit and prefix_filter by @TCeason in [#16713](https://github.com/databendlabs/databend/pull/16713) +- chore: avoid returning error during computing binary comparison selectivity by @xudong963 in [#16725](https://github.com/databendlabs/databend/pull/16725) +- chore: Simplifying BlockMetaInfo Definitions by @forsaken628 in [#16716](https://github.com/databendlabs/databend/pull/16716) +- chore: tweak cargo feature "jemalloc" by @dantengsky in [#16693](https://github.com/databendlabs/databend/pull/16693) +- chore: remove flaky test by @TCeason in [#16739](https://github.com/databendlabs/databend/pull/16739) +- chore: refine vacuum by @dantengsky in [#16743](https://github.com/databendlabs/databend/pull/16743) +- chore: Remove not used dep `config` by @Xuanwo in [#16746](https://github.com/databendlabs/databend/pull/16746) +- chore(query): Introduce VecExt and SliceExt to check unsafe bounds in debug mode by @sundy-li in [#16747](https://github.com/databendlabs/databend/pull/16747) +- chore: make VACUUM TEMPORARY FILES killable by @dantengsky in [#16751](https://github.com/databendlabs/databend/pull/16751) +- chore: tweak batch deletion concurrency by @dantengsky in [#16770](https://github.com/databendlabs/databend/pull/16770) +- chore: refine raft-types import path by @drmingdrmer in [#16764](https://github.com/databendlabs/databend/pull/16764) +- chore: remove obsolete version by @everpcpc in [#16789](https://github.com/databendlabs/databend/pull/16789) +- chore: add snapshot location cache for attached table by @dantengsky in [#16795](https://github.com/databendlabs/databend/pull/16795) +- chore: update meta-service version info and compatibility doc by @drmingdrmer in [#16800](https://github.com/databendlabs/databend/pull/16800) +- chore(query): embedded public key of license by @zhang2014 in [#16813](https://github.com/databendlabs/databend/pull/16813) +- chore(query): refactor common/arrow removes arrow/io crates by @sundy-li in [#16808](https://github.com/databendlabs/databend/pull/16808) +- chore: purge dropped view metadata during vacuum by @dantengsky in [#16819](https://github.com/databendlabs/databend/pull/16819) +- chore(query): keep queries detail and profile log format by @zhang2014 in [#16822](https://github.com/databendlabs/databend/pull/16822) +- chore(ci): test with different license by @everpcpc in [#16815](https://github.com/databendlabs/databend/pull/16815) +- chore(base): rollback to kernel signal handler after dump backtrace by @zhang2014 in [#16828](https://github.com/databendlabs/databend/pull/16828) +- chore: remove unused codes by @zhyass in [#16834](https://github.com/databendlabs/databend/pull/16834) +- chore: fix typo in `ColumnCacheKeyBuilder` by @dantengsky in [#16838](https://github.com/databendlabs/databend/pull/16838) +- chore(cluster): disable parallel commit of cluster tasks by @zhang2014 in [#16851](https://github.com/databendlabs/databend/pull/16851) +- chore(query): remove SliceExt by @sundy-li in [#16853](https://github.com/databendlabs/databend/pull/16853) +- chore(ci): separate build profile by @everpcpc in [#16855](https://github.com/databendlabs/databend/pull/16855) +- chore(query): remove useless new line for query log by @zhang2014 in [#16860](https://github.com/databendlabs/databend/pull/16860) +- chore: add some log by @SkyFan2002 in [#16863](https://github.com/databendlabs/databend/pull/16863) +- chore(query): improve distributed runtime filter by @Dousir9 in [#16862](https://github.com/databendlabs/databend/pull/16862) +- chore: enable stderr logging for `table_meta_inspector` by @dantengsky in [#16865](https://github.com/databendlabs/databend/pull/16865) +- chore(query): remove common/arrow crate by @sundy-li in [#16846](https://github.com/databendlabs/databend/pull/16846) +- chore(ci): adjust runner size by @everpcpc in [#16879](https://github.com/databendlabs/databend/pull/16879) +- chore(settings): enable spill by @Dousir9 in [#16888](https://github.com/databendlabs/databend/pull/16888) +- chore: remove unused config_id from RaftConfig by @drmingdrmer in [#16902](https://github.com/databendlabs/databend/pull/16902) +- chore(ci): flaky test by @zhyass in [#16917](https://github.com/databendlabs/databend/pull/16917) +- chore(ci): enable overflow-checks in ci profile by @sundy-li in [#16895](https://github.com/databendlabs/databend/pull/16895) +- chore(ci): flaky test by @zhyass in [#16919](https://github.com/databendlabs/databend/pull/16919) +- chore(query): add snapshot logs in read partitions by @sundy-li in [#16918](https://github.com/databendlabs/databend/pull/16918) +- chore: bump rustls version 0.23.18 by @TCeason in [#16936](https://github.com/databendlabs/databend/pull/16936) +- chore(query): spilt binary symbol by @zhang2014 in [#16861](https://github.com/databendlabs/databend/pull/16861) +- chore: `k way merge sort` add boundary check to prevent process crash by @forsaken628 in [#16934](https://github.com/databendlabs/databend/pull/16934) +- chore(ci): remove aarch64 musl in release by @zhang2014 in [#16946](https://github.com/databendlabs/databend/pull/16946) +- chore(planner): improve cardinality estimation by @Dousir9 in [#16938](https://github.com/databendlabs/databend/pull/16938) +- chore(planner): refine project set cardinality by @Dousir9 in [#16944](https://github.com/databendlabs/databend/pull/16944) +- chore: support recursive cte with normal cte by @xudong963 in [#16932](https://github.com/databendlabs/databend/pull/16932) +- chore(binder): add enable_materialized_cte settings by @Dousir9 in [#16950](https://github.com/databendlabs/databend/pull/16950) +- chore(storage): hook compact avoid scan all segments by @zhyass in [#16954](https://github.com/databendlabs/databend/pull/16954) +- chore(storage): do compact before recluster during compact hook by @zhyass in [#16949](https://github.com/databendlabs/databend/pull/16949) +- chore(ci): upgrade bendsql by @everpcpc in [#16965](https://github.com/databendlabs/databend/pull/16965) +- chore(storage): refine error message for stream read offset snapshot by @zhyass in [#16964](https://github.com/databendlabs/databend/pull/16964) +- chore: bump ruzstd from 0.7.2 to 0.7.3 by @dqhl76 in [#16969](https://github.com/databendlabs/databend/pull/16969) +- chore(ci): install bendsql from packages by @everpcpc in [#16970](https://github.com/databendlabs/databend/pull/16970) +- chore(planner): improve physical join by @Dousir9 in [#16962](https://github.com/databendlabs/databend/pull/16962) +- chore(ci): fix some flaky test by @TCeason in [#16980](https://github.com/databendlabs/databend/pull/16980) +- chore(query): improve decimal aggregate state by @sundy-li in [#16983](https://github.com/databendlabs/databend/pull/16983) +- chore(planner): refine physical join by @Dousir9 in [#16988](https://github.com/databendlabs/databend/pull/16988) +- chore: adjust fuse_time_travel_size() by @SkyFan2002 in [#16995](https://github.com/databendlabs/databend/pull/16995) +- chore(ci): use new dsn for create database by @zhang2014 in [#16968](https://github.com/databendlabs/databend/pull/16968) +- chore(ci): rust toolchain 2024-11-28 build image by @sundy-li in [#17001](https://github.com/databendlabs/databend/pull/17001) +- chore(query): fix topk in native by @sundy-li in [#17003](https://github.com/databendlabs/databend/pull/17003) +- chore(query): bump up rust toolchain to 2024-11-28 by @sundy-li in [#16981](https://github.com/databendlabs/databend/pull/16981) +- chore: tweak attach table refreshing by @dantengsky in [#17019](https://github.com/databendlabs/databend/pull/17019) +- chore(query): remove old aggregate codes by @sundy-li in [#17025](https://github.com/databendlabs/databend/pull/17025) +- chore: add more test to meta-service txn value-matching by @drmingdrmer in [#17033](https://github.com/databendlabs/databend/pull/17033) +- chore(cluster): disable parallel commit for cluster task by @zhang2014 in [#17034](https://github.com/databendlabs/databend/pull/17034) +- chore: improve error handling in partition sending loop by @dqhl76 in [#17035](https://github.com/databendlabs/databend/pull/17035) +- chore(ci): remove musl release by @everpcpc in [#17041](https://github.com/databendlabs/databend/pull/17041) +- chore(query): improve comparison functions by @sundy-li in [#17032](https://github.com/databendlabs/databend/pull/17032) +- chore(binder): fix bind materialized cte by @Dousir9 in [#17046](https://github.com/databendlabs/databend/pull/17046) +- chore: refmt crash log message by @TCeason in [#17059](https://github.com/databendlabs/databend/pull/17059) +- chore: bump dtparse by @TCeason in [#17073](https://github.com/databendlabs/databend/pull/17073) +- chore: remove unused dev by @zhyass in [#17088](https://github.com/databendlabs/databend/pull/17088) +- chore(query): Revert "feat(query): support javascript/python script User Defined Aggregate Function" by @sundy-li in [#17107](https://github.com/databendlabs/databend/pull/17107) +- chore: add more log by @SkyFan2002 in [#17110](https://github.com/databendlabs/databend/pull/17110) +- chore(planner): fix except and intersect operation by @Dousir9 in [#17111](https://github.com/databendlabs/databend/pull/17111) +- chore(query): add fuzz tests by @sundy-li in [#17100](https://github.com/databendlabs/databend/pull/17100) +- chore(query): bump federated mysql version by @TCeason in [#17118](https://github.com/databendlabs/databend/pull/17118) +- chore(query): reduce-functions-code-expand by @sundy-li in [#17114](https://github.com/databendlabs/databend/pull/17114) +- chore(query): improve hook vacuum temp after query by @sundy-li in [#17125](https://github.com/databendlabs/databend/pull/17125) +- chore(query): bump enum-as-inner 0.6 by @forsaken628 in [#17120](https://github.com/databendlabs/databend/pull/17120) +- chore: rename default_cluster_key_id to cluster_key_seq by @zhyass in [#17135](https://github.com/databendlabs/databend/pull/17135) +- chore(query): fix udf metrics by @sundy-li in [#17134](https://github.com/databendlabs/databend/pull/17134) ## New Contributors -* @arkzuse made their first contribution in [#16502](https://github.com/databendlabs/databend/pull/16502) -* @chagelo made their first contribution in [#16560](https://github.com/databendlabs/databend/pull/16560) -* @Dragonliu2018 made their first contribution in [#16631](https://github.com/databendlabs/databend/pull/16631) -* @Maricaya made their first contribution in [#16543](https://github.com/databendlabs/databend/pull/16543) -* @ding-young made their first contribution in [#16685](https://github.com/databendlabs/databend/pull/16685) -* @lyang24 made their first contribution in [#16695](https://github.com/databendlabs/databend/pull/16695) -* @florann made their first contribution in [#16181](https://github.com/databendlabs/databend/pull/16181) -* @Rowlandev made their first contribution in [#16824](https://github.com/databendlabs/databend/pull/16824) -* @kursataktas made their first contribution in [#16773](https://github.com/databendlabs/databend/pull/16773) -* @flashmouse made their first contribution in [#16926](https://github.com/databendlabs/databend/pull/16926) -* @notauserx made their first contribution in [#16912](https://github.com/databendlabs/databend/pull/16912) + +- @arkzuse made their first contribution in [#16502](https://github.com/databendlabs/databend/pull/16502) +- @chagelo made their first contribution in [#16560](https://github.com/databendlabs/databend/pull/16560) +- @Dragonliu2018 made their first contribution in [#16631](https://github.com/databendlabs/databend/pull/16631) +- @Maricaya made their first contribution in [#16543](https://github.com/databendlabs/databend/pull/16543) +- @ding-young made their first contribution in [#16685](https://github.com/databendlabs/databend/pull/16685) +- @lyang24 made their first contribution in [#16695](https://github.com/databendlabs/databend/pull/16695) +- @florann made their first contribution in [#16181](https://github.com/databendlabs/databend/pull/16181) +- @Rowlandev made their first contribution in [#16824](https://github.com/databendlabs/databend/pull/16824) +- @kursataktas made their first contribution in [#16773](https://github.com/databendlabs/databend/pull/16773) +- @flashmouse made their first contribution in [#16926](https://github.com/databendlabs/databend/pull/16926) +- @notauserx made their first contribution in [#16912](https://github.com/databendlabs/databend/pull/16912) **Full Changelog**: https://github.com/databendlabs/databend/compare/v1.2.615...v1.2.680 From 2a4f268fc4dca2f8fb360f2359626d406d2d5c85 Mon Sep 17 00:00:00 2001 From: soyeric128 Date: Wed, 8 Jan 2025 16:54:45 -0500 Subject: [PATCH 05/18] Update index.md --- docs/en/guides/00-overview/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/guides/00-overview/index.md b/docs/en/guides/00-overview/index.md index c6c20732cd..5134f067eb 100644 --- a/docs/en/guides/00-overview/index.md +++ b/docs/en/guides/00-overview/index.md @@ -6,7 +6,7 @@ slug: / import DocsOverview from '@site/src/components/DocsOverview' import Speaker from '@site/src/components/Speaker' -Welcome to the Databend (pronounced as /ˈdeɪtəˌbɛnd/) Guides, covering all Databend products. +Welcome to the Databend (pronounced as /ˈdeɪtəˌbɛnd/) documentation. Databend is an affordable, Snowflake-like cloud data warehouse. You can choose to self-host Databend as a completely free and open-source solution, or opt for the convenience of getting started right away with Databend Cloud. From d9d3081c339bb757887082dce92bed02c1646e30 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 8 Jan 2025 22:35:45 +0000 Subject: [PATCH 06/18] =?UTF-8?q?=F0=9F=92=ACGenerate=20LLM=20translations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/cn/guides/00-overview/index.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/cn/guides/00-overview/index.md b/docs/cn/guides/00-overview/index.md index 9489e6d456..1e377c9816 100644 --- a/docs/cn/guides/00-overview/index.md +++ b/docs/cn/guides/00-overview/index.md @@ -6,17 +6,17 @@ slug: / import DocsOverview from '@site/src/components/DocsOverview' import Speaker from '@site/src/components/Speaker' -欢迎来到 Databend(发音为 /ˈdeɪtəˌbɛnd/) 指南,涵盖所有 Databend 产品。 +欢迎来到 Databend(发音为 /ˈdeɪtəˌbɛnd/) 文档。Databend 是一个经济实惠、类似于 Snowflake 的云数仓。您可以选择自托管 Databend 作为完全免费的开源解决方案,或者选择立即开始使用 Databend Cloud 的便利。 -**以下是您可能想要了解的一些条目** +**以下是一些您可能想要了解的内容** -- **[SQL 参考](/sql)**:您的 Databend 基础快速访问指南! -- **[数据卸载](../50-unload-data/index.md)**:从 Databend(Cloud) 导出数据。 -- **[外部函数](../54-query/04-external-function.md)**:使用外部函数扩展 Databend 的功能。 -- **[数据管理](../57-data-management/index.md)**:在 Databend(Cloud) 中管理数据。 -- **[基准测试](../80-benchmark/index.md)**:在 TPC-H SF100 基准测试中比较 Databend Cloud 与 Snowflake 的性能。 -- **[访问数据湖](../51-access-data-lake/index.md)**:Databend 与三种强大的数据湖技术——Apache Hive、Apache Iceberg 和 Delta Lake 无缝集成。 -- **[查询结构](../54-query/index.md)**:Databend 支持多种查询结构,以增强您的数据查询体验。 -- **[性能优化](../55-performance/index.md)**:Databend 支持以下功能,以优化各种场景下的查询性能。 \ No newline at end of file +- **[SQL 参考](/sql)**: 快速访问 Databend 必备指南! +- **[数据卸载](../50-unload-data/index.md)**: 从 Databend(Cloud) 导出数据。 +- **[外部函数](../54-query/04-external-function.md)**: 使用外部函数扩展 Databend 的功能。 +- **[数据管理](../57-data-management/index.md)**: 在 Databend(Cloud) 中管理数据。 +- **[基准测试](../80-benchmark/index.md)**: 在 TPC-H SF100 基准测试中比较 Databend Cloud 与 Snowflake 的性能。 +- **[访问数据湖](../51-access-data-lake/index.md)**: Databend 提供了与三种强大的数据湖技术——Apache Hive、Apache Iceberg 和 Delta Lake 的无缝集成。 +- **[查询结构](../54-query/index.md)**: Databend 支持多种查询结构,以增强您的数据查询体验。 +- **[性能优化](../55-performance/index.md)**: Databend 支持以下功能,以优化各种场景下的查询性能。 \ No newline at end of file From b8ff2cb39cbfa67fbb86b2a74362f699e675232e Mon Sep 17 00:00:00 2001 From: zhihanz Date: Wed, 8 Jan 2025 18:53:29 -0800 Subject: [PATCH 07/18] feat: add on-premise warehouse guide --- .../03-manage-query-warehouse-through-SQL.md | 318 ++++++++++++++++++ .../img/deploy/on-premise-warehouse.png | Bin 0 -> 347552 bytes 2 files changed, 318 insertions(+) create mode 100644 docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md create mode 100644 static/public/img/deploy/on-premise-warehouse.png diff --git a/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md b/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md new file mode 100644 index 0000000000..496f38120f --- /dev/null +++ b/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md @@ -0,0 +1,318 @@ +--- +title: Manage Query Warehouse through SQL on Premise +sidebar_label: Manage Query Warehouse through SQL +description: How to manage scalable and flexible query warehouse through SQL on premise. +--- +import EEFeature from '@site/src/components/EEFeature'; + +This topic explains how to manage scalable and flexible query warehouse through SQL on premise. + +## Understand Warehouse + +![Warehouse On Premise](/img/deploy/on-premise-warehouse.png) + +**Scenario Description** +Previously, we introduced to deploy databend using static `tenant_id` and `cluster_id` in the ![deployment](https://docs.databend.com/guides/deploy/deploy/production/metasrv-deploy#step-2-deploy-query-nodes). + +For on-premise deployments to be successful, it's essential to have a skilled DevOps team in place to effectively manage the deployment and configuration. This includes: +1. Strategically routing queries to various clusters to enhance concurrency during peak usage times. +2. Adjusting cluster sizes by restarting nodes and reallocating them to different clusters as needed. +3. Implementing a robust load balancing strategy for cluster nodes, which can present unique challenges in an on-premise environment. + +Databend's on-premise warehouse SQL commands provide a powerful solution to let user built a multi-cluster query warehouse within 5 minutes. These commands enable you to: + +- Build and manage multiple query warehouses to improve query concurrency during peak hours +- Dynamically route queries across different clusters to handle peak traffic periods +- Implement intelligent load balancing across cluster nodes +- Seamlessly reallocate nodes between warehouses and clusters with zero downtime + +This flexibility allows you to optimize resource utilization and maintain high availability while adapting to changing workload demands in your on-premise deployment. + +### Warehouse related concepts + +The following concepts are important to understand when working with warehouses in Databend: + +- **Warehouse**: An abstract concept representing one or more groups of compute resources. It is the smallest logical unit of compute resources for executing SQL queries. + +- **Cluster**: An abstract concept representing a group of compute resources. Each SQL query will try to use all nodes's resources(including CPU, memory, disk, etc.) to finish the query. A warehouse consists of multiple clusters, with each cluster being physically isolated. When increased concurrent processing capacity is needed for a warehouse, new clusters can be added. In previous static configured `tenant_id` and `cluster_id` deployment, the warehouse is a single cluster warehouse named `cluster_id`. + +- **Node Group**: A grouping of nodes that can either correspond one-to-one with nodes or have multiple nodes belonging to the same group. it can be understand as some sort of label help node to be allocated to different warehouse and cluster. + +## Deploy Databend Query with System Managed Warehouse + +- Change Your Query Configuration. + +```toml title='databend-query.toml' +[query] +.... +# To enable warehouse feature, you MUST not set cluster_id +# cluster_id = "test_cluster" +... +[query.resources_management] +type = "system_managed" +node_group = "node_group" +... +``` + +- Start Databend Query + +```shell +./databend-query --config databend-query.toml +``` + + +## Using SQL to manage your on-premise warehouse + +### Check current online nodes in the tenant + +```sql +show online nodes; + +┌──────────────────────────────────────────────────────────────────────────────────────────-─────┐ +│ id │ type │ node_group │ warehouse │ cluster │ version │ +│ String │ String │ String │ String │ String │ String │ +├────────────────────────┼───────────────┼────────────┼───────────┼─────────┼────────────────────┤ +│ 9rabYMxa0ReDyZe6F9igH5 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ +│ CbzfLlTVO29EhkZXdeR625 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ +│ O0kOetbvkFjxrQ2kx4uMI │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ R2epWlGVd8S0maSTuwbsv4 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ SoZcaT4gmhVoGKcChlDw93 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ UeNVzwHCXhxJTTB4Xonj07 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ Zu7rmhVZ2s2HqTUCdFBdu2 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ bRubWZEzIibFgRgFad2MS3 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ ilPer0ps5wWnEDOLIlk821 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ shnWu1TC41sAxVwJMIVQF3 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +└───────────────────────────────────────────────────────────────────────────────────────────---──┘ +10 rows read in 0.131 sec. Processed 0 rows, 0 B (0 row/s, 0 B/s) +``` + +### Create a single cluster warehouse with 2 nodes +this command will create a warehouse named `test_warehouse_1` with 2 nodes. +```sql +root@localhost:8000/default> create warehouse test_warehouse_1 with warehouse_size = 2; + +create warehouse test_warehouse_1 with warehouse_size = 2 + +0 row written in 0.015 sec. Processed 0 row, 0 B (0 row/s, 0 B/s) + +root@localhost:8000/default> show online nodes; + +show online nodes + +┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ id │ type │ node_group │ warehouse │ cluster │ version │ +│ String │ String │ String │ String │ String │ String │ +├────────────────────────┼───────────────┼────────────┼──────────────────┼─────────┼─────────────────────────────┤ +│ 9rabYMxa0ReDyZe6F9igH5 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ +│ CbzfLlTVO29EhkZXdeR625 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ +│ O0kOetbvkFjxrQ2kx4uMI │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ R2epWlGVd8S0maSTuwbsv4 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ SoZcaT4gmhVoGKcChlDw93 │ SystemManaged │ infra_node │ test_warehouse_1 │ default │ v1.2.686-nightly │ +│ UeNVzwHCXhxJTTB4Xonj07 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ Zu7rmhVZ2s2HqTUCdFBdu2 │ SystemManaged │ infra_node │ test_warehouse_1 │ default │ v1.2.686-nightly │ +│ bRubWZEzIibFgRgFad2MS3 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ ilPer0ps5wWnEDOLIlk821 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ shnWu1TC41sAxVwJMIVQF3 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +└────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +10 rows read in 0.130 sec. Processed 0 rows, 0 B (0 row/s, 0 B/s) +``` + +### Get all existing warehouses + +```sql +root@localhost:8000/default> show warehouses; + +show warehouses + +┌───────────────────────────────────────────┐ +│ warehouse │ type │ status │ +│ String │ String │ String │ +├────────────────┼────────────────┼─────────┤ +│ test_warehouse │ System-Managed │ Running │ +└───────────────────────────────────────────┘ +1 row read in 0.130 sec. Processed 0 row, 0 B (0 row/s, 0 B/s) +``` + +### Use one of the existing warehouses to run query +system.clusters is a system table that stores the information of all clusters, and their nodes. + +```sql +root@localhost:8000/default> use warehouse test_warehouse_1; + +use warehouse test_warehouse_1 + +0 row read in 0.014 sec. Processed 0 row, 0 B (0 row/s, 0 B/s) + +root@(test_warehouse_1)/default> select * from system.clusters; + +SELECT * FROM system.clusters + +┌───────────────────────────────────────────────────────────────────────────────────────────┐ +│ name │ cluster │ host │ port │ version │ +│ String │ String │ String │ UInt16 │ String │ +├────────────────────────┼──────────────────────────┼───────────┼────────┼──────────────────┤ +│ SoZcaT4gmhVoGKcChlDw93 │ test_warehouse_1/default │ 127.0.0.1 │ 27498 │ v1.2.686-nightly │ +│ Zu7rmhVZ2s2HqTUCdFBdu2 │ test_warehouse_1/default │ 127.0.0.1 │ 29798 │ v1.2.686-nightly │ +└───────────────────────────────────────────────────────────────────────────────────────────┘ +2 rows read in 0.679 sec. Processed 2 rows, 350 B (2.95 rows/s, 515 B/s) +``` + +### Add clusters to an existing warehouse +Add clusters to an existing warehouse will allow the warehouse to route queries to the new clusters, thus far increase the concurrency of the warehouse. + +:::note +Currently, warehouse will forward queries to different clusters randomly. +::: + +```sql +root@localhost:8000/default> alter warehouse test_warehouse add cluster test_cluster with cluster_size = 3; + +alter warehouse test_warehouse add cluster test_cluster with cluster_size = 3 + +0 row written in 0.039 sec. Processed 0 row, 0 B (0 row/s, 0 B/s) + +root@localhost:8000/default> show online nodes; + +show online nodes + +┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ id │ type │ node_group │ warehouse │ cluster │ version │ +│ String │ String │ String │ String │ String │ String │ +├────────────────────────┼───────────────┼────────────┼────────────────┼──────────────┼─────────────────────────────┤ +│ 9rabYMxa0ReDyZe6F9igH5 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ +│ CbzfLlTVO29EhkZXdeR625 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ +│ O0kOetbvkFjxrQ2kx4uMI │ SystemManaged │ dev_node │ test_warehouse │ test_cluster │ v1.2.686-nightly │ +│ R2epWlGVd8S0maSTuwbsv4 │ SystemManaged │ dev_node │ test_warehouse │ test_cluster │ v1.2.686-nightly │ +│ SoZcaT4gmhVoGKcChlDw93 │ SystemManaged │ infra_node │ test_warehouse │ test_cluster │ v1.2.686-nightly │ +│ UeNVzwHCXhxJTTB4Xonj07 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ Zu7rmhVZ2s2HqTUCdFBdu2 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ bRubWZEzIibFgRgFad2MS3 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ ilPer0ps5wWnEDOLIlk821 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ +│ shnWu1TC41sAxVwJMIVQF3 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ +└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +### Using node group to create and manage warehouse + +Databend allow user to create multi-cluster warehouse with different node group. nodes under the same node group will be allocated randomly to designated warehouse. + + +#### Create a warehouse in designated node groups +```sql +root@localhost:8000/default> create warehouse test_warehouse(assign 1 nodes from log_node, assign 2 nodes from infra_node); + +create warehouse test_warehouse(assign 1 nodes from log_node, assign 2 nodes from infra_node) + +0 row written in 0.013 sec. Processed 0 row, 0 B (0 row/s, 0 B/s) + +root@localhost:8000/default> show online nodes; + +show online nodes + +┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ id │ type │ node_group │ warehouse │ cluster │ version │ +│ String │ String │ String │ String │ String │ String │ +├────────────────────────┼───────────────┼────────────┼────────────────┼─────────┼─────────────────────────────┤ +│ 6yCaMTMAZbP6nSsNfzkSG5 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ +│ 8g0E9LxG3mk2eBhKNT9DT2 │ SystemManaged │ log_node │ test_warehouse │ default │ v1.2.686-nightly │ +│ AJ4V671FSZiWz2NUIWg6w5 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ DQUhMHYSdKqML5HJFhVbn4 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ Ji2SZp1zsJQHLyBUTDcrm1 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ a4XEkpidlCSuRkB7cMlCv4 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ dtawAX7FT56iJJv6rER6R2 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ jze3JfzDyY2amoN7Zbq3u6 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ +│ s7Yfg7OgXPHAX7pETAbcc │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ tM8lj2NOTTtTwjnQIzCwI6 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ +└──────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +10 rows read in 0.128 sec. Processed 0 rows, 0 B (0 row/s, 0 B/s) +``` + +#### Add a cluster to an existing warehouse, cluster nodes come from different node groups +```sql +root@localhost:8000/default> alter warehouse test_warehouse add cluster test_cluster (assign 1 nodes from dev_node, assign 1 nodes from infra_node); + +alter warehouse test_warehouse add cluster test_cluster (assign 1 nodes from dev_node, assign 1 nodes from infra_node) + +0 row written in 0.034 sec. Processed 0 row, 0 B (0 row/s, 0 B/s) + +root@localhost:8000/default> show online nodes; + +show online nodes +┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ id │ type │ node_group │ warehouse │ cluster │ version │ +│ String │ String │ String │ String │ String │ String │ +├────────────────────────┼───────────────┼────────────┼────────────────┼──────────────┼─────────────────────────────┤ +│ DZB0EWAz4EiR9UnndkQY92 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ GFkSBv96W9bWBa85n5sC87 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ WwSuc1P3f58CuEd6JcO4L3 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ cjHBOKg8Q39aL30S1FpGN6 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ +│ eAlj9SBIdJPRNDjERwAve4 │ SystemManaged │ infra_node │ test_warehouse │ test_cluster │ v1.2.686-nightly │ +│ hYCjglpJvjglu8krdYGgL │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ +│ nrMfUZljjKQFMPP7H61GX1 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ tEIG103u3Yd7UGS5Fd3mh │ SystemManaged │ log_node │ test_warehouse │ default │ v1.2.686-nightly │ +│ wXgSNxxOTOkjazEPLbDVF3 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ +│ xqWmN2SR1wRjMUt4T2Oy66 │ SystemManaged │ dev_node │ test_warehouse │ test_cluster │ v1.2.686-nightly │ +└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +10 rows read in 0.128 sec. Processed 0 rows, 0 B (0 row/s, 0 B/s) +``` + +#### Add nodes to an existing warehouse, cluster nodes come from different node groups +```sql +root@localhost:8000/default> alter warehouse test_warehouse assign nodes(assign 1 nodes from dev_node for default, assign 1 nodes from infra_node for default); + +alter warehouse test_warehouse assign nodes(assign 1 nodes from dev_node for default, assign 1 nodes from infra_node for default) + +0 row written in 0.075 sec. Processed 0 row, 0 B (0 row/s, 0 B/s) + +root@localhost:8000/default> show online nodes; + +show online nodes + +┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ id │ type │ node_group │ warehouse │ cluster │ version │ +│ String │ String │ String │ String │ String │ String │ +├────────────────────────┼───────────────┼────────────┼────────────────┼─────────┼─────────────────────────────┤ +│ 6yCaMTMAZbP6nSsNfzkSG5 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ +│ 8g0E9LxG3mk2eBhKNT9DT2 │ SystemManaged │ log_node │ test_warehouse │ default │ v1.2.686-nightly │ +│ AJ4V671FSZiWz2NUIWg6w5 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ DQUhMHYSdKqML5HJFhVbn4 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ Ji2SZp1zsJQHLyBUTDcrm1 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ a4XEkpidlCSuRkB7cMlCv4 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ dtawAX7FT56iJJv6rER6R2 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ +│ jze3JfzDyY2amoN7Zbq3u6 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ +│ s7Yfg7OgXPHAX7pETAbcc │ SystemManaged │ dev_node │ test_warehouse │ default │ v1.2.686-nightly │ +│ tM8lj2NOTTtTwjnQIzCwI6 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ +└──────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +10 rows read in 0.139 sec. Processed 0 rows, 0 B (0 row/s, 0 B/s) +``` + +#### Remove Nodes from cluster of a Warehouse by Node Group + +```sql +root@localhost:8000/default> alter warehouse test_warehouse unassign nodes(unassign 1 nodes from dev_node for default, unassign 2 nodes from infra_node for default); + +alter warehouse test_warehouse unassign nodes(unassign 1 nodes from dev_node for default, unassign 2 nodes from infra_node for default) + +0 row written in 0.028 sec. Processed 0 row, 0 B (0 row/s, 0 B/s) + +root@localhost:8000/default> show online nodes; + +show online nodes + +┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ id │ type │ node_group │ warehouse │ cluster │ version │ +│ String │ String │ String │ String │ String │ String │ +├────────────────────────┼───────────────┼────────────┼────────────────┼─────────┼─────────────────────────────┤ +│ 6yCaMTMAZbP6nSsNfzkSG5 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ +│ 8g0E9LxG3mk2eBhKNT9DT2 │ SystemManaged │ log_node │ test_warehouse │ default │ v1.2.686-nightly │ +│ AJ4V671FSZiWz2NUIWg6w5 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ DQUhMHYSdKqML5HJFhVbn4 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ Ji2SZp1zsJQHLyBUTDcrm1 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ a4XEkpidlCSuRkB7cMlCv4 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ dtawAX7FT56iJJv6rER6R2 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ jze3JfzDyY2amoN7Zbq3u6 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ s7Yfg7OgXPHAX7pETAbcc │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ tM8lj2NOTTtTwjnQIzCwI6 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ +└──────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +10 rows read in 0.128 sec. Processed 0 rows, 0 B (0 row/s, 0 B/s) +``` \ No newline at end of file diff --git a/static/public/img/deploy/on-premise-warehouse.png b/static/public/img/deploy/on-premise-warehouse.png new file mode 100644 index 0000000000000000000000000000000000000000..a17d92f90a5a66feadcbc45a570293218093a83a GIT binary patch literal 347552 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≈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%0ARX{pBdJJAWC1a0 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 SqW%Z)r>dlNxBSk-Xa5hKEVdQ^ literal 0 HcmV?d00001 From 2b5d385a254d56abbe127e2053fd3629a52702e6 Mon Sep 17 00:00:00 2001 From: zhihanz Date: Wed, 8 Jan 2025 20:18:11 -0800 Subject: [PATCH 08/18] try fix image ref --- .../img/deploy/on-premise-warehouse.png | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename static/{public => }/img/deploy/on-premise-warehouse.png (100%) diff --git a/static/public/img/deploy/on-premise-warehouse.png b/static/img/deploy/on-premise-warehouse.png similarity index 100% rename from static/public/img/deploy/on-premise-warehouse.png rename to static/img/deploy/on-premise-warehouse.png From 66e57c4371164fa3b6b0cb3dd6c1a2f8344419b1 Mon Sep 17 00:00:00 2001 From: zhihanz Date: Wed, 8 Jan 2025 20:46:12 -0800 Subject: [PATCH 09/18] chore: make it more clear --- .../02-production/03-manage-query-warehouse-through-SQL.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md b/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md index 496f38120f..ffd40b0451 100644 --- a/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md +++ b/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md @@ -31,8 +31,7 @@ This flexibility allows you to optimize resource utilization and maintain high a ### Warehouse related concepts The following concepts are important to understand when working with warehouses in Databend: - -- **Warehouse**: An abstract concept representing one or more groups of compute resources. It is the smallest logical unit of compute resources for executing SQL queries. +- **Warehouse**: A collection of compute resources that users interact with to execute SQL queries. It can internally contain multiple clusters to handle concurrent query workloads. - **Cluster**: An abstract concept representing a group of compute resources. Each SQL query will try to use all nodes's resources(including CPU, memory, disk, etc.) to finish the query. A warehouse consists of multiple clusters, with each cluster being physically isolated. When increased concurrent processing capacity is needed for a warehouse, new clusters can be added. In previous static configured `tenant_id` and `cluster_id` deployment, the warehouse is a single cluster warehouse named `cluster_id`. From 4c9bf761d6cbcdc20cb4c50649964327a4fd0785 Mon Sep 17 00:00:00 2001 From: zhihanz Date: Wed, 8 Jan 2025 20:51:45 -0800 Subject: [PATCH 10/18] chore: fix --- .../02-production/03-manage-query-warehouse-through-SQL.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md b/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md index ffd40b0451..ffa2a7e63d 100644 --- a/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md +++ b/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md @@ -19,7 +19,7 @@ For on-premise deployments to be successful, it's essential to have a skilled De 2. Adjusting cluster sizes by restarting nodes and reallocating them to different clusters as needed. 3. Implementing a robust load balancing strategy for cluster nodes, which can present unique challenges in an on-premise environment. -Databend's on-premise warehouse SQL commands provide a powerful solution to let user built a multi-cluster query warehouse within 5 minutes. These commands enable you to: +Databend's on-premise warehouse SQL commands provide a powerful solution to let user built a multi-cluster query warehouse within several seconds. These commands enable you to: - Build and manage multiple query warehouses to improve query concurrency during peak hours - Dynamically route queries across different clusters to handle peak traffic periods @@ -256,6 +256,7 @@ show online nodes ``` #### Add nodes to an existing warehouse, cluster nodes come from different node groups + ```sql root@localhost:8000/default> alter warehouse test_warehouse assign nodes(assign 1 nodes from dev_node for default, assign 1 nodes from infra_node for default); From 6a02e020e1693f485ea457a6661ace52124979bb Mon Sep 17 00:00:00 2001 From: Bohu Date: Thu, 9 Jan 2025 13:15:45 +0800 Subject: [PATCH 11/18] Update 03-manage-query-warehouse-through-SQL.md --- .../03-manage-query-warehouse-through-SQL.md | 28 ++----------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md b/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md index ffa2a7e63d..705869f42b 100644 --- a/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md +++ b/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md @@ -12,7 +12,7 @@ This topic explains how to manage scalable and flexible query warehouse through ![Warehouse On Premise](/img/deploy/on-premise-warehouse.png) **Scenario Description** -Previously, we introduced to deploy databend using static `tenant_id` and `cluster_id` in the ![deployment](https://docs.databend.com/guides/deploy/deploy/production/metasrv-deploy#step-2-deploy-query-nodes). +Previously, we introduced to deploy databend using static `tenant_id` and `cluster_id` in the [deployment](https://docs.databend.com/guides/deploy/deploy/production/metasrv-deploy#step-2-deploy-query-nodes). For on-premise deployments to be successful, it's essential to have a skilled DevOps team in place to effectively manage the deployment and configuration. This includes: 1. Strategically routing queries to various clusters to enhance concurrency during peak usage times. @@ -69,7 +69,6 @@ show online nodes; ┌──────────────────────────────────────────────────────────────────────────────────────────-─────┐ │ id │ type │ node_group │ warehouse │ cluster │ version │ -│ String │ String │ String │ String │ String │ String │ ├────────────────────────┼───────────────┼────────────┼───────────┼─────────┼────────────────────┤ │ 9rabYMxa0ReDyZe6F9igH5 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ │ CbzfLlTVO29EhkZXdeR625 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ @@ -82,7 +81,6 @@ show online nodes; │ ilPer0ps5wWnEDOLIlk821 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ │ shnWu1TC41sAxVwJMIVQF3 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ └───────────────────────────────────────────────────────────────────────────────────────────---──┘ -10 rows read in 0.131 sec. Processed 0 rows, 0 B (0 row/s, 0 B/s) ``` ### Create a single cluster warehouse with 2 nodes @@ -92,7 +90,6 @@ root@localhost:8000/default> create warehouse test_warehouse_1 with warehouse_si create warehouse test_warehouse_1 with warehouse_size = 2 -0 row written in 0.015 sec. Processed 0 row, 0 B (0 row/s, 0 B/s) root@localhost:8000/default> show online nodes; @@ -100,7 +97,6 @@ show online nodes ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ id │ type │ node_group │ warehouse │ cluster │ version │ -│ String │ String │ String │ String │ String │ String │ ├────────────────────────┼───────────────┼────────────┼──────────────────┼─────────┼─────────────────────────────┤ │ 9rabYMxa0ReDyZe6F9igH5 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ │ CbzfLlTVO29EhkZXdeR625 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ @@ -113,7 +109,6 @@ show online nodes │ ilPer0ps5wWnEDOLIlk821 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ │ shnWu1TC41sAxVwJMIVQF3 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ └────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ -10 rows read in 0.130 sec. Processed 0 rows, 0 B (0 row/s, 0 B/s) ``` ### Get all existing warehouses @@ -125,11 +120,9 @@ show warehouses ┌───────────────────────────────────────────┐ │ warehouse │ type │ status │ -│ String │ String │ String │ ├────────────────┼────────────────┼─────────┤ │ test_warehouse │ System-Managed │ Running │ └───────────────────────────────────────────┘ -1 row read in 0.130 sec. Processed 0 row, 0 B (0 row/s, 0 B/s) ``` ### Use one of the existing warehouses to run query @@ -140,7 +133,6 @@ root@localhost:8000/default> use warehouse test_warehouse_1; use warehouse test_warehouse_1 -0 row read in 0.014 sec. Processed 0 row, 0 B (0 row/s, 0 B/s) root@(test_warehouse_1)/default> select * from system.clusters; @@ -148,12 +140,10 @@ SELECT * FROM system.clusters ┌───────────────────────────────────────────────────────────────────────────────────────────┐ │ name │ cluster │ host │ port │ version │ -│ String │ String │ String │ UInt16 │ String │ ├────────────────────────┼──────────────────────────┼───────────┼────────┼──────────────────┤ │ SoZcaT4gmhVoGKcChlDw93 │ test_warehouse_1/default │ 127.0.0.1 │ 27498 │ v1.2.686-nightly │ │ Zu7rmhVZ2s2HqTUCdFBdu2 │ test_warehouse_1/default │ 127.0.0.1 │ 29798 │ v1.2.686-nightly │ └───────────────────────────────────────────────────────────────────────────────────────────┘ -2 rows read in 0.679 sec. Processed 2 rows, 350 B (2.95 rows/s, 515 B/s) ``` ### Add clusters to an existing warehouse @@ -168,7 +158,6 @@ root@localhost:8000/default> alter warehouse test_warehouse add cluster test_clu alter warehouse test_warehouse add cluster test_cluster with cluster_size = 3 -0 row written in 0.039 sec. Processed 0 row, 0 B (0 row/s, 0 B/s) root@localhost:8000/default> show online nodes; @@ -176,7 +165,6 @@ show online nodes ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ id │ type │ node_group │ warehouse │ cluster │ version │ -│ String │ String │ String │ String │ String │ String │ ├────────────────────────┼───────────────┼────────────┼────────────────┼──────────────┼─────────────────────────────┤ │ 9rabYMxa0ReDyZe6F9igH5 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ │ CbzfLlTVO29EhkZXdeR625 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ @@ -202,7 +190,6 @@ root@localhost:8000/default> create warehouse test_warehouse(assign 1 nodes from create warehouse test_warehouse(assign 1 nodes from log_node, assign 2 nodes from infra_node) -0 row written in 0.013 sec. Processed 0 row, 0 B (0 row/s, 0 B/s) root@localhost:8000/default> show online nodes; @@ -210,7 +197,6 @@ show online nodes ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ id │ type │ node_group │ warehouse │ cluster │ version │ -│ String │ String │ String │ String │ String │ String │ ├────────────────────────┼───────────────┼────────────┼────────────────┼─────────┼─────────────────────────────┤ │ 6yCaMTMAZbP6nSsNfzkSG5 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ │ 8g0E9LxG3mk2eBhKNT9DT2 │ SystemManaged │ log_node │ test_warehouse │ default │ v1.2.686-nightly │ @@ -223,7 +209,6 @@ show online nodes │ s7Yfg7OgXPHAX7pETAbcc │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ │ tM8lj2NOTTtTwjnQIzCwI6 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ └──────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ -10 rows read in 0.128 sec. Processed 0 rows, 0 B (0 row/s, 0 B/s) ``` #### Add a cluster to an existing warehouse, cluster nodes come from different node groups @@ -232,14 +217,12 @@ root@localhost:8000/default> alter warehouse test_warehouse add cluster test_clu alter warehouse test_warehouse add cluster test_cluster (assign 1 nodes from dev_node, assign 1 nodes from infra_node) -0 row written in 0.034 sec. Processed 0 row, 0 B (0 row/s, 0 B/s) root@localhost:8000/default> show online nodes; show online nodes ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ id │ type │ node_group │ warehouse │ cluster │ version │ -│ String │ String │ String │ String │ String │ String │ ├────────────────────────┼───────────────┼────────────┼────────────────┼──────────────┼─────────────────────────────┤ │ DZB0EWAz4EiR9UnndkQY92 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ │ GFkSBv96W9bWBa85n5sC87 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ @@ -252,7 +235,6 @@ show online nodes │ wXgSNxxOTOkjazEPLbDVF3 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ │ xqWmN2SR1wRjMUt4T2Oy66 │ SystemManaged │ dev_node │ test_warehouse │ test_cluster │ v1.2.686-nightly │ └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ -10 rows read in 0.128 sec. Processed 0 rows, 0 B (0 row/s, 0 B/s) ``` #### Add nodes to an existing warehouse, cluster nodes come from different node groups @@ -262,7 +244,6 @@ root@localhost:8000/default> alter warehouse test_warehouse assign nodes(assign alter warehouse test_warehouse assign nodes(assign 1 nodes from dev_node for default, assign 1 nodes from infra_node for default) -0 row written in 0.075 sec. Processed 0 row, 0 B (0 row/s, 0 B/s) root@localhost:8000/default> show online nodes; @@ -270,7 +251,6 @@ show online nodes ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ id │ type │ node_group │ warehouse │ cluster │ version │ -│ String │ String │ String │ String │ String │ String │ ├────────────────────────┼───────────────┼────────────┼────────────────┼─────────┼─────────────────────────────┤ │ 6yCaMTMAZbP6nSsNfzkSG5 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ │ 8g0E9LxG3mk2eBhKNT9DT2 │ SystemManaged │ log_node │ test_warehouse │ default │ v1.2.686-nightly │ @@ -283,7 +263,6 @@ show online nodes │ s7Yfg7OgXPHAX7pETAbcc │ SystemManaged │ dev_node │ test_warehouse │ default │ v1.2.686-nightly │ │ tM8lj2NOTTtTwjnQIzCwI6 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ └──────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ -10 rows read in 0.139 sec. Processed 0 rows, 0 B (0 row/s, 0 B/s) ``` #### Remove Nodes from cluster of a Warehouse by Node Group @@ -293,7 +272,6 @@ root@localhost:8000/default> alter warehouse test_warehouse unassign nodes(unass alter warehouse test_warehouse unassign nodes(unassign 1 nodes from dev_node for default, unassign 2 nodes from infra_node for default) -0 row written in 0.028 sec. Processed 0 row, 0 B (0 row/s, 0 B/s) root@localhost:8000/default> show online nodes; @@ -301,7 +279,6 @@ show online nodes ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ id │ type │ node_group │ warehouse │ cluster │ version │ -│ String │ String │ String │ String │ String │ String │ ├────────────────────────┼───────────────┼────────────┼────────────────┼─────────┼─────────────────────────────┤ │ 6yCaMTMAZbP6nSsNfzkSG5 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ │ 8g0E9LxG3mk2eBhKNT9DT2 │ SystemManaged │ log_node │ test_warehouse │ default │ v1.2.686-nightly │ @@ -314,5 +291,4 @@ show online nodes │ s7Yfg7OgXPHAX7pETAbcc │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ │ tM8lj2NOTTtTwjnQIzCwI6 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ └──────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ -10 rows read in 0.128 sec. Processed 0 rows, 0 B (0 row/s, 0 B/s) -``` \ No newline at end of file +``` From 950c4f5bf9c3c3933066d0c909e3bdd2557ab1a6 Mon Sep 17 00:00:00 2001 From: Bohu Date: Thu, 9 Jan 2025 13:24:40 +0800 Subject: [PATCH 12/18] Update 03-manage-query-warehouse-through-SQL.md --- .../02-production/03-manage-query-warehouse-through-SQL.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md b/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md index 705869f42b..5928f16142 100644 --- a/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md +++ b/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md @@ -3,8 +3,13 @@ title: Manage Query Warehouse through SQL on Premise sidebar_label: Manage Query Warehouse through SQL description: How to manage scalable and flexible query warehouse through SQL on premise. --- +import FunctionDescription from '@site/src/components/FunctionDescription'; + + + import EEFeature from '@site/src/components/EEFeature'; + This topic explains how to manage scalable and flexible query warehouse through SQL on premise. ## Understand Warehouse From 972c7bbebaae8568a31c7d41ebd80e6231d137c9 Mon Sep 17 00:00:00 2001 From: Bohu Date: Thu, 9 Jan 2025 13:29:20 +0800 Subject: [PATCH 13/18] Update 03-manage-query-warehouse-through-SQL.md --- .../02-production/03-manage-query-warehouse-through-SQL.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md b/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md index 5928f16142..697c840895 100644 --- a/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md +++ b/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md @@ -9,6 +9,8 @@ import FunctionDescription from '@site/src/components/FunctionDescription'; import EEFeature from '@site/src/components/EEFeature'; + + This topic explains how to manage scalable and flexible query warehouse through SQL on premise. From fe254f1447bf3eb08fbabff41e70f779788b0a4b Mon Sep 17 00:00:00 2001 From: Bohu Date: Thu, 9 Jan 2025 13:37:54 +0800 Subject: [PATCH 14/18] Update 03-manage-query-warehouse-through-SQL.md --- .../02-production/03-manage-query-warehouse-through-SQL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md b/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md index 697c840895..993563b4a9 100644 --- a/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md +++ b/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md @@ -5,7 +5,7 @@ description: How to manage scalable and flexible query warehouse through SQL on --- import FunctionDescription from '@site/src/components/FunctionDescription'; - + import EEFeature from '@site/src/components/EEFeature'; From 323e2f07e3749cf25f3b1743b602bc85bf5ad62a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 9 Jan 2025 05:40:01 +0000 Subject: [PATCH 15/18] =?UTF-8?q?=F0=9F=92=ACGenerate=20LLM=20translations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../03-manage-query-warehouse-through-SQL.md | 299 ++++++++++++++++++ 1 file changed, 299 insertions(+) create mode 100644 docs/cn/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md diff --git a/docs/cn/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md b/docs/cn/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md new file mode 100644 index 0000000000..e2ed3aef21 --- /dev/null +++ b/docs/cn/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md @@ -0,0 +1,299 @@ +--- +title: 通过 SQL 管理本地查询计算集群 +sidebar_label: 通过 SQL 管理查询计算集群 +description: 如何通过 SQL 在本地管理可扩展且灵活的查询计算集群。 +--- +import FunctionDescription from '@site/src/components/FunctionDescription'; + + + +import EEFeature from '@site/src/components/EEFeature'; + + + + +本主题解释了如何通过 SQL 在本地管理可扩展且灵活的查询计算集群。 + +## 理解计算集群 + +![本地计算集群](/img/deploy/on-premise-warehouse.png) + +**场景描述** +之前,我们在[部署](https://docs.databend.com/guides/deploy/deploy/production/metasrv-deploy#step-2-deploy-query-nodes)中介绍了如何使用静态的 `tenant_id` 和 `cluster_id` 来部署 Databend。 + +为了使本地部署成功,必须有一个熟练的 DevOps 团队来有效管理部署和配置。这包括: +1. 在高峰使用期间,策略性地将查询路由到不同的集群以提高并发性。 +2. 根据需要重新启动节点并将其重新分配到不同的集群来调整集群大小。 +3. 实施一个强大的集群节点负载均衡策略,这在本地环境中可能会带来独特的挑战。 + +Databend 的本地计算集群 SQL 命令提供了一个强大的解决方案,让用户在几秒钟内构建一个多集群查询计算集群。这些命令使您能够: + +- 构建和管理多个查询计算集群,以提高高峰时段的查询并发性 +- 动态地将查询路由到不同的集群以处理高峰流量 +- 在集群节点之间实施智能负载均衡 +- 无缝地在计算集群和集群之间重新分配节点,实现零停机 + +这种灵活性使您能够优化资源利用率,并在本地部署中适应不断变化的工作负载需求,同时保持高可用性。 + +### 计算集群相关概念 + +在 Databend 中处理计算集群时,以下概念非常重要: +- **计算集群**:用户与之交互以执行 SQL 查询的计算资源集合。它内部可以包含多个集群来处理并发查询工作负载。 + +- **集群**:表示一组计算资源的抽象概念。每个 SQL 查询将尝试使用所有节点的资源(包括 CPU、内存、磁盘等)来完成查询。一个计算集群由多个集群组成,每个集群在物理上是隔离的。当需要增加计算集群的并发处理能力时,可以添加新的集群。在之前静态配置的 `tenant_id` 和 `cluster_id` 部署中,计算集群是一个名为 `cluster_id` 的单集群计算集群。 + +- **节点组**:节点的分组,可以与节点一一对应,也可以有多个节点属于同一个组。可以理解为某种标签,帮助节点分配到不同的计算集群和集群。 + +## 使用系统管理的计算集群部署 Databend Query + +- 更改您的查询配置。 + +```toml title='databend-query.toml' +[query] +.... +# 要启用计算集群功能,您必须不设置 cluster_id +# cluster_id = "test_cluster" +... +[query.resources_management] +type = "system_managed" +node_group = "node_group" +... +``` + +- 启动 Databend Query + +```shell +./databend-query --config databend-query.toml +``` + +## 使用 SQL 管理您的本地计算集群 + +### 检查租户中当前在线的节点 + +```sql +show online nodes; + +┌──────────────────────────────────────────────────────────────────────────────────────────-─────┐ +│ id │ type │ node_group │ warehouse │ cluster │ version │ +├────────────────────────┼───────────────┼────────────┼───────────┼─────────┼────────────────────┤ +│ 9rabYMxa0ReDyZe6F9igH5 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ +│ CbzfLlTVO29EhkZXdeR625 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ +│ O0kOetbvkFjxrQ2kx4uMI │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ R2epWlGVd8S0maSTuwbsv4 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ SoZcaT4gmhVoGKcChlDw93 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ UeNVzwHCXhxJTTB4Xonj07 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ Zu7rmhVZ2s2HqTUCdFBdu2 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ bRubWZEzIibFgRgFad2MS3 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ ilPer0ps5wWnEDOLIlk821 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ shnWu1TC41sAxVwJMIVQF3 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +└───────────────────────────────────────────────────────────────────────────────────────────---──┘ +``` + +### 创建一个包含 2 个节点的单集群计算集群 +此命令将创建一个名为 `test_warehouse_1` 的计算集群,包含 2 个节点。 +```sql +root@localhost:8000/default> create warehouse test_warehouse_1 with warehouse_size = 2; + +create warehouse test_warehouse_1 with warehouse_size = 2 + + +root@localhost:8000/default> show online nodes; + +show online nodes + +┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ id │ type │ node_group │ warehouse │ cluster │ version │ +├────────────────────────┼───────────────┼────────────┼──────────────────┼─────────┼─────────────────────────────┤ +│ 9rabYMxa0ReDyZe6F9igH5 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ +│ CbzfLlTVO29EhkZXdeR625 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ +│ O0kOetbvkFjxrQ2kx4uMI │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ R2epWlGVd8S0maSTuwbsv4 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ SoZcaT4gmhVoGKcChlDw93 │ SystemManaged │ infra_node │ test_warehouse_1 │ default │ v1.2.686-nightly │ +│ UeNVzwHCXhxJTTB4Xonj07 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ Zu7rmhVZ2s2HqTUCdFBdu2 │ SystemManaged │ infra_node │ test_warehouse_1 │ default │ v1.2.686-nightly │ +│ bRubWZEzIibFgRgFad2MS3 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ ilPer0ps5wWnEDOLIlk821 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ shnWu1TC41sAxVwJMIVQF3 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +└────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +### 获取所有现有的计算集群 + +```sql +root@localhost:8000/default> show warehouses; + +show warehouses + +┌───────────────────────────────────────────┐ +│ warehouse │ type │ status │ +├────────────────┼────────────────┼─────────┤ +│ test_warehouse │ System-Managed │ Running │ +└───────────────────────────────────────────┘ +``` + +### 使用现有的计算集群之一来运行查询 +system.clusters 是一个系统表,存储了所有集群及其节点的信息。 + +```sql +root@localhost:8000/default> use warehouse test_warehouse_1; + +use warehouse test_warehouse_1 + + +root@(test_warehouse_1)/default> select * from system.clusters; + +SELECT * FROM system.clusters + +┌───────────────────────────────────────────────────────────────────────────────────────────┐ +│ name │ cluster │ host │ port │ version │ +├────────────────────────┼──────────────────────────┼───────────┼────────┼──────────────────┤ +│ SoZcaT4gmhVoGKcChlDw93 │ test_warehouse_1/default │ 127.0.0.1 │ 27498 │ v1.2.686-nightly │ +│ Zu7rmhVZ2s2HqTUCdFBdu2 │ test_warehouse_1/default │ 127.0.0.1 │ 29798 │ v1.2.686-nightly │ +└───────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +### 向现有计算集群添加集群 +向现有计算集群添加集群将使计算集群能够将查询路由到新集群,从而大大提高计算集群的并发性。 + +:::note +目前,计算集群会随机将查询转发到不同的集群。 +::: + +```sql +root@localhost:8000/default> alter warehouse test_warehouse add cluster test_cluster with cluster_size = 3; + +alter warehouse test_warehouse add cluster test_cluster with cluster_size = 3 + + +root@localhost:8000/default> show online nodes; + +show online nodes + +┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ id │ type │ node_group │ warehouse │ cluster │ version │ +├────────────────────────┼───────────────┼────────────┼────────────────┼──────────────┼─────────────────────────────┤ +│ 9rabYMxa0ReDyZe6F9igH5 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ +│ CbzfLlTVO29EhkZXdeR625 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ +│ O0kOetbvkFjxrQ2kx4uMI │ SystemManaged │ dev_node │ test_warehouse │ test_cluster │ v1.2.686-nightly │ +│ R2epWlGVd8S0maSTuwbsv4 │ SystemManaged │ dev_node │ test_warehouse │ test_cluster │ v1.2.686-nightly │ +│ SoZcaT4gmhVoGKcChlDw93 │ SystemManaged │ infra_node │ test_warehouse │ test_cluster │ v1.2.686-nightly │ +│ UeNVzwHCXhxJTTB4Xonj07 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ Zu7rmhVZ2s2HqTUCdFBdu2 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ bRubWZEzIibFgRgFad2MS3 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ ilPer0ps5wWnEDOLIlk821 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ +│ shnWu1TC41sAxVwJMIVQF3 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ +└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +### 使用节点组创建和管理计算集群 + +Databend 允许用户使用不同的节点组创建多集群计算集群。同一节点组下的节点将被随机分配到指定的计算集群。 + +#### 在指定的节点组中创建计算集群 +```sql +root@localhost:8000/default> create warehouse test_warehouse(assign 1 nodes from log_node, assign 2 nodes from infra_node); + +create warehouse test_warehouse(assign 1 nodes from log_node, assign 2 nodes from infra_node) + + +root@localhost:8000/default> show online nodes; + +show online nodes + +┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ id │ type │ node_group │ warehouse │ cluster │ version │ +├────────────────────────┼───────────────┼────────────┼────────────────┼─────────┼─────────────────────────────┤ +│ 6yCaMTMAZbP6nSsNfzkSG5 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ +│ 8g0E9LxG3mk2eBhKNT9DT2 │ SystemManaged │ log_node │ test_warehouse │ default │ v1.2.686-nightly │ +│ AJ4V671FSZiWz2NUIWg6w5 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ DQUhMHYSdKqML5HJFhVbn4 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ Ji2SZp1zsJQHLyBUTDcrm1 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ a4XEkpidlCSuRkB7cMlCv4 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ dtawAX7FT56iJJv6rER6R2 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ jze3JfzDyY2amoN7Zbq3u6 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ +│ s7Yfg7OgXPHAX7pETAbcc │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ tM8lj2NOTTtTwjnQIzCwI6 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ +└──────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +#### 向现有计算集群添加集群,集群节点来自不同的节点组 +```sql +root@localhost:8000/default> alter warehouse test_warehouse add cluster test_cluster (assign 1 nodes from dev_node, assign 1 nodes from infra_node); + +alter warehouse test_warehouse add cluster test_cluster (assign 1 nodes from dev_node, assign 1 nodes from infra_node) + + +root@localhost:8000/default> show online nodes; + +show online nodes +┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ id │ type │ node_group │ warehouse │ cluster │ version │ +├────────────────────────┼───────────────┼────────────┼────────────────┼──────────────┼─────────────────────────────┤ +│ DZB0EWAz4EiR9UnndkQY92 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ GFkSBv96W9bWBa85n5sC87 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ WwSuc1P3f58CuEd6JcO4L3 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ cjHBOKg8Q39aL30S1FpGN6 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ +│ eAlj9SBIdJPRNDjERwAve4 │ SystemManaged │ infra_node │ test_warehouse │ test_cluster │ v1.2.686-nightly │ +│ hYCjglpJvjglu8krdYGgL │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ +│ nrMfUZljjKQFMPP7H61GX1 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ tEIG103u3Yd7UGS5Fd3mh │ SystemManaged │ log_node │ test_warehouse │ default │ v1.2.686-nightly │ +│ wXgSNxxOTOkjazEPLbDVF3 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ +│ xqWmN2SR1wRjMUt4T2Oy66 │ SystemManaged │ dev_node │ test_warehouse │ test_cluster │ v1.2.686-nightly │ +└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +#### 向现有计算集群添加节点,集群节点来自不同的节点组 + +```sql +root@localhost:8000/default> alter warehouse test_warehouse assign nodes(assign 1 nodes from dev_node for default, assign 1 nodes from infra_node for default); + +alter warehouse test_warehouse assign nodes(assign 1 nodes from dev_node for default, assign 1 nodes from infra_node for default) + + +root@localhost:8000/default> show online nodes; + +show online nodes + +┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ id │ type │ node_group │ warehouse │ cluster │ version │ +├────────────────────────┼───────────────┼────────────┼────────────────┼─────────┼─────────────────────────────┤ +│ 6yCaMTMAZbP6nSsNfzkSG5 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ +│ 8g0E9LxG3mk2eBhKNT9DT2 │ SystemManaged │ log_node │ test_warehouse │ default │ v1.2.686-nightly │ +│ AJ4V671FSZiWz2NUIWg6w5 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ DQUhMHYSdKqML5HJFhVbn4 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ Ji2SZp1zsJQHLyBUTDcrm1 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ a4XEkpidlCSuRkB7cMlCv4 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ dtawAX7FT56iJJv6rER6R2 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ +│ jze3JfzDyY2amoN7Zbq3u6 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ +│ s7Yfg7OgXPHAX7pETAbcc │ SystemManaged │ dev_node │ test_warehouse │ default │ v1.2.686-nightly │ +│ tM8lj2NOTTtTwjnQIzCwI6 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ +└──────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +#### 从计算集群的集群中按节点组移除节点 + +```sql +root@localhost:8000/default> alter warehouse test_warehouse unassign nodes(unassign 1 nodes from dev_node for default, unassign 2 nodes from infra_node for default); + +alter warehouse test_warehouse unassign nodes(unassign 1 nodes from dev_node for default, unassign 2 nodes from infra_node for default) + + +root@localhost:8000/default> show online nodes; + +show online nodes + +┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ id │ type │ node_group │ warehouse │ cluster │ version │ +├────────────────────────┼───────────────┼────────────┼────────────────┼─────────┼─────────────────────────────┤ +│ 6yCaMTMAZbP6nSsNfzkSG5 │ SystemManaged │ log_node │ │ │ v1.2.686-nightly │ +│ 8g0E9LxG3mk2eBhKNT9DT2 │ SystemManaged │ log_node │ test_warehouse │ default │ v1.2.686-nightly │ +│ AJ4V671FSZiWz2NUIWg6w5 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ DQUhMHYSdKqML5HJFhVbn4 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ Ji2SZp1zsJQHLyBUTDcrm1 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ a4XEkpidlCSuRkB7cMlCv4 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ dtawAX7FT56iJJv6rER6R2 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ jze3JfzDyY2amoN7Zbq3u6 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ s7Yfg7OgXPHAX7pETAbcc │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ tM8lj2NOTTtTwjnQIzCwI6 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ +└──────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` \ No newline at end of file From 67ae112c8382f2f7b64b2ef51a9e832ede45f329 Mon Sep 17 00:00:00 2001 From: Bohu Date: Thu, 9 Jan 2025 15:27:36 +0800 Subject: [PATCH 16/18] Update 03-manage-query-warehouse-through-SQL.md --- .../03-manage-query-warehouse-through-SQL.md | 33 ------------------- 1 file changed, 33 deletions(-) diff --git a/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md b/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md index 993563b4a9..26dd96595d 100644 --- a/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md +++ b/docs/en/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md @@ -95,13 +95,8 @@ this command will create a warehouse named `test_warehouse_1` with 2 nodes. ```sql root@localhost:8000/default> create warehouse test_warehouse_1 with warehouse_size = 2; -create warehouse test_warehouse_1 with warehouse_size = 2 - - root@localhost:8000/default> show online nodes; -show online nodes - ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ id │ type │ node_group │ warehouse │ cluster │ version │ ├────────────────────────┼───────────────┼────────────┼──────────────────┼─────────┼─────────────────────────────┤ @@ -123,8 +118,6 @@ show online nodes ```sql root@localhost:8000/default> show warehouses; -show warehouses - ┌───────────────────────────────────────────┐ │ warehouse │ type │ status │ ├────────────────┼────────────────┼─────────┤ @@ -138,13 +131,8 @@ system.clusters is a system table that stores the information of all clusters, a ```sql root@localhost:8000/default> use warehouse test_warehouse_1; -use warehouse test_warehouse_1 - - root@(test_warehouse_1)/default> select * from system.clusters; -SELECT * FROM system.clusters - ┌───────────────────────────────────────────────────────────────────────────────────────────┐ │ name │ cluster │ host │ port │ version │ ├────────────────────────┼──────────────────────────┼───────────┼────────┼──────────────────┤ @@ -168,8 +156,6 @@ alter warehouse test_warehouse add cluster test_cluster with cluster_size = 3 root@localhost:8000/default> show online nodes; -show online nodes - ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ id │ type │ node_group │ warehouse │ cluster │ version │ ├────────────────────────┼───────────────┼────────────┼────────────────┼──────────────┼─────────────────────────────┤ @@ -195,13 +181,8 @@ Databend allow user to create multi-cluster warehouse with different node group. ```sql root@localhost:8000/default> create warehouse test_warehouse(assign 1 nodes from log_node, assign 2 nodes from infra_node); -create warehouse test_warehouse(assign 1 nodes from log_node, assign 2 nodes from infra_node) - - root@localhost:8000/default> show online nodes; -show online nodes - ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ id │ type │ node_group │ warehouse │ cluster │ version │ ├────────────────────────┼───────────────┼────────────┼────────────────┼─────────┼─────────────────────────────┤ @@ -222,12 +203,8 @@ show online nodes ```sql root@localhost:8000/default> alter warehouse test_warehouse add cluster test_cluster (assign 1 nodes from dev_node, assign 1 nodes from infra_node); -alter warehouse test_warehouse add cluster test_cluster (assign 1 nodes from dev_node, assign 1 nodes from infra_node) - - root@localhost:8000/default> show online nodes; -show online nodes ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ id │ type │ node_group │ warehouse │ cluster │ version │ ├────────────────────────┼───────────────┼────────────┼────────────────┼──────────────┼─────────────────────────────┤ @@ -249,13 +226,8 @@ show online nodes ```sql root@localhost:8000/default> alter warehouse test_warehouse assign nodes(assign 1 nodes from dev_node for default, assign 1 nodes from infra_node for default); -alter warehouse test_warehouse assign nodes(assign 1 nodes from dev_node for default, assign 1 nodes from infra_node for default) - - root@localhost:8000/default> show online nodes; -show online nodes - ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ id │ type │ node_group │ warehouse │ cluster │ version │ ├────────────────────────┼───────────────┼────────────┼────────────────┼─────────┼─────────────────────────────┤ @@ -277,13 +249,8 @@ show online nodes ```sql root@localhost:8000/default> alter warehouse test_warehouse unassign nodes(unassign 1 nodes from dev_node for default, unassign 2 nodes from infra_node for default); -alter warehouse test_warehouse unassign nodes(unassign 1 nodes from dev_node for default, unassign 2 nodes from infra_node for default) - - root@localhost:8000/default> show online nodes; -show online nodes - ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ id │ type │ node_group │ warehouse │ cluster │ version │ ├────────────────────────┼───────────────┼────────────┼────────────────┼─────────┼─────────────────────────────┤ From 1146d59b15af381435f0419c65a9f00967cfa502 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 9 Jan 2025 06:05:54 +0000 Subject: [PATCH 17/18] =?UTF-8?q?=F0=9F=92=ACGenerate=20LLM=20translations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../00-sql-reference/10-data-types/bitmap.md | 18 +- .../00-sql-reference/10-data-types/boolean.md | 6 +- .../10-data-types/datetime.md | 68 +++---- .../00-sql-reference/10-data-types/decimal.md | 8 +- .../10-data-types/geospatial.md | 38 ++-- .../00-sql-reference/10-data-types/index.md | 20 +-- .../10-data-types/interval.md | 16 +- .../00-sql-reference/10-data-types/map.md | 10 +- .../00-sql-reference/10-data-types/string.md | 10 +- .../00-sql-reference/10-data-types/tuple.md | 10 +- .../00-sql-reference/10-data-types/variant.md | 12 +- .../information-schema-tables.md | 6 +- .../20-system-tables/system-build-options.md | 2 +- .../20-system-tables/system-caches.md | 2 +- .../20-system-tables/system-clusters.md | 2 +- .../20-system-tables/system-columns.md | 48 ++--- .../20-system-tables/system-configs.md | 6 +- .../20-system-tables/system-contributors.md | 2 +- .../20-system-tables/system-credits.md | 2 +- .../system-databases-with-history.md | 6 +- .../20-system-tables/system-databases.md | 18 +- .../20-system-tables/system-functions.md | 6 +- .../20-system-tables/system-indexes.md | 4 +- .../20-system-tables/system-locks.md | 6 +- .../20-system-tables/system-metrics.md | 2 +- .../20-system-tables/system-numbers.md | 6 +- .../20-system-tables/system-query-log.md | 3 +- .../20-system-tables/system-settings.md | 139 +++++++-------- .../20-system-tables/system-stream-status.md | 54 ------ .../20-system-tables/system-streams.md | 6 +- .../system-tables-with-history.md | 4 +- .../20-system-tables/system-tables.md | 8 +- .../20-system-tables/system-temp-files.md | 16 +- .../20-system-tables/system-temp-tables.md | 4 +- .../20-system-tables/system-user-functions.md | 6 +- .../system-virtual-columns.md | 4 +- .../30-table-engines/00-fuse.md | 52 +++--- .../30-table-engines/01-memory.md | 14 +- .../30-table-engines/02-random.md | 8 +- .../30-table-engines/03-iceberg.md | 2 +- .../30-table-engines/04-delta.md | 3 +- .../00-sql-reference/40-sql-identifiers.md | 48 ++--- .../00-sql-reference/41-sql-variables.md | 18 +- .../00-sql-reference/42-lambda-expressions.md | 20 +-- .../50-file-format-options.md | 168 +++++++++--------- .../00-sql-reference/51-connect-parameters.md | 125 ++++++------- .../00-sql-reference/98-sql-scripting.md | 76 ++++---- .../00-sql-reference/99-ansi-sql.md | 83 +++++---- .../sql-reference/00-sql-reference/index.md | 8 +- 49 files changed, 581 insertions(+), 622 deletions(-) delete mode 100644 docs/cn/sql-reference/00-sql-reference/20-system-tables/system-stream-status.md diff --git a/docs/cn/sql-reference/00-sql-reference/10-data-types/bitmap.md b/docs/cn/sql-reference/00-sql-reference/10-data-types/bitmap.md index 23caf29653..61795a8283 100644 --- a/docs/cn/sql-reference/00-sql-reference/10-data-types/bitmap.md +++ b/docs/cn/sql-reference/00-sql-reference/10-data-types/bitmap.md @@ -11,20 +11,20 @@ Databend 中的 Bitmap 是一种高效的数据结构,用于表示集合中元 - 去重计数:Bitmap 用于高效计算集合中唯一元素的数量。通过对 Bitmap 进行位操作,可以快速确定元素的存在性,实现去重计数的功能。 -- 过滤和选择:Bitmap 可以快速进行数据过滤和选择。通过对 Bitmap 进行位操作,可以高效地识别满足特定条件的元素,从而实现高效的数据过滤和选择。 +- 过滤和选择:Bitmap 对于快速数据过滤和选择非常有效。通过对 Bitmap 进行位操作,可以高效地识别满足特定条件的元素,实现高效的数据过滤和选择。 -- 集合操作:Bitmap 可以用于各种集合操作,如并集、交集、差集和对称差集。这些集合操作可以通过位操作实现,为数据处理和分析提供高效的集合操作。 +- 集合操作:Bitmap 可以用于各种集合操作,如并集、交集、差集和对称差集。这些集合操作可以通过位操作实现,在数据处理和分析中提供高效的集合操作。 -- 压缩存储:Bitmap 在存储方面具有很高的压缩性能。与传统的存储方法相比,Bitmap 可以有效地利用存储空间,节省存储成本并提高查询性能。 +- 压缩存储:Bitmap 在存储方面具有很高的压缩性能。与传统存储方法相比,Bitmap 可以有效地利用存储空间,节省存储成本并提高查询性能。 ::: -Databend 允许使用 TO_BITMAP 函数通过两种格式创建 Bitmap: +Databend 允许使用 TO_BITMAP 函数以两种格式创建 Bitmap: -- 字符串格式:您可以使用逗号分隔的字符串创建 Bitmap。例如,TO_BITMAP('1,2,3') 会创建一个 Bitmap,其中值为 1、2 和 3 的位被设置。 +- 字符串格式:您可以使用逗号分隔的字符串创建 Bitmap。例如,TO_BITMAP('1,2,3') 创建一个 Bitmap,其中值为 1、2 和 3 的位被设置。 -- uint64 格式:您也可以使用 uint64 值创建 Bitmap。例如,TO_BITMAP(123) 会创建一个 Bitmap,其中根据 uint64 值 123 的二进制表示设置位。 +- uint64 格式:您也可以使用 uint64 值创建 Bitmap。例如,TO_BITMAP(123) 创建一个 Bitmap,其中根据 uint64 值 123 的二进制表示设置位。 -在 Databend 中,一个 Bitmap 最多可以存储 2^64 位。Databend 中的 Bitmap 数据类型是一种二进制类型,与其他支持的类型在表示和显示方面有所不同。与其他类型不同,Bitmap 不能直接在 SELECT 语句的结果集中显示,而是需要使用 [Bitmap 函数](../../20-sql-functions/01-bitmap-functions/index.md) 进行操作和解释: +在 Databend 中,Bitmap 最多可以存储 2^64 位。Databend 中的 Bitmap 数据类型是一种二进制类型,与其他支持的类型在表示和 SELECT 语句中的显示方式不同。与其他类型不同,Bitmap 不能直接在 SELECT 语句的结果集中显示。相反,它们需要使用 [Bitmap 函数](../../20-sql-functions/01-bitmap-functions/index.md) 进行操作和解释: ```sql SELECT TO_BITMAP('1,2,3') @@ -46,10 +46,10 @@ SELECT TO_STRING(TO_BITMAP('1,2,3')) **示例**: -此示例展示了 Databend 中的 Bitmap 如何高效地存储和查询具有大量可能值的数据,例如用户访问历史。 +此示例展示了 Databend 中的 Bitmap 如何高效存储和查询具有大量可能值的数据,例如用户访问历史。 ```sql --- 创建 user_visits 表,包含 user_id 和 page_visits 列,使用 build_bitmap 表示 page_visits。 +-- 创建表 user_visits,包含 user_id 和 page_visits 列,使用 build_bitmap 表示 page_visits。 CREATE TABLE user_visits ( user_id INT, page_visits Bitmap diff --git a/docs/cn/sql-reference/00-sql-reference/10-data-types/boolean.md b/docs/cn/sql-reference/00-sql-reference/10-data-types/boolean.md index c27bf54d0e..fd94824568 100644 --- a/docs/cn/sql-reference/00-sql-reference/10-data-types/boolean.md +++ b/docs/cn/sql-reference/00-sql-reference/10-data-types/boolean.md @@ -7,9 +7,9 @@ BOOLEAN 类型表示一个真值陈述(`true` 或 `false`)。 ## 布尔数据类型 -| 名称 | 别名 | 存储大小 | 最小值 | 最大值 | 描述 | -|---------|--------|----------|--------|--------|-----------------------| -| BOOLEAN | BOOL | 1 字节 | | | 逻辑布尔值(真/假) | +| 名称 | 别名 | 存储大小 | 最小值 | 最大值 | 描述 | +|---------|---------|--------------|-----------|-----------|------------------------------| +| BOOLEAN | BOOL | 1 字节 | | | 逻辑布尔值(真/假) | ## 隐式转换 diff --git a/docs/cn/sql-reference/00-sql-reference/10-data-types/datetime.md b/docs/cn/sql-reference/00-sql-reference/10-data-types/datetime.md index b7190d5c78..e26605d46c 100644 --- a/docs/cn/sql-reference/00-sql-reference/10-data-types/datetime.md +++ b/docs/cn/sql-reference/00-sql-reference/10-data-types/datetime.md @@ -9,10 +9,10 @@ import FunctionDescription from '@site/src/components/FunctionDescription'; ## 日期与时间数据类型 -| 名称 | 别名 | 存储大小 | 分辨率 | 最小值 | 最大值 | 描述 | -| --------- | -------- | -------- | ----------- | ------------------- | ------------------------------ | ------------------------------------------------------------------- | -| DATE | | 4 字节 | 天 | 1000-01-01 | 9999-12-31 | YYYY-MM-DD | -| TIMESTAMP | DATETIME | 8 字节 | 微秒 | 1000-01-01 00:00:00 | 9999-12-31 23:59:59.999999 UTC | `YYYY-MM-DD hh:mm:ss[.fraction]`,最高支持微秒(6 位)精度 | +| 名称 | 别名 | 存储大小 | 分辨率 | 最小值 | 最大值 | 描述 | +| --------- | -------- | ------------ | ----------- | ------------------- | ------------------------------ | ------------------------------------------------------------------------- | +| DATE | | 4 字节 | 天 | 1000-01-01 | 9999-12-31 | YYYY-MM-DD | +| TIMESTAMP | DATETIME | 8 字节 | 微秒 | 1000-01-01 00:00:00 | 9999-12-31 23:59:59.999999 UTC | `YYYY-MM-DD hh:mm:ss[.fraction]`,精度可达微秒(6 位小数) | ## 示例 @@ -32,14 +32,14 @@ DESC test_dt; ``` ┌────────────────────────────────────────────────┐ -│ 字段 │ 类型 │ 空值 │ 默认值 │ 额外 │ +│ 字段 │ 类型 │ 可为空 │ 默认值 │ 额外 │ ├────────┼───────────┼────────┼─────────┼────────┤ -│ date │ DATE │ YES │ NULL │ │ -│ ts │ TIMESTAMP │ YES │ NULL │ │ +│ date │ DATE │ 是 │ NULL │ │ +│ ts │ TIMESTAMP │ 是 │ NULL │ │ └────────────────────────────────────────────────┘ ``` -TIMESTAMP 值可以选择性地包含一个尾部的秒小数部分,最高支持微秒(6 位)精度。 +TIMESTAMP 值可以选择性地包含一个尾部的秒小数部分,精度可达微秒(6 位小数)。 ```sql -- 向表中插入值 @@ -63,7 +63,7 @@ FROM test_dt; └─────────────────────────────────────────────┘ ``` -Databend 支持多种格式的 TIMESTAMP 值。 +Databend 识别多种格式的 TIMESTAMP 值。 ```sql -- 创建一个表来测试不同的时间戳格式 @@ -169,13 +169,13 @@ FROM test_tz; ## 函数 -参见 [日期与时间函数](/sql/sql-functions/datetime-functions)。 +参见[日期与时间函数](/sql/sql-functions/datetime-functions)。 ## 处理夏令时调整 -在某些地区,会观察到夏令时。在夏令时开始的那一天,时钟会向前调整一小时。Databend 通过 `enable_dst_hour_fix` 设置来管理夏令时调整。当启用时,Databend 会自动将时间向前调整一小时(例如,2:10 AM 将被处理为 3:10 AM)。 +在某些地区,会观察到夏令时。在夏令时开始的那一天,时钟会向前调整一小时。Databend 通过 `enable_dst_hour_fix` 设置来管理夏令时调整。当启用时,Databend 会自动将时间提前一小时(例如,2:10 AM 将被处理为 3:10 AM)。 -例如,多伦多的夏令时于 2024 年 3 月 10 日凌晨 2:00 开始。因此,当天 2:00 AM 到 3:00 AM 之间的时间不存在。Databend 依赖 [Chrono](https://github.com/chronotope/chrono) 来确定每个时区的夏令时。如果提供了这个范围内的某个时间,Databend 将返回错误: +例如,多伦多的夏令时于 2024 年 3 月 10 日凌晨 2:00 开始。因此,当天 2:00 AM 到 3:00 AM 之间的时间不存在。Databend 依赖 [Chrono](https://github.com/chronotope/chrono) 来确定每个时区的夏令时。如果提供了此范围内的某个时间,Databend 将返回错误: ```sql SET timezone = 'America/Toronto'; @@ -184,7 +184,7 @@ SELECT to_datetime('2024-03-10 02:01:00'); error: APIError: ResponseError with 1006: cannot parse to type `TIMESTAMP`. BadArguments. Code: 1006, Text = unexpected argument. while evaluating function `to_timestamp('2024-03-10 02:01:00')` in expr `to_timestamp('2024-03-10 02:01:00')` ``` -要修复此类错误,您可以启用 `enable_dst_hour_fix` 设置,将时间向前调整一小时: +要修复此类错误,您可以启用 `enable_dst_hour_fix` 设置以将时间提前一小时: ```sql SET enable_dst_hour_fix = 1; @@ -200,7 +200,7 @@ SELECT to_datetime('2024-03-10 02:01:00'); ## 处理无效值 -Databend 会自动将无效的日期或时间戳值转换为其最小有效值,日期为 `1000-01-01`,时间戳为 `1000-01-01 00:00:00`,确保在处理超出范围或格式错误的日期和时间戳时的一致性。 +Databend 会自动将无效的日期或时间戳值转换为其最小有效等效值,日期为 `1000-01-01`,时间戳为 `1000-01-01 00:00:00`,确保在处理超出范围或格式错误的日期和时间戳时的一致性。 示例: @@ -217,7 +217,7 @@ SELECT ADD_DAYS(TO_DATE('9999-12-31'), 1); ``` ```sql --- 尝试将最小日期减去一分钟,这将无效。 +-- 尝试从最小日期减去一分钟,这将无效。 -- 结果:返回 DateMIN (1000-01-01 00:00:00),确保结果的稳定性。 SELECT SUBTRACT_MINUTES(TO_DATE('1000-01-01'), 1); @@ -228,16 +228,16 @@ SELECT SUBTRACT_MINUTES(TO_DATE('1000-01-01'), 1); └────────────────────────────────────────────┘ ``` -## 格式化日期与时间 +## 格式化日期和时间 -在 Databend 中,某些日期和时间函数如 [TO_DATE](../../20-sql-functions/05-datetime-functions/to-date.md) 和 [TO_TIMESTAMP](../../20-sql-functions/05-datetime-functions/to-timestamp.md) 需要您指定日期和时间值的格式。为了处理日期和时间的格式化,Databend 使用了 chrono::format::strftime 模块,这是 Rust 中 chrono 库提供的一个标准模块。该模块能够精确控制日期和时间的格式化。以下内容摘自 [https://docs.rs/chrono/latest/chrono/format/strftime/index.html](https://docs.rs/chrono/latest/chrono/format/strftime/index.html): +在 Databend 中,某些日期和时间函数如 [TO_DATE](../../20-sql-functions/05-datetime-functions/to-date.md) 和 [TO_TIMESTAMP](../../20-sql-functions/05-datetime-functions/to-timestamp.md) 要求您指定日期和时间值的所需格式。为了处理日期和时间的格式化,Databend 使用了 chrono::format::strftime 模块,这是 Rust 中 chrono 库提供的标准模块。该模块能够精确控制日期和时间的格式化。以下内容摘自 [https://docs.rs/chrono/latest/chrono/format/strftime/index.html](https://docs.rs/chrono/latest/chrono/format/strftime/index.html): | 格式符 | 示例 | 描述 | | ----- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | | | 日期格式符: | -| %Y | 2001 | 完整的格里高利年份,补零至4位。chrono支持从-262144到262143的年份。注意:公元前1年或公元9999年之后的年份需要初始符号(+/-)。 | -| %C | 20 | 格里高利年份除以100,补零至2位。 | -| %y | 01 | 格里高利年份模100,补零至2位。 | +| %Y | 2001 | 完整的格里高利历年份,补零至4位。chrono支持从-262144到262143的年份。注意:公元前1年之前或公元9999年之后的年份,需要在前面加上符号(+/-)。 | +| %C | 20 | 格里高利历年份除以100,补零至2位。 | +| %y | 01 | 格里高利历年份模100,补零至2位。 | | %m | 07 | 月份数字(01–12),补零至2位。 | | %b | Jul | 缩写的月份名称。始终为3个字母。 | | %B | July | 完整的月份名称。在解析时也接受相应的缩写。 | @@ -249,9 +249,9 @@ SELECT SUBTRACT_MINUTES(TO_DATE('1000-01-01'), 1); | %w | 0 | 星期日 = 0,星期一 = 1,…,星期六 = 6。 | | %u | 7 | 星期一 = 1,星期二 = 2,…,星期日 = 7。(ISO 8601) | | %U | 28 | 从星期日开始的周数(00–53),补零至2位。 | -| %W | 27 | 同%U,但第1周从该年的第一个星期一开始。 | -| %G | 2001 | 同%Y,但使用ISO 8601周日期中的年份。 | -| %g | 01 | 同%y,但使用ISO 8601周日期中的年份。 | +| %W | 27 | 同%U,但第一周从该年的第一个星期一开始。 | +| %G | 2001 | 同%Y,但使用ISO 8601周日期中的年份数字。 | +| %g | 01 | 同%y,但使用ISO 8601周日期中的年份数字。 | | %V | 27 | 同%U,但使用ISO 8601周日期中的周数(01–53)。 | | %j | 189 | 一年中的第几天(001–366),补零至3位。 | | %D | 07/08/01 | 月-日-年格式。同%m/%d/%y。 | @@ -283,9 +283,9 @@ SELECT SUBTRACT_MINUTES(TO_DATE('1000-01-01'), 1); | %Z | ACST | 本地时区名称。在解析时跳过所有非空白字符。 | | %z | +0930 | 本地时间与UTC的偏移量(UTC为+0000)。 | | %:z | +09:30 | 同%z,但带有冒号。 | -| %::z | +09:30:00 | 本地时间与UTC的偏移量,带秒。 | -| %:::z | +09 | 本地时间与UTC的偏移量,不带分钟。 | -| %#z | +09 | 仅解析:同%z,但允许分钟缺失或存在。 | +| %::z | +09:30:00 | 本地时间与UTC的偏移量,带秒数。 | +| %:::z | +09 | 本地时间与UTC的偏移量,不带分钟数。 | +| %#z | +09 | 仅解析:同%z,但允许分钟数缺失或存在。 | | | | 日期和时间格式符: | | %c | Sun Jul 8 00:34:60 2001 | 本地日期和时间(例如,Thu Mar 3 23:05:25 2005)。 | | %+ | 2001-07-08T00:34:60.026490+09:30 | ISO 8601 / RFC 3339 日期和时间格式。 | @@ -295,7 +295,7 @@ SELECT SUBTRACT_MINUTES(TO_DATE('1000-01-01'), 1); | %n | | 字面换行符(\n)。 | | %% | | 字面百分号。 | -可以覆盖数字说明符 `%?` 的默认填充行为。其他说明符不允许这样做,否则会导致 `BAD_FORMAT` 错误。 +可以覆盖数字说明符 `%?` 的默认填充行为。对于其他说明符,这是不允许的,会导致 `BAD_FORMAT` 错误。 | 修饰符 | 描述 | | -------- | ----------------------------------------------------------------------------- | @@ -305,7 +305,7 @@ SELECT SUBTRACT_MINUTES(TO_DATE('1000-01-01'), 1); - %C, %y: 这是向下取整的除法,因此公元前100年(年份编号为-99)将分别打印为-1和99。 -- %U: 第1周从该年的第一个星期日开始。在第一个星期日之前的日子可能会有第0周。 +- %U: 第1周从该年的第一个星期日开始。在第一个星期日之前的日子可能有第0周。 - %G, %g, %V: 第1周是该年中至少有4天的第一周。第0周不存在,因此应与%G或%g一起使用。 @@ -314,13 +314,13 @@ SELECT SUBTRACT_MINUTES(TO_DATE('1000-01-01'), 1); - %f, %.f, %.3f, %.6f, %.9f, %3f, %6f, %9f: 默认的%f是右对齐的,并且总是用零填充到9位,以与glibc等兼容,因此它总是计算自上一整秒以来的纳秒数。例如,上一秒后的7毫秒将打印为007000000,解析7000000将产生相同的结果。 - 变体%.f是左对齐的,并根据精度打印0、3、6或9位小数。例如,上一秒后的70毫秒在%.f下将打印为.070(注意:不是.07),解析.07、.070000等将产生相同的结果。请注意,如果小数部分为零或下一个字符不是.,它们可能不会打印或读取任何内容。 + 变体%.f是左对齐的,并根据精度打印0、3、6或9位小数。例如,上一秒后的70毫秒在%.f下将打印为.070(注意:不是.07),解析.07、.070000等将产生相同的结果。请注意,如果小数部分为零或下一个字符不是.,它们可能不打印或读取任何内容。 - 变体%.3f、%.6f和%.9f是左对齐的,并根据f前面的数字打印3、6或9位小数。例如,上一秒后的70毫秒在%.3f下将打印为.070(注意:不是.07),解析.07、.070000等将产生相同的结果。请注意,如果小数部分为零或下一个字符不是.,它们可能不会读取任何内容,但会以指定的长度打印。 + 变体%.3f、%.6f和%.9f是左对齐的,并根据f前面的数字打印3、6或9位小数。例如,上一秒后的70毫秒在%.3f下将打印为.070(注意:不是.07),解析.07、.070000等将产生相同的结果。请注意,如果小数部分为零或下一个字符不是.,它们可能不读取任何内容,但会以指定的长度打印。 - 变体%3f、%6f和%9f是左对齐的,并根据f前面的数字打印3、6或9位小数,但没有前导点。例如,上一秒后的70毫秒在%3f下将打印为070(注意:不是07),解析07、070000等将产生相同的结果。请注意,如果小数部分为零,它们可能不会读取任何内容。 + 变体%3f、%6f和%9f是左对齐的,并根据f前面的数字打印3、6或9位小数,但没有前导点。例如,上一秒后的70毫秒在%3f下将打印为070(注意:不是07),解析07、070000等将产生相同的结果。请注意,如果小数部分为零,它们可能不读取任何内容。 -- %Z: 偏移量不会从解析的数据中填充,也不会进行验证。时区被完全忽略。类似于glibc strptime对此格式代码的处理。 +- %Z: 偏移量不会从解析的数据中填充,也不会进行验证。时区完全被忽略。类似于glibc strptime对此格式代码的处理。 无法可靠地从缩写转换为偏移量,例如CDT可以表示北美中部夏令时或中国夏令时。 @@ -330,6 +330,6 @@ SELECT SUBTRACT_MINUTES(TO_DATE('1000-01-01'), 1); 请注意,所有T、Z和UTC都是不区分大小写解析的。 - 典型的strftime实现对此说明符有不同的(且依赖于区域的)格式。虽然Chrono的%+格式要稳定得多,但如果您想控制确切的输出,最好避免使用此说明符。 + 典型的strftime实现对于此说明符有不同的(且依赖于区域的)格式。虽然Chrono的%+格式要稳定得多,但如果您想控制确切的输出,最好避免使用此说明符。 -- %s: 此说明符不填充,并且可以为负数。对于Chrono的目的,它只考虑非闰秒,因此与ISO C strftime行为略有不同。 \ No newline at end of file +- %s: 这不填充,并且可以为负数。对于Chrono的目的,它只考虑非闰秒,因此与ISO C strftime行为略有不同。 \ No newline at end of file diff --git a/docs/cn/sql-reference/00-sql-reference/10-data-types/decimal.md b/docs/cn/sql-reference/00-sql-reference/10-data-types/decimal.md index 1a05507df3..cf5ed85f98 100644 --- a/docs/cn/sql-reference/00-sql-reference/10-data-types/decimal.md +++ b/docs/cn/sql-reference/00-sql-reference/10-data-types/decimal.md @@ -48,11 +48,11 @@ SELECT * FROM decimal; ## 精度推断 -DECIMAL 有一套复杂的精度推断规则。不同的表达式会应用不同的规则来推断精度。 +Decimal 有一套复杂的精度推断规则。不同的表达式会应用不同的规则来推断精度。 ### 算术运算 -- 加法/减法:`DECIMAL(a, b) + DECIMAL(x, y) -> DECIMAL(max(a - b, x - y) + max(b, y) + 1, max(b, y))`,这意味着整数部分和小数部分都使用两个操作数中的较大值。 +- 加法/减法:`DECIMAL(a, b) + DECIMAL(x, y) -> DECIMAL(max(a - b, x - y) + max(b, y) + 1, max(b, y))`,这意味着整数部分和小数部分都使用两个操作数中较大的值。 - 乘法:`DECIMAL(a, b) * DECIMAL(x, y) -> DECIMAL(a + x, b + y)`。 @@ -72,8 +72,8 @@ DECIMAL 有一套复杂的精度推断规则。不同的表达式会应用不同 ## 调整结果精度 -不同的用户对 Decimal 的精度要求不同。上述规则是 Databend 的默认行为。如果用户有不同的精度要求,可以通过以下方式调整精度: +不同的用户对 Decimal 有不同的精度要求。上述规则是 databend 的默认行为。如果用户有不同的精度要求,可以通过以下方式调整精度: 如果预期的结果精度高于默认精度,可以通过调整输入精度来调整结果精度。例如,如果用户希望计算 AVG(col) 得到 DECIMAL(x, y) 作为结果,其中 col 的类型为 DECIMAL(a, b),可以将表达式重写为 `cast(AVG(col) as Decimal(x, y)` 或 `AVG(col)::Decimal(x, y)`。 -需要注意的是,在 Decimal 类型的转换或计算中,如果整数部分溢出,会抛出错误,如果小数部分的精度溢出,则会直接丢弃而不是四舍五入。 \ No newline at end of file +注意,在 Decimal 类型的转换或计算中,如果整数部分溢出,会抛出错误;如果小数部分的精度溢出,则会直接丢弃,而不是四舍五入。 \ No newline at end of file diff --git a/docs/cn/sql-reference/00-sql-reference/10-data-types/geospatial.md b/docs/cn/sql-reference/00-sql-reference/10-data-types/geospatial.md index b2800cf6d3..988b432e3b 100644 --- a/docs/cn/sql-reference/00-sql-reference/10-data-types/geospatial.md +++ b/docs/cn/sql-reference/00-sql-reference/10-data-types/geospatial.md @@ -4,7 +4,7 @@ title: 地理空间 Databend 支持以下地理空间数据类型,用于处理空间数据: -- **GEOMETRY**:使用平面坐标系(笛卡尔坐标),适用于二维几何对象。坐标表示为 (X, Y) 对,单位由关联的空间参考系统 (SRS) 决定。默认 SRID 为 0,但可以指定自定义 SRID。适用于小规模测量,如城市或省级分析,具有高计算速度和低资源使用率,但在较大区域可能会引入显著误差。 +- **GEOMETRY**:使用平面坐标系(笛卡尔坐标),适用于二维几何对象。坐标表示为 (X, Y) 对,单位由关联的空间参考系统(SRS)决定。默认 SRID 为 0,但可以指定自定义 SRID。适用于小规模测量,如城市或省级分析,具有高计算速度和低资源使用率,但在较大区域可能会引入显著误差。 - **GEOGRAPHY**:使用地理坐标系(球面坐标),基于纬度(-90° 到 90°)和经度(-180° 到 180°),遵循 WGS 84(SRID 4326)。设计用于全球或大规模空间数据,提供在大距离上的准确性,但计算复杂度和资源需求较高。需要时可以转换为 GEOMETRY。 @@ -16,29 +16,29 @@ GEOMETRY 和 GEOGRAPHY 类型目前是实验性功能。要使用这些类型创 Databend 支持一系列地理空间对象类型,能够精确表示和分析平面(GEOMETRY)和球面(GEOGRAPHY)坐标系的空间数据。 -| 对象类型 | 描述 | GEOMETRY 示例 | GEOGRAPHY 示例 | +| 对象类型 | 描述 | GEOMETRY 示例 | GEOGRAPHY 示例 | |--------------------|-----------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------| -| 点 (Point) | 零维几何对象,表示特定位置或坐标点。 | POINT(10 20) | POINT(-122.4194 37.7749)(旧金山坐标) | -| 线 (LineString) | 一维几何对象,由一系列连接的点组成,表示路径或线段。 | LINESTRING(10 20, 30 40, 50 60) | LINESTRING(-122.4194 37.7749, -73.9352 40.7306)(旧金山到纽约) | -| 多边形 (Polygon) | 二维几何对象,具有外环和可选的内环,表示区域。 | POLYGON((10 20, 30 40, 50 60, 10 20)) | POLYGON((-122.5 37.7, -122.4 37.8, -122.3 37.7, -122.5 37.7))(旧金山的一个区域) | -| 多点 (MultiPoint) | 多个零维几何对象的集合。 | MULTIPOINT((10 20), (30 40), (50 60)) | MULTIPOINT((-122.4194 37.7749), (-73.9352 40.7306))(旧金山和纽约的点) | -| 多线 (MultiLineString) | 多个 LineString 对象的集合。 | MULTILINESTRING((10 20, 30 40), (50 60, 70 80)) | MULTILINESTRING((-122.5 37.7, -122.4 37.8), (-122.3 37.7, -122.2 37.8))(城市中的多条路径) | -| 多面 (MultiPolygon)| 多个 Polygon 对象的集合,表示多个区域或区域。 | MULTIPOLYGON(((10 20, 30 40, 50 60, 10 20)), ((15 25, 25 35, 35 45, 15 25))) | MULTIPOLYGON(((-122.5 37.7, -122.4 37.8, -122.3 37.7, -122.5 37.7)))(城市中的多个区域) | -| 几何集合 (GeometryCollection) | 不同类型几何对象的集合,如点、线和多边形。 | GEOMETRYCOLLECTION(POINT(10 20), LINESTRING(10 20, 30 40), POLYGON((10 20, 30 40, 50 60, 10 20))) | GEOMETRYCOLLECTION(POINT(-122.4194 37.7749), LINESTRING(-122.5 37.7, -122.4 37.8)) | +| 点 | 零维几何对象,表示特定位置或坐标点。 | POINT(10 20) | POINT(-122.4194 37.7749)(旧金山坐标) | +| 线串 | 一维几何对象,由一系列连接的点组成,表示路径或线段。 | LINESTRING(10 20, 30 40, 50 60) | LINESTRING(-122.4194 37.7749, -73.9352 40.7306)(旧金山到纽约) | +| 多边形 | 二维几何对象,具有外环和可选的内环,表示区域。 | POLYGON((10 20, 30 40, 50 60, 10 20)) | POLYGON((-122.5 37.7, -122.4 37.8, -122.3 37.7, -122.5 37.7))(旧金山的一个区域) | +| 多点 | 多个零维几何对象的集合。 | MULTIPOINT((10 20), (30 40), (50 60)) | MULTIPOINT((-122.4194 37.7749), (-73.9352 40.7306))(旧金山和纽约的点) | +| 多线串 | 多个线串对象的集合。 | MULTILINESTRING((10 20, 30 40), (50 60, 70 80)) | MULTILINESTRING((-122.5 37.7, -122.4 37.8), (-122.3 37.7, -122.2 37.8))(城市中的多条路径) | +| 多多边形 | 多个多边形对象的集合,表示多个区域或区域。 | MULTIPOLYGON(((10 20, 30 40, 50 60, 10 20)), ((15 25, 25 35, 35 45, 15 25))) | MULTIPOLYGON(((-122.5 37.7, -122.4 37.8, -122.3 37.7, -122.5 37.7)))(城市中的多个区域) | +| 几何集合 | 不同类型几何对象的集合,如点、线和多边形。 | GEOMETRYCOLLECTION(POINT(10 20), LINESTRING(10 20, 30 40), POLYGON((10 20, 30 40, 50 60, 10 20))) | GEOMETRYCOLLECTION(POINT(-122.4194 37.7749), LINESTRING(-122.5 37.7, -122.4 37.8)) | ## 支持的输出格式 -Databend 支持多种地理空间输出格式——[WKT (Well-Known Text)](https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry)、EWKT (Extended Well-Known Text)、[WKB (Well-Known Binary)](https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry#Well-known_binary)、EWKB (Extended Well-Known Binary) 和 [GeoJSON](https://geojson.org/)。EWKT 和 EWKB 扩展了 WKT 和 WKB,通过包含 SRID(空间参考系统标识符)来指定坐标参考系统,例如 `SRID=4326;POINT(-44.3 60.1)`。 +Databend 支持多种地理空间输出格式——[WKT(Well-Known Text)](https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry)、EWKT(扩展 Well-Known Text)、[WKB(Well-Known Binary)](https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry#Well-known_binary)、EWKB(扩展 Well-Known Binary)和 [GeoJSON](https://geojson.org/)。EWKT 和 EWKB 通过包含 SRID(空间参考系统标识符)来扩展 WKT 和 WKB,以指定坐标参考系统,例如 `SRID=4326;POINT(-44.3 60.1)`。 -| 对象类型 | WKT 示例 | GeoJSON 示例 | +| 对象类型 | WKT 示例 | GeoJSON 示例 | |--------------------|-----------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------| -| 点 (Point) | `POINT(10 10)` | `{"coordinates":[10,10],"type":"Point"}` | -| 线 (LineString) | `LINESTRING(10 10, 20 30)` | `{"coordinates":[[10,10],[20,30]],"type":"LineString"}` | -| 多边形 (Polygon) | `POLYGON((10 10, 15 16, 22 10, 30 32))` | `{"coordinates":[[[10,10],[15,16],[22,10],[30,32],[10,10]]],"type":"Polygon"}` | -| 多点 (MultiPoint) | `MULTIPOINT((10 20), (30 40), (50 60))` | `{"coordinates":[[10,20],[30,40],[50,60]],"type":"MultiPoint"}` | -| 多线 (MultiLineString) | `MULTILINESTRING((10 20, 30 40), (50 60, 70 80))` | `{"coordinates":[[[10,20],[30,40]],[[50,60],[70,80]]],"type":"MultiLineString"}` | -| 多面 (MultiPolygon)| `MULTIPOLYGON(((10 20, 30 40, 50 60, 10 20)), ((15 25, 25 35, 35 45, 15 25)))` | `{"coordinates":[[[[10,20],[30,40],[50,60],[10,20]]],[[[15,25],[25,35],[35,45],[15,25]]]],"type":"MultiPolygon"}` | -| 几何集合 (GeometryCollection) | `GEOMETRYCOLLECTION(POINT(10 20), LINESTRING(10 20, 30 40), POLYGON((10 20, 30 40, 50 60, 10 20)))` | `{"coordinates":[[[10,20],[30,40],[50,60],[10,20]]],"type":"Polygon"}` | +| 点 | `POINT(10 10)` | `{"coordinates":[10,10],"type":"Point"}` | +| 线串 | `LINESTRING(10 10, 20 30)` | `{"coordinates":[[10,10],[20,30]],"type":"LineString"}` | +| 多边形 | `POLYGON((10 10, 15 16, 22 10, 30 32))` | `{"coordinates":[[[10,10],[15,16],[22,10],[30,32],[10,10]]],"type":"Polygon"}` | +| 多点 | `MULTIPOINT((10 20), (30 40), (50 60))` | `{"coordinates":[[10,20],[30,40],[50,60]],"type":"MultiPoint"}` | +| 多线串 | `MULTILINESTRING((10 20, 30 40), (50 60, 70 80))` | `{"coordinates":[[[10,20],[30,40]],[[50,60],[70,80]]],"type":"MultiLineString"}` | +| 多多边形 | `MULTIPOLYGON(((10 20, 30 40, 50 60, 10 20)), ((15 25, 25 35, 35 45, 15 25)))` | `{"coordinates":[[[[10,20],[30,40],[50,60],[10,20]]],[[[15,25],[25,35],[35,45],[15,25]]]],"type":"MultiPolygon"}` | +| 几何集合 | `GEOMETRYCOLLECTION(POINT(10 20), LINESTRING(10 20, 30 40), POLYGON((10 20, 30 40, 50 60, 10 20)))` | `{"coordinates":[[[10,20],[30,40],[50,60],[10,20]]],"type":"Polygon"}` | 要在 Databend 中切换地理空间输出格式,请使用 `SET geometry_output_format` 设置配置所需的格式。例如, @@ -104,7 +104,7 @@ SELECT id, st_asgeojson(geo) FROM test WHERE id=1; │ 1 │ {"coordinates":[66,12],"type":"Point"} │ └──────────────────────────────────────────────────────────┘ --- 获取 Point 的 X 和 Y 坐标 +-- 获取点的 X 和 Y 坐标 SELECT id, st_x(geo), st_y(geo) FROM test WHERE id=1; ┌─────────────────────────────────────────────────────────┐ │ id │ st_x(geo) │ st_y(geo) │ diff --git a/docs/cn/sql-reference/00-sql-reference/10-data-types/index.md b/docs/cn/sql-reference/00-sql-reference/10-data-types/index.md index c016eae18b..72f056bdf5 100644 --- a/docs/cn/sql-reference/00-sql-reference/10-data-types/index.md +++ b/docs/cn/sql-reference/00-sql-reference/10-data-types/index.md @@ -30,10 +30,10 @@ import FunctionDescription from '@site/src/components/FunctionDescription'; | 数据类型 | 别名 | 示例 | 描述 | | -------------------------------------- | ----- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------- | -| [ARRAY](array.md) | N/A | [1, 2, 3, 4] | 相同数据类型的值集合,通过索引访问。 | -| [TUPLE](tuple.md) | N/A | ('2023-02-14','情人节') | 不同数据类型的值的有序集合,通过索引访问。 | +| [ARRAY](array.md) | N/A | [1, 2, 3, 4] | 相同数据类型的值的集合,通过索引访问。 | +| [TUPLE](tuple.md) | N/A | ('2023-02-14','Valentine Day') | 不同数据类型的值的有序集合,通过索引访问。 | | [MAP](map.md) | N/A | `{"a":1, "b":2, "c":3}` | 一组键值对,其中每个键都是唯一的并映射到一个值。 | -| [VARIANT](variant.md) | JSON | `[1,{"a":1,"b":{"c":2}}]` | 不同数据类型的元素集合,包括 `ARRAY` 和 `OBJECT`。 | +| [VARIANT](variant.md) | JSON | `[1,{"a":1,"b":{"c":2}}]` | 不同数据类型的元素的集合,包括 `ARRAY` 和 `OBJECT`。 | | [BITMAP](bitmap.md) | N/A | 0101010101 | 用于表示一组值的二进制数据类型,其中每个位表示一个值的存在或不存在。 | ## 数据类型转换 @@ -93,13 +93,13 @@ Int --> Variant 6. `Array` --> `Array` 如果 `T` --> `U`。 7. `Nullable` --> `Nullable` 如果 `T`--> `U`。 8. `Null` --> `Nullable` 对于任何 `T` 数据类型。 -9. 数值类型可以隐式转换为其他数值类型,如果没有精度损失。 +9. 如果无损,数值可以隐式转换为其他数值数据类型。 ### 常见问题 > 为什么数值类型不能自动转换为字符串类型。 -这在其他流行的数据库中可能很常见,但它会引入歧义。 +这在其他流行的数据库中很常见,但它会引入歧义。 例如: @@ -131,13 +131,13 @@ select true > 0.5; 你可以将 SQL 改进为 `select concat('1', col)`。 -我们可能会在未来改进表达式,使其在可能的情况下将字面量 `1` 解析为字符串值(concat 函数只接受字符串参数)。 +我们可能会在未来改进表达式,以便在可能的情况下将字面量 `1` 解析为字符串值(concat 函数只接受字符串参数)。 ## NULL 值和 NOT NULL 约束 NULL 值用于表示不存在或未知的数据。在 Databend 中,每个列默认都可以包含 NULL 值,这意味着列可以同时容纳 NULL 值和常规数据。 -如果你需要一个不允许 NULL 值的列,请使用 NOT NULL 约束。如果在 Databend 中将列配置为不允许 NULL 值,并且在插入数据时没有显式提供该列的值,则会自动应用与该列数据类型关联的默认值。 +如果你需要一个不允许 NULL 值的列,请使用 NOT NULL 约束。如果在 Databend 中将列配置为不允许 NULL 值,并且在插入数据时没有显式提供该列的值,则将自动应用与该列数据类型关联的默认值。 | 数据类型 | 默认值 | | ------------------------- | ---------------------------------------------------------- | @@ -171,19 +171,19 @@ age |INT |YES |NULL | | - "age" 列与 "id" 列一样,也可以包含 NULL 值,因为它没有 "NOT NULL" 约束,允许空条目或 NULL 值来表示未知的年龄。 -以下 INSERT 语句为 "age" 列插入了一个 NULL 值。这是允许的,因为 "age" 列没有 NOT NULL 约束,因此它可以包含 NULL 值来表示缺失或未知的数据。 +以下 INSERT 语句插入一行,其中 "age" 列的值为 NULL。这是允许的,因为 "age" 列没有 NOT NULL 约束,因此它可以包含 NULL 值以表示缺失或未知的数据。 ```sql INSERT INTO test (id, name, age) VALUES (2, 'Alice', NULL); ``` -以下 INSERT 语句向 "test" 表插入了一行,为 "id" 和 "name" 列提供了值,但没有为 "age" 列提供值。这是允许的,因为 "age" 列没有 NOT NULL 约束,因此可以留空或分配 NULL 值来表示缺失或未知的数据。 +以下 INSERT 语句向 "test" 表插入一行,其中 "id" 和 "name" 列有值,但没有为 "age" 列提供值。这是允许的,因为 "age" 列没有 NOT NULL 约束,因此可以留空或分配 NULL 值以表示缺失或未知的数据。 ```sql INSERT INTO test (id, name) VALUES (1, 'John'); ``` -以下 INSERT 语句尝试插入一行,但没有为 "name" 列提供值。将应用该列类型的默认值。 +以下 INSERT 语句尝试插入一行,但没有为 "name" 列提供值。将应用列类型的默认值。 ```sql INSERT INTO test (id, age) VALUES (3, 45); diff --git a/docs/cn/sql-reference/00-sql-reference/10-data-types/interval.md b/docs/cn/sql-reference/00-sql-reference/10-data-types/interval.md index a851d16022..29d67d15b9 100644 --- a/docs/cn/sql-reference/00-sql-reference/10-data-types/interval.md +++ b/docs/cn/sql-reference/00-sql-reference/10-data-types/interval.md @@ -6,7 +6,7 @@ import FunctionDescription from '@site/src/components/FunctionDescription'; -INTERVAL 数据类型表示一段时间间隔,允许精确操作和存储跨不同单位的时间间隔。 +INTERVAL 数据类型表示时间间隔,允许精确操作和存储跨不同单位的时间间隔。 - 接受自然语言格式(例如,'1 year 2 months ago')或解释为微秒的数值。 @@ -18,10 +18,10 @@ INTERVAL 数据类型表示一段时间间隔,允许精确操作和存储跨 -- 插入不同类型的 INTERVAL 数据 INSERT INTO intervals VALUES - ('1 year 2 months ago'), -- 带有 'ago' 的自然语言格式(负间隔) - ('1 year 2 months'), -- 不带 'ago' 的自然语言格式(正间隔) - ('1000000'), -- 解释为微秒的正数值 - ('-1000000'); -- 解释为微秒的负数值 + ('1 year 2 months ago'), -- 自然语言格式,带有 'ago'(负间隔) + ('1 year 2 months'), -- 自然语言格式,不带 'ago'(正间隔) + ('1000000'), -- 正数值,解释为微秒 + ('-1000000'); -- 负数值,解释为微秒 -- 查询表以查看结果 SELECT * FROM intervals; @@ -36,7 +36,7 @@ INTERVAL 数据类型表示一段时间间隔,允许精确操作和存储跨 └──────────────────────────┘ ``` - - 当给定一个数值时,Databend 只识别该值的整数部分。例如,`TO_INTERVAL('1 seconds')` 和 `TO_INTERVAL('1.6 seconds')` 都表示 1 秒的间隔。小数点后的分数部分被忽略。 + - 当给定一个数值时,Databend 只识别该值的整数部分。例如,`TO_INTERVAL('1 seconds')` 和 `TO_INTERVAL('1.6 seconds')` 都表示 1 秒的间隔。小数点后的部分被忽略。 ```sql title='示例:' SELECT TO_INTERVAL('1 seconds'), TO_INTERVAL('1.6 seconds'); @@ -48,7 +48,7 @@ INTERVAL 数据类型表示一段时间间隔,允许精确操作和存储跨 └───────────────────────────────────────────────────────┘ ``` - 处理正负间隔,精度可达微秒。 -- 一个间隔可以与其他间隔相加或相减。 +- 一个间隔可以加上或减去另一个间隔。 ```sql title='示例:' SELECT TO_DAYS(3) + TO_DAYS(1), TO_DAYS(3) - TO_DAYS(1); @@ -59,7 +59,7 @@ INTERVAL 数据类型表示一段时间间隔,允许精确操作和存储跨 │ 4 days │ 2 days │ └───────────────────────────────────────────────────┘ ``` -- 间隔可以与 DATE 和 TIMESTAMP 值相加或相减。 +- 间隔可以加上或减去 DATE 和 TIMESTAMP 值。 ```sql title='示例:' SELECT DATE '2024-12-20' + TO_DAYS(2), DATE '2024-12-20' - TO_DAYS(2); diff --git a/docs/cn/sql-reference/00-sql-reference/10-data-types/map.md b/docs/cn/sql-reference/00-sql-reference/10-data-types/map.md index e8b1a0e5c4..232c365cc3 100644 --- a/docs/cn/sql-reference/00-sql-reference/10-data-types/map.md +++ b/docs/cn/sql-reference/00-sql-reference/10-data-types/map.md @@ -2,13 +2,13 @@ title: Map --- -MAP 数据结构用于存储一组 `Key:Value` 对,并使用 Array(Tuple(key, value)) 的嵌套数据结构来存储数据。它适用于数据类型固定但 `Key` 的值无法完全确定的情况。 +MAP 数据结构用于存储一组 `Key:Value` 对,并使用 Array(Tuple(key, value)) 的嵌套数据结构来存储数据。它适用于数据类型恒定但 `Key` 的值无法完全确定的情况。 ## 理解 Key:Value `Key` 是一个指定的基本数据类型,包括 Boolean、Number、Decimal、String、Date 或 Timestamp。`Key` 的值不能为 Null,且不允许重复。`Value` 可以是任何数据类型,包括嵌套的数组、元组等。 -Map 数据可以通过大括号括起来的 `Key:Value` 对生成,或者使用 Map 函数将两个数组转换为 Map。Map 函数接受两个数组作为输入,其中第一个数组的元素作为键,第二个数组的元素作为值。参见以下示例: +Map 数据可以通过花括号中的 `Key:Value` 对生成,或者使用 Map 函数将两个数组转换为 Map。Map 函数接受两个数组作为输入,其中第一个数组的元素作为键,第二个数组的元素作为值。参见以下示例: ```sql -- 输入数组:[1, 2] 和 ['v1', 'v2'] @@ -22,11 +22,11 @@ SELECT {'k1': 1, 'k2': 2}, map([1, 2], ['v1', 'v2']); +-----------------+---------------------------+ ``` -## Map 和 Bloom Filter 索引 +## Map 和布隆过滤器索引 在 Databend Map 中,为某些数据类型的值创建了布隆过滤器索引:`Numeric`、`String`、`Timestamp` 和 `Date`。 -这使得在 MAP 数据结构中搜索值更加容易和快速。 +这使得在 MAP 数据结构中搜索值变得更加容易和快速。 Databend Map 中布隆过滤器索引的实现见 [PR#10457](https://github.com/databendlabs/databend/pull/10457)。 @@ -67,7 +67,7 @@ WHERE log['ip'] = '205.91.162.141'; ## 示例 -**创建一个包含 Map 列的表用于存储网络流量数据** +**创建一个带有 Map 列的表用于存储网络流量数据** ```sql CREATE TABLE web_traffic_data( diff --git a/docs/cn/sql-reference/00-sql-reference/10-data-types/string.md b/docs/cn/sql-reference/00-sql-reference/10-data-types/string.md index 28bf5a70e7..8bf32d48e9 100644 --- a/docs/cn/sql-reference/00-sql-reference/10-data-types/string.md +++ b/docs/cn/sql-reference/00-sql-reference/10-data-types/string.md @@ -8,8 +8,8 @@ description: 基本的字符串数据类型。 在 Databend 中,字符串可以存储在 `VARCHAR` 字段中,存储大小是可变的。 | 名称 | 别名 | 存储大小 | -|---------|--------|----------| -| VARCHAR | STRING | 可变 | +|---------|---------|--------------| +| VARCHAR | STRING | 可变 | ## 函数 @@ -27,9 +27,9 @@ DESC string_table; 结果: ``` ┌──────────────────────────────────────────────┐ -│ 字段 │ 类型 │ 可为空 │ 默认值 │ 额外 │ -├────────┼─────────┼─────────┼──────────┼────────┤ -│ text │ VARCHAR │ 是 │ NULL │ │ +│ 字段 │ 类型 │ 可为空 │ 默认值 │ 额外 │ +├────────┼─────────┼────────┼─────────┼────────┤ +│ text │ VARCHAR │ 是 │ NULL │ │ └──────────────────────────────────────────────┘ ``` diff --git a/docs/cn/sql-reference/00-sql-reference/10-data-types/tuple.md b/docs/cn/sql-reference/00-sql-reference/10-data-types/tuple.md index c29d309c0b..dc56ad30ef 100644 --- a/docs/cn/sql-reference/00-sql-reference/10-data-types/tuple.md +++ b/docs/cn/sql-reference/00-sql-reference/10-data-types/tuple.md @@ -7,22 +7,22 @@ description: 元组是一个有序、不可变的类型集合。 | 名称 | 别名 | 值 | 描述 | |-------|---------|-------------------------------------------|-----------------------------------------------------------------------------------------------------------| -| TUPLE | | ('2023-02-14 08:00:00','情人节') | 有序、不可变的集合,使用前需要声明每个元素的类型。 | +| TUPLE | | ('2023-02-14 08:00:00','情人节') | 有序、不可变的集合,要求在使用前声明每个元素的类型。 | 元组是一个有序、不可变且异构的元素集合,在大多数编程语言中用括号 () 表示。换句话说,元组是一个有限的有序列表,包含不同数据类型的元素,一旦创建,其元素不能被更改或修改。 元组通常用于存储相关数据,例如二维空间中点的坐标 (x, y),或名称及其对应的地址,或日期及其对应的事件等。 -> 但除非确实需要,否则不建议使用它。 +> 但除非你真的需要它,否则不建议使用它。 ## 示例 -创建表: +创建一个表: ```sql CREATE TABLE t_table(event tuple(datetime, varchar)); ``` -向表中插入不同类型的数据: +向表中插入一个不同类型的值: ```sql insert into t_table values(('2023-02-14 8:00:00','情人节')); ``` @@ -50,5 +50,5 @@ select event.1 from t_table; +----------------------------+ | 2023-02-14 08:00:00.000000 | +----------------------------+ -1 row in set (0.03 sec) +1 行记录 (0.03 秒) ``` \ No newline at end of file diff --git a/docs/cn/sql-reference/00-sql-reference/10-data-types/variant.md b/docs/cn/sql-reference/00-sql-reference/10-data-types/variant.md index 76a9ef84ef..3620cbc781 100644 --- a/docs/cn/sql-reference/00-sql-reference/10-data-types/variant.md +++ b/docs/cn/sql-reference/00-sql-reference/10-data-types/variant.md @@ -2,7 +2,7 @@ title: Variant --- -VARIANT 类型可以存储任何其他类型的值,包括 NULL、BOOLEAN、NUMBER、STRING、ARRAY 和 OBJECT,其内部值可以是任意层级的嵌套结构,非常灵活地存储各种数据。VARIANT 也可以称为 JSON,更多信息请参考 [JSON 网站](https://www.json.org/json-en.html)。 +VARIANT 类型可以存储任何其他类型的值,包括 NULL、BOOLEAN、NUMBER、STRING、ARRAY 和 OBJECT,其内部值可以是任意层级的嵌套结构,非常灵活,适用于存储各种数据。VARIANT 也可以称为 JSON,更多信息请参考 [JSON 网站](https://www.json.org/json-en.html)。 以下是在 Databend 中插入和查询 Variant 数据的示例: @@ -56,7 +56,7 @@ VARIANT 类型包含一个数组,该数组是一个从零开始的数组,类 创建表: ```sql --- 创建一个表来存储用户的爱好 +-- 创建一个表来存储用户的兴趣爱好 CREATE TABLE user_hobbies(user_id INT64, hobbies VARIANT NULL); ``` @@ -68,7 +68,7 @@ VALUES (2, '["Photography", "Travel", "Swimming"]'); ``` -检索每个用户的第一个爱好: +检索每个用户的第一个兴趣爱好: ```sql SELECT user_id, @@ -86,7 +86,7 @@ FROM └─────────────────────────────────────┘ ``` -检索每个用户的第三个爱好: +检索每个用户的第三个兴趣爱好: ```sql SELECT hobbies [2], @@ -107,7 +107,7 @@ GROUP BY └─────────────────────────────────┘ ``` -通过分组检索爱好: +按组检索兴趣爱好: ```sql SELECT hobbies [2], @@ -129,7 +129,7 @@ GROUP BY ### 通过字段名访问 -VARIANT 类型包含表示为对象的键值对,其中每个键是 VARCHAR,每个值是 VARIANT。它的功能类似于其他编程语言中的“字典”、“哈希”或“映射”。可以使用**方括号**或**冒号**以及**点号**(仅适用于第二层及更深层次,点号不能用作第一层名称表示法,以避免与表和列之间的点号表示法混淆)通过字段名访问值。 +VARIANT 类型包含表示为对象的键值对,其中每个键是一个 VARCHAR,每个值是一个 VARIANT。它的功能类似于其他编程语言中的“字典”、“哈希”或“映射”。可以通过字段名使用**方括号**或**冒号**访问值,以及使用**点号**访问第二层及更深层级的字段(点号不能用作第一层字段名的表示法,以避免与表和列之间的点号表示法混淆)。 #### 示例 diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/information-schema-tables.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/information-schema-tables.md index b9d6c61c9d..0d56953d2b 100644 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/information-schema-tables.md +++ b/docs/cn/sql-reference/00-sql-reference/20-system-tables/information-schema-tables.md @@ -2,9 +2,9 @@ title: information_schema.tables --- -`information_schema.tables` 系统表是一个视图,提供了所有数据库中所有表的元数据,包括它们的模式、类型、引擎和创建细节。它还包括存储指标,如数据长度、索引长度和行数,提供了对表结构和使用的洞察。 +`information_schema.tables` 系统表是一个视图,提供了所有数据库中所有表的元数据,包括它们的模式、类型、引擎和创建细节。它还包含存储指标,如数据长度、索引长度和行数,提供了对表结构和使用的洞察。 -另请参阅: [system.tables](system-tables.md) +另请参阅:[system.tables](system-tables.md) ```sql title='示例:' SELECT * FROM information_schema.tables LIMIT 3; @@ -18,7 +18,7 @@ SELECT * FROM information_schema.tables LIMIT 3; └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ ``` -要显示 `information_schema.tables` 的模式,请使用 `DESCRIBE information_schema.tables`: +要显示 `information_schema.tables` 的模式,请使用 `DESCRIBE information_schema.tables`: ```sql DESCRIBE information_schema.tables; diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-build-options.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-build-options.md index e90b9af71e..c040727f8c 100644 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-build-options.md +++ b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-build-options.md @@ -5,7 +5,7 @@ title: system.build_options 该系统表描述了当前 Databend 版本的构建选项。 - `cargo_features`: 已启用的包特性,这些特性列在 `Cargo.toml` 的 `[features]` 部分。 -- `target_features`: 为当前编译目标启用的平台特性。参考:[条件编译 - `target_feature`](https://doc.rust-lang.org/reference/conditional-compilation.html#target_feature)。 +- `target_features`: 已为当前编译目标启用的平台特性。参考:[条件编译 - `target_feature`](https://doc.rust-lang.org/reference/conditional-compilation.html#target_feature)。 ```sql SELECT * FROM system.build_options; diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-caches.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-caches.md index 398696aa20..d0a081b2b4 100644 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-caches.md +++ b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-caches.md @@ -2,7 +2,7 @@ title: system.caches --- -Databend 中管理的各种缓存的概述。 +Databend 中管理的各种缓存的概览。 下表显示了缓存名称、缓存中的项目数量以及缓存的大小: ```sql diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-clusters.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-clusters.md index 59759d3ecb..b5bd2c7ea0 100644 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-clusters.md +++ b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-clusters.md @@ -5,7 +5,7 @@ title: system.clusters 包含有关集群节点的信息。 :::note -您可以使用配置选项 `disable_system_table_load` 禁用对 `clusters` 表的访问。 +您可以使用配置选项 `disable_system_table_load` 来禁用对 `clusters` 表的访问。 例如,DatabendCloud 的用户将无法看到此表。 ::: diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-columns.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-columns.md index ec8edb80e7..bb6e562091 100644 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-columns.md +++ b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-columns.md @@ -2,41 +2,41 @@ title: system.columns --- -包含表的列信息。 +包含有关表列的信息。 ```sql DESC system.columns; +--------------------+---------+------+---------+-------+ -| Field | Type | Null | Default | Extra | +| 字段 | 类型 | 空值 | 默认值 | 额外 | +--------------------+---------+------+---------+-------+ -| name | VARCHAR | NO | | | -| database | VARCHAR | NO | | | -| table | VARCHAR | NO | | | -| type | VARCHAR | NO | | | -| default_kind | VARCHAR | NO | | | -| default_expression | VARCHAR | NO | | | -| is_nullable | BOOLEAN | NO | false | | -| comment | VARCHAR | NO | | | +| name | VARCHAR | 否 | | | +| database | VARCHAR | 否 | | | +| table | VARCHAR | 否 | | | +| type | VARCHAR | 否 | | | +| default_kind | VARCHAR | 否 | | | +| default_expression | VARCHAR | 否 | | | +| is_nullable | BOOLEAN | 否 | false | | +| comment | VARCHAR | 否 | | | ``` ```sql +--------------------------+----------+---------------------+------------------+-------------------+--------------+--------------------+-------------+---------+ -| name | database | table | column_type | data_type | default_kind | default_expression | is_nullable | comment | +| 名称 | 数据库 | 表 | 列类型 | 数据类型 | 默认类型 | 默认表达式 | 可为空 | 注释 | +--------------------------+----------+---------------------+------------------+-------------------+--------------+--------------------+-------------+---------+ -| id | system | processes | String | VARCHAR | | | NO | | -| type | system | processes | String | VARCHAR | | | NO | | -| host | system | processes | Nullable(String) | VARCHAR | | | YES | | -| user | system | processes | String | VARCHAR | | | NO | | -| command | system | processes | String | VARCHAR | | | NO | | -| database | system | processes | String | VARCHAR | | | NO | | -| extra_info | system | processes | String | VARCHAR | | | NO | | -| memory_usage | system | processes | Int64 | BIGINT | | | NO | | -| data_read_bytes | system | processes | UInt64 | BIGINT UNSIGNED | | | NO | | -| data_write_bytes | system | processes | UInt64 | BIGINT UNSIGNED | | | NO | | -| scan_progress_read_rows | system | processes | UInt64 | BIGINT UNSIGNED | | | NO | | -| scan_progress_read_bytes | system | processes | UInt64 | BIGINT UNSIGNED | | | NO | | -| mysql_connection_id | system | processes | Nullable(UInt32) | INT UNSIGNED | | | YES | | +| id | system | processes | String | VARCHAR | | | 否 | | +| type | system | processes | String | VARCHAR | | | 否 | | +| host | system | processes | Nullable(String) | VARCHAR | | | 是 | | +| user | system | processes | String | VARCHAR | | | 否 | | +| command | system | processes | String | VARCHAR | | | 否 | | +| database | system | processes | String | VARCHAR | | | 否 | | +| extra_info | system | processes | String | VARCHAR | | | 否 | | +| memory_usage | system | processes | Int64 | BIGINT | | | 否 | | +| data_read_bytes | system | processes | UInt64 | BIGINT UNSIGNED | | | 否 | | +| data_write_bytes | system | processes | UInt64 | BIGINT UNSIGNED | | | 否 | | +| scan_progress_read_rows | system | processes | UInt64 | BIGINT UNSIGNED | | | 否 | | +| scan_progress_read_bytes | system | processes | UInt64 | BIGINT UNSIGNED | | | 否 | | +| mysql_connection_id | system | processes | Nullable(UInt32) | INT UNSIGNED | | | 是 | | .... ``` \ No newline at end of file diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-configs.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-configs.md index 5708c6ea3c..0a92d8399a 100644 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-configs.md +++ b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-configs.md @@ -5,15 +5,15 @@ title: system.configs 包含有关 Databend 服务器配置的信息。 :::note -您可以使用配置选项 `disable_system_table_load` 禁用对 `configs` 表的访问。 +您可以使用配置选项 `disable_system_table_load` 来禁用对 `configs` 表的访问。 -例如,DatabendCloud 的用户将无法查看此表。 +例如,DatabendCloud 的用户将无法看到此表。 ::: ```sql mysql> SELECT * FROM system.configs; +---------+----------------------------------------+--------------------------------+-------------+ -| group | name | value | description | +| 分组 | 名称 | 值 | 描述 | +---------+----------------------------------------+--------------------------------+-------------+ | query | tenant_id | admin | | | query | cluster_id | | | diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-contributors.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-contributors.md index d252fe1e11..f2f4f4fe56 100644 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-contributors.md +++ b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-contributors.md @@ -2,7 +2,7 @@ title: system.contributors --- -包含贡献者信息。 +包含有关贡献者的信息。 ```sql SELECT * FROM system.contributors LIMIT 20; diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-credits.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-credits.md index 2f35ec646e..cfe3027159 100644 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-credits.md +++ b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-credits.md @@ -2,7 +2,7 @@ title: system.credits --- -包含信用信息。 +包含有关credits的信息。 ```sql SELECT * FROM system.credits LIMIT 20; diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-databases-with-history.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-databases-with-history.md index 67997dc31f..c1583c6525 100644 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-databases-with-history.md +++ b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-databases-with-history.md @@ -4,11 +4,11 @@ title: system.databases_with_history import FunctionDescription from '@site/src/components/FunctionDescription'; - + -记录所有数据库,包括活跃的和已删除的数据库。显示每个数据库的目录、名称、唯一ID、所有者(如果指定)以及删除时间戳(如果仍活跃则为NULL)。 +记录所有数据库,包括活跃的和已删除的。它显示每个数据库的目录、名称、唯一ID、所有者(如果指定)以及删除时间戳(如果仍然活跃则为NULL)。 -另请参阅: [SHOW DROP DATABASES](../../10-sql-commands/00-ddl/00-database/show-drop-databases.md) +另请参阅:[SHOW DROP DATABASES](../../10-sql-commands/00-ddl/00-database/show-drop-databases.md) ```sql SELECT * FROM system.databases_with_history; diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-databases.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-databases.md index fe8d9be6b2..511f5a6270 100644 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-databases.md +++ b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-databases.md @@ -2,9 +2,9 @@ title: system.databases --- -提供系统中所有数据库的元数据,包括它们的目录、名称、唯一ID、所有者和删除时间戳。 +提供系统中所有数据库的元数据,包括它们的目录、名称、唯一ID、所有者以及删除时间戳。 -另请参阅: [SHOW DATABASES](../../10-sql-commands/00-ddl/00-database/show-databases.md) +另请参阅:[SHOW DATABASES](../../10-sql-commands/00-ddl/00-database/show-databases.md) ```sql title='示例:' SELECT * FROM system.databases; @@ -19,18 +19,18 @@ SELECT * FROM system.databases; └─────────────────────────────────────────────────────────────────────────────────────────────┘ ``` -要显示 `system.databases` 的架构,请使用 `DESCRIBE system.databases`: +要显示 `system.databases` 的表结构,请使用 `DESCRIBE system.databases`: ```sql DESCRIBE system.databases; ┌───────────────────────────────────────────────────────────┐ -│ Field │ Type │ Null │ Default │ Extra │ +│ 字段 │ 类型 │ 可为空 │ 默认值 │ 额外 │ ├─────────────┼─────────────────┼────────┼─────────┼────────┤ -│ catalog │ VARCHAR │ NO │ '' │ │ -│ name │ VARCHAR │ NO │ '' │ │ -│ database_id │ BIGINT UNSIGNED │ NO │ 0 │ │ -│ owner │ VARCHAR │ YES │ NULL │ │ -│ dropped_on │ TIMESTAMP │ YES │ NULL │ │ +│ catalog │ VARCHAR │ 否 │ '' │ │ +│ name │ VARCHAR │ 否 │ '' │ │ +│ database_id │ BIGINT UNSIGNED │ 否 │ 0 │ │ +│ owner │ VARCHAR │ 是 │ NULL │ │ +│ dropped_on │ TIMESTAMP │ 是 │ NULL │ │ └───────────────────────────────────────────────────────────┘ ``` \ No newline at end of file diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-functions.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-functions.md index 7ab5fb0257..6ce1bc0ff9 100644 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-functions.md +++ b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-functions.md @@ -4,11 +4,11 @@ title: system.functions import FunctionDescription from '@site/src/components/FunctionDescription'; - + -包含有关支持的内置标量和聚合函数的信息。 +包含有关支持的标量和聚合函数的信息。 -另请参阅: [SHOW FUNCTIONS](/sql/sql-commands/administration-cmds/show-functions). +另请参阅:[SHOW FUNCTIONS](/sql/sql-commands/administration-cmds/show-functions)。 ## 示例 diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-indexes.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-indexes.md index 04098d570b..20215ce4bc 100644 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-indexes.md +++ b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-indexes.md @@ -4,11 +4,11 @@ title: system.indexes import FunctionDescription from '@site/src/components/FunctionDescription'; - + 包含有关已创建的聚合索引的信息。 -另请参阅: [SHOW INDEXES](../../10-sql-commands/00-ddl/07-aggregating-index/show-indexes.md) +另请参阅:[SHOW INDEXES](../../10-sql-commands/00-ddl/07-aggregating-index/show-indexes.md) ```sql CREATE TABLE t1(a int,b int); diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-locks.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-locks.md index 26f67af190..219b36475d 100644 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-locks.md +++ b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-locks.md @@ -4,11 +4,11 @@ title: system.locks import FunctionDescription from '@site/src/components/FunctionDescription'; - + -包含系统中锁的信息。 +包含系统中锁的相关信息。 -另请参阅: [SHOW LOCKS](../../10-sql-commands/00-ddl/14-transaction/show-locks.md) +另请参阅:[SHOW LOCKS](../../10-sql-commands/00-ddl/14-transaction/show-locks.md) ```sql SELECT * FROM system.locks; diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-metrics.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-metrics.md index 5690d7de79..413bb12b2b 100644 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-metrics.md +++ b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-metrics.md @@ -2,7 +2,7 @@ title: system.metrics --- -包含关于指标事件的信息。 +包含有关指标事件的信息。 ```sql SELECT * FROM system.metrics; diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-numbers.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-numbers.md index 747732209c..ac4a67112a 100644 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-numbers.md +++ b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-numbers.md @@ -2,11 +2,11 @@ title: system.numbers --- -该表包含一个名为 number 的 UInt64 列,其中包含从零开始的几乎所有自然数。 +该表包含一个名为 `number` 的 UInt64 列,其中包含从零开始的几乎所有自然数。 -您可以使用此表进行测试,或者如果您需要进行暴力搜索。 +您可以将此表用于测试,或者在需要进行暴力搜索时使用。 -从此表进行的读取操作也是并行化的。 +从该表中读取数据也是并行化的。 用于测试。 diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-query-log.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-query-log.md index b022e850bf..98872f57d9 100644 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-query-log.md +++ b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-query-log.md @@ -2,7 +2,8 @@ title: system.query_log --- -一个只读的内存表,存储所有查询日志。 +一个只读的内存表,用于存储所有查询日志。 + ## 示例 diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-settings.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-settings.md index 62f8c3c5d8..367652fc2b 100644 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-settings.md +++ b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-settings.md @@ -3,7 +3,7 @@ title: system.settings --- import FunctionDescription from '@site/src/components/FunctionDescription'; - + 存储当前会话的系统设置。 @@ -11,72 +11,71 @@ import FunctionDescription from '@site/src/components/FunctionDescription'; SELECT * FROM system.settings; ``` -| 名称 | 值 | 默认值 | 级别 | 描述 | 类型 | -|--------------------------------------------|------------|-------------|--------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------| -| collation | binary | binary | SESSION| 设置字符排序规则。可用值包括 "binary" 和 "utf8"。 | String | -| ddl_column_type_nullable | 1 | 1 | SESSION| 创建或修改表时,列是否默认可空。 | UInt64 | -| efficiently_memory_group_by | 0 | 0 | SESSION| 内存使用更高效,但这可能会导致性能下降。 | UInt64 | -| enable_aggregating_index_scan | 1 | 1 | SESSION| 在查询时启用聚合索引数据扫描。 | UInt64 | -| enable_bushy_join | 0 | 0 | SESSION| 启用优化器生成bushy join计划。 | UInt64 | -| enable_cbo | 1 | 1 | SESSION| 启用基于成本的优化。 | UInt64 | -| enable_distributed_compact | 0 | 0 | SESSION| 启用表压缩的分布式执行。 | UInt64 | -| enable_distributed_copy_into | 0 | 0 | SESSION| 启用copy into的分布式执行。 | UInt64 | -| enable_distributed_merge_into | 0 | 0 | SESSION| 启用分布式merge into。 | UInt64 | -| enable_distributed_recluster | 0 | 0 | SESSION| 启用表重新聚类的分布式执行。 | UInt64 | -| enable_distributed_replace_into | 0 | 0 | SESSION| 启用replace into的分布式执行。 | UInt64 | -| enable_dphyp | 1 | 1 | SESSION| 启用dphyp join顺序算法。 | UInt64 | -| enable_experimental_merge_into | 0 | 0 | SESSION| 启用实验性merge into。 | UInt64 | -| enable_hive_parquet_predict_pushdown | 1 | 1 | SESSION| 通过将此变量设置为1来启用hive parquet预测下推,默认值:1 | UInt64 | -| enable_parquet_page_index | 1 | 1 | SESSION| 启用parquet页索引 | UInt64 | -| enable_parquet_prewhere | 0 | 0 | SESSION| 启用parquet prewhere | UInt64 | -| enable_parquet_rowgroup_pruning | 1 | 1 | SESSION| 启用parquet行组剪枝 | UInt64 | -| enable_query_profiling | 0 | 0 | SESSION| 启用记录查询性能 | UInt64 | -| enable_query_result_cache | 0 | 0 | SESSION| 启用缓存查询结果以提高相同查询的性能。 | UInt64 | -| enable_recluster_after_write | 1 | 1 | SESSION| 在写入(copy/replace-into)后启用重新聚类。 | UInt64 | -| enable_refresh_aggregating_index_after_write| 0 | 0 | SESSION| 在新数据写入后刷新聚合索引 | UInt64 | -| enable_replace_into_bloom_pruning | 1 | 1 | SESSION| 为replace-into语句启用bloom剪枝。 | UInt64 | -| enable_replace_into_partitioning | 1 | 1 | SESSION| 为replace-into语句启用分区(如果表有聚类键)。 | UInt64 | -| enable_runtime_filter | 0 | 0 | SESSION| 为JOIN启用运行时过滤器优化。 | UInt64 | -| enable_table_lock | 1 | 1 | SESSION| 在必要时启用表锁(默认启用)。 | UInt64 | -| flight_client_timeout | 60 | 60 | SESSION| 设置flight客户端请求可以处理的最大时间(以秒为单位)。 | UInt64 | -| group_by_shuffle_mode | before_merge| before_merge| SESSION| Group by shuffle模式,'before_partial'更平衡,但需要更多数据交换。 | String | -| group_by_two_level_threshold | 20000 | 20000 | SESSION| 设置GROUP BY操作中触发两级聚合的键数。 | UInt64 | -| hide_options_in_show_create_table | 1 | 1 | SESSION| 在SHOW TABLE CREATE结果的末尾隐藏表相关信息,如SNAPSHOT_LOCATION和STORAGE_FORMAT。 | UInt64 | -| hive_parquet_chunk_size | 16384 | 16384 | SESSION| 从parquet读取到databend处理器时,每次读取的最大行数 | UInt64 | -| input_read_buffer_size | 4194304 | 4194304 | SESSION| 设置缓冲读取器从存储读取数据时分配的内存大小(以字节为单位)。 | UInt64 | -| join_spilling_threshold | 0 | 0 | SESSION| hash join可以使用的最大内存量,0表示无限制。 | UInt64 | -| lazy_read_threshold | 1000 | 1000 | SESSION| 设置查询中启用懒读优化的最大LIMIT。设置为0将禁用优化。 | UInt64 | -| load_file_metadata_expire_hours | 12 | 12 | SESSION| 设置使用COPY INTO加载数据时文件元数据的过期小时数。 | UInt64 | -| max_block_size | 65536 | 65536 | SESSION| 设置可以读取的单个数据块的最大字节大小。 | UInt64 | -| max_execute_time_in_seconds | 0 | 0 | SESSION| 设置查询执行的最大时间(以秒为单位)。设置为0表示无限制。 | UInt64 | -| max_inlist_to_or | 3 | 3 | SESSION| 设置IN表达式中可以包含的最大值数,以转换为OR运算符。 | UInt64 | -| max_memory_usage | 6871947673 | 6871947673 | SESSION| 设置处理单个查询的最大内存使用量(以字节为单位)。 | UInt64 | -| max_result_rows | 0 | 0 | SESSION| 设置未指定行数时查询结果可以返回的最大行数。设置为0表示无限制。 | UInt64 | -| max_storage_io_requests | 48 | 48 | SESSION| 设置最大并发I/O请求数。 | UInt64 | -| max_threads | 8 | 8 | SESSION| 设置执行请求的最大线程数。 | UInt64 | -| numeric_cast_option | rounding | rounding | SESSION| 将数值转换模式设置为"rounding"或"truncating"。 | String | -| parquet_fast_read_bytes | 0 | 0 | SESSION| 较小的parquet文件将作为整个文件读取,而不是逐列读取。 | UInt64 | -| parquet_uncompressed_buffer_size | 2097152 | 2097152 | SESSION| 设置读取Parquet文件时使用的缓冲区字节大小。 | UInt64 | -| prefer_broadcast_join | 1 | 1 | SESSION| 启用广播join。 | UInt64 | -| query_result_cache_allow_inconsistent | 0 | 0 | SESSION| 确定Databend是否将返回与底层数据不一致的缓存查询结果。 | UInt64 | -| query_result_cache_max_bytes | 1048576 | 1048576 | SESSION| 设置单个查询结果缓存的最大字节大小。 | UInt64 | -| query_result_cache_ttl_secs | 300 | 300 | SESSION| 设置缓存查询结果的生存时间(TTL)(以秒为单位)。一旦缓存结果的TTL过期,结果将被视为陈旧,不会用于新查询。 | UInt64 | -| quoted_ident_case_sensitive | 1 | 1 | SESSION| 确定Databend是否将带引号的标识符视为区分大小写。 | UInt64 | -| recluster_block_size | 2405181685 | 2405181685 | SESSION| 设置重新聚类的块的最大字节大小 | UInt64 | -| recluster_timeout_secs | 43200 | 43200 | SESSION| 设置重新聚类最终的超时秒数。 | UInt64 | -| replace_into_bloom_pruning_max_column_number| 4 | 4 | SESSION| replace-into语句中bloom剪枝使用的最大列数。 | UInt64 | -| replace_into_shuffle_strategy | 0 | 0 | SESSION| 0表示块级shuffle,1表示段级shuffle | UInt64 | -| retention_period | 12 | 12 | SESSION| 设置保留期(以小时为单位)。 | UInt64 | -| sandbox_tenant | | | SESSION| 在此会话中注入自定义'sandbox_tenant'。这仅用于测试目的,并且仅在'internal_enable_sandbox_tenant'开启时生效。 | String | -| spilling_bytes_threshold_per_proc | 0 | 0 | SESSION| 设置聚合器在查询执行期间溢出数据到存储之前可以使用的最大内存量(以字节为单位)。 | UInt64 | -| spilling_memory_ratio | 0 | 0 | SESSION| 设置聚合器在查询执行期间溢出数据到存储之前可以使用的最大内存比率(以字节为单位)。 | UInt64 | -| sql_dialect | PostgreSQL | PostgreSQL | SESSION| 设置SQL方言。可用值包括"PostgreSQL"、"MySQL"和"Hive"。 | String | -| storage_fetch_part_num | 2 | 2 | SESSION| 设置查询执行期间从存储并行获取的分区数。 | UInt64 | -| storage_io_max_page_bytes_for_read | 524288 | 524288 | SESSION| 设置从存储读取数据页的最大字节大小(单次I/O操作)。 | UInt64 | -| storage_io_min_bytes_for_seek | 48 | 48 | SESSION| 设置在数据文件中寻找新位置时必须从存储读取的最小字节大小(单次I/O操作)。 | UInt64 | -| storage_read_buffer_size | 1048576 | 1048576 | SESSION| 设置读取数据到内存时使用的缓冲区字节大小。 | UInt64 | -| table_lock_expire_secs | 5 | 5 | SESSION| 设置表锁的过期秒数。 | UInt64 | -| timezone | Japan | UTC | GLOBAL | 设置时区。 | String | -| unquoted_ident_case_sensitive | 0 | 0 | SESSION| 确定Databend是否将不带引号的标识符视为区分大小写。 | UInt64 | -| use_parquet2 | 1 | 1 | SESSION| 在infer_schema()时使用parquet2而不是parquet_rs。 | UInt64 | -``` \ No newline at end of file +| 名称 | 值 | 默认值 | 级别 | 描述 | 类型 | +|--------------------------------------------|------------|------------|-------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------| +| collation | binary | binary | SESSION | 设置字符排序规则。可用值包括 "binary" 和 "utf8"。 | String | +| ddl_column_type_nullable | 1 | 1 | SESSION | 创建或修改表时,列是否默认为可空 | UInt64 | +| efficiently_memory_group_by | 0 | 0 | SESSION | 高效使用内存,但可能会导致性能下降。 | UInt64 | +| enable_aggregating_index_scan | 1 | 1 | SESSION | 启用查询时扫描聚合索引数据。 | UInt64 | +| enable_bushy_join | 0 | 0 | SESSION | 启用生成带有优化器的宽连接计划。 | UInt64 | +| enable_cbo | 1 | 1 | SESSION | 启用基于成本的优化。 | UInt64 | +| enable_distributed_compact | 0 | 0 | SESSION | 启用表的分布式压缩执行。 | UInt64 | +| enable_distributed_copy_into | 0 | 0 | SESSION | 启用分布式执行 copy into。 | UInt64 | +| enable_distributed_merge_into | 0 | 0 | SESSION | 启用分布式 merge into。 | UInt64 | +| enable_distributed_recluster | 0 | 0 | SESSION | 启用表的分布式重新聚类执行。 | UInt64 | +| enable_distributed_replace_into | 0 | 0 | SESSION | 启用分布式执行 replace into。 | UInt64 | +| enable_dphyp | 1 | 1 | SESSION | 启用 dphyp 连接顺序算法。 | UInt64 | +| enable_experimental_merge_into | 0 | 0 | SESSION | 启用实验性 merge into。 | UInt64 | +| enable_hive_parquet_predict_pushdown | 1 | 1 | SESSION | 启用 hive parquet 预测下推,默认值为 1。 | UInt64 | +| enable_parquet_page_index | 1 | 1 | SESSION | 启用 parquet 页面索引。 | UInt64 | +| enable_parquet_prewhere | 0 | 0 | SESSION | 启用 parquet prewhere。 | UInt64 | +| enable_parquet_rowgroup_pruning | 1 | 1 | SESSION | 启用 parquet 行组剪枝。 | UInt64 | +| enable_query_profiling | 0 | 0 | SESSION | 启用记录查询性能分析。 | UInt64 | +| enable_query_result_cache | 0 | 0 | SESSION | 启用缓存查询结果以提高相同查询的性能。 | UInt64 | +| enable_recluster_after_write | 1 | 1 | SESSION | 启用写入后重新聚类(copy/replace-into)。 | UInt64 | +| enable_refresh_aggregating_index_after_write| 0 | 0 | SESSION | 写入新数据后刷新聚合索引。 | UInt64 | +| enable_replace_into_bloom_pruning | 1 | 1 | SESSION | 启用 replace-into 语句的布隆过滤器剪枝。 | UInt64 | +| enable_replace_into_partitioning | 1 | 1 | SESSION | 启用 replace-into 语句的分区(如果表有聚类键)。 | UInt64 | +| enable_runtime_filter | 0 | 0 | SESSION | 启用 JOIN 的运行时过滤器优化。 | UInt64 | +| enable_table_lock | 1 | 1 | SESSION | 启用表锁(默认启用)。 | UInt64 | +| flight_client_timeout | 60 | 60 | SESSION | 设置 flight 客户端请求处理的最大时间(秒)。 | UInt64 | +| group_by_shuffle_mode | before_merge| before_merge| SESSION | 分组洗牌模式,'before_partial' 更平衡,但需要交换更多数据。 | String | +| group_by_two_level_threshold | 20000 | 20000 | SESSION | 设置触发两级聚合的 GROUP BY 操作中的键数。 | UInt64 | +| hide_options_in_show_create_table | 1 | 1 | SESSION | 隐藏表相关信息,如 SNAPSHOT_LOCATION 和 STORAGE_FORMAT,在 SHOW TABLE CREATE 结果的末尾。 | UInt64 | +| hive_parquet_chunk_size | 16384 | 16384 | SESSION | 每次从 parquet 读取到 Databend 处理器的最大行数。 | UInt64 | +| input_read_buffer_size | 4194304 | 4194304 | SESSION | 设置用于从存储读取数据的缓冲读取器的内存大小(字节)。 | UInt64 | +| join_spilling_threshold | 0 | 0 | SESSION | 哈希连接可以使用的最大内存量,0 表示无限制。 | UInt64 | +| lazy_read_threshold | 1000 | 1000 | SESSION | 设置查询中启用延迟读取优化的最大 LIMIT。设置为 0 禁用优化。 | UInt64 | +| load_file_metadata_expire_hours | 12 | 12 | SESSION | 设置通过 COPY INTO 加载数据的文件元数据过期时间(小时)。 | UInt64 | +| max_block_size | 65536 | 65536 | SESSION | 设置可以读取的单个数据块的最大字节大小。 | UInt64 | +| max_execute_time_in_seconds | 0 | 0 | SESSION | 设置查询执行的最大时间(秒)。设置为 0 表示无限制。 | UInt64 | +| max_inlist_to_or | 3 | 3 | SESSION | 设置 IN 表达式中可以包含的最大值数,以转换为 OR 运算符。 | UInt64 | +| max_memory_usage | 6871947673 | 6871947673 | SESSION | 设置处理单个查询的最大内存使用量(字节)。 | UInt64 | +| max_result_rows | 0 | 0 | SESSION | 设置未指定行数时查询结果中返回的最大行数。设置为 0 表示无限制。 | UInt64 | +| max_storage_io_requests | 48 | 48 | SESSION | 设置并发 I/O 请求的最大数量。 | UInt64 | +| max_threads | 8 | 8 | SESSION | 设置执行请求的最大线程数。 | UInt64 | +| numeric_cast_option | rounding | rounding | SESSION | 设置数值转换模式为 "rounding" 或 "truncating"。 | String | +| parquet_fast_read_bytes | 0 | 0 | SESSION | 小于此大小的 parquet 文件将作为整个文件读取,而不是逐列读取。 | UInt64 | +| parquet_uncompressed_buffer_size | 2097152 | 2097152 | SESSION | 设置用于读取 parquet 文件的缓冲区大小(字节)。 | UInt64 | +| prefer_broadcast_join | 1 | 1 | SESSION | 启用广播连接。 | UInt64 | +| query_result_cache_allow_inconsistent | 0 | 0 | SESSION | 确定 Databend 是否返回与底层数据不一致的缓存查询结果。 | UInt64 | +| query_result_cache_max_bytes | 1048576 | 1048576 | SESSION | 设置单个查询结果缓存的最大字节大小。 | UInt64 | +| query_result_cache_ttl_secs | 300 | 300 | SESSION | 设置缓存查询结果的生存时间(TTL,秒)。一旦缓存结果的 TTL 过期,结果将被视为过时,不会用于新查询。| UInt64 | +| quoted_ident_case_sensitive | 1 | 1 | SESSION | 确定 Databend 是否将带引号的标识符视为区分大小写。 | UInt64 | +| recluster_block_size | 2405181685 | 2405181685 | SESSION | 设置重新聚类的块的最大字节大小。 | UInt64 | +| recluster_timeout_secs | 43200 | 43200 | SESSION | 设置重新聚类最终超时的秒数。 | UInt64 | +| replace_into_bloom_pruning_max_column_number| 4 | 4 | SESSION | 用于 replace-into 语句的布隆过滤器剪枝的最大列数。 | UInt64 | +| replace_into_shuffle_strategy | 0 | 0 | SESSION | 0 表示块级洗牌,1 表示段级洗牌。 | UInt64 | +| retention_period | 12 | 12 | SESSION | 设置保留期(小时)。 | UInt64 | +| sandbox_tenant | | | SESSION | 注入自定义的 'sandbox_tenant' 到当前会话。仅用于测试目的,仅在 'internal_enable_sandbox_tenant' 开启时生效。 | String | +| spilling_bytes_threshold_per_proc | 0 | 0 | SESSION | 设置聚合器在查询执行期间将数据溢出到存储之前可以使用的最大内存量(字节)。 | UInt64 | +| spilling_memory_ratio | 0 | 0 | SESSION | 设置聚合器在查询执行期间将数据溢出到存储之前可以使用的最大内存比率(字节)。 | UInt64 | +| sql_dialect | PostgreSQL | PostgreSQL | SESSION | 设置 SQL 方言。可用值包括 "PostgreSQL", "MySQL", 和 "Hive"。 | String | +| storage_fetch_part_num | 2 | 2 | SESSION | 设置查询执行期间从存储并行获取的分区数。 | UInt64 | +| storage_io_max_page_bytes_for_read | 524288 | 524288 | SESSION | 设置从存储读取的单个 I/O 操作中数据页的最大字节大小。 | UInt64 | +| storage_io_min_bytes_for_seek | 48 | 48 | SESSION | 设置从存储读取的单个 I/O 操作中必须读取的最小字节数,当在数据文件中寻找新位置时。 | UInt64 | +| storage_read_buffer_size | 1048576 | 1048576 | SESSION | 设置用于将数据读入内存的缓冲区大小(字节)。 | UInt64 | +| table_lock_expire_secs | 5 | 5 | SESSION | 设置表锁过期的秒数。 | UInt64 | +| timezone | Japan | UTC | GLOBAL | 设置时区。 | String | +| unquoted_ident_case_sensitive | 0 | 0 | SESSION | 确定 Databend 是否将不带引号的标识符视为区分大小写。 | UInt64 | +| use_parquet2 | 1 | 1 | SESSION | 在 infer_schema() 时使用 parquet2 而不是 parquet_rs。 | UInt64 | \ No newline at end of file diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-stream-status.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-stream-status.md deleted file mode 100644 index 2aa3e80d8e..0000000000 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-stream-status.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: system.stream_status ---- -import FunctionDescription from '@site/src/components/FunctionDescription'; - - - -提供有关指定流状态的信息,生成单列结果 (`has_data`),其值可以是 `true` 或 `false`: - -- `true`: 表示流**可能包含**变更数据捕获记录。 -- `false`: 表示流当前不包含任何变更数据捕获记录。 - -:::note -结果中出现 `true` (`has_data`) **并不**保证变更数据捕获记录的确定存在。其他操作,例如执行表压缩操作,也可能导致在没有实际变更数据捕获记录的情况下出现 `true` 值。 -::: - -## 语法 - -```sql -SELECT * FROM STREAM_STATUS(''); -``` - -## 示例 - -```sql --- 创建一个包含列 'c' 的表 't' -CREATE TABLE t (c int); - --- 在表 't' 上创建流 's' -CREATE STREAM s ON TABLE t; - --- 检查流 's' 的初始状态 -SELECT * FROM STREAM_STATUS('s'); - --- 结果应为 'false',表示初始没有变更数据捕获记录 -┌──────────┐ -│ has_data │ -├──────────┤ -│ false │ -└──────────┘ - --- 向表 't' 插入一个值 -INSERT INTO t VALUES (1); - --- 插入后检查流 's' 的更新状态 -SELECT * FROM STREAM_STATUS('s'); - --- 结果现在应为 'true',表示存在变更数据捕获记录 -┌──────────┐ -│ has_data │ -├──────────┤ -│ true │ -└──────────┘ -``` \ No newline at end of file diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-streams.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-streams.md index bd580aada6..61243eb84d 100644 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-streams.md +++ b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-streams.md @@ -3,11 +3,11 @@ title: system.streams --- import FunctionDescription from '@site/src/components/FunctionDescription'; - + -提供系统中流的信息。此表中的每一行对应一个流,列包含流的详细信息,如模式、注释(如果有)、关联的表名、表ID、表版本、快照位置、无效原因(如果适用)和所有者。 +提供系统中流的相关信息。此表中的每一行对应一个流,列中包含流的详细信息,如流的模式、注释(如果有)、关联的表名、表ID、表版本、快照位置、无效原因(如果适用)以及所有者。 -```sql title="示例:" +```sql title="示例:" SELECT * FROM system.streams; ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-tables-with-history.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-tables-with-history.md index 4980443152..f44ac1cd94 100644 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-tables-with-history.md +++ b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-tables-with-history.md @@ -4,7 +4,7 @@ title: system.tables_with_history 提供所有表的元数据信息,包括历史表。它包含表属性、创建时间、行数、数据大小等详细信息。 -另请参阅: [SHOW DROP TABLES](../../10-sql-commands/00-ddl/01-table/show-drop-tables.md) +另请参阅:[SHOW DROP TABLES](../../10-sql-commands/00-ddl/01-table/show-drop-tables.md) ```sql title='示例:' SELECT * FROM system.tables_with_history LIMIT 3; @@ -18,7 +18,7 @@ SELECT * FROM system.tables_with_history LIMIT 3; └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ ``` -要显示 `system.tables_with_history` 的架构,请使用 `DESCRIBE system.tables_with_history`: +要显示 `system.tables_with_history` 的表结构,请使用 `DESCRIBE system.tables_with_history`: ```sql DESCRIBE system.tables_with_history; diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-tables.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-tables.md index 7e55c6519d..d9e3fd7f6d 100644 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-tables.md +++ b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-tables.md @@ -2,14 +2,14 @@ title: system.tables --- -提供所有表的元数据信息。它包括表属性、创建时间、行数、数据大小等详细信息。 +提供所有表的元数据信息。包括表属性、创建时间、行数、数据大小等详细信息。 -另请参阅: +另请参阅: - [information_schema.tables](information-schema-tables.md) - [SHOW TABLES](../../10-sql-commands/00-ddl/01-table/show-tables.md) -```sql title='示例:' +```sql title='示例:' SELECT * FROM system.tables LIMIT 3; ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ @@ -21,7 +21,7 @@ SELECT * FROM system.tables LIMIT 3; └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ ``` -要显示 `system.tables` 的架构,请使用 `DESCRIBE system.tables`: +要显示 `system.tables` 的表结构,请使用 `DESCRIBE system.tables`: ```sql DESCRIBE system.tables; diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-temp-files.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-temp-files.md index fc98045995..050b125617 100644 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-temp-files.md +++ b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-temp-files.md @@ -4,17 +4,17 @@ title: system.temp_files import FunctionDescription from '@site/src/components/FunctionDescription'; - + -包含由Databend创建的临时文件信息,例如溢出文件。要删除临时文件,请使用[VACUUM TEMPORARY FILES](/sql/sql-commands/administration-cmds/vacuum-temp-files)命令。 +包含由 Databend 创建的临时文件的信息,例如溢出文件。要删除这些临时文件,请使用 [VACUUM TEMPORARY FILES](/sql/sql-commands/administration-cmds/vacuum-temp-files) 命令。 ```sql SELECT * FROM system.temp_files; ``` -``` +```markdown ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ -│ file_type │ file_name │ file_content_length │ file_last_modified_time │ +│ 文件类型 │ 文件名 │ 文件内容长度 │ 文件最后修改时间 │ ├───────────┼─────────────────────────────────────────────────────────────┼─────────────────────┼─────────────────────────┤ │ Spill │ 1e9411e1-3c2f-48ee-9712-9d3ce396d1b3/0tUE8EqsxxjO4ftZA8Zni6 │ 591239232 │ 2024-11-19 03:06:03 │ │ Spill │ 1e9411e1-3c2f-48ee-9712-9d3ce396d1b3/440NKJwbRrW8HCFfQuNmb4 │ 607193920 │ 2024-11-19 03:05:18 │ @@ -59,4 +59,10 @@ SELECT * FROM system.temp_files; │ Spill │ 71c1bdcd-8ebb-45c1-98af-2700df2f9e10/fnQanOb1s6OmwJtooi35K5 │ 796730688 │ 2024-11-19 03:01:08 │ │ Spill │ 71c1bdcd-8ebb-45c1-98af-2700df2f9e10/hHSrrfmMjtnPP4gbKBuTc2 │ 764452672 │ 2024-11-19 03:01:07 │ │ Spill │ 71c1bdcd-8ebb-45c1-98af-2700df2f9e10/pZ06OYSniDzOLp8vTtruQ6 │ 796523712 │ 2024-11-19 03:02:37 │ -│ Spill │ 71c1bdcd-8ebb- \ No newline at end of file +│ Spill │ 71c1bdcd-8ebb-45c1-98af-2700df2f9e10/rPdRFZz6g3NlhIlbnk5b16 │ 790081408 │ 2024-11-19 03:01:07 │ +│ Spill │ 71c1bdcd-8ebb-45c1-98af-2700df2f9e10/sxOeDcjyKRrahkCHtAbeG2 │ 605099776 │ 2024-11-19 03:01:52 │ +│ Spill │ 71c1bdcd-8ebb-45c1-98af-2700df2f9e10/v1PU6oEHSSEieXL7mceqz5 │ 682199616 │ 2024-11-19 03:02:36 │ +│ Spill │ 71c1bdcd-8ebb-45c1-98af-2700df2f9e10/xRRUU3sKkjyFAKv4LDuUt2 │ 786471232 │ 2024-11-19 03:01:08 │ +│ Spill │ 71c1bdcd-8ebb-45c1-98af-2700df2f9e10/ys9yCVJNSRBY73ce46bCA6 │ 747938176 │ 2024-11-19 03:01:07 │ +└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` \ No newline at end of file diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-temp-tables.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-temp-tables.md index f14465b95a..9448c4ed48 100644 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-temp-tables.md +++ b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-temp-tables.md @@ -3,11 +3,11 @@ title: system.temporary_tables --- import FunctionDescription from '@site/src/components/FunctionDescription'; - + 提供当前会话中所有现有临时表的信息。 -```sql title='示例:' +```sql title='示例:' SELECT * FROM system.temporary_tables; ┌────────────────────────────────────────────────────┐ diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-user-functions.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-user-functions.md index 39256b596b..9268a29828 100644 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-user-functions.md +++ b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-user-functions.md @@ -4,18 +4,18 @@ title: system.user_functions import FunctionDescription from '@site/src/components/FunctionDescription'; - + 包含系统中用户定义函数和外部函数的信息。 -另请参阅: [SHOW USER FUNCTIONS](/sql/sql-commands/administration-cmds/show-user-functions). +另请参阅:[SHOW USER FUNCTIONS](/sql/sql-commands/administration-cmds/show-user-functions)。 ```sql SELECT * FROM system.user_functions; ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ -│ name │ is_aggregate │ description │ arguments │ language │ definition │ +│ 名称 │ 是否为聚合函数 │ 描述 │ 参数 │ 语言 │ 定义 │ ├────────────────┼───────────────────┼─────────────┼───────────────────────────────────────────────────────────┼──────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ binary_reverse │ NULL │ │ {"arg_types":["Binary NULL"],"return_type":"Binary NULL"} │ python │ (Binary NULL) RETURNS Binary NULL LANGUAGE python HANDLER = binary_reverse ADDRESS = http://0.0.0.0:8815 │ │ echo │ NULL │ │ {"arg_types":["String NULL"],"return_type":"String NULL"} │ python │ (String NULL) RETURNS String NULL LANGUAGE python HANDLER = echo ADDRESS = http://0.0.0.0:8815 │ diff --git a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-virtual-columns.md b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-virtual-columns.md index b162b8d8f1..c563b6e964 100644 --- a/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-virtual-columns.md +++ b/docs/cn/sql-reference/00-sql-reference/20-system-tables/system-virtual-columns.md @@ -4,11 +4,11 @@ title: system.virtual_columns import FunctionDescription from '@site/src/components/FunctionDescription'; - + 包含系统中创建的虚拟列的信息。 -另请参阅: [SHOW VIRTUAL COLUMNS](../../10-sql-commands/00-ddl/07-virtual-column/show-virtual-columns.md) +另请参阅:[SHOW VIRTUAL COLUMNS](../../10-sql-commands/00-ddl/07-virtual-column/show-virtual-columns.md) ```sql SELECT * FROM system.virtual_columns; diff --git a/docs/cn/sql-reference/00-sql-reference/30-table-engines/00-fuse.md b/docs/cn/sql-reference/00-sql-reference/30-table-engines/00-fuse.md index cbf8c1bae5..cb089d0216 100644 --- a/docs/cn/sql-reference/00-sql-reference/30-table-engines/00-fuse.md +++ b/docs/cn/sql-reference/00-sql-reference/30-table-engines/00-fuse.md @@ -1,12 +1,12 @@ --- -title: Fuse 引擎 +title: Fuse Engine --- import FunctionDescription from '@site/src/components/FunctionDescription'; - + -Databend 使用 Fuse 引擎作为其默认引擎,提供了一个类似于 Git 的用户友好界面的数据管理系统。用户可以轻松地在任何给定时刻查询数据,并轻松地将数据恢复到任何所需的时间点。 +Databend 使用 Fuse Engine 作为其默认引擎,提供了一个类似于 Git 的用户友好界面的数据管理系统。用户能够轻松地在任何时刻查询数据,并轻松地将数据恢复到任何所需的时间点。 ## 语法 @@ -18,26 +18,26 @@ CREATE TABLE ( []; ``` -有关 `CREATE TABLE` 语法的更多详细信息,请参阅 [CREATE TABLE](../../10-sql-commands/00-ddl/01-table/10-ddl-create-table.md)。 - -| 参数 | 描述 | -| ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ENGINE` | 如果未明确指定引擎,Databend 将自动默认使用 Fuse 引擎创建表,这等同于 `ENGINE = FUSE`。 | -| `CLUSTER BY` | 指定由多个表达式组成的数据的排序方法。更多信息请参阅 [Cluster Key](/guides/performance/cluster-key)。 | -| `` | Fuse 引擎提供了各种选项(不区分大小写),允许您自定义表的属性。详情请参阅 [Fuse 引擎选项](#fuse-engine-options)。
- 使用空格分隔多个选项。
- 使用 [ALTER TABLE OPTION](../../10-sql-commands/00-ddl/01-table/90-alter-table-option.md) 修改表的选项。
- 使用 [SHOW CREATE TABLE](../../10-sql-commands/00-ddl/01-table/show-create-table.md) 显示表的选项。 | - -## Fuse 引擎选项 - -以下是可用的 Fuse 引擎选项: - -| 选项 | 语法 | 描述 | -| ------------------------------ | --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| bloom_index_columns | `bloom_index_columns = ' [, ...]'` | 指定用于布隆索引的列。这些列的数据类型可以是 Map、Number、String、Date 或 Timestamp。如果没有指定特定列,布隆索引默认在所有支持的列上创建。`bloom_index_columns=''` 禁用布隆索引。 | -| compression | `compression = ''` | 指定引擎的压缩方法。压缩选项包括 lz4、zstd、snappy 或 none。压缩方法在对象存储中默认为 zstd,在文件系统 (fs) 存储中默认为 lz4。 | -| storage_format | `storage_format = ''` | 指定数据的存储方式。默认情况下,storage_format 设置为 **Parquet**,它提供高压缩率,非常适合云原生对象存储。此外,还支持实验性的 **Native** 格式,优化了文件系统等存储设备的内存复制开销。 | -| snapshot_loc | `snapshot_loc = ''` | 指定字符串格式的位置参数,允许在不复制数据的情况下轻松共享表。 | -| block_size_threshold | `block_size_threshold = ` | 指定块的最大大小(以字节为单位)。默认值为 104,857,600 字节。 | -| block_per_segment | `block_per_segment = ` | 指定段中的最大块数。默认值为 1,000。 | -| row_per_block | `row_per_block = ` | 指定文件中的最大行数。默认值为 1,000,000。 | -| change_tracking | `change_tracking = True / False` | 在 Fuse 引擎中将此选项设置为 `True` 允许跟踪表的更改。
为表创建流将自动将 `change_tracking` 设置为 `True`,并在表中引入额外的隐藏列作为更改跟踪元数据。更多信息请参阅 [How Stream Works](/guides/load-data/continuous-data-pipelines/stream#how-stream-works)。 | -| data_retention_period_in_hours | `data_retention_period_in_hours = ` | 指定保留表数据的小时数。最小值为 1 小时。最大值由 [databend-query.toml](https://github.com/databendlabs/databend/blob/main/scripts/distribution/configs/databend-query.toml) 配置文件中的 `data_retention_time_in_days_max` 设置定义,如果未指定,则默认为 2,160 小时(90 天 x 24 小时)。 | +有关 `CREATE TABLE` 语法的更多详细信息,请参见 [CREATE TABLE](../../10-sql-commands/00-ddl/01-table/10-ddl-create-table.md)。 + +| 参数 | 描述 | +| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ENGINE` | 如果未明确指定引擎,Databend 将自动默认使用 Fuse Engine 创建表,这相当于 `ENGINE = FUSE`。 | +| `CLUSTER BY` | 指定由多个表达式组成的数据的排序方法。有关更多信息,请参见 [Cluster Key](/guides/performance/cluster-key)。 | +| `` | Fuse Engine 提供了多种选项(不区分大小写),允许您自定义表的属性。详情请参见 [Fuse Engine 选项](#fuse-engine-options)。
- 多个选项之间用空格分隔。
- 使用 [ALTER TABLE OPTION](../../10-sql-commands/00-ddl/01-table/90-alter-table-option.md) 修改表的选项。
- 使用 [SHOW CREATE TABLE](../../10-sql-commands/00-ddl/01-table/show-create-table.md) 显示表的选项。 | + +## Fuse Engine 选项 + +以下是可用的 Fuse Engine 选项: + +| 选项 | 语法 | 描述 | +| ------------------------------ | --------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| bloom_index_columns | `bloom_index_columns = '<列> [, <列> ...]'` | 指定用于布隆索引的列。这些列的数据类型可以是 Map、Number、String、Date 或 Timestamp。如果未指定特定列,则默认在所有支持的列上创建布隆索引。`bloom_index_columns=''` 会禁用布隆索引。 | +| compression | `compression = '<压缩方法>'` | 指定引擎的压缩方法。压缩选项包括 lz4、zstd、snappy 或 none。在对象存储中,压缩方法默认为 zstd,在文件系统(fs)存储中默认为 lz4。 | +| storage_format | `storage_format = '<存储格式>'` | 指定数据的存储方式。默认情况下,storage_format 设置为 **Parquet**,它提供了高压缩率,非常适合云原生对象存储。此外,还支持实验性的 **Native** 格式,优化了文件系统等存储设备的内存复制开销。 | +| snapshot_loc | `snapshot_loc = ''` | 指定一个字符串格式的位置参数,允许轻松共享表而无需复制数据。 | +| block_size_threshold | `block_size_threshold = ` | 指定块的最大大小(以字节为单位)。默认为 104,857,600 字节。 | +| block_per_segment | `block_per_segment = ` | 指定一个段中的最大块数。默认为 1,000。 | +| row_per_block | `row_per_block = ` | 指定文件中的最大行数。默认为 1,000,000。 | +| change_tracking | `change_tracking = True / False` | 在 Fuse Engine 中将此选项设置为 `True` 可以跟踪表的更改。
为表创建流会自动将 `change_tracking` 设置为 `True`,并向表中引入额外的隐藏列作为更改跟踪元数据。有关更多信息,请参阅 [流的工作原理](/guides/load-data/continuous-data-pipelines/stream#how-stream-works)。 | +| data_retention_period_in_hours | `data_retention_period_in_hours = ` | 指定表数据的保留时间(以小时为单位)。最小值为 1 小时。最大值由 [databend-query.toml](https://github.com/databendlabs/databend/blob/main/scripts/distribution/configs/databend-query.toml) 配置文件中的 `data_retention_time_in_days_max` 设置定义,如果未指定,则默认为 2,160 小时(90 天 x 24 小时)。 | \ No newline at end of file diff --git a/docs/cn/sql-reference/00-sql-reference/30-table-engines/01-memory.md b/docs/cn/sql-reference/00-sql-reference/30-table-engines/01-memory.md index 9451221211..f7c2af4455 100644 --- a/docs/cn/sql-reference/00-sql-reference/30-table-engines/01-memory.md +++ b/docs/cn/sql-reference/00-sql-reference/30-table-engines/01-memory.md @@ -5,19 +5,19 @@ title: 内存引擎 ## 语法 ```sql -CREATE TABLE table_name ( - column_name1 column_type1, - column_name2 column_type2, +CREATE TABLE 表名 ( + 列名1 列类型1, + 列名2 列类型2, ... ) ENGINE = Memory; ``` ## 使用场景 -此引擎仅用于开发和测试目的。不建议在生产环境中使用。 +该引擎仅用于开发和测试目的。不建议在生产环境中使用。 -尽管内存引擎提供了几个优点,但也存在一些限制: +虽然内存引擎提供了几个优势,但也存在一些限制: -- 存储容量有限:可存储的数据量受服务器可用内存量的限制。这使得内存引擎不太适合大型数据集。 +- 存储容量有限:可以存储的数据量受限于服务器上的可用内存量。这使得内存引擎不太适合处理大型数据集。 -- 服务器故障时数据丢失:由于所有数据都存储在内存中,如果托管 Databend 实例的服务器发生故障,所有存储在内存中的数据都将丢失。 \ No newline at end of file +- 服务器故障时数据丢失:由于所有数据都存储在内存中,如果托管 Databend 实例的服务器发生故障,内存中存储的所有数据都将丢失。 \ No newline at end of file diff --git a/docs/cn/sql-reference/00-sql-reference/30-table-engines/02-random.md b/docs/cn/sql-reference/00-sql-reference/30-table-engines/02-random.md index 6666908022..0129539005 100644 --- a/docs/cn/sql-reference/00-sql-reference/30-table-engines/02-random.md +++ b/docs/cn/sql-reference/00-sql-reference/30-table-engines/02-random.md @@ -5,16 +5,16 @@ title: 随机引擎 ## 语法 ```sql -CREATE TABLE table_name ( - column_name1 column_type1, - column_name2 column_type2, +CREATE TABLE 表名 ( + 列名1 列类型1, + 列名2 列类型2, ... ) ENGINE = Random; ``` ## 使用场景 -随机引擎用于生成随机数据以进行测试。如果在查询中未指定限制,它将使用 `max_block_size` 作为限制值。 +随机引擎用于生成随机数据以进行测试。如果查询中未指定限制,它将使用 `max_block_size` 作为限制值。 示例: diff --git a/docs/cn/sql-reference/00-sql-reference/30-table-engines/03-iceberg.md b/docs/cn/sql-reference/00-sql-reference/30-table-engines/03-iceberg.md index 02d67b4057..8f7c330872 100644 --- a/docs/cn/sql-reference/00-sql-reference/30-table-engines/03-iceberg.md +++ b/docs/cn/sql-reference/00-sql-reference/30-table-engines/03-iceberg.md @@ -2,4 +2,4 @@ title: Apache Iceberg 引擎 --- -请参阅 [Iceberg 表引擎](/guides/access-data-lake/iceberg/iceberg-engine)。 \ No newline at end of file +参见 [Iceberg 表引擎](/guides/access-data-lake/iceberg/iceberg-engine)。 \ No newline at end of file diff --git a/docs/cn/sql-reference/00-sql-reference/30-table-engines/04-delta.md b/docs/cn/sql-reference/00-sql-reference/30-table-engines/04-delta.md index 4b75df0c75..302e65dd50 100644 --- a/docs/cn/sql-reference/00-sql-reference/30-table-engines/04-delta.md +++ b/docs/cn/sql-reference/00-sql-reference/30-table-engines/04-delta.md @@ -2,4 +2,5 @@ title: Delta Lake 引擎 --- -参见 [Delta Lake 引擎](/guides/access-data-lake/delta). \ No newline at end of file +参见 [Delta Lake 引擎](/guides/access-data-lake/delta)。 +--- \ No newline at end of file diff --git a/docs/cn/sql-reference/00-sql-reference/40-sql-identifiers.md b/docs/cn/sql-reference/00-sql-reference/40-sql-identifiers.md index 25fae9693b..fff4aef9cd 100644 --- a/docs/cn/sql-reference/00-sql-reference/40-sql-identifiers.md +++ b/docs/cn/sql-reference/00-sql-reference/40-sql-identifiers.md @@ -1,24 +1,24 @@ --- -title: SQL标识符 -sidebar_label: SQL标识符 +title: SQL 标识符 +sidebar_label: SQL 标识符 --- -SQL标识符是用于Databend中不同元素的名称,例如表、视图和数据库。 +SQL 标识符是 Databend 中用于不同元素的名称,例如表、视图和数据库。 -## 未引用的 & 双引号标识符 +## 未引用与双引号标识符 未引用的标识符以字母(A-Z,a-z)或下划线(“_”)开头,可以由字母、下划线、数字(0-9)或美元符号(“$”)组成。 -```text title='示例:' +```text title='示例:' mydatabend MyDatabend1 My$databend _my_databend ``` -双引号标识符可以包含广泛的字符,例如数字(0-9)、特殊字符(如句号(.)、单引号(')、感叹号(!)、@符号(@)、井号(#)、美元符号($)、百分号(%)、插入符号(^)和与号(&))、扩展ASCII和非ASCII字符,以及空白字符。 +双引号标识符可以包含各种字符,例如数字(0-9)、特殊字符(如句点(.)、单引号(')、感叹号(!)、at符号(@)、井号(#)、美元符号($)、百分号(%)、插入符号(^)和与符号(&))、扩展ASCII和非ASCII字符,以及空白字符。 -```text title='示例:' +```text title='示例:' "MyDatabend" "my.databend" "my databend" @@ -27,9 +27,9 @@ _my_databend "$Databend" ``` -请注意,使用双反引号(``)或双引号(")是等效的: +注意,使用双反引号(``)或双引号(")是等价的: -```text title='示例:' +```text title='示例:' `MyDatabend` `my.databend` `my databend` @@ -40,28 +40,28 @@ _my_databend ## 标识符大小写规则 -Databend默认将未引用的标识符存储为小写,并将双引号标识符按输入存储。换句话说,Databend处理对象名称(如数据库、表和列)时,默认情况下不区分大小写。如果您希望Databend区分大小写,请使用双引号。 +Databend 默认将未引用的标识符存储为小写,而双引号标识符则按输入时的形式存储。换句话说,Databend 将对象名称(如数据库、表和列)视为大小写不敏感。如果您希望 Databend 将其视为大小写敏感,请使用双引号。 :::note -Databend允许您控制标识符的大小写敏感性。有两个关键设置可用: +Databend 允许您控制标识符的大小写敏感性。有两个关键设置可用: -- unquoted_ident_case_sensitive: 当设置为1时,此选项保留未引用标识符的字符大小写,确保它们区分大小写。如果保留默认值0,未引用的标识符将保持不区分大小写,转换为小写。 +- unquoted_ident_case_sensitive:当设置为1时,此选项保留未引用标识符的字符大小写,确保它们大小写敏感。如果保持默认值0,未引用标识符将保持大小写不敏感,并转换为小写。 -- quoted_ident_case_sensitive: 通过将此选项设置为0,您可以指示双引号标识符不应保留字符大小写,使其不区分大小写。 +- quoted_ident_case_sensitive:通过将此选项设置为0,您可以指示双引号标识符不应保留字符大小写,使其大小写不敏感。 ::: -此示例演示了Databend在创建和列出数据库时如何处理标识符的大小写: +此示例展示了 Databend 在创建和列出数据库时如何处理标识符的大小写: ```sql --- 创建名为 "databend" 的数据库 +-- 创建一个名为 "databend" 的数据库 CREATE DATABASE databend; --- 尝试创建名为 "Databend" 的数据库 +-- 尝试创建一个名为 "Databend" 的数据库 CREATE DATABASE Databend; >> SQL Error [1105] [HY000]: DatabaseAlreadyExists. Code: 2301, Text = Database 'databend' already exists. --- 创建名为 "Databend" 的数据库 +-- 创建一个名为 "Databend" 的数据库 CREATE DATABASE "Databend"; -- 列出所有数据库 @@ -76,10 +76,10 @@ information_schema | system | ``` -此示例演示了Databend如何处理表和列名称的标识符大小写,默认情况下区分大小写,并使用双引号来区分大小写不同的标识符: +此示例展示了 Databend 如何处理表和列名称的标识符大小写,突出其默认的大小写敏感性以及使用双引号来区分大小写不同的标识符: ```sql --- 创建名为 "databend" 的表 +-- 创建一个名为 "databend" 的表 CREATE TABLE databend (a INT); DESC databend; @@ -87,17 +87,17 @@ Field|Type|Null|Default|Extra| -----+----+----+-------+-----+ a |INT |YES |NULL | | --- 尝试创建名为 "Databend" 的表 +-- 尝试创建一个名为 "Databend" 的表 CREATE TABLE Databend (a INT); >> SQL Error [1105] [HY000]: TableAlreadyExists. Code: 2302, Text = Table 'databend' already exists. --- 尝试创建一个表,其中一列名为 "a",另一列名为 "A" +-- 尝试创建一个表,其中一个列名为 "a",另一个列名为 "A" CREATE TABLE "Databend" (a INT, A INT); >> SQL Error [1105] [HY000]: BadArguments. Code: 1006, Text = Duplicated column name: a. --- 双引号列名 +-- 使用双引号引用列名 CREATE TABLE "Databend" ("a" INT, "A" INT); DESC "Databend"; @@ -109,7 +109,7 @@ A |INT |YES |NULL | | ## 字符串标识符 -在Databend中,当管理字符串项(如文本和日期)时,必须将它们用单引号(')括起来,这是标准做法。 +在 Databend 中,管理字符串项(如文本和日期)时,必须将其用单引号(')括起来,这是标准做法。 ```sql INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27'); @@ -129,7 +129,7 @@ SELECT "Databend"; | ^^^^^^^^^^ column Databend doesn't exist, do you mean 'Databend'? ``` -默认情况下,Databend SQL方言为 `PostgreSQL`: +默认情况下,Databend 的 SQL 方言是 `PostgreSQL`: ```sql SHOW SETTINGS LIKE '%sql_dialect%'; diff --git a/docs/cn/sql-reference/00-sql-reference/41-sql-variables.md b/docs/cn/sql-reference/00-sql-reference/41-sql-variables.md index 00d9097df4..c914a42b1d 100644 --- a/docs/cn/sql-reference/00-sql-reference/41-sql-variables.md +++ b/docs/cn/sql-reference/00-sql-reference/41-sql-variables.md @@ -3,17 +3,17 @@ title: SQL 变量 sidebar_label: SQL 变量 --- -SQL 变量允许你在会话中存储和管理临时数据。 +SQL 变量允许您在会话中存储和管理临时数据。 ## 变量 DDL 命令 -Databend 提供了以下 DDL 命令用于使用 SQL 变量: +Databend 提供了以下 DDL 命令来使用 SQL 变量: - [SET VARIABLE](../10-sql-commands/00-ddl/15-variable/set-variable.md) - [SHOW VARIABLES](../10-sql-commands/00-ddl/15-variable/show-variables.md) - [UNSET VARIABLE](../10-sql-commands/00-ddl/15-variable/unset-variable.md) -SHOW VARIABLES 命令有一个对应的表函数,[SHOW_VARIABLES](../20-sql-functions/17-table-functions/show-variables.md),它以表格格式提供相同的信息,允许在 SQL 语句中进行更复杂的过滤和查询。 +SHOW VARIABLES 命令有一个对应的表函数,[SHOW_VARIABLES](../20-sql-functions/17-table-functions/show-variables.md),它以表格形式提供相同的信息,允许在 SQL 语句中进行更复杂的过滤和查询。 ## 使用变量进行查询 @@ -21,24 +21,24 @@ SHOW VARIABLES 命令有一个对应的表函数,[SHOW_VARIABLES](../20-sql-fu ### 使用 `$` 和 `getvariable()` 访问变量 -你可以在 SQL 语句中使用 `$` 符号或 `getvariable()` 函数引用变量的值。这两种方法都允许动态替换,变量的值在运行时直接嵌入到查询中。 +您可以在 SQL 语句中使用 `$` 符号或 `getvariable()` 函数引用变量的值。这两种方法都允许动态替换,变量的值在运行时直接嵌入到查询中。 -```sql title='示例:' +```sql title='示例:' -- 设置一个变量作为过滤值 SET VARIABLE threshold = 100; --- 在查询中使用 $ 变量 +-- 在查询中使用 $ 引用变量 SELECT * FROM sales WHERE amount > $threshold; --- 或者使用 getvariable() 函数 +-- 或者,使用 getvariable() 函数 SELECT * FROM sales WHERE amount > getvariable('threshold'); ``` ### 使用 `IDENTIFIER` 访问对象 -`IDENTIFIER` 关键字允许你动态引用存储在变量中的数据库对象名称。请注意,BendSQL 尚不支持使用 `IDENTIFIER` 访问对象。 +`IDENTIFIER` 关键字允许您动态引用存储在变量中的数据库对象名称。请注意,BendSQL 尚不支持使用 `IDENTIFIER` 访问对象。 -```sql title='示例:' +```sql title='示例:' -- 创建一个包含销售数据的表 CREATE TABLE sales_data (region TEXT, sales_amount INT, month TEXT) AS SELECT 'North', 5000, 'January' UNION ALL diff --git a/docs/cn/sql-reference/00-sql-reference/42-lambda-expressions.md b/docs/cn/sql-reference/00-sql-reference/42-lambda-expressions.md index fa2de8e9b2..703b827a44 100644 --- a/docs/cn/sql-reference/00-sql-reference/42-lambda-expressions.md +++ b/docs/cn/sql-reference/00-sql-reference/42-lambda-expressions.md @@ -2,7 +2,7 @@ title: Lambda 表达式 --- -Lambda 表达式是匿名函数,允许您封装逻辑并将其作为参数传递给高阶函数,例如用于处理数组、列表或其他复杂数据类型的函数。它通常接受一组输入参数和一个代码体,该代码体对集合中的每个元素或排序逻辑中的每次比较执行。 +Lambda 表达式是匿名函数,允许您封装逻辑并将其作为参数传递给高阶函数,例如用于处理数组、列表或其他复杂数据类型的函数。它通常接受一组输入参数和一个代码体,该代码体针对集合中的每个元素或排序逻辑中的每次比较执行。 ## 语法 @@ -14,33 +14,33 @@ Lambda 表达式是匿名函数,允许您封装逻辑并将其作为参数传 (, , ...) -> ``` -| 参数 | 描述 | -|-----------------------------------|----------------------------------------------------------------------------------------------| -| `, , ...` | Lambda 将操作的值(例如,数组的元素)。 | -| `->` | 将输入参数与逻辑分隔开。 | -| `` | 应用于输入参数的逻辑,通常写为条件或计算。 | +| 参数 | 描述 | +|-----------------------------------|------------------------------------------------------------------------------------------------| +| `, , ...` | Lambda 将操作的值(例如,数组的元素)。 | +| `->` | 将输入参数与逻辑分开。 | +| `` | 应用于输入参数的逻辑,通常写为条件或计算。 | ## 示例 -此 Lambda 表达式接受一个参数 n 并将其加 5: +这个 lambda 表达式接受一个参数 n 并将其加 5: ```bash n -> (n + 5) ``` -此 Lambda 表达式接受一个整数 x,如果 x 大于 0 则返回 `Positive`,否则返回 `Non-Positive`: +这个 lambda 表达式接受一个整数 x,如果 x 大于 0,则返回 `Positive`,否则返回 `Non-Positive`: ```bash x -> (CASE WHEN x > 0 THEN 'Positive' ELSE 'Non-Positive' END) ``` -此 Lambda 表达式检查 num 是否为偶数。对于偶数返回 `true`,对于奇数返回 `false`: +这个 lambda 表达式检查 num 是否为偶数。对于偶数返回 `true`,对于奇数返回 `false`: ```bash num -> (num % 2 = 0) ``` -此 Lambda 表达式将两个参数 x 和 y 相加: +这个 lambda 表达式将两个参数 x 和 y 相加: ```bash (x, y) -> (x + y) diff --git a/docs/cn/sql-reference/00-sql-reference/50-file-format-options.md b/docs/cn/sql-reference/00-sql-reference/50-file-format-options.md index c7e35c9c16..5ccc4fe764 100644 --- a/docs/cn/sql-reference/00-sql-reference/50-file-format-options.md +++ b/docs/cn/sql-reference/00-sql-reference/50-file-format-options.md @@ -3,7 +3,7 @@ title: 输入与输出文件格式 --- import FunctionDescription from '@site/src/components/FunctionDescription'; - + Databend 接受多种文件格式作为数据加载或卸载的源和目标。本页解释了支持的文件格式及其可用选项。 @@ -19,13 +19,13 @@ Databend 接受多种文件格式作为数据加载或卸载的源和目标。 ... FILE_FORMAT = ( FORMAT_NAME = '' ) ``` -- Databend 目前仅支持 ORC 作为源。不支持将数据卸载到 ORC 文件。 -- 如果在执行 COPY INTO 或 SELECT 操作时未指定 FILE_FORMAT,Databend 将使用您在创建阶段时最初为阶段定义的文件格式。如果在创建阶段时未明确指定文件格式,Databend 默认使用 PARQUET 格式。如果在操作中指定了与创建阶段时定义的不同的 FILE_FORMAT,Databend 将优先使用操作中指定的 FILE_FORMAT。 -- 有关在 Databend 中管理自定义文件格式,请参阅 [File Format](../10-sql-commands/00-ddl/13-file-format/index.md)。 +- Databend 目前仅支持 ORC 作为源。尚不支持将数据卸载为 ORC 文件。 +- 如果在执行 COPY INTO 或从 Stage 执行 SELECT 操作时未指定 FILE_FORMAT,Databend 将使用您在创建 Stage 时最初定义的文件格式。如果在创建 Stage 时未明确指定文件格式,Databend 默认使用 PARQUET 格式。如果您指定的 FILE_FORMAT 与创建 Stage 时定义的不同,Databend 将优先使用操作期间指定的 FILE_FORMAT。 +- 有关在 Databend 中管理自定义文件格式的信息,请参阅[文件格式](../10-sql-commands/00-ddl/13-file-format/index.md)。 ### formatTypeOptions -`formatTypeOptions` 包括一个或多个选项,用于描述文件的其他格式细节。选项因文件格式而异。请参阅下面的部分,了解每种支持的文件格式的可用选项。 +`formatTypeOptions` 包括一个或多个选项,用于描述文件的其他格式细节。这些选项因文件格式而异。请参阅以下部分以了解每种支持的文件格式的可用选项。 ```sql formatTypeOptions ::= @@ -41,102 +41,102 @@ formatTypeOptions ::= ## CSV 选项 -Databend 接受符合 [RFC 4180](https://www.rfc-editor.org/rfc/rfc4180) 的 CVS 文件,并受以下条件限制: +Databend 接受符合 [RFC 4180](https://www.rfc-editor.org/rfc/rfc4180) 的 CSV 文件,并受以下条件约束: -- 如果字符串包含 [QUOTE](#quote)、[ESCAPE](#escape)、[RECORD_DELIMITER](#record_delimiter) 或 [FIELD_DELIMITER](#field_delimiter) 的字符,则必须用引号括起来。 -- 引号字符串中除 [QUOTE](#quote) 外的字符不会被转义。 -- [FIELD_DELIMITER](#field_delimiter) 和 [QUOTE](#quote) 之间不应有空格。 -- 如果字符串来自序列化的 Array 或 Struct 字段,则会在 CSV 中用引号括起来。 -- 如果您开发程序并从中生成 CSV 文件,Databend 建议使用编程语言的 CSV 库。 +- 如果字符串包含 [QUOTE](#quote)、[ESCAPE](#escape)、[RECORD_DELIMITER](#record_delimiter) 或 [FIELD_DELIMITER](#field_delimiter) 的字符,则必须引用该字符串。 +- 在引用的字符串中,除了 [QUOTE](#quote) 外,不会转义任何字符。 +- [FIELD_DELIMITER](#field_delimiter) 和 [QUOTE](#quote) 之间不应留有空格。 +- 如果字符串来自序列化的数组或结构体字段,则会在 CSV 中引用该字符串。 +- 如果您开发程序并从该程序生成 CSV 文件,Databend 建议使用编程语言的 CSV 库。 ### RECORD_DELIMITER 分隔输入文件中的记录。 -**可用值**: +**可用值**: - `\r\n` -- 一个单字节、非字母数字字符,如 `#` 和 `|`。 +- 一个非字母数字的单字节字符,例如 `#` 和 `|`。 - 带有转义字符的字符:`\b`, `\f`, `\r`, `\n`, `\t`, `\0`, `\xHH` -**默认**: `\n` +**默认值**:`\n` ### FIELD_DELIMITER 分隔记录中的字段。 -**可用值**: +**可用值**: -- 一个单字节、非字母数字字符,如 `#` 和 `|`。 +- 一个非字母数字的单字节字符,例如 `#` 和 `|`。 - 带有转义字符的字符:`\b`, `\f`, `\r`, `\n`, `\t`, `\0`, `\xHH` -**默认**: `,` (逗号) +**默认值**:`,`(逗号) ### QUOTE -在 CSV 文件中引用字符串。对于数据加载,除非字符串包含 [QUOTE](#quote)、[ESCAPE](#escape)、[RECORD_DELIMITER](#record_delimiter) 或 [FIELD_DELIMITER](#field_delimiter) 的字符,否则不需要引号。 +在 CSV 文件中引用字符串。对于数据加载,除非字符串包含 [QUOTE](#quote)、[ESCAPE](#escape)、[RECORD_DELIMITER](#record_delimiter) 或 [FIELD_DELIMITER](#field_delimiter) 的字符,否则不需要引用。 :::note -**仅用于数据加载**: 当您从 Databend 卸载数据时,此选项不可用。 +**仅用于数据加载**:当您从 Databend 卸载数据时,此选项不可用。 ::: -**可用值**: `'`, `"`, 或 `(反引号) +**可用值**:`'`, `"`, 或 `(反引号) -**默认**: `"` +**默认值**:`"` ### ESCAPE -在引号字符串中转义引号。 +在引用的字符串中转义引号。 -**可用值**: `'\\'` 或 `''` +**可用值**:`'\\'` 或 `''` -**默认**: `''` +**默认值**:`''` ### SKIP_HEADER -指定从文件开头跳过的行数。 +指定从文件开头跳过多少行。 :::note -**仅用于数据加载**: 当您从 Databend 卸载数据时,此选项不可用。 +**仅用于数据加载**:当您从 Databend 卸载数据时,此选项不可用。 ::: -**默认**: `0` +**默认值**:`0` ### NAN_DISPLAY -指定在查询结果中如何显示“NaN”(非数字)值。 +指定查询结果中如何显示“NaN”(非数字)值。 -**可用值**: 必须是字面量 `'nan'` 或 `'null'`(不区分大小写) +**可用值**:必须是字面量 `'nan'` 或 `'null'`(不区分大小写) -**默认**: `'NaN'` +**默认值**:`'NaN'` ### NULL_DISPLAY -指定在查询结果中如何显示 NULL 值。 +指定查询结果中如何显示 NULL 值。 -**默认**: `'\N'` +**默认值**:`'\N'` ### ERROR_ON_COLUMN_COUNT_MISMATCH -ERROR_ON_COLUMN_COUNT_MISMATCH 是一个布尔选项,当设置为 true 时,指定如果数据文件中的列数与目标表中的列数不匹配,则应引发错误。设置为 true 有助于在加载过程中确保数据完整性和一致性。 +ERROR_ON_COLUMN_COUNT_MISMATCH 是一个布尔选项,当设置为 true 时,如果数据文件中的列数与目标表中的列数不匹配,则会引发错误。将其设置为 true 有助于确保加载过程中的数据完整性和一致性。 -**默认**: `true` +**默认值**:`true` ### EMPTY_FIELD_AS -指定在遇到空字段(包括 `,,` 和 `,"",`)时,应使用的值,这些空字段正在加载到表中。 +指定在加载到表中的 CSV 数据中遇到空字段(包括 `,,` 和 `,"",`)时应使用的值。 -**可用值**: +**可用值**: -| 值 | 描述 | -|------------------|---------------------------------------------------------------------------| -| `null` (默认) | 将空字段解释为 NULL 值。仅适用于可为空的列。 | -| `string` | 将空字段解释为空字符串('')。仅适用于 String 列。 | -| `field_default` | 使用列的默认值作为空字段。 | +| 值 | 描述 | +|------------------|-----------------------------------------------------------------------------------| +| `null` (默认) | 将空字段解释为 NULL 值。仅适用于可为空的列。 | +| `string` | 将空字段解释为空字符串('')。仅适用于字符串列。 | +| `field_default` | 使用列的默认值处理空字段。 | ### OUTPUT_HEADER -指定在使用 `COPY INTO ` 命令导出数据时,是否在 CSV 文件中包含标题行。默认为 `false`。 +指定在使用 `COPY INTO ` 命令导出数据时是否在 CSV 文件中包含标题行。默认为 `false`。 ### BINARY_FORMAT @@ -146,60 +146,60 @@ ERROR_ON_COLUMN_COUNT_MISMATCH 是一个布尔选项,当设置为 true 时, 指定压缩算法。 -**可用值**: +**可用值**: -| 值 | 描述 | -|------------------|---------------------------------------------------------------------------| -| `NONE` (默认) | 表示文件未压缩。 | -| `AUTO` | 通过文件扩展名自动检测压缩。 | -| `GZIP` | | -| `BZ2` | | -| `BROTLI` | 如果加载/卸载 Brotli 压缩文件,则必须指定。 | -| `ZSTD` | 支持 Zstandard v0.8(及更高版本)。 | -| `DEFLATE` | 使用 zlib 头部的 Deflate 压缩文件(RFC1950)。 | -| `RAW_DEFLATE` | 不带任何头部的 Deflate 压缩文件(RFC1951)。 | -| `XZ` | | +| 值 | 描述 | +|------------------|-----------------------------------------------------------------| +| `NONE` (默认) | 表示文件未压缩。 | +| `AUTO` | 通过文件扩展名自动检测压缩 | +| `GZIP` | | +| `BZ2` | | +| `BROTLI` | 如果加载/卸载 Brotli 压缩文件,则必须指定。 | +| `ZSTD` | 支持 Zstandard v0.8(及更高版本)。 | +| `DEFLATE` | Deflate 压缩文件(带有 zlib 头,RFC1950)。 | +| `RAW_DEFLATE` | Deflate 压缩文件(无任何头,RFC1951)。 | +| `XZ` | | ## TSV 选项 -Databend 在处理 TSV 文件时受以下条件限制: +Databend 在处理 TSV 文件时受以下条件约束: - TSV 文件中的这些字符将被转义:`\b`, `\f`, `\r`, `\n`, `\t`, `\0`, `\\`, `\'`, [RECORD_DELIMITER](#record_delimiter-1), [FIELD_DELIMITER](#field_delimiter-1)。 -- 目前不支持引用或封闭。 -- 如果字符串来自序列化的 Array 或 Struct 字段,则会在 CSV 中用引号括起来。 -- Null 序列化为 `\N`。 +- 目前不支持引用或包围。 +- 如果字符串来自序列化的数组或结构体字段,则会在 CSV 中引用该字符串。 +- Null 被序列化为 `\N`。 :::note -1. 在 Databend 中,TSV 和 CSV 的主要区别不是使用制表符而不是逗号作为字段分隔符(可以通过选项更改),而是使用转义而不是引用来处理 [分隔符冲突](https://en.wikipedia.org/wiki/Delimiter#Delimiter_collision)。 -2. 我们建议使用 CSV 作为存储格式,因为它有正式的标准。 +1. 在 Databend 中,TSV 和 CSV 的主要区别不是使用制表符代替逗号作为字段分隔符(可以通过选项更改),而是使用转义而不是引用来处理[分隔符冲突](https://en.wikipedia.org/wiki/Delimiter#Delimiter_collision)。 +2. 我们建议使用 CSV 而不是 TSV 作为存储格式,因为它有正式的标准。 3. TSV 可用于加载由以下方式生成的文件: 1. Clickhouse TSV 文件格式。 - 2. MySQL `mysqldump` 命令,带有选项 `--tab`,但不带 `--fields-enclosed-by` 或 `--fields-optinally-enclosed-by`,如果指定了后两者,请改用 CSV。 - 3. Snowflake CSV,不带 `ESCAPE_UNENCLOSED_FIELD`。如果指定了 `ESCAPE_UNENCLOSED_FIELD`,请改用 CSV。 + 2. MySQL `mysqldump` 命令,带有 `--tab` 选项但不带 `--fields-enclosed-by` 或 `--fields-optinally-enclosed-by`,如果指定了后两个选项,请使用 CSV。 + 3. Snowflake CSV,不带 `ESCAPE_UNENCLOSED_FIELD`。如果指定了 `ESCAPE_UNENCLOSED_FIELD`,请使用 CSV。 ::: ### RECORD_DELIMITER 分隔输入文件中的记录。 -**可用值**: +**可用值**: - `\r\n` -- 任意字符,如 `#` 和 `|`。 +- 任意字符,例如 `#` 和 `|`。 - 带有转义字符的字符:`\b`, `\f`, `\r`, `\n`, `\t`, `\0`, `\xHH` -**默认**: `\n` +**默认值**:`\n` ### FIELD_DELIMITER 分隔记录中的字段。 -**可用值**: +**可用值**: -- 非字母数字字符,如 `#` 和 `|`。 +- 非字母数字字符,例如 `#` 和 `|`。 - 带有转义字符的字符:`\b`, `\f`, `\r`, `\n`, `\t`, `\0`, `\xHH` -**默认**: `\t` (制表符) +**默认值**:`\t`(制表符) ### COMPRESSION @@ -209,23 +209,23 @@ Databend 在处理 TSV 文件时受以下条件限制: ### NULL_FIELD_AS -指定在数据加载期间如何处理 null 值。请参阅下表中的选项以了解可能的配置。 +指定在数据加载期间如何处理空值。请参阅下表中的选项以了解可能的配置。 -| 可用值 | 描述 | -|----------------------|-------------------------------------------------------------------------------------------------| -| `NULL` (默认) | 将 null 值解释为 NULL,适用于可为空的字段。对于不可为空的字段,将生成错误。 | -| `FIELD_DEFAULT` | 使用字段的默认值作为 null 值。 | +| 可用值 | 描述 | +|-------------------------|---------------------------------------------------------------------------------------------------------| +| `NULL` (默认) | 将空值解释为 NULL 用于可为空的字段。对于不可为空的字段将生成错误。 | +| `FIELD_DEFAULT` | 使用字段的默认值处理空值。 | ### MISSING_FIELD_AS 确定在数据加载期间遇到缺失字段时的行为。请参阅下表中的选项以了解可能的配置。 -| 可用值 | 描述 | -|----------------------|-------------------------------------------------------------------------------------------------| -| `ERROR` (默认) | 如果遇到缺失字段,则生成错误。 | -| `NULL` | 将缺失字段解释为 NULL 值。对于不可为空的字段,将生成错误。 | -| `FIELD_DEFAULT` | 使用字段的默认值作为缺失字段。 | -| `TYPE_DEFAULT` | 使用字段数据类型的默认值作为缺失字段。 | +| 可用值 | 描述 | +|------------------|-----------------------------------------------------------------------------------------------| +| `ERROR` (默认) | 如果遇到缺失字段,则生成错误。 | +| `NULL` | 将缺失字段解释为 NULL 值。对于不可为空的字段将生成错误。 | +| `FIELD_DEFAULT` | 使用字段的默认值处理缺失字段。 | +| `TYPE_DEFAULT` | 使用字段数据类型的默认值处理缺失字段。 | ### COMPRESSION @@ -237,11 +237,11 @@ Databend 在处理 TSV 文件时受以下条件限制: 确定在数据加载期间遇到缺失字段时的行为。请参阅下表中的选项以了解可能的配置。 -| 可用值 | 描述 | -|----------------------|-------------------------------------------------------------------------------------------------| -| `ERROR` (默认) | 如果遇到缺失字段,则生成错误。 | -| `FIELD_DEFAULT` | 使用字段的默认值作为缺失字段。 | +| 可用值 | 描述 | +|------------------|-----------------------------------------------------------------------------------------------| +| `ERROR` (默认)| 如果遇到缺失字段,则生成错误。 | +| `FIELD_DEFAULT` | 使用字段的默认值处理缺失字段。 | ## ORC 选项 -目前 ORC 格式没有可用选项。 \ No newline at end of file +ORC 格式目前没有可用选项。 \ No newline at end of file diff --git a/docs/cn/sql-reference/00-sql-reference/51-connect-parameters.md b/docs/cn/sql-reference/00-sql-reference/51-connect-parameters.md index fb8c49d1d1..a16c98b66c 100644 --- a/docs/cn/sql-reference/00-sql-reference/51-connect-parameters.md +++ b/docs/cn/sql-reference/00-sql-reference/51-connect-parameters.md @@ -3,11 +3,11 @@ title: 连接参数 --- import FunctionDescription from '@site/src/components/FunctionDescription'; - + -连接参数是用于建立与外部存储服务(如Amazon S3)的安全链接的键值对。这些参数对于创建Stage、将数据复制到Databend以及查询外部文件等任务至关重要。 +连接参数是用于建立与外部存储服务(如 Amazon S3)的安全链接的键值对。这些参数对于创建 Stage、将数据复制到 Databend 以及查询外部文件等任务至关重要。 -有关每个存储服务的具体连接详情,请参见下表。 +有关每种存储服务的具体连接详情,请参见下表。 import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -15,22 +15,22 @@ import TabItem from '@theme/TabItem'; -下表列出了访问Amazon S3类存储服务的连接参数: +下表列出了访问 Amazon S3 类似存储服务的连接参数: -| 参数 | 必需? | 描述 | +| 参数 | 是否必填 | 描述 | |--------------------------- |----------- |-------------------------------------------------------------- | -| endpoint_url | 是 | Amazon S3类存储服务的端点URL。 | -| access_key_id | 是 | 用于标识请求者的访问密钥ID。 | -| secret_access_key | 是 | 用于认证的秘密访问密钥。 | -| enable_virtual_host_style | 否 | 是否使用虚拟主机风格的URL。默认为*false*。 | -| master_key | 否 | 用于高级数据加密的可选主密钥。 | -| region | 否 | 存储桶所在的AWS区域。 | -| security_token | 否 | 用于临时凭证的安全令牌。 | +| endpoint_url | 是 | Amazon S3 类似存储服务的端点 URL。 | +| access_key_id | 是 | 用于标识请求者的访问密钥 ID。 | +| secret_access_key | 是 | 用于身份验证的密钥访问密钥。 | +| enable_virtual_host_style | 否 | 是否使用虚拟主机风格的 URL。默认为 *false*。 | +| master_key | 否 | 用于高级数据加密的可选主密钥。 | +| region | 否 | 存储桶所在的 AWS 区域。 | +| security_token | 否 | 用于临时凭证的安全令牌。 | :::note -- 如果在命令中未指定**endpoint_url**参数,Databend将默认在Amazon S3上创建Stage。因此,当您在兼容S3的对象存储或其他对象存储解决方案上创建外部Stage时,请务必包含**endpoint_url**参数。 +- 如果命令中未指定 **endpoint_url** 参数,Databend 将默认在 Amazon S3 上创建 Stage。因此,当您在 S3 兼容的对象存储或其他对象存储解决方案上创建外部 Stage 时,请务必包含 **endpoint_url** 参数。 -- **region**参数不是必需的,因为Databend可以自动检测区域信息。通常情况下,您不需要手动为此参数指定值。如果自动检测失败,Databend将默认使用'us-east-1'作为区域。当使用MinIO部署Databend且未配置区域信息时,它将自动默认使用'us-east-1',并且这将正常工作。但是,如果您收到诸如“region is missing”或“The bucket you are trying to access requires a specific endpoint. Please direct all future requests to this particular endpoint”的错误消息,您需要确定您的区域名称并明确将其分配给**region**参数。 +- **region** 参数不是必需的,因为 Databend 可以自动检测区域信息。通常您不需要手动指定此参数的值。如果自动检测失败,Databend 将默认使用 'us-east-1' 作为区域。当使用 MinIO 部署 Databend 且未配置区域信息时,它将自动默认使用 'us-east-1',并且这将正常工作。但是,如果您收到诸如“region is missing”或“The bucket you are trying to access requires a specific endpoint. Please direct all future requests to this particular endpoint”之类的错误消息,您需要确定您的区域名称并将其显式分配给 **region** 参数。 ::: ```sql title='示例' @@ -50,15 +50,16 @@ CREATE STAGE my_minio_stage ); ``` -要访问您的Amazon S3存储桶,您还可以指定AWS IAM角色和外部ID进行认证。通过指定AWS IAM角色和外部ID,您可以更精细地控制用户可以访问哪些S3存储桶。这意味着如果IAM角色已被授予仅访问特定S3存储桶的权限,那么用户将只能访问这些存储桶。外部ID可以通过提供额外的验证层来进一步增强安全性。更多信息请参见https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html -下表列出了使用AWS IAM角色认证访问Amazon S3存储服务的连接参数: +要访问您的 Amazon S3 存储桶,您还可以指定 AWS IAM 角色和外部 ID 进行身份验证。通过指定 AWS IAM 角色和外部 ID,您可以更精细地控制用户可以访问哪些 S3 存储桶。这意味着如果 IAM 角色仅被授予访问特定 S3 存储桶的权限,那么用户将只能访问这些存储桶。外部 ID 可以通过提供额外的验证层来进一步增强安全性。有关更多信息,请参见 https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html -| 参数 | 必需? | 描述 | -|-------------- |----------- |-------------------------------------------------------------- | -| endpoint_url | 否 | Amazon S3的端点URL。 | -| role_arn | 是 | 用于授权访问S3的AWS IAM角色的ARN。 | -| external_id | 否 | 用于增强角色假设安全性的外部ID。 | +下表列出了使用 AWS IAM 角色身份验证访问 Amazon S3 存储服务的连接参数: + +| 参数 | 是否必填 | 描述 | +|-------------- |----------- |------------------------------------------------------- | +| endpoint_url | 否 | Amazon S3 的端点 URL。 | +| role_arn | 是 | 用于授权访问 S3 的 AWS IAM 角色的 ARN。 | +| external_id | 否 | 用于角色假设中增强安全性的外部 ID。 | ```sql title='示例' CREATE STAGE my_s3_stage @@ -73,13 +74,13 @@ CREATE STAGE my_s3_stage -下表列出了访问Azure Blob存储的连接参数: +下表列出了访问 Azure Blob Storage 的连接参数: -| 参数 | 必需? | 描述 | -|----------------|-------------|--------------------------------------------------------------| -| endpoint_url | 是 | Azure Blob存储的端点URL。 | -| account_key | 是 | 用于认证的Azure Blob存储账户密钥。 | -| account_name | 是 | 用于标识的Azure Blob存储账户名称。 | +| 参数 | 是否必填 | 描述 | +|----------------|-------------|-------------------------------------------------------| +| endpoint_url | 是 | Azure Blob Storage 的端点 URL。 | +| account_key | 是 | 用于身份验证的 Azure Blob Storage 账户密钥。 | +| account_name | 是 | 用于标识的 Azure Blob Storage 账户名称。 | ```sql title='示例' CREATE STAGE my_azure_stage @@ -95,13 +96,13 @@ CREATE STAGE my_azure_stage -下表列出了访问Google云存储的连接参数: +下表列出了访问 Google Cloud Storage 的连接参数: -| 参数 | 必需? | 描述 | -|----------------|-------------|--------------------------------------------------------------| -| credential | 是 | 用于认证的Google云存储凭证。 | +| 参数 | 是否必填 | 描述 | +|----------------|-------------|-------------------------------------------------------| +| credential | 是 | 用于身份验证的 Google Cloud Storage 凭证。 | -要获取`credential`,您可以按照Google文档中的主题[创建服务账户密钥](https://cloud.google.com/iam/docs/keys-create-delete#creating)创建并下载服务账户密钥文件。下载服务账户密钥文件后,您可以通过以下命令将其转换为base64字符串: +要获取 `credential`,您可以按照 Google 文档中的主题 [创建服务账户密钥](https://cloud.google.com/iam/docs/keys-create-delete#creating) 创建并下载服务账户密钥文件。下载服务账户密钥文件后,您可以通过以下命令将其转换为 base64 字符串: ``` base64 -i -o ~/Desktop/base64-encoded-key.txt @@ -117,16 +118,16 @@ CREATE STAGE my_gcs_stage - + -下表列出了访问Alibaba云OSS的连接参数: +下表列出了访问阿里云 OSS 的连接参数: -| 参数 | 必需? | 描述 | -|--------------------------- |----------- |-------------------------------------------------------------- | -| access_key_id | 是 | 用于认证的Alibaba云OSS访问密钥ID。 | -| access_key_secret | 是 | 用于认证的Alibaba云OSS访问密钥秘密。 | -| endpoint_url | 是 | Alibaba云OSS的端点URL。 | -| presign_endpoint_url | 否 | 用于预签名Alibaba云OSS URL的端点URL。 | +| 参数 | 是否必填 | 描述 | +|---------------------- |----------- |--------------------------------------------------------- | +| access_key_id | 是 | 用于身份验证的阿里云 OSS 访问密钥 ID。 | +| access_key_secret | 是 | 用于身份验证的阿里云 OSS 访问密钥。 | +| endpoint_url | 是 | 阿里云 OSS 的端点 URL。 | +| presign_endpoint_url | 否 | 用于预签名阿里云 OSS URL 的端点 URL。 | ```sql title='示例' CREATE STAGE my_oss_stage @@ -140,15 +141,15 @@ CREATE STAGE my_oss_stage - + -下表列出了访问腾讯云对象存储(COS)的连接参数: +下表列出了访问腾讯云对象存储 (COS) 的连接参数: -| 参数 | 必需? | 描述 | -|-------------- |----------- |-------------------------------------------------------------- | -| endpoint_url | 是 | 腾讯云对象存储的端点URL。 | -| secret_id | 是 | 用于认证的腾讯云对象存储秘密ID。 | -| secret_key | 是 | 用于认证的腾讯云对象存储秘密密钥。 | +| 参数 | 是否必填 | 描述 | +|-------------- |----------- |------------------------------------------------------------- | +| endpoint_url | 是 | 腾讯云对象存储的端点 URL。 | +| secret_id | 是 | 用于身份验证的腾讯云对象存储密钥 ID。 | +| secret_key | 是 | 用于身份验证的腾讯云对象存储密钥。 | ```sql title='示例' CREATE STAGE my_cos_stage @@ -164,11 +165,11 @@ CREATE STAGE my_cos_stage -下表列出了访问Hadoop分布式文件系统(HDFS)的连接参数: +下表列出了访问 Hadoop 分布式文件系统 (HDFS) 的连接参数: -| 参数 | 必需? | 描述 | -|-------------- |----------- |-------------------------------------------------------------- | -| name_node | 是 | 用于连接集群的HDFS NameNode地址。 | +| 参数 | 是否必填 | 描述 | +|----------- |----------- |------------------------------------------------------ | +| name_node | 是 | 用于连接到集群的 HDFS NameNode 地址。 | ```sql title='示例' CREATE STAGE my_hdfs_stage @@ -182,12 +183,12 @@ CREATE STAGE my_hdfs_stage -下表列出了访问WebHDFS的连接参数: +下表列出了访问 WebHDFS 的连接参数: -| 参数 | 必需? | 描述 | -|-------------- |----------- |-------------------------------------------------------------- | -| endpoint_url | 是 | WebHDFS的端点URL。 | -| delegation | 否 | 用于访问WebHDFS的委托令牌。 | +| 参数 | 是否必填 | 描述 | +|-------------- |----------- |--------------------------------------------------- | +| endpoint_url | 是 | WebHDFS 的端点 URL。 | +| delegation | 否 | 用于访问 WebHDFS 的委托令牌。 | ```sql title='示例' CREATE STAGE my_webhdfs_stage @@ -201,13 +202,13 @@ CREATE STAGE my_webhdfs_stage -下表列出了访问Hugging Face的连接参数: +下表列出了访问 Hugging Face 的连接参数: -| 参数 | 必需? | 描述 | -|----------- |----------------------- |-----------------------------------------------------------------------------------------------------------------| -| repo_type | 否 (默认: dataset) | Hugging Face仓库的类型。可以是`dataset`或`model`。 | -| revision | 否 (默认: main) | Hugging Face URI的修订版本。可以是仓库的分支、标签或提交。 | -| token | 否 | Hugging Face的API令牌,可能需要访问私有仓库或某些资源。 | +| 参数 | 是否必填 | 描述 | +|-----------|-----------------------|-----------------------------------------------------------------------------------------------------------------| +| repo_type | 否 (默认: dataset) | Hugging Face 仓库的类型。可以是 `dataset` 或 `model`。 | +| revision | 否 (默认: main) | Hugging Face URI 的修订版本。可以是仓库的分支、标签或提交。 | +| token | 否 | 来自 Hugging Face 的 API 令牌,可能需要用于访问私有仓库或某些资源。 | ```sql title='示例' CREATE STAGE my_huggingface_stage diff --git a/docs/cn/sql-reference/00-sql-reference/98-sql-scripting.md b/docs/cn/sql-reference/00-sql-reference/98-sql-scripting.md index 82f766d18c..2d4b235f09 100644 --- a/docs/cn/sql-reference/00-sql-reference/98-sql-scripting.md +++ b/docs/cn/sql-reference/00-sql-reference/98-sql-scripting.md @@ -2,7 +2,7 @@ title: SQL 脚本 --- -本页概述了 Databend 中可用的 SQL 脚本选项。您可以使用以下任意一种查询方法来使用 SQL 脚本: +本页面概述了 Databend 中可用的 SQL 脚本选项。您可以使用以下任意一种查询方法来使用 SQL 脚本: - [存储过程](/guides/query/stored-procedure) - [EXECUTE IMMEDIATE](/sql/sql-commands/administration-cmds/execute-immediate) @@ -11,7 +11,7 @@ title: SQL 脚本 可以使用 `LET` 关键字声明变量,后跟变量名、可选的类型和初始值。 -```sql title='示例:' +```sql title='示例:' LET x := 100; ``` @@ -19,60 +19,60 @@ LET x := 100; 可以在脚本中执行 SQL 查询,并将结果存储在变量或结果集中。 -```sql title='示例:' +```sql title='示例:' LET result RESULTSET := SELECT * FROM t1; ``` ### 控制流结构 -- **FOR 循环**: 遍历范围或结果集。 +- **FOR 循环**:遍历范围或结果集。 - ```sql title='示例:' - FOR i IN 1..10 DO ... END FOR; - ``` + ```sql title='示例:' + FOR i IN 1..10 DO ... END FOR; + ``` -- **WHILE 循环**: 只要指定条件为真,就执行代码块。 +- **WHILE 循环**:只要指定条件为真,就执行代码块。 - ```sql title='示例:' - WHILE condition DO ... END WHILE; - ``` + ```sql title='示例:' + WHILE condition DO ... END WHILE; + ``` -- **REPEAT 循环**: 执行代码块,直到满足条件。 +- **REPEAT 循环**:执行代码块直到满足条件。 - ```sql title='示例:' - REPEAT ... UNTIL condition END REPEAT; - ``` + ```sql title='示例:' + REPEAT ... UNTIL condition END REPEAT; + ``` -- **LOOP**: 无限执行代码块,直到遇到 `BREAK` 语句。 +- **LOOP**:无限执行代码块,直到遇到 `BREAK` 语句。 - ```sql title='示例:' - LOOP ... END LOOP; - ``` + ```sql title='示例:' + LOOP ... END LOOP; + ``` -- **CASE 语句**: 根据不同的条件执行代码块。 +- **CASE 语句**:根据不同的条件执行代码块。 - ```sql title='示例:' - CASE [operand] - WHEN condition1 THEN ... - WHEN condition2 THEN ... - ELSE ... - END; - ``` + ```sql title='示例:' + CASE [operand] + WHEN condition1 THEN ... + WHEN condition2 THEN ... + ELSE ... + END; + ``` -- **IF 语句**: 根据条件执行代码块。 +- **IF 语句**:根据条件执行代码块。 - ```sql title='示例:' - IF condition THEN ... - ELSEIF condition THEN ... - ELSE ... - END IF; - ``` + ```sql title='示例:' + IF condition THEN ... + ELSEIF condition THEN ... + ELSE ... + END IF; + ``` ### RETURN 从脚本中返回,可选择返回值。 -```sql title='示例:' +```sql title='示例:' RETURN [expr]; ``` @@ -80,7 +80,7 @@ RETURN [expr]; 从脚本中返回表结果作为字符串列。 -```sql title='示例:' +```sql title='示例:' EXECUTE IMMEDIATE $$ BEGIN CREATE OR REPLACE TABLE t1 (a INT, b FLOAT, c STRING); @@ -104,5 +104,5 @@ $$; ### 注释 -- **单行注释**: `-- 注释` -- **多行注释**: `/* 注释 */` +- **单行注释**:`-- comment` +- **多行注释**:`/* comment */` \ No newline at end of file diff --git a/docs/cn/sql-reference/00-sql-reference/99-ansi-sql.md b/docs/cn/sql-reference/00-sql-reference/99-ansi-sql.md index f48eada004..495cc3d739 100644 --- a/docs/cn/sql-reference/00-sql-reference/99-ansi-sql.md +++ b/docs/cn/sql-reference/00-sql-reference/99-ansi-sql.md @@ -1,20 +1,20 @@ --- -title: SQL 方言与一致性 +title: SQL 方言与兼容性 --- -本页详细介绍了 Databend 支持的 SQL 方言及其与 SQL 标准的符合性,特别是针对 SQL:2011 特性和 Databend 中的支持状态。 +本页面详细介绍了 Databend 支持的 SQL 方言,以及其对 SQL 标准的兼容性,特别是对 SQL:2011 特性的支持情况。 ## 支持的 SQL 方言 -SQL 方言指的是结构化查询语言的特定变体或风格。Databend 默认支持 `PostgreSQL` 方言,并提供切换到其他支持方言的灵活性。请参阅下表了解支持的方言及其各自的简要描述: +SQL 方言指的是结构化查询语言(SQL)的特定变体或风格。Databend 默认支持 `PostgreSQL` 方言,并提供了切换到其他支持方言的灵活性。请参考下表了解支持的方言及其简要描述: -| 方言 | 介绍 | 了解更多 | -|---------------|-------------------------------------------------------------------------------------------------|------------------------------| -| `PostgreSQL` | 默认支持的方言,企业中常用 | https://www.postgresql.org/ | -| `MySQL` | 开源数据库管理系统 | https://www.mysql.com/ | -| `Hive` | 大数据处理的数据仓库 | https://hive.apache.org/ | -| `Prql` | PRQL 是一种用于转换数据的现代语言 — 一种简单、强大、管道化的 SQL 替代方案 | https://github.com/PRQL/prql | -| `Experimental`| 用于测试和研究的实验性方言 | N/A | +| 方言 | 介绍 | 了解更多 | +|---------------|-----------------------------------------------------------------------------------------------|------------------------------| +| `PostgreSQL` | 默认支持的方言,常用于企业环境中 | https://www.postgresql.org/ | +| `MySQL` | 开源数据库管理系统 | https://www.mysql.com/ | +| `Hive` | 用于大数据处理的数据仓库 | https://hive.apache.org/ | +| `Prql` | PRQL 是一种用于数据转换的现代语言——简单、强大、管道化的 SQL 替代品 | https://github.com/PRQL/prql | +| `Experimental`| 用于测试和研究的实验性方言 | N/A | 要在支持的 SQL 方言之间切换或显示当前方言,请使用 `sql_dialect` 设置: @@ -26,21 +26,23 @@ SET sql_dialect = 'Prql'; SHOW SETTINGS LIKE 'sql_dialect'; ``` -## SQL 一致性概述 +## SQL 兼容性概述 -Databend 旨在符合 SQL 标准,特别是支持 ISO/IEC 9075:2011,也称为 SQL:2011。虽然这不是符合性的详尽声明,但 Databend 包含了 SQL 标准所需的许多特性,通常在语法或功能上略有不同。本页概述了 Databend 与 SQL:2011 标准的符合性水平。 +Databend 旨在符合 SQL 标准,特别是对 ISO/IEC 9075:2011(即 SQL:2011)的支持。虽然这不是一个详尽的兼容性声明,但 Databend 包含了许多 SQL 标准要求的功能,通常在语法或函数上略有差异。本页面概述了 Databend 对 SQL:2011 标准的兼容性水平。 -| 功能ID | 功能名称 | 支持情况 | 备注 | +{/*examples*/} + +| 功能 ID | 功能名称 | 是否支持 | 备注 | |:----------: |:------------------------------------------------------------------------------------------------------------------------: |:----------: |:------------------------------------------------------------------------------------------------------------: | | **E011** | **数值数据类型** | | | | E011-01 | INTEGER 和 SMALLINT 数据类型 | | | -| E011-02 | REAL, DOUBLE PRECISION 和 FLOAT 数据类型 | | | +| E011-02 | REAL、DOUBLE PRECISION 和 FLOAT 数据类型 | | | | E011-03 | DECIMAL 和 NUMERIC 数据类型 | | | | E011-04 | 算术运算符 | | | | E011-05 | 数值比较 | | | -| E011-06 | 数值数据类型之间的隐式类型转换 | | | +| E011-06 | 数值数据类型之间的隐式转换 | | | | **E021** | **字符串类型** | 部分 | | -| E021-01 | CHARACTER 数据类型 | | 不支持固定长度字符串类型 | +| E021-01 | CHARACTER 数据类型 | | 不支持定长字符串类型 | | E021-02 | CHARACTER VARYING 数据类型 | | | | E021-03 | 字符字面量 | | | | E021-04 | CHARACTER_LENGTH 函数 | | | @@ -49,9 +51,9 @@ Databend 旨在符合 SQL 标准,特别是支持 ISO/IEC 9075:2011,也称为 | E021-07 | 字符串连接 | | | | E021-08 | UPPER 和 LOWER 函数 | | | | E021-09 | TRIM 函数 | | | -| E021-10 | 固定长度和可变长度字符串类型之间的隐式类型转换 | | 不支持固定长度字符串类型 | +| E021-10 | 定长和变长字符串类型之间的隐式转换 | | 不支持定长字符串类型 | | E021-11 | POSITION 函数 | | | -| E021-12 | 字符比较 | | | +| E021-12 | 字符串比较 | | | | **E031** | **标识符** | | | | E031-01 | 带分隔符的标识符 | | | | E031-02 | 小写标识符 | | | @@ -62,13 +64,13 @@ Databend 旨在符合 SQL 标准,特别是支持 ISO/IEC 9075:2011,也称为 | E051-04 | GROUP BY 可以包含不在 SELECT 列表中的列 | | | | E051-05 | 选择项可以重命名 | | | | E051-06 | HAVING 子句 | | | -| E051-07 | 选择列表中的限定 * | | | -| E051-08 | FROM 子句中的相关名称 | | | -| E051-09 | FROM 子句中重命名列 | | | +| E051-07 | 限定符 * 在选择列表中 | | | +| E051-08 | FROM 子句中的关联名称 | | | +| E051-09 | 在 FROM 子句中重命名列 | | | | **E061** | **基本谓词和搜索条件** | 部分 | | | E061-01 | 比较谓词 | | | | E061-02 | BETWEEN 谓词 | | | -| E061-03 | IN 谓词与值列表 | | | +| E061-03 | 带值列表的 IN 谓词 | | | | E061-04 | LIKE 谓词 | | | | E061-05 | LIKE 谓词:ESCAPE 子句 | | | | E061-06 | NULL 谓词 | | | @@ -80,11 +82,11 @@ Databend 旨在符合 SQL 标准,特别是支持 ISO/IEC 9075:2011,也称为 | E061-13 | 相关子查询 | | | | E061-14 | 搜索条件 | | | | **E071** | **基本查询表达式** | 部分 | | -| E071-01 | UNION DISTINCT 表运算符 | | | -| E071-02 | UNION ALL 表运算符 | | | -| E071-03 | EXCEPT DISTINCT 表运算符 | | | -| E071-05 | 通过表运算符组合的列不需要具有完全相同的数据类型 | 部分 | 只有数据类型可以隐式强制转换的列才允许通过表运算符组合。 | -| E071-06 | 子查询中的表运算符 | | | +| E071-01 | UNION DISTINCT 表操作符 | | | +| E071-02 | UNION ALL 表操作符 | | | +| E071-03 | EXCEPT DISTINCT 表操作符 | | | +| E071-05 | 通过表操作符组合的列不需要完全相同的数据类型 | 部分 | 只有可以隐式转换的列才能通过表操作符组合。 | +| E071-06 | 子查询中的表操作符 | | | | **E081** | **基本权限** | 部分 | | | E081-01 | 表级别的 SELECT 权限 | | | | E081-02 | DELETE 权限 | | | @@ -106,37 +108,40 @@ Databend 旨在符合 SQL 标准,特别是支持 ISO/IEC 9075:2011,也称为 | E091-07 | DISTINCT 量词 | 部分 | 目前,Databend 支持 COUNT(DISTINCT ...) 和 SELECT DISTINCT ... 查询。 | | **E101** | **基本数据操作** | 部分 | | | E101-01 | INSERT 语句 | | | -| E101-03 | 搜索型 UPDATE 语句 | | | -| E101-04 | 搜索型 DELETE 语句 | | | +| E101-03 | 搜索式 UPDATE 语句 | | | +| E101-04 | 搜索式 DELETE 语句 | | | | **E111** | **单行 SELECT 语句** | | | | **E121** | **基本游标支持** | 部分 | | | E121-01 | DECLARE CURSOR | | | | E121-02 | ORDER BY 列不需要在选择列表中 | | | | E121-03 | ORDER BY 子句中的值表达式 | | | | E121-04 | OPEN 语句 | | | -| E121-06 | 定位型 UPDATE 语句 | | | -| E121-07 | 定位型 DELETE 语句 | | | +| E121-06 | 定位式 UPDATE 语句 | | | +| E121-07 | 定位式 DELETE 语句 | | | | E121-08 | CLOSE 语句 | | | | E121-10 | FETCH 语句:隐式 NEXT | | | | E121-17 | WITH HOLD 游标 | | | | **E131** | **空值支持(用空值代替值)** | | | | **E141** | **基本完整性约束** | | | -| E141-01 | NOT NULL 约束 | | Databend 默认:所有列都可为空。 | +| E141-01 | NOT NULL 约束 | | Databend 默认:所有列可为空。 | | E141-02 | NOT NULL 列的 UNIQUE 约束 | | | | E141-03 | PRIMARY KEY 约束 | | | -| E141-04 | 基本 FOREIGN KEY 约束,对引用删除和更新操作的默认 NO ACTION | | | +| E141-04 | 基本 FOREIGN KEY 约束,默认情况下引用删除操作和引用更新操作为 NO ACTION | | | | E141-06 | CHECK 约束 | | | | E141-07 | 列默认值 | | | -| E141-08 | PRIMARY KEY 推断 NOT NULL | | | -| E141-10 | 外键中的名称可以按任意顺序指定 | | | +| E141-08 | PRIMARY KEY 上推断的 NOT NULL | | | +| E141-10 | 外键中的名称可以以任何顺序指定 | | | | **E151** | **事务支持** | 部分 | | -| E151-01 | COMMIT 语句 | 部分 | Databend 仅支持每个 DML 语句的隐式事务。 | +| E151-01 | COMMIT 语句 | 部分 | Databend 仅支持每个单独的 DML 语句的隐式事务。 | | E151-02 | ROLLBACK 语句 | | | | **E152** | **基本 SET TRANSACTION 语句** | | | | E152-01 | SET TRANSACTION 语句:ISOLATION LEVEL SERIALIZABLE 子句 | | | | E152-02 | SET TRANSACTION 语句:READ ONLY 和 READ WRITE 子句 | | | -| **E153** | **带有子查询的可更新查询** | | | -| **E161** | **使用前导双减号的 SQL 注释** | | | +| **E153** | **带子查询的可更新查询** | | | +| **E161** | **使用双减号的 SQL 注释** | | | | **E171** | **SQLSTATE 支持** | | | | **E182** | **宿主语言绑定** | | | -| **F031** | **基本模式操作** | \ No newline at end of file +| **F031** | **基本模式操作** | | | +| F031-01 | 创建持久基表的 CREATE TABLE 语句 | | | +| F031-02 | CREATE VIEW 语句 | | | +| \ No newline at end of file diff --git a/docs/cn/sql-reference/00-sql-reference/index.md b/docs/cn/sql-reference/00-sql-reference/index.md index c24566b6c6..c93f6750c8 100644 --- a/docs/cn/sql-reference/00-sql-reference/index.md +++ b/docs/cn/sql-reference/00-sql-reference/index.md @@ -3,10 +3,10 @@ title: SQL 参考 slug: '/' --- -欢迎来到 SQL 参考 – 您快速访问 Databend 核心指南! +欢迎来到 SQL 参考——您的 Databend 快速入门指南! -- **通用参考:** 提供对基础元素(如数据类型、系统表和表引擎)的深入了解,帮助您建立对 Databend 结构的坚实理解。 +- **通用参考:** 提供对数据类型、系统表和表引擎等基础元素的深入解析,帮助您构建对 Databend 结构的扎实理解。 -- **SQL 命令:** 详细信息、语法和实际示例,用于执行命令,使您能够在 Databend 中自信地进行数据管理。 +- **SQL 命令:** 提供详细的命令执行信息、语法和实用示例,助您在 Databend 中自信地进行数据管理。 -- **SQL 函数:** 对 Databend 函数的简明指南,提供对其多样化功能的见解,以实现有效的数据管理和分析。 \ No newline at end of file +- **SQL 函数:** 简洁的 Databend 函数指南,深入解析其多样化的功能,助力高效的数据管理和分析。 \ No newline at end of file From f77816e7bb8883e5d51ef82103c1de3f23988467 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 9 Jan 2025 07:29:25 +0000 Subject: [PATCH 18/18] =?UTF-8?q?=F0=9F=92=ACGenerate=20LLM=20translations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../03-manage-query-warehouse-through-SQL.md | 57 +++++-------------- 1 file changed, 13 insertions(+), 44 deletions(-) diff --git a/docs/cn/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md b/docs/cn/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md index e2ed3aef21..4e736732c5 100644 --- a/docs/cn/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md +++ b/docs/cn/guides/10-deploy/01-deploy/02-production/03-manage-query-warehouse-through-SQL.md @@ -1,7 +1,7 @@ --- title: 通过 SQL 管理本地查询计算集群 sidebar_label: 通过 SQL 管理查询计算集群 -description: 如何通过 SQL 在本地管理可扩展且灵活的查询计算集群。 +description: 如何在本地通过 SQL 管理可扩展且灵活的查询计算集群。 --- import FunctionDescription from '@site/src/components/FunctionDescription'; @@ -12,19 +12,19 @@ import EEFeature from '@site/src/components/EEFeature'; -本主题解释了如何通过 SQL 在本地管理可扩展且灵活的查询计算集群。 +本主题解释了如何在本地通过 SQL 管理可扩展且灵活的查询计算集群。 ## 理解计算集群 ![本地计算集群](/img/deploy/on-premise-warehouse.png) **场景描述** -之前,我们在[部署](https://docs.databend.com/guides/deploy/deploy/production/metasrv-deploy#step-2-deploy-query-nodes)中介绍了如何使用静态的 `tenant_id` 和 `cluster_id` 来部署 Databend。 +之前,我们在[部署](https://docs.databend.com/guides/deploy/deploy/production/metasrv-deploy#step-2-deploy-query-nodes)中介绍了如何使用静态的 `tenant_id` 和 `cluster_id` 部署 Databend。 -为了使本地部署成功,必须有一个熟练的 DevOps 团队来有效管理部署和配置。这包括: +为了使本地部署成功,必须拥有一支熟练的 DevOps 团队来有效管理部署和配置。这包括: 1. 在高峰使用期间,策略性地将查询路由到不同的集群以提高并发性。 2. 根据需要重新启动节点并将其重新分配到不同的集群来调整集群大小。 -3. 实施一个强大的集群节点负载均衡策略,这在本地环境中可能会带来独特的挑战。 +3. 为集群节点实施稳健的负载均衡策略,这在本地环境中可能会带来独特的挑战。 Databend 的本地计算集群 SQL 命令提供了一个强大的解决方案,让用户在几秒钟内构建一个多集群查询计算集群。这些命令使您能够: @@ -37,7 +37,7 @@ Databend 的本地计算集群 SQL 命令提供了一个强大的解决方案, ### 计算集群相关概念 -在 Databend 中处理计算集群时,以下概念非常重要: +在使用 Databend 中的计算集群时,以下概念非常重要: - **计算集群**:用户与之交互以执行 SQL 查询的计算资源集合。它内部可以包含多个集群来处理并发查询工作负载。 - **集群**:表示一组计算资源的抽象概念。每个 SQL 查询将尝试使用所有节点的资源(包括 CPU、内存、磁盘等)来完成查询。一个计算集群由多个集群组成,每个集群在物理上是隔离的。当需要增加计算集群的并发处理能力时,可以添加新的集群。在之前静态配置的 `tenant_id` 和 `cluster_id` 部署中,计算集群是一个名为 `cluster_id` 的单集群计算集群。 @@ -94,13 +94,8 @@ show online nodes; ```sql root@localhost:8000/default> create warehouse test_warehouse_1 with warehouse_size = 2; -create warehouse test_warehouse_1 with warehouse_size = 2 - - root@localhost:8000/default> show online nodes; -show online nodes - ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ id │ type │ node_group │ warehouse │ cluster │ version │ ├────────────────────────┼───────────────┼────────────┼──────────────────┼─────────┼─────────────────────────────┤ @@ -122,8 +117,6 @@ show online nodes ```sql root@localhost:8000/default> show warehouses; -show warehouses - ┌───────────────────────────────────────────┐ │ warehouse │ type │ status │ ├────────────────┼────────────────┼─────────┤ @@ -131,19 +124,14 @@ show warehouses └───────────────────────────────────────────┘ ``` -### 使用现有的计算集群之一来运行查询 +### 使用现有的计算集群之一运行查询 system.clusters 是一个系统表,存储了所有集群及其节点的信息。 ```sql root@localhost:8000/default> use warehouse test_warehouse_1; -use warehouse test_warehouse_1 - - root@(test_warehouse_1)/default> select * from system.clusters; -SELECT * FROM system.clusters - ┌───────────────────────────────────────────────────────────────────────────────────────────┐ │ name │ cluster │ host │ port │ version │ ├────────────────────────┼──────────────────────────┼───────────┼────────┼──────────────────┤ @@ -167,8 +155,6 @@ alter warehouse test_warehouse add cluster test_cluster with cluster_size = 3 root@localhost:8000/default> show online nodes; -show online nodes - ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ id │ type │ node_group │ warehouse │ cluster │ version │ ├────────────────────────┼───────────────┼────────────┼────────────────┼──────────────┼─────────────────────────────┤ @@ -187,19 +173,16 @@ show online nodes ### 使用节点组创建和管理计算集群 -Databend 允许用户使用不同的节点组创建多集群计算集群。同一节点组下的节点将被随机分配到指定的计算集群。 +Databend 允许用户使用不同的节点组创建和管理多集群计算集群。同一节点组下的节点将被随机分配到指定的计算集群。 #### 在指定的节点组中创建计算集群 ```sql root@localhost:8000/default> create warehouse test_warehouse(assign 1 nodes from log_node, assign 2 nodes from infra_node); -create warehouse test_warehouse(assign 1 nodes from log_node, assign 2 nodes from infra_node) - - root@localhost:8000/default> show online nodes; +``` -show online nodes - +```sql ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ id │ type │ node_group │ warehouse │ cluster │ version │ ├────────────────────────┼───────────────┼────────────┼────────────────┼─────────┼─────────────────────────────┤ @@ -209,9 +192,9 @@ show online nodes │ DQUhMHYSdKqML5HJFhVbn4 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ │ Ji2SZp1zsJQHLyBUTDcrm1 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ │ a4XEkpidlCSuRkB7cMlCv4 │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ -│ dtawAX7FT56iJJv6rER6R2 │ SystemManaged │ infra_node │ │ │ v1.2.686-nightly │ +│ dtawAX7FT56iJJv6rER6R2 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ │ jze3JfzDyY2amoN7Zbq3u6 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ -│ s7Yfg7OgXPHAX7pETAbcc │ SystemManaged │ dev_node │ │ │ v1.2.686-nightly │ +│ s7Yfg7OgXPHAX7pETAbcc │ SystemManaged │ dev_node │ test_warehouse │ default │ v1.2.686-nightly │ │ tM8lj2NOTTtTwjnQIzCwI6 │ SystemManaged │ infra_node │ test_warehouse │ default │ v1.2.686-nightly │ └──────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ ``` @@ -220,12 +203,8 @@ show online nodes ```sql root@localhost:8000/default> alter warehouse test_warehouse add cluster test_cluster (assign 1 nodes from dev_node, assign 1 nodes from infra_node); -alter warehouse test_warehouse add cluster test_cluster (assign 1 nodes from dev_node, assign 1 nodes from infra_node) - - root@localhost:8000/default> show online nodes; -show online nodes ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ id │ type │ node_group │ warehouse │ cluster │ version │ ├────────────────────────┼───────────────┼────────────┼────────────────┼──────────────┼─────────────────────────────┤ @@ -247,13 +226,8 @@ show online nodes ```sql root@localhost:8000/default> alter warehouse test_warehouse assign nodes(assign 1 nodes from dev_node for default, assign 1 nodes from infra_node for default); -alter warehouse test_warehouse assign nodes(assign 1 nodes from dev_node for default, assign 1 nodes from infra_node for default) - - root@localhost:8000/default> show online nodes; -show online nodes - ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ id │ type │ node_group │ warehouse │ cluster │ version │ ├────────────────────────┼───────────────┼────────────┼────────────────┼─────────┼─────────────────────────────┤ @@ -270,18 +244,13 @@ show online nodes └──────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ ``` -#### 从计算集群的集群中按节点组移除节点 +#### 通过节点组从计算集群中移除节点 ```sql root@localhost:8000/default> alter warehouse test_warehouse unassign nodes(unassign 1 nodes from dev_node for default, unassign 2 nodes from infra_node for default); -alter warehouse test_warehouse unassign nodes(unassign 1 nodes from dev_node for default, unassign 2 nodes from infra_node for default) - - root@localhost:8000/default> show online nodes; -show online nodes - ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ id │ type │ node_group │ warehouse │ cluster │ version │ ├────────────────────────┼───────────────┼────────────┼────────────────┼─────────┼─────────────────────────────┤