Trino源码学习-准备工作
本文是学习Trino源码前的准备工作。在开始之前,先做好准备工作:
- 编译环境 Mac OS X or Linux
- 安装Java 17.0.4+, Trino 依赖 Java 17.0.4 或更新的版本来进行构建(本文基于 https://gitee.com/chutian0610/trino/tree/code-study/)。
- 安装 Maven, Maven的版本不重要,Trino编译时会使用mvnw指定mvn版本
- 安装 Docker
本文是学习Trino源码前的准备工作。在开始之前,先做好准备工作:
最近在做SQL方面的工作,主要是SQL语法解析和改写。因此打算记录下解析的技术&工具。
文本解析一般首推使用正则表达式。对于大多数的文本,正则都可以很好的解析。以ELK套件中的Logstash为例,其内置的Grok插件支持了120+种常用Pattern,可以很好的用于解析多种形式的文本。但是。正则不是文本解析的万能钥匙,由于正则表达式的自身实现约束,大多数正则表达式引擎不能较好的处理嵌套结构的数据。此外,对于脚本语言或编程语言,正则表达式也是无能为力。
举个例子,如果想替换SQL中的某个字段名,如果只是简单的使用正则替换,那么很可能会错误修改其他位置的文本。例如想修改下面SQL中的order_cnt别名时,就很有可能错误修改其他位置的order_cnt,要避免这类问题需要对正则添加很多断言和约束,由于实际场景中可能会对SQL的列名,表名,条件等各个位置进行改写,场景十分复杂。所以正则这种方式不能从根本上解决问题。由此,引出了接下来要介绍的技术–语法解析器(Parser)。
select
dt,
sum(order_cnt) as order_cnt
from(
select order_cnt
from order_info
where dt between xxx and xxx
)group by dtLFU(Least Frequently Used)最近最少使用算法。它是基于“如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小”的思路。
举个例子,缓存空间大小为3:
Maven依赖传递是Maven的核心机制之一,它能够一定程度上简化Maven的依赖配置。
clickhouse 在查询中使用别名时可能会有下面的问题1。
$ SELECT avg(number) AS number, max(number) FROM numbers(10)
Aggregate function avg(number) is found inside another aggregate function in query.在排查线上问题的时候,发现日志中只有java.lang.NullPointerException: null,没有打印出日志堆栈。
在使用antlr生成的语法解析器处理多个文件后,JVM 最终会产生内存不足异常,PredictionContextCache中的hashMap和DFA数组_decisionToDFA会不断增长。因为 PredictionContextCache和_decisionToDFA在生成Parser和Lexer中是类共享的。
public class XXXParser extends Parser {
protected static final DFA[] _decisionToDFA;
protected static final PredictionContextCache _sharedContextCache =
new PredictionContextCache();
// ...
}上一篇我们介绍了早期计算机和现代计算机构成位的不同硬件,计算机最底层的抽象“从硬件层抽象出二进制值”,以及二进制值的简单计算(和对应的门电路)。这一篇文章,将介绍一些更复杂的门电路(Gate Combinations )。
复杂门电路的重要设计思想:Design small circuits to be used in a bigger circuit。
本文的目的是快速了解计算机系统。文章标题模仿了《What Every Programmer Should Know About Memory》