Built by @KipData ββββββββββββ βββ ββββββββββ βββ ββββββββ βββββββ βββ βββββββββββββ ββββββββββββββ ββββ ββββββββββββββββββββ ββββββ ββββββ ββββββ βββββββ βββββββββββ ββββββ ββββββ βββββββββββββ βββββββ βββββββββββββ ββββββ βββ βββ βββββββββββββββββ βββ βββββββββββββββββββββββββ βββ βββ βββββ ββββββββββ βββ ββββββββ βββββββ ββββββββ ----------------------------------- π
FnckSQL is a high-performance SQL database that can be embedded in Rust code (based on RocksDB by default), making it possible to call SQL just like calling a function. It supports most of the syntax of SQL 2016.
Tips: Install rust toolchain and llvm first.
Clone the repository
git clone https://github.com/KipData/FnckSQL.git
let fnck_sql = DataBaseBuilder::path("./data").build()?;
let tuples = fnck_sql.run("select * from t1")?;
run cargo run --features="net"
to start server
then use psql
to enter sql
Storage Support:
- RocksDB
docker pull kould23333/fncksql:latest
git clone https://github.com/KipData/FnckSQL.git
cd FnckSQL
docker build -t kould23333/fncksql:latest .
We installed the psql
tool in the image for easy debug.
You can use psql -h 127.0.0.1 -p 5432
to do this.
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 Mapping:
features = ["macros"]
#[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;
}
}
)
);
- User-Defined Function:
features = ["macros"]
scala_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_scala_function(TestFunction::new())
.build()?;
- User-Defined Table Function:
features = ["macros"]
table_function!(MyTableFunction::test_numbers(LogicalType::Integer) -> [c1: LogicalType::Integer, c2: LogicalType::Integer] => (|v1: ValueRef| {
let num = v1.i32().unwrap();
Ok(Box::new((0..num)
.into_iter()
.map(|i| Ok(Tuple {
id: None,
values: vec![
Arc::new(DataValue::Int32(Some(i))),
Arc::new(DataValue::Int32(Some(i))),
]
}))) as Box<dyn Iterator<Item = Result<Tuple, DatabaseError>>>)
}));
let fnck_sql = DataBaseBuilder::path("./data")
.register_table_function(MyTableFunction::new())
.build()?;
- Optimizer
- RBO
- CBO based on RBO(Physical Selection)
- Execute
- Volcano
- MVCC Transaction
- Optimistic
- Field options
- [not] null
- unique
- primary key
- SQL where options
- is [not] null
- [not] like
- [not] in
- Supports index type
- PrimaryKey
- Unique
- Normal
- Composite
- Supports multiple primary key types
- Tinyint
- UTinyint
- Smallint
- USmallint
- Integer
- UInteger
- Bigint
- UBigint
- Char
- Varchar
- DDL
- Begin (Server only)
- Commit (Server only)
- Rollback (Server only)
- Create
- Table
- Index: Unique\Normal\Composite
- Drop
- Table
- Index
- Alert
- Add Column
- Drop Column
- Truncate
- DQL
- Select
- SeqScan
- IndexScan
- Where
- Distinct
- Alias
- Aggregation: count()/sum()/avg()/min()/max()
- SubQuery[select/from/where]
- Join: Inner/Left/Right/Full/Cross (Natural\Using)
- Group By
- Having
- Order By
- Limit
- Show Tables
- Explain
- Describe
- Union
- Select
- DML
- Insert
- Insert Overwrite
- Update
- Delete
- Analyze
- DataTypes
- Invalid
- SqlNull
- Boolean
- Tinyint
- UTinyint
- Smallint
- USmallint
- Integer
- UInteger
- Bigint
- UBigint
- Float
- Double
- Char
- Varchar
- Date
- DateTime
- Time
- Tuple
- SQL 2016
FnckSQL uses the Apache 2.0 license to strike a balance between open contributions and allowing you to use the software however you want.
- Fedomn/sqlrs: Main reference materials, Optimizer and Executor all refer to the design of sqlrs
- systemxlabs/bustubx
- duckdb/duckdb