mirror of
https://github.com/GreptimeTeam/greptimedb.git
synced 2026-05-21 07:20:41 +00:00
* fix: window sort off by one precision TimeRange&better alias track (#8019) * fix: window sort track alias&off by one precision TimeRange Signed-off-by: discord9 <discord9@163.com> * chore: more test Signed-off-by: discord9 <discord9@163.com> * refactor: clear helper Signed-off-by: discord9 <discord9@163.com> * dedup a bit Signed-off-by: discord9 <discord9@163.com> * feat: even more guard Signed-off-by: discord9 <discord9@163.com> * fix: case insensitive Signed-off-by: discord9 <discord9@163.com> --------- Signed-off-by: discord9 <discord9@163.com> (cherry picked from commit9fafd879ed) Signed-off-by: evenyag <realevenyag@gmail.com> * fix(server): describe EXPLAIN statements so bind parameters work (#8035) * fix(server): describe EXPLAIN statements so bind parameters work `do_describe_inner` only planned `Insert`/`Query`/`Delete`, so `EXPLAIN` and `EXPLAIN ANALYZE` fell through to the non-plan branch and had no parameter-type inference. At Bind time the Postgres handler then reported `unsupported_parameter_type` even though the inner query would have worked on its own. Recurse one level into `Statement::Explain` so that an EXPLAIN wrapping a plannable statement goes through the same describe path. Adds a tokio-postgres integration test that exercises `EXPLAIN`/`EXPLAIN ANALYZE` over the extended query protocol. Fixes #8029 Signed-off-by: BootstrapperSBL <yvanwww@gmail.com> * refactor(server): extract plannable-inner check into closure Reduce duplication between the direct match and the EXPLAIN inner match by factoring out is_inner_plannable. Behaviour unchanged. Signed-off-by: BootstrapperSBL <yvanwww@gmail.com> --------- Signed-off-by: BootstrapperSBL <yvanwww@gmail.com> (cherry picked from commit793545d8e6) Signed-off-by: evenyag <realevenyag@gmail.com> * fix: windows windowed sort ci (#8039) * fix: windows windowed sort ci Signed-off-by: discord9 <discord9@163.com> * chore Signed-off-by: discord9 <discord9@163.com> * c Signed-off-by: discord9 <discord9@163.com> --------- Signed-off-by: discord9 <discord9@163.com> (cherry picked from commit760581b2a0) Signed-off-by: evenyag <realevenyag@gmail.com> * fix: batched prometheus ingest row metric (#8054) * fix: count batched prometheus ingest rows Signed-off-by: Lei, HUANG <mrsatangel@gmail.com> * fix: align batched ingest metrics Use actual affected rows when updating `DIST_INGEST_ROW_COUNT` and cache the flush database label to avoid repeated `get_db_string` allocation. Files: `src/servers/src/pending_rows_batcher.rs` Signed-off-by: Lei, HUANG <mrsatangel@gmail.com> --------- Signed-off-by: Lei, HUANG <mrsatangel@gmail.com> (cherry picked from commitf0b3ee4830) Signed-off-by: evenyag <realevenyag@gmail.com> * fix: preserve case in database name from connection string (#8062) `parse_optional_catalog_and_schema_from_db_string` unconditionally lowercased database/schema names, causing quoted database names (e.g. `CREATE DATABASE "TestQuery"`) to be stored with preserved case but looked up as lowercase on connection, resulting in "Database not found". Fixes #8059 Signed-off-by: Lei, HUANG <mrsatangel@gmail.com> (cherry picked from commitf5c1d5d9bc) Signed-off-by: evenyag <realevenyag@gmail.com> * fix(metric-engine): validate column types and require time index in verify_rows (#8018) * fix(metric-engine): validate column types and require time index in verify_rows The remote-write path into the metric engine previously bypassed schema validation. When a row's time index column carried a non-timestamp datatype (e.g. a string), the request reached mito's ValueBuilder::push for the timestamp builder and panicked instead of surfacing a typed error. Cache the (column_id, data_type, semantic_type) tuple for each physical column on PhysicalRegionState and use it in verify_rows to: - reject columns whose datatype or semantic type disagrees with the physical region's schema (mirrors mito's WriteRequest::check_schema) - reject requests that omit the time index column entirely Field columns stay optional; tag completeness needs per-logical-region metadata that verify_rows doesn't have and is left to a follow-up. Fixes #7990. Signed-off-by: BootstrapperSBL <yvanwww01@gmail.com> * refactor(metric-engine): simplify PhysicalColumnInfo construction - Add From<ColumnMetadata> and From<&ColumnMetadata> for PhysicalColumnInfo so call sites can use metadata.into() instead of repeating the field list. - Replace the four struct-literal constructions in create.rs, open.rs and alter.rs with the conversion. - In verify_rows, pass &col.column_name to ColumnNotFoundSnafu instead of cloning it explicitly (snafu's context handles the conversion). Signed-off-by: BootstrapperSBL <yvanwww01@gmail.com> * perf(metric-engine): cache time index column name in PhysicalRegionState verify_rows previously scanned every physical column on each row batch to find the timestamp column. Since the time index is fixed at region creation and never changes, stash its name on PhysicalRegionState when the region is first registered and read it directly from there. add_physical_columns carries a debug_assert to document the invariant that alter never introduces a new time index. Signed-off-by: BootstrapperSBL <yvanwww01@gmail.com> * perf(metric-engine): borrow physical column names when building name_to_id On the row-write path we built a HashMap<String, ColumnId> by cloning every column name out of the physical region's cached state. The map is scoped to the block that holds the state's read guard, so there's no need to own the keys. Switch the map to HashMap<&str, ColumnId> and widen RowsIter::new / IterIndex::new to accept any key type that borrows as str. Existing test helpers that pass HashMap<String, ColumnId> keep working through the Borrow<str> bound. Signed-off-by: BootstrapperSBL <yvanwww01@gmail.com> * fix: validate metric rows against physical schema Cache physical column metadata in the metric engine state so row validation and row modification can use the same source of truth for column IDs, data types, and semantic types. Validate incoming metric rows against the physical schema before writes. Put requests now require the time index and the expected field column, while delete requests keep accepting primary-key-plus-timestamp payloads by skipping the field completeness check. Pass physical column metadata directly into RowsIter instead of rebuilding a name-to-column-id map at each call site, and cover the new validation paths with tests for missing time indexes, missing fields, and duplicate field columns. Signed-off-by: evenyag <realevenyag@gmail.com> * fix: do not allow adding a new field Signed-off-by: evenyag <realevenyag@gmail.com> * fix: fill default value for fields Signed-off-by: evenyag <realevenyag@gmail.com> * fix: fill default for nullable fields Signed-off-by: evenyag <realevenyag@gmail.com> --------- Signed-off-by: BootstrapperSBL <yvanwww01@gmail.com> Signed-off-by: evenyag <realevenyag@gmail.com> Co-authored-by: BootstrapperSBL <yvanwww01@gmail.com> Co-authored-by: evenyag <realevenyag@gmail.com> (cherry picked from commitd1873ca31d) Signed-off-by: evenyag <realevenyag@gmail.com> * fix: type inference for sql rewrite (#8052) fix: type inference for rewrited sql (cherry picked from commit5b47ec24ec) Signed-off-by: evenyag <realevenyag@gmail.com> * fix: infer time index from column meta on derived table (#8013) * rough fix Signed-off-by: Ruihang Xia <waynestxia@gmail.com> * reorganize Signed-off-by: Ruihang Xia <waynestxia@gmail.com> * simplification Signed-off-by: Ruihang Xia <waynestxia@gmail.com> * fix format Signed-off-by: Ruihang Xia <waynestxia@gmail.com> * add comment Signed-off-by: Ruihang Xia <waynestxia@gmail.com> * enhance default by infer Signed-off-by: Ruihang Xia <waynestxia@gmail.com> * supply comments Signed-off-by: Ruihang Xia <waynestxia@gmail.com> * update sqlness result Signed-off-by: Ruihang Xia <waynestxia@gmail.com> --------- Signed-off-by: Ruihang Xia <waynestxia@gmail.com> (cherry picked from commit0d90f7407c) Signed-off-by: evenyag <realevenyag@gmail.com> * feat: pre-cast constants (#7926) * init impl Signed-off-by: Ruihang Xia <waynestxia@gmail.com> * handle no cast Signed-off-by: Ruihang Xia <waynestxia@gmail.com> * refactor using common-expr Signed-off-by: Ruihang Xia <waynestxia@gmail.com> * extend matching pattern Signed-off-by: Ruihang Xia <waynestxia@gmail.com> * more tests Signed-off-by: Ruihang Xia <waynestxia@gmail.com> * simplification Signed-off-by: Ruihang Xia <waynestxia@gmail.com> * fix zero timestamp Signed-off-by: Ruihang Xia <waynestxia@gmail.com> * fix: normalize sqlness partition count output Signed-off-by: Ruihang Xia <waynestxia@gmail.com> * fix: normalize remaining sqlness plan output Signed-off-by: Ruihang Xia <waynestxia@gmail.com> * fix: normalize sqlness repartition details in tql explain Signed-off-by: Ruihang Xia <waynestxia@gmail.com> * fix: tighten const normalization casts * test: normalize standalone tql explain repartition output * resolve cr comments Signed-off-by: Ruihang Xia <waynestxia@gmail.com> * simplify Signed-off-by: Ruihang Xia <waynestxia@gmail.com> --------- Signed-off-by: Ruihang Xia <waynestxia@gmail.com> (cherry picked from commit9133d0464f) Signed-off-by: evenyag <realevenyag@gmail.com> * fix(mito): ignore compaction override in enum option validation (#8094) * fix(mito): ignore compaction override in enum option validation Signed-off-by: QuakeWang <wangfuzheng0814@foxmail.com> * test: cover compaction override without compaction type Signed-off-by: QuakeWang <wangfuzheng0814@foxmail.com> * fix(mito): short-circuit enum option validation Signed-off-by: QuakeWang <wangfuzheng0814@foxmail.com> --------- Signed-off-by: QuakeWang <wangfuzheng0814@foxmail.com> (cherry picked from commit73c267e641) Signed-off-by: evenyag <realevenyag@gmail.com> * fix(mito2): drop unsound time-filter cache-key stripping (#8105) * fix(mito2): drop unsound time-filter cache-key stripping Signed-off-by: evenyag <realevenyag@gmail.com> * chore: update comments and test Signed-off-by: evenyag <realevenyag@gmail.com> --------- Signed-off-by: evenyag <realevenyag@gmail.com> (cherry picked from commit5e468190a5) Signed-off-by: evenyag <realevenyag@gmail.com> * fix: remap batch table route addresses (#8109) (cherry picked from commita04fa52486) Signed-off-by: evenyag <realevenyag@gmail.com> * chore: bump version to v1.0.2 Signed-off-by: evenyag <realevenyag@gmail.com> * fix: avoid stale route update during repartition allocation (#8115) Signed-off-by: WenyXu <wenymedia@gmail.com> Signed-off-by: evenyag <realevenyag@gmail.com> * test: update sqlness result Signed-off-by: evenyag <realevenyag@gmail.com> --------- Signed-off-by: discord9 <discord9@163.com> Signed-off-by: evenyag <realevenyag@gmail.com> Signed-off-by: BootstrapperSBL <yvanwww@gmail.com> Signed-off-by: Lei, HUANG <mrsatangel@gmail.com> Signed-off-by: BootstrapperSBL <yvanwww01@gmail.com> Signed-off-by: Ruihang Xia <waynestxia@gmail.com> Signed-off-by: QuakeWang <wangfuzheng0814@foxmail.com> Signed-off-by: WenyXu <wenymedia@gmail.com> Co-authored-by: discord9 <55937128+discord9@users.noreply.github.com> Co-authored-by: Yvan Wang <131545713+BootstrapperSBL@users.noreply.github.com> Co-authored-by: Lei, HUANG <6406592+v0y4g3r@users.noreply.github.com> Co-authored-by: BootstrapperSBL <yvanwww01@gmail.com> Co-authored-by: Ning Sun <sunng@protonmail.com> Co-authored-by: Ruihang Xia <waynestxia@gmail.com> Co-authored-by: QuakeWang <45645138+QuakeWang@users.noreply.github.com> Co-authored-by: Weny Xu <wenymedia@gmail.com>
90 lines
2.2 KiB
SQL
90 lines
2.2 KiB
SQL
CREATE TABLE host (
|
|
ts timestamp(3) time index,
|
|
host STRING PRIMARY KEY,
|
|
val BIGINT,
|
|
);
|
|
|
|
INSERT INTO TABLE host VALUES
|
|
(0, 'host1', 0),
|
|
(5000, 'host1', null),
|
|
(10000, 'host1', 1),
|
|
(15000, 'host1', null),
|
|
(20000, 'host1', 2),
|
|
(0, 'host2', 3),
|
|
(5000, 'host2', null),
|
|
(10000, 'host2', 4),
|
|
(15000, 'host2', null),
|
|
(20000, 'host2', 5);
|
|
|
|
-- Test range query in nest sql
|
|
|
|
SELECT ts, host, foo FROM (SELECT ts, host, min(val) RANGE '5s' AS foo FROM host ALIGN '5s') WHERE host = 'host1' ORDER BY host, ts;
|
|
|
|
SELECT ts, b, min(c) RANGE '5s' FROM (SELECT ts, host AS b, val AS c FROM host WHERE host = 'host1') ALIGN '5s' BY (b) ORDER BY b, ts;
|
|
|
|
CREATE TABLE host_union_0 (
|
|
ts timestamp(3) time index,
|
|
host STRING PRIMARY KEY,
|
|
val BIGINT,
|
|
ts2 timestamp(3),
|
|
);
|
|
|
|
CREATE TABLE host_union_1 (
|
|
ts timestamp(3) time index,
|
|
host STRING PRIMARY KEY,
|
|
val BIGINT,
|
|
ts2 timestamp(3),
|
|
);
|
|
|
|
INSERT INTO TABLE host_union_0 VALUES
|
|
(0, 'host1', 3, 0),
|
|
(5000, 'host1', 2, 5000),
|
|
(10000, 'host1', 1, 10000);
|
|
|
|
INSERT INTO TABLE host_union_1 VALUES
|
|
(0, 'host1', 6, 0),
|
|
(5000, 'host1', 5, 5000),
|
|
(10000, 'host1', 4, 10000);
|
|
|
|
SELECT ts, host, min(val ORDER BY ts ASC) RANGE '5s'
|
|
FROM (
|
|
SELECT ts, host, val, ts2 FROM host_union_0
|
|
UNION ALL
|
|
SELECT ts, host, val, ts2 FROM host_union_1
|
|
)
|
|
WHERE ts >= '1970-01-01 00:00:00'
|
|
ALIGN '5s' BY (host)
|
|
ORDER BY host, ts;
|
|
|
|
SELECT tmp.ts, tmp.host, min(tmp.val ORDER BY tmp.ts ASC) RANGE '5s'
|
|
FROM (
|
|
SELECT ts, host, val, ts2 FROM host_union_0
|
|
UNION ALL
|
|
SELECT ts, host, val, ts2 FROM host_union_1
|
|
) AS tmp
|
|
WHERE tmp.ts >= '1970-01-01 00:00:00'
|
|
ALIGN '5s' BY (tmp.host)
|
|
ORDER BY tmp.host, tmp.ts;
|
|
|
|
DROP TABLE host_union_0;
|
|
|
|
DROP TABLE host_union_1;
|
|
|
|
|
|
-- Test EXPLAIN and ANALYZE
|
|
|
|
-- SQLNESS REPLACE (-+) -
|
|
-- SQLNESS REPLACE (\s\s+) _
|
|
-- SQLNESS REPLACE (peers.*) REDACTED
|
|
-- SQLNESS REPLACE (metrics.*) REDACTED
|
|
EXPLAIN SELECT ts, host, min(val) RANGE '5s' FROM host ALIGN '5s';
|
|
|
|
-- SQLNESS REPLACE (-+) -
|
|
-- SQLNESS REPLACE (\s\s+) _
|
|
-- SQLNESS REPLACE (peers.*) REDACTED
|
|
-- SQLNESS REPLACE (metrics.*) REDACTED
|
|
-- SQLNESS REPLACE region=\d+\(\d+,\s+\d+\) region=REDACTED
|
|
EXPLAIN ANALYZE SELECT ts, host, min(val) RANGE '5s' FROM host ALIGN '5s';
|
|
|
|
DROP TABLE host;
|