FnckSQL 是什么
FnckSQL 是由个人开发者出于爱好独立实现的基于 LSM KV 的 SQL 数据库管理系统。这个 SQL 数据库将向你证明任何人都可以编写数据库(即使是核心作者也找不到工作)。如果你是数据库相关的爱好者,让我们一起向这个“美好”的行业竖起中指🖕。
欢迎访问我们的网站,由 FnckSQL 提供动力: http://www.kipdata.site/
快速开始
提示:首先安装 Rust 工具链。
克隆仓库
git clone https://github.com/KipData/FnckSQL.git
然后使用 psql
进入 SQL 环境
在代码中使用 FnckSQL
let fnck_sql = DataBaseBuilder::path("./data")
.build()
.await?;
let tuples = fnck_sql.run("select * from t1").await?;
支持的存储:
- KipDB
Docker
拉取镜像
docker pull kould23333/fncksql:latest
从源代码构建
git clone https://github.com/KipData/FnckSQL.git
cd FnckSQL
docker build -t kould23333/fncksql:latest .
运行
我们在镜像中安装了 psql
工具,方便调试。
你可以使用 psql -h 127.0.0.1 -p 5432
来这样做。
docker run -d \
--name=fncksql \
-p 5432:5432 \
--restart=always \
-v fncksql-data:/fnck_sql/fncksql_data \
-v /etc/localtime:/etc/localtime:ro \
kould23333/fncksql:latest
特性
- ORM 映射:
features = ["marcos"]
```rust[derive(Default, Debug, PartialEq)]
struct MyStruct { c1: i32, c2: String, }
implement_from_tuple!( MyStruct, ( c1: i32 => |inner: &mut MyStruct, value| { if let DataValue::Int32(Some(val)) = value { inner.c1 = val; } }, c2: String => |inner: &mut MyStruct, value| { if let DataValue::Utf8(Some(val)) = value { inner.c2 = val; } } ) );
- 用户定义函数:`features = ["marcos"]`
```rust
function!(TestFunction::test(LogicalType::Integer, LogicalType::Integer) -> LogicalType::Integer => |v1: ValueRef, v2: ValueRef| {
let plus_binary_evaluator = EvaluatorFactory::binary_create(LogicalType::Integer, BinaryOperator::Plus)?;
let value = plus_binary_evaluator.binary_eval(&v1, &v2);
let plus_unary_evaluator = EvaluatorFactory::unary_create(LogicalType::Integer, UnaryOperator::Minus)?;
Ok(plus_unary_evaluator.unary_eval(&value))
});
let fnck_sql = DataBaseBuilder::path("./data")
.register_function(TestFunction::new())
.build()
.await?;
优化器
- RBO
- 基于 RBO 的 CBO(物理选择)
执行
- Volcano
- LuaJIT 上的代码生成:
features = ["codegen_execute"]
MVCC 事务
- 乐观锁
字段选项
- [not] null
- unique
- primary key
SQL where 选项
- is [not] null
- [not] like
- [not] in
支持索引类型
- PrimaryKey
- Unique
- Normal
- Composite
支持多种主键类型
- Tinyint
- UTinyint
- Smallint
- USmallint
- Integer
- UInteger
- Bigint
- UBigint
- Char
- Varchar
DDL
- Begin(仅限服务器)
- Commit(仅限服务器)
- Rollback(仅限服务器)
- Create
- 表
- 索引:Unique\Normal\Composite
- Drop
- 表
- 索引
- Alter
- 添加列
- 删除列
- 清空
DQL
- Select
- SeqScan
- IndexScan
- Where
- Distinct
- 别名
- 聚合:count()/sum()/avg()/min()/max()
- 子查询[select/from/where]
- Join:Inner/Left/Right/Full/Cross (Natural\Using)
- Group By
- Having
- Order By
- Limit
- 显示表
- 解释
- 描述
- Union
- Select
DML
- Insert
- Insert Overwrite
- Update
- Delete
- 分析
数据类型
- Invalid
- SqlNull
- Boolean
- Tinyint
- UTinyint
- Smallint
- USmallint
- Integer
- UInteger
- Bigint
- UBigint
- Float
- Double
- Char
- Varchar
- Date
- DateTime
- Time
- Tuple
路线图
- SQL 2016
许可证
FnckSQL 使用 Apache 2.0 许可证,在开放贡献和允许你随意使用该软件之间取得平衡。
贡献者
感谢
- Fedomn/sqlrs:主要参考资料,优化器和执行器都参考了 sqlrs 的设计
- systemxlabs/bustubx
- duckdb/duckdb