| 优化buffer pool | 10 | 必做。实现LRU淘汰算法或其它淘汰算法。<br/> 题目没有明确的测试方法。同学可以通过这个简单的题目学习disk_buffer_pool的工作原理。 | |
| 查询元数据校验<br>select-meta | 10 | 必做。查询语句中存在不存在的列名、表名等,需要返回失败。需要检查代码,判断是否需要返回错误的地方都返回错误了。 | create table t(id int, age int);<br/>select * from t where name='a'; <br/>select address from t where id=1;<br/>select * from t_1000;<br/>select * from t where not_exists_col=1; |
| drop table<br>drop-table | 10 | 必做。删除表。清除表相关的资源。<br/>注意:要删除所有与表关联的数据,不仅仅是在create table时创建的资源,还包括索引等数据。 | create table t(id int, age int);<br/>create table t(id int, name char);<br/>drop table t;<br/>create table t(id int, name char); |
| 实现update功能<br>update | 10 | 必做。update单个字段即可。<br/>可以参考insert_record和delete_record的实现。目前能支持update的语法解析,但是不能执行。需要考虑带条件查询的更新,和不带条件的更新。 | update t set age =100 where id=2;<br/>update set age=20 where id>100; |
| 增加date字段<br>date | 10 | 必做。要求实现日期类型字段。date测试不会超过2038年2月,不会小于1970年1月1号。注意处理非法的date输入,需要返回FAILURE。<br/>当前已经支持了int、char、float类型,在此基础上实现date类型的字段。<br/>这道题目需要从词法解析开始,一直调整代码到执行阶段,还需要考虑DATE类型数据的存储。<br/>注意:<br/>- 需要考虑date字段作为索引时的处理,以及如何比较大小;<br/>- 这里限制了日期的范围,所以简化了溢出处理的逻辑,测试数据中也删除了溢出日期,比如没有 2040-01-02;<br/>- 需要考虑闰年。 | create table t(id int, birthday date);<br/>insert into t values(1, '2020-09-10');<br/>insert into t values(2, '2021-1-2');<br/>select * from t; |
| 多表查询<br>select-tables | 10 | 必做。当前系统支持单表查询的功能,需要在此基础上支持多张表的笛卡尔积关联查询。需要实现select * from t1,t2; select t1.\*,t2.\* from t1,t2;以及select t1.id,t2.id from t1,t2;查询可能会带条件。查询结果展示格式参考单表查询。每一列必须带有表信息,比如:<br/>t1.id \| t2.id <br/>1 \| 1 | select * from t1,t2;<br/>select * from t1,t2 where t1.id=t2.id and t1.age > 10;<br/>select * from t1,t2,t3; |
| 聚合运算<br>aggregation-func | 10 | 实现聚合函数 max/min/count/avg.<br/>包含聚合字段时,只会出现聚合字段,不会出现如select id, count(age) from t;这样的测试语句。聚合函数中的参数不会是表达式,比如age +1。 | select max(age) from t1; <br/>select count(*) from t1; <br/>select count(1) from t1; <br/>select count(id) from t1; |
| 多表join操作<br>join-tables | 20 | INNER JOIN。需要支持join多张表。主要工作是语法扩展。注意带有多条on条件的join操作。 | select * from t1 inner join t2 on t1.id=t2.id;<br/>select * from t1 inner join t2 on t1.id=t2.id inner join t3 on t1.id=t3.id;<br/>selec * from t1 inner join t2 on t1.id=t2.id and t2.age>10 where t1.name >='a'; |
| 唯一索引<br>unique | 10 | 唯一索引:create unique index。 | create unique index i_id on t1(id);<br/>insert into t1 values(1,1);<br/>insert into t1 values(1,2); -- failed |
| 支持NULL类型<br>null | 10 | 字段支持NULL值。包括但不限于建表、查询和插入。默认情况不允许为NULL,使用nullable关键字表示字段允许为NULL。<br/>Null不区分大小写。<br/>注意NULL字段的对比规则是NULL与**任何** 数据对比,都是FALSE。<br/>如果实现了NULL,需要调整聚合函数的实现。 | create table t1 (id int not null, age int not null, address nullable); <br/>create table t1 (id int, age int, address char nullable);<br/> insert into t1 values(1,1, null); |
| 简单子查询<br>simple-sub-query | 10 | 支持简单的IN(NOT IN)语句;<br/>支持与子查询结果做比较运算;<br/>支持子查询中带聚合函数。<br/>子查询中不会与主查询做关联。 | select * from t1 where name in(select name from t2);<br/>select * from t1 where t1.age >(select max(t2.age) from t2);<br/>select * from t1 where t1.age > (select avg(t2.age) from t2) and t1.age > 20.0; <br/>NOTE: 表达式中可能存在不同类型值比较 |
| 多列索引<br>multi-index | 20 | 多个字段关联起来称为单个索引。<br/> | create index i_id on t1(id, age); |
| 超长字段<br>text | 20 | 超长字段的长度可能超出一页,比如常见的text,blob等。这里仅要求实现text(text 长度固定4096字节),可以当做字符串实现。<br/>注意:当前的查询,只能支持一次返回少量数据,需要扩展<br/>如果输入的字符串长度,超过4096,那么应该保存4096字节,剩余的数据截断。<br/>需要调整record_manager的实现。当前record_manager是按照定长长度来管理页面的。 | create table t(id int, age int, info text);<br/>insert into t values(1,1, 'a very very long string');<br/>select * from t where id=1; |
| 查询支持表达式<br>expression | 20 | 查询中支持运算表达式,这里的运算表达式包括 +-*/。<br/>仅支持基本数据的运算即可,不对date字段做考察。<br/>运算出现异常,按照NULL规则处理。<br/>只需要考虑select。 | select * from t1,t2 where t1.age +10 > t2.age *2 + 3-(t1.age +10)/3;<br/>select t1.col1+t2.col2 from t1,t2 where t1.age +10 > t2.age *2 + 3-(t1.age +10)/3; |
| 复杂子查询<br>complex-sub-query | 20 | 子查询在WHERE条件中,子查询语句支持多张表与AND条件表达式,查询条件支持max/min等。<br>注意考虑一下子查询与父表相关联的情况。 | select * from t1 where age in (select id from t2 where t2.name in (select name from t3)) |
| 排序<br>order-by | 10 | 支持oder by功能。不指定排序顺序默认为升序(asc)。<br/>不需要支持oder by字段为数字的情况,比如select * from t order by 1; | select * from t,t1 where t.id=t1.id order by t.id asc,t1.score desc; |
| 分组<br>group-by | 20 | 支持group by功能。group by中的聚合函数也不要求支持表达式 | select t.id, t.name, avg(t.score),avg(t2.age) from t,t2 where t.id=t2.id group by t.id,t.name; |
date不需要考虑和string(char)做对比。比如 select * from t where d > '123'; select * from t where d <'abc';不会测试这种场景。但是需要考虑日期与日期的比较,比如select*fromtwhered> '2021-01-21';。
date也不会用来计算平均值。
select * form t where d=’2021-02-30‘; 这种场景在mysql下面是返回空数据集,但是我们现在约定都返回 FAILURE。