跳转至

4.2 SQL语法简介

结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。SQL是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统。虽然作为一种数据库语言的基准,但是工业界数据库厂商大多都在SQL基准基础之上进行了一定程度的变化和拓展,导致了当今存在了大量不同版本的SQL文法规范。本次实验任务中,同学们仅需要重点关注于SQL语言中有关于数据操作语言(DML)数据定义语言(DDL)的部分重点文法结构。

所有需要支持的文法已经在sql.g4文件中给出,文法对应的功能可以参阅文法手册。

由于SQL语句转抽象语法树的部分是编译原理课程已经充分研究的内容,所以第一个转化阶段不作为本次实验的重点内容,可以直接基于给出的文法文件利用antlr的访问者模式生成这一部分代码。解析器部分重点的实验内容为逻辑优化和物理优化的过程。

考虑到部分同学可能没有接触过编译原理课程的相关内容,在此给出利用antlr生成C++版本编译器基本代码的流程。

  1. 配置JAVA环境(注意是JDK环境)
  2. 访问www.antlr.org/download.html,下载最新版antlr的jar包文件直接下载
  3. 通过如下指令可以生成最基本的C++版本编译器代码
java -jar <antlr4.jar文件路径> -Dlanguage=Cpp <sql.g4语法文件路径> -visitor -no-listener -o <生成代码文件输出路径>
  1. 通过继承BaseVisitor可以在编译器中实现自定义的编译过程,从而实现编译器的设计
  2. 在使用自动生成的antlr4代码时,需要下载对应版本的antlr runtime库文件,例如c++,并根据其中的文档,结合你自己使用的编译环境,在配置文件中正确包含该依赖
  3. 解析SQL过程中使用生成代码的方式
#include <string>
#include "antlr4-runtime.h"

// 包含你完成的Visitor类
#include "YourVisitor.h"

using namespace antlr4;

// 返回类型根据你的visitor决定
auto parse(std::String sSQL) {
  // 解析SQL语句sSQL的过程
  // 转化为输入流
  ANTLRInputStream sInputStream(sSQL);
  // 设置Lexer
  SQLLexer iLexer(&sInputStream);
  CommonTokenStream sTokenStream(&iLexer);
  // 设置Parser
  SQLParser iParser(&sTokenStream);
  auto iTree = iParser.program();
  // 构造你的visitor
  YourVisitor iVisitor{/*YourVisitor的构造函数*/};
  // visitor模式下执行SQL解析过程
  // --如果采用解释器方式可以在解析过程中完成执行过程(相对简单,但是很难进行进一步优化,功能上已经达到实验要求)
  // --如果采用编译器方式则需要生成自行设计的物理执行执行计划(相对复杂,易于进行进一步优化,希望有能力的同学自行调研尝试)
  auto iRes = iVisitor.visit(iTree);
  return iRes;
}
  1. 如果同学们没有接触过antlr,也可以使用自己熟悉的其他编译代码生成工具,但是需要保证能够支持要求的文法标准。

  2. antlr4使用样例参考: Makefile的样例CMakeLists的样例

Authors: Congyuan Rao (2.38%), Haowen Dong (97.62%)