From 02430d1b092d8ee38925eb49ad646672e0412c1c Mon Sep 17 00:00:00 2001 From: Clarence <36807519+Clarence404@users.noreply.github.com> Date: Wed, 2 Sep 2026 16:56:12 +0800 Subject: [PATCH] fix(influxdb): prefill new-query with rolling time window --- .../src/lib/__tests__/sql/newQueryContext.spec.ts | 14 ++++++++++++++ apps/desktop/src/lib/sql/newQueryContext.ts | 14 ++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/apps/desktop/src/lib/__tests__/sql/newQueryContext.spec.ts b/apps/desktop/src/lib/__tests__/sql/newQueryContext.spec.ts index 8c7d8368e1..fef4782f1c 100644 --- a/apps/desktop/src/lib/__tests__/sql/newQueryContext.spec.ts +++ b/apps/desktop/src/lib/__tests__/sql/newQueryContext.spec.ts @@ -212,6 +212,20 @@ describe("buildSelectAllSql", () => { expect(buildSelectAllSql("jdbc", { schema: "APP", tableName: "USERS" }, '"', "phoenix")).toBe('SELECT * FROM "APP"."USERS"'); }); + it("scopes InfluxDB 1.x / 2.x prefill to a rolling InfluxQL window", () => { + // Without a time predicate the InfluxQL query would scan every shard + // for the measurement before LIMIT clips the tail; the 5-minute + // window matches the sidebar quick-open default so users can run + // the prefill safely. + expect(buildSelectAllSql("influxdb", { tableName: "cpu" })).toBe('SELECT * FROM "cpu" WHERE time > now() - 5m ORDER BY time DESC LIMIT 100'); + }); + + it("scopes InfluxDB 3.x prefill to a rolling DataFusion INTERVAL window", () => { + // v3 goes through DataFusion SQL and needs an ANSI INTERVAL literal + // rather than the InfluxQL Go-duration form used by v1 / v2. + expect(buildSelectAllSql("influxdb3", { tableName: "cpu" })).toBe(`SELECT * FROM "cpu" WHERE time > now() - INTERVAL '5 minutes' ORDER BY time DESC LIMIT 100`); + }); + it("bracket-quotes a SQL Server table", () => { expect(buildSelectAllSql("sqlserver", { schema: "dbo", tableName: "users" })).toBe("SELECT * FROM [dbo].[users]"); expect(buildSelectAllSql("sqlserver", { tableName: "users" })).toBe("SELECT * FROM [users]"); diff --git a/apps/desktop/src/lib/sql/newQueryContext.ts b/apps/desktop/src/lib/sql/newQueryContext.ts index 1409be7a12..a4a0fbbdb1 100644 --- a/apps/desktop/src/lib/sql/newQueryContext.ts +++ b/apps/desktop/src/lib/sql/newQueryContext.ts @@ -147,10 +147,24 @@ export function resolveNewQueryTable(input: ResolveNewQueryTableInput): NewQuery * Builds a `SELECT * FROM ` statement for the new-query prefill, reusing * the same per-dialect identifier quoting and schema/catalog qualification used * by the table-data view. + * + * Time-series engines get the same rolling-window scoping the sidebar + * quick-open uses (see `default_time_series_predicate` in + * `crates/dbx-core/src/sql_dialect/table_select.rs`). Without a `time` + * predicate InfluxDB scans every shard (v1/v2) or every Parquet file + * (v3), which turns "let me draft a query against this table" into a + * full-history scan the moment the user hits Run. VictoriaMetrics + * already has its own metric range template above. */ export function buildSelectAllSql(databaseType: DatabaseType | undefined, table: Pick & Partial>, identifierQuote?: string, driverProfile?: string, includeDatabaseName = false): string { if (databaseType === "victoriametrics") return metricRangeQuery(table.tableName); const ref = qualifiedTableName({ databaseType, driverProfile, identifierQuote, database: table.database, schema: table.schema, catalog: table.catalog, tableName: table.tableName, includeDatabaseName }); + if (databaseType === "influxdb") { + return `SELECT * FROM ${ref} WHERE time > now() - 5m ORDER BY time DESC LIMIT 100`; + } + if (databaseType === "influxdb3") { + return `SELECT * FROM ${ref} WHERE time > now() - INTERVAL '5 minutes' ORDER BY time DESC LIMIT 100`; + } return `SELECT * FROM ${ref}`; }