代码之旅

I love Coding !

由于评论从畅言云评迁移到waline,导致评论数据丢失。非本人删除,各位大佬见谅!!!

flowchart LR
    subgraph calcite
    A[1.SQL] -->|Parser| B[2.SQL Node]
    B -->|Validator| C[3.SQL Node]
    C -->|Convertor| D[4.Rel Node]
    D -->|Optimizer| E[5.Rel Node]
    end
    E --> F[6.Physical Excute Plan]

本文主要介绍Calcite 中的SQL Validator。Calcite 通过 SQL 校验器实现 SQL 绑定,SQL 校验器所需的 Catalog 信息,在深入理解 Apache Calcite Catalog 中已经做了详细的介绍。

SQL 绑定主要的作用是将 SQL 解析生成的 AST 和数据库的元数据进行绑定,从而生成具有语义的 AST。SQL 绑定会通过自底向上的方式遍历 AST,对抽象语法树中的节点进行绑定分析,绑定的过程中会将表、列等元数据附在语法树上,最后生成具有语义的语法树 Bounded AST。

阅读全文 »

计算机科学中的随机数分为两种:

  • 真随机数: 其生成过程是不可预测、不可重复的,完全基于自然界中物理过程的随机性。
  • 伪随机数: 其生成过程是确定性的、可预测的,但通过一个算法使得生成的数字序列看起来像是随机的。
    • 使用一个确定的数学公式。它从一个初始值(称为“种子”)开始,通过算法计算出下一个数,然后用这个数作为新的内部状态,继续计算下一个数,如此反复。
阅读全文 »

flowchart LR
    subgraph calcite
    A[1.SQL] -->|Parser| B[2.SQL Node]
    B -->|Validator| C[3.SQL Node]
    C -->|Convertor| D[4.Rel Node]
    D -->|Optimizer| E[5.Rel Node]
    end
    E --> F[6.Physical Excute Plan]

Calcite 中的SQL Parser 使用JavaCC 实现。JavaCC 在前面的博客中有过介绍, 本文就不赘述了。本文主要介绍Parser。

阅读全文 »

上一篇文章我们简单介绍了 JavaCC的语法和使用。本文将以实现一个计算器为例,介绍JavaCC 在实际代码中的使用。

阅读全文 »

JavaCC 是 java 生态中常用的Parser Generator。特征如下:

  • JavaCC 生成的解析器是基于LL 的,默认是LL(1),通过配置可以支持 LL(K)。
  • 由于是LL 方式,需要用户自己书写递归下降的语法规则来避免出现左递归问题。
  • JavaCC 支持 EBNF 语法范式。

JavaCC的工作流程如下:

  • 令牌管理器读入一个字符序列并生成一个称为令牌的对象序列。用于将字符序列分解为标记序列的规则取决于语言-它们由用户作为正则表达式的集合提供。
  • 解析器使用一个令牌序列,分析它的结构,并产生一个由用户定义的输出。
阅读全文 »

假设我有两个 github 账号,victor(for personal) 和 superman(for work)。如果我想在同一台电脑上使用这两个账号进行 git push/pull。该如何配置?

阅读全文 »

如何在 Rust 的多线程中共享值?

  • 共享值的方式是使用Arc
  • 修改值的方式是使用Mutex
阅读全文 »

Pin 和 Unpin 标记 trait 搭配使用。固定保证了实现了 !Unpin trait 的对象不会被移动。先用一个简单点的例子来理解固定。

Rust 既支持了基于系统线程的多线程编程模型,也支持了基于async/await的异步编程模型。Rust 的async编程有有以下特性:

  • Future 在 Rust 中是惰性的
  • Async 在 Rust 中使用开销是零
  • Rust 没有内置异步调用所必需的运行时,但是社区生态中已经提供了非常优异的运行时实现,例如 tokio和async-std
  • 运行时同时支持单线程和多线程
阅读全文 »