fix(gaussdb): 修复查询分页限制

* 修复驱动管理与首页重叠

* 修复 GaussDB 查询分页限制

---------

Co-authored-by: staff <staff@qimaos-MacBook-Pro.local>
This commit is contained in:
zipg 2026-06-25 18:28:31 +08:00 committed by GitHub
parent a595d4d4bd
commit d0dce7b87b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 27 additions and 4 deletions

View File

@ -0,0 +1,12 @@
import { describe, expect, it } from "vitest";
import { databaseRuntimeMode, usesAgentCursorForQuery } from "@/lib/databaseDriverManifest";
describe("databaseDriverManifest", () => {
it("uses agent cursor only for agent or external runtimes", () => {
expect(databaseRuntimeMode("gaussdb")).toBe("native");
expect(usesAgentCursorForQuery("gaussdb")).toBe(false);
expect(usesAgentCursorForQuery("mysql")).toBe(false);
expect(usesAgentCursorForQuery("jdbc")).toBe(true);
expect(usesAgentCursorForQuery("prestosql")).toBe(true);
});
});

View File

@ -2,6 +2,7 @@ import type { DatabaseType } from "@/types/database";
import driverManifest from "../../../../crates/dbx-core/assets/database-drivers.manifest.json";
export type DatabaseSupportLevel = "connect" | "browse" | "understand" | "operate";
export type DatabaseRuntimeMode = "native" | "file" | "agent" | "external";
export const DATABASE_PRODUCT_CAPABILITY_KEYS = [
"queryExecution",
@ -27,6 +28,7 @@ export type DatabaseProductCapabilities = Record<DatabaseProductCapability, bool
interface DatabaseDriverManifestEntry {
dbType: DatabaseType;
runtimeMode: DatabaseRuntimeMode;
supportLevel: DatabaseSupportLevel;
capabilities: Partial<DatabaseProductCapabilities>;
}
@ -72,6 +74,10 @@ export function databaseSupportLevel(dbType?: DatabaseType): DatabaseSupportLeve
return dbType ? DATABASE_DRIVER_BY_TYPE.get(dbType)?.supportLevel : undefined;
}
export function databaseRuntimeMode(dbType?: DatabaseType): DatabaseRuntimeMode | undefined {
return dbType ? DATABASE_DRIVER_BY_TYPE.get(dbType)?.runtimeMode : undefined;
}
export function databaseProductCapabilities(dbType?: DatabaseType): DatabaseProductCapabilities {
if (!dbType) return DEFAULT_CAPABILITIES;
return (DATABASE_DRIVER_BY_TYPE.get(dbType)?.capabilities ?? DEFAULT_CAPABILITIES) as DatabaseProductCapabilities;
@ -85,6 +91,11 @@ export function manifestDatabaseTypes(): DatabaseType[] {
return DATABASE_DRIVER_ENTRIES.map((entry) => entry.dbType);
}
export function usesAgentCursorForQuery(dbType?: DatabaseType): boolean {
const runtimeMode = databaseRuntimeMode(dbType);
return runtimeMode === "agent" || runtimeMode === "external";
}
function productCapabilities(overrides: Partial<DatabaseProductCapabilities>): DatabaseProductCapabilities {
const capabilities = Object.fromEntries(DATABASE_PRODUCT_CAPABILITY_KEYS.map((key) => [key, false])) as DatabaseProductCapabilities;
return { ...capabilities, ...overrides };

View File

@ -27,7 +27,7 @@ import {
import { redisCommandResultToQueryResult } from "@/lib/redisQueryResult";
import { nextRedisCommandDb } from "@/lib/redisCommandSession";
import { isRedisMutatingCommand } from "@/lib/redisCommandTable";
import { supportsDatabaseFeature } from "@/lib/databaseCapabilities";
import { usesAgentCursorForQuery } from "@/lib/databaseDriverManifest";
import { canUseKeylessRowPredicate, editableRowIdentifierColumns } from "@/lib/tableEditing";
import { TABLE_DATA_EXPORT_PAGE_SIZE } from "@/lib/tableDataExport";
import { tableMetaForDataTab } from "@/lib/tableDataTabMeta";
@ -1428,7 +1428,7 @@ export const useQueryStore = defineStore("query", () => {
}
const conn = connStore.getConfig(tab.connectionId);
const effectiveDbType = effectiveDatabaseTypeForConnection(conn);
const useAgentCursor = conn?.db_type === "jdbc" || supportsDatabaseFeature(conn?.db_type, "driverManagement");
const useAgentCursor = usesAgentCursorForQuery(conn?.db_type);
const queryTimeoutSecs = queryTimeoutSecsForConnection(conn);
const settingsStore = useSettingsStore();
console.info("[DBX][executeTabSql:previous-session-close:start]", { traceId, elapsed: elapsed() });
@ -2218,7 +2218,7 @@ export const useQueryStore = defineStore("query", () => {
const conn = connStore.getConfig(tab.connectionId);
const effectiveDbType = effectiveDatabaseTypeForConnection(conn);
const queryTimeoutSecs = queryTimeoutSecsForConnection(conn);
const useAgentCursor = conn?.db_type === "jdbc" || supportsDatabaseFeature(conn?.db_type, "driverManagement");
const useAgentCursor = usesAgentCursorForQuery(conn?.db_type);
const queryBaseSql = tab.resultBaseSql ?? sql;
const exportSettings = useSettingsStore().editorSettings;
const exportRowLimit = exportSettings.exportRowLimitEnabled ? exportSettings.exportRowLimit : Number.POSITIVE_INFINITY;
@ -2298,7 +2298,7 @@ export const useQueryStore = defineStore("query", () => {
const settings = useSettingsStore().editorSettings;
const effectiveDbType = effectiveDatabaseTypeForConnection(conn);
if (!effectiveDbType) return undefined;
const useAgentCursor = conn?.db_type === "jdbc" || supportsDatabaseFeature(conn?.db_type, "driverManagement");
const useAgentCursor = usesAgentCursorForQuery(conn?.db_type);
const queryBaseSql = tab.resultBaseSql ?? sql;
const rowLimit = settings.exportRowLimitEnabled ? settings.exportRowLimit : null;
const totalRows = typeof tab.resultTotalRowCount === "number" ? (rowLimit === null ? tab.resultTotalRowCount : Math.min(tab.resultTotalRowCount, rowLimit)) : null;