<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Apache Calcite - 系列 - Victor's Code Journey</title><link>http://www.victorchu.info/series/apache-calcite/</link><description>Apache Calcite - 系列 - Victor's Code Journey</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><managingEditor>victorchu0610@outlook.com (victorchutian)</managingEditor><webMaster>victorchu0610@outlook.com (victorchutian)</webMaster><lastBuildDate>Thu, 18 Dec 2025 11:09:52 +0800</lastBuildDate><atom:link href="http://www.victorchu.info/series/apache-calcite/" rel="self" type="application/rss+xml"/><item><title>Apache Calcite 关系代数</title><link>http://www.victorchu.info/posts/2025/12/554cedc2/</link><pubDate>Thu, 18 Dec 2025 11:09:52 +0800</pubDate><author><name>victorchutian</name></author><guid>http://www.victorchu.info/posts/2025/12/554cedc2/</guid><description><![CDATA[<div class="featured-image">
                <img src="/feature-images/calcite.webp" referrerpolicy="no-referrer">
            </div><div class="details admonition note open">
    <div class="details-summary admonition-title">
        <span class="icon"><svg class="icon"
    xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><path d="M497.9 142.1l-46.1 46.1c-4.7 4.7-12.3 4.7-17 0l-111-111c-4.7-4.7-4.7-12.3 0-17l46.1-46.1c18.7-18.7 49.1-18.7 67.9 0l60.1 60.1c18.8 18.7 18.8 49.1 0 67.9zM284.2 99.8L21.6 362.4.4 483.9c-2.9 16.4 11.4 30.6 27.8 27.8l121.5-21.3 262.6-262.6c4.7-4.7 4.7-12.3 0-17l-111-111c-4.8-4.7-12.4-4.7-17.1 0zM124.1 339.9c-5.5-5.5-5.5-14.3 0-19.8l154-154c5.5-5.5 14.3-5.5 19.8 0s5.5 14.3 0 19.8l-154 154c-5.5 5.5-14.3 5.5-19.8 0zM88 424h48v36.3l-64.5 11.3-31.1-31.1L51.7 376H88v48z"/></svg></span>未完待续<span class="details-icon"><svg class="icon"
    xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 512"><!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><path d="M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z"/></svg></span>
    </div>
    <div class="details-content">
        <div class="admonition-content">持续更新中&hellip;</div></div></div>
<p>本文主要介绍Calcite 中的AST转执行计划。关系代数最早由E. F. Codd在1970年的论文<a href="https://www.seas.upenn.edu/~zives/03f/cis550/codd.pdf" target="_blank" rel="noopener noreferrer">A Relational Model of Data for Large Shared Data Banks</a>中提出, 是关系型数据库查询语言的基础, 也是查询优化技术的理论基础。 在Calcite内部, 会将SQL查询转化为一颗等价的关系算子树, 并在此基础上进行查询优化. 通用的关系代数理论可以参考之前的文章<a href="/posts/9e3f23c9/" rel="">形式化关系查询语言</a>, 接下来介绍在Calciate中的实现。</p>]]></description></item><item><title>Apache Calcite: SQL验证</title><link>http://www.victorchu.info/posts/2025/12/3e9140da/</link><pubDate>Mon, 08 Dec 2025 17:23:48 +0800</pubDate><author><name>victorchutian</name></author><guid>http://www.victorchu.info/posts/2025/12/3e9140da/</guid><description><![CDATA[<div class="featured-image">
                <img src="/feature-images/calcite.webp" referrerpolicy="no-referrer">
            </div><p>本文主要介绍Calcite 中的SQL Validator。Calcite 通过 SQL 校验器实现 SQL 绑定，SQL 校验器所需的 Catalog 信息，在<a href="/post/f2cd8cb8/" rel="">深入理解 Apache Calcite Catalog</a> 中已经做了详细的介绍。</p>
<blockquote>
  <p>SQL 绑定主要的作用是将 SQL 解析生成的 AST 和数据库的元数据进行绑定，从而生成具有语义的 AST。SQL 绑定会通过自底向上的方式遍历 AST，对抽象语法树中的节点进行绑定分析，绑定的过程中会将表、列等元数据附在语法树上，最后生成具有语义的语法树 Bounded AST。</p>

</blockquote>]]></description></item><item><title>Apache Calcite:SQL解析</title><link>http://www.victorchu.info/posts/2025/11/ef5a33c2/</link><pubDate>Thu, 13 Nov 2025 17:34:25 +0800</pubDate><author><name>victorchutian</name></author><guid>http://www.victorchu.info/posts/2025/11/ef5a33c2/</guid><description><![CDATA[<div class="featured-image">
                <img src="/feature-images/calcite.webp" referrerpolicy="no-referrer">
            </div><p>Calcite 中的SQL Parser 使用JavaCC 实现。JavaCC 在前面的博客中有过介绍, 本文就不赘述了。本文主要介绍Parser。</p>]]></description></item><item><title>深入理解 Apache Calcite-Catalog</title><link>http://www.victorchu.info/posts/2022/01/f2cd8cb8/</link><pubDate>Fri, 07 Jan 2022 10:56:04 +0800</pubDate><author><name>victorchutian</name></author><guid>http://www.victorchu.info/posts/2022/01/f2cd8cb8/</guid><description><![CDATA[<div class="featured-image">
                <img src="/feature-images/calcite.webp" referrerpolicy="no-referrer">
            </div><p>Calcite 支持管理底层数据库的元数据信息和根据元数据优化查询 SQL。但是 Calcite 不直接存储底层系统中的元数据信息，用户需要先将元数据注册到 Calcite Catalog 中，才可以使用Calcite提供的能力。</p>]]></description></item><item><title>Apache Calcite Quick Start</title><link>http://www.victorchu.info/posts/2022/01/351c6aee/</link><pubDate>Thu, 06 Jan 2022 10:54:14 +0800</pubDate><author><name>victorchutian</name></author><guid>http://www.victorchu.info/posts/2022/01/351c6aee/</guid><description><![CDATA[<div class="featured-image">
                <img src="/feature-images/calcite.webp" referrerpolicy="no-referrer">
            </div><p>Apache Calcite是一个动态的数据管理框架，从功能上看它有很多数据库管理系统的典型功能，比如 SQL 解析、SQL 校验、SQL 查询优化、SQL 生成、数据连接查询等等，但省略了一些关键功能：数据存储，处理数据的算法以及用于存储元数据的存储库。从另一方面看，正因为 Calcite  这种与数据处理和存储的无关的设计，才使它成为在多个数据源和数据处理引擎之间进行协调的绝佳选择。它也是构建数据库的完美基础：只需添加数据即可。</p>
<p>Calcite 的主要功能是 SQL 语法解析(parse)和优化(optimazation)。首先它会把 SQL 语句解析成抽象语法树（AST Abstract Syntax Tree），并基于一定规则或成本对 AST 的算法与关系进行优化，最后推给各个数据处理引擎进行执行。</p>
<p>一般来说 Calcite 解析 SQL 有下面几步:</p>
<p><img class="tw-inline" loading="lazy" src='/posts/2022/01/351c6aee/fig1.webp'    height="384" width="418"></p>
<ol>
<li>解析（Parser），Calcite 通过Java CC 将 SQL 解析成未经校验的的 AST</li>
<li>验证（Validate），该步主要作用是校验上一步中的 AST 是否合法，比如如验证 SQL scheme、字段、函数等是否存在，SQL 语句是否合法等等，此步完成之后就生成了 RelNode 树。</li>
<li>优化（Optimize），该步主要作用是优化 RelNode 树，把它转化成物理执行计划。涉及的 SQL 规则优化一般有两种：基于规则的优化（RBO）、基于成本的优化（CBO）这一步原则上说是可选的，经过 Validate 后的 RelNode 树实际就可以直接转化物理执行计划，但现代的 SQL 解析器基本上都有这一步，目的是优化 SQL 执行计划。该步骤得到的结果是物理执行计划。</li>
<li>执行（Execute），这一步主要做的是把物理执行计划转换成可在特定平台执行的程序。如 Hive 、Flink 都在此阶段将物理执行计划 CodeGen 生成相应的可执行代码。</li>
</ol>]]></description></item></channel></rss>