* feat: Adds ColumnDefaultConstraint::create_default_vector ColumnDefaultConstraint::create_default_vector is ported from MitoTable::try_get_column_default_constraint_vector. * refactor: Replace try_get_column_default_constraint_vector by create_default_vector * style: Remove unnecessary map_err in MitoTable::insert * feat: Adds compat_write For column in `dest_schema` but not in `write_batch`, this method would insert a vector with default value to the `write_batch`. If there are columns not in `dest_schema`, an error would be returned. * chore: Add info log to RegionInner::alter * feat(storage): RegionImpl::write support request with old version * feat: Add nullable check when creating default value * feat: Validate nullable and default value * chore: Modify PutOperation comments * chore: Make ColumnDescriptor::is_nullable readonly and validate name * feat: Use CompatWrite trait to replace campat::compat_write method Adds a CompactWrite trait to support padding columns to WriteBatch: - The WriteBatch and PutData implements this trait - Fix the issue that WriteBatch::schema is not updated to the schema after compat - Also validate the created column when adding to PutData The WriteBatch would also pad default value to missing columns in PutData, so the memtable inserter don't need to manually check whether the column is nullable and then insert a NullVector. All WriteBatch is ensured to have all columns defined by the schema in its PutData. * feat: Validate constraint by ColumnDefaultConstraint::validate() The ColumnDefaultConstraint::validate() would also ensure the default value has the same data type as the column's. * feat: Use NullVector for null columns * fix: Fix BinaryType returns wrong logical_type_id * fix: Fix tests and revert NullVector for null columns NullVector doesn't support custom logical type make it hard to encode/decode, which also cause the arrow/protobuf codec of write batch fail. * fix: create_default_vector use replicate to create vector with default value This would fix the test_codec_with_none_column_protobuf test, as we need to downcast the vector to construct the protobuf values. * test: add tests for column default constraints * test: Add tests for CompatWrite trait impl * test: Test write region with old schema * fix(storage): Fix replay() applies metadata too early The committed sequence of the RegionChange action is the sequence of the last entry that use the old metadata (schema). During replay, we should apply the new metadata after we see an entry that has sequence greater than (not equals to) the `RegionChange::committed_sequence` Also remove duplicate `set_committed_sequence()` call in persist_manifest_version() * chore: Removes some unreachable codes Also add more comments to document codes in these files * refactor: Refactor MitoTable::insert Return error if we could not create a default vector for given column, instead of ignoring the error * chore: Fix incorrect comments * chore: Fix typo in error message
GreptimeDB
GreptimeDB: the next-generation hybrid timeseries/analytics processing database in the cloud.
Getting Started
Prerequisites
To compile GreptimeDB from source, you'll need the following:
- Rust
- Protobuf
Rust
The easiest way to install Rust is to use rustup, which will check our rust-toolchain file and install correct Rust version for you.
Protobuf
protoc is required for compiling .proto files. protobuf is available from
major package manager on macos and linux distributions. You can find an
installation instructions here.
Build the Docker Image
docker build --network host -f docker/Dockerfile -t greptimedb .
Usage
Start Datanode
// Start datanode with default options.
cargo run -- datanode start
OR
// Start datanode with `http-addr` option.
cargo run -- datanode start --http-addr=0.0.0.0:9999
OR
// Start datanode with `log-dir` and `log-level` options.
cargo run -- --log-dir=logs --log-level=debug datanode start
Start datanode with config file:
cargo run -- --log-dir=logs --log-level=debug datanode start -c ./config/datanode.example.toml
Start datanode by runing docker container:
docker run -p 3000:3000 \
-p 3001:3001 \
-p 3306:3306 \
greptimedb
Start Frontend
Frontend should connect to Datanode, so Datanode must have been started at first!
// Connects to local Datanode at its default GRPC port: 3001
// Start Frontend with default options.
cargo run -- frontend start
OR
// Start Frontend with `mysql-addr` option.
cargo run -- frontend start --mysql-addr=0.0.0.0:9999
OR
// Start datanode with `log-dir` and `log-level` options.
cargo run -- --log-dir=logs --log-level=debug frontend start
Start datanode with config file:
cargo run -- --log-dir=logs --log-level=debug frontend start -c ./config/frontend.example.toml
SQL Operations
-
Connecting DB by mysql client:
# The datanode listen on port 3306 by default. mysql -h 127.0.0.1 -P 3306 -
Create table:
CREATE TABLE monitor ( host STRING, ts TIMESTAMP, cpu DOUBLE DEFAULT 0, memory DOUBLE, TIME INDEX (ts), PRIMARY KEY(host)) ENGINE=mito WITH(regions=1); -
Insert data:
INSERT INTO monitor(host, cpu, memory, ts) VALUES ('host1', 66.6, 1024, 1660897955); INSERT INTO monitor(host, cpu, memory, ts) VALUES ('host2', 77.7, 2048, 1660897956); INSERT INTO monitor(host, cpu, memory, ts) VALUES ('host3', 88.8, 4096, 1660897957); -
Query data:
mysql> SELECT * FROM monitor; +-------+------------+------+--------+ | host | ts | cpu | memory | +-------+------------+------+--------+ | host1 | 1660897955 | 66.6 | 1024 | | host2 | 1660897956 | 77.7 | 2048 | | host3 | 1660897957 | 88.8 | 4096 | +-------+------------+------+--------+ 3 rows in set (0.01 sec)You can delete your data by removing
/tmp/greptimedb.
Contribute
- Install rust
- Install
pre-commitfor run hooks on every commit automatically such ascargo fmtetc.
$ pip install pre-commit
or
$ brew install pre-commit
$
- Install the git hook scripts:
$ pre-commit install
pre-commit installed at .git/hooks/pre-commit
$ pre-commit install --hook-type commit-msg
pre-commit installed at .git/hooks/commit-msg
$ pre-commit install --hook-type pre-push
pre-commit installed at .git/hooks/pre-pus
now pre-commit will run automatically on git commit.
- Check out branch from
developand make your contribution. Follow the style guide. Create a PR when you are ready, feel free and have fun!