feat(saved-sql): run queries in the current database

This commit is contained in:
zhangyc authored and GitHub committed 2026-07-31 01:57:39 +08:00
1 parent 4062f11a26
commit e2ba75b102
22 files changed
+501 -51

No files matched your search

@@ -0,0 +1,55 @@
import { describe, expect, it } from "vitest";
import { resolveSavedSqlExecutionTarget, savedSqlDefaultTargetForWrite, savedSqlExecutionTargetFromTab } from "@/lib/savedSql/savedSqlExecutionTarget";
const savedTarget = {
connectionId: "saved-connection",
database: "saved_database",
schema: "saved_schema",
};
describe("saved SQL execution targets", () => {
it("uses the saved target by default", () => {
expect(
resolveSavedSqlExecutionTarget(savedTarget, "saved", {
connectionId: "current-connection",
database: "current_database",
schema: "current_schema",
catalog: "current_catalog",
}),
).toEqual(savedTarget);
});
it("uses the current tab target when requested", () => {
expect(
resolveSavedSqlExecutionTarget(savedTarget, "current", {
connectionId: "current-connection",
database: "current_database",
schema: "current_schema",
catalog: "current_catalog",
}),
).toEqual({
connectionId: "current-connection",
database: "current_database",
schema: "current_schema",
catalog: "current_catalog",
});
});
it("falls back to the saved target when no current tab is available", () => {
expect(resolveSavedSqlExecutionTarget(savedTarget, "current")).toEqual(savedTarget);
expect(savedSqlExecutionTargetFromTab(undefined)).toBeUndefined();
});
it("preserves the saved default target when an existing file is updated", () => {
expect(
savedSqlDefaultTargetForWrite(
{
connectionId: "runtime-connection",
database: "runtime_database",
schema: "runtime_schema",
},
savedTarget,
),
).toEqual(savedTarget);
});
});
@@ -0,0 +1,45 @@
import type { QueryTab, SavedSqlFile } from "@/types/database";
export type SavedSqlOpenTargetMode = "saved" | "current";
export interface SavedSqlExecutionTarget {
connectionId: string;
database: string;
schema?: string;
catalog?: string;
}
type SavedSqlFileTarget = Pick<SavedSqlFile, "connectionId" | "database" | "schema">;
type QueryTabTarget = Pick<QueryTab, "connectionId" | "database" | "schema" | "catalog">;
export function savedSqlExecutionTargetFromFile(file: SavedSqlFileTarget): SavedSqlExecutionTarget {
return {
connectionId: file.connectionId,
database: file.database,
schema: file.schema,
};
}
export function savedSqlExecutionTargetFromTab(tab: QueryTabTarget | undefined): SavedSqlExecutionTarget | undefined {
if (!tab?.connectionId) return undefined;
return {
connectionId: tab.connectionId,
database: tab.database,
schema: tab.schema,
catalog: tab.catalog,
};
}
export function resolveSavedSqlExecutionTarget(file: SavedSqlFileTarget, mode: SavedSqlOpenTargetMode, currentTarget?: SavedSqlExecutionTarget): SavedSqlExecutionTarget {
if (mode === "current" && currentTarget) return { ...currentTarget };
return savedSqlExecutionTargetFromFile(file);
}
export function savedSqlDefaultTargetForWrite(currentTarget: SavedSqlExecutionTarget, existingFile?: SavedSqlFileTarget): SavedSqlFileTarget {
if (existingFile) return savedSqlExecutionTargetFromFile(existingFile);
return {
connectionId: currentTarget.connectionId,
database: currentTarget.database,
schema: currentTarget.schema,
};
}
@@ -21,6 +21,7 @@ function makeSettings(overrides: Partial<EditorSettings> = {}): EditorSettings {
confirmDangerousSqlExecution: true,
continueOnErrorOnBatch: false,
confirmUnsavedSqlClose: true,
savedSqlOpenTargetMode: "saved",
objectBrowserViewMode: "list",
sqlVariableSyntaxOverrides: {},
tabLayout: "scroll",
@@ -36,6 +37,10 @@ describe("EDITOR_SETTINGS_DRAFT_KEYS", () => {
it("includes the table-open page size", () => {
expect(EDITOR_SETTINGS_DRAFT_KEYS).toContain("tableOpenPageSize");
});
it("includes the saved SQL open target mode", () => {
expect(EDITOR_SETTINGS_DRAFT_KEYS).toContain("savedSqlOpenTargetMode");
});
});
describe("editorSettingsDraftFromSettings", () => {
@@ -54,6 +59,10 @@ describe("editorSettingsDraftFromSettings", () => {
delete (settings as Partial<EditorSettings>).tableOpenPageSize;
expect(editorSettingsDraftFromSettings(settings).tableOpenPageSize).toBe(100);
});
it("maps the saved SQL open target mode", () => {
expect(editorSettingsDraftFromSettings(makeSettings({ savedSqlOpenTargetMode: "current" })).savedSqlOpenTargetMode).toBe("current");
});
});
describe("normalizeTableOpenPageSizeDraft", () => {
@@ -94,6 +103,14 @@ describe("editorSettingsDraftChanged", () => {
draft.tableOpenPageSize = Number.NaN;
expect(editorSettingsDraftChanged(draft, base)).toBe(false);
});
it("detects a saved SQL open target change", () => {
const settings = makeSettings({ savedSqlOpenTargetMode: "saved" });
const draft = editorSettingsDraftFromSettings(settings);
const base = editorSettingsDraftFromSettings(settings);
draft.savedSqlOpenTargetMode = "current";
expect(editorSettingsDraftChanged(draft, base)).toBe(true);
});
});
describe("editorSettingsPatchFromDraft", () => {
@@ -121,6 +138,14 @@ describe("editorSettingsPatchFromDraft", () => {
draft.tableOpenPageSize = 200000.9;
expect(editorSettingsPatchFromDraft(draft, base).tableOpenPageSize).toBe(100000);
});
it("includes the saved SQL open target when changed", () => {
const settings = makeSettings({ savedSqlOpenTargetMode: "saved" });
const draft = editorSettingsDraftFromSettings(settings);
const base = editorSettingsDraftFromSettings(settings);
draft.savedSqlOpenTargetMode = "current";
expect(editorSettingsPatchFromDraft(draft, base).savedSqlOpenTargetMode).toBe("current");
});
});
describe("EDITOR_SETTINGS_DRAFT_KEYS - tabLayout", () => {
@@ -23,6 +23,7 @@ export const EDITOR_SETTINGS_DRAFT_KEYS = [
"sqlSemanticDiagnosticsMode",
"confirmDangerousSqlExecution",
"confirmUnsavedSqlClose",
"savedSqlOpenTargetMode",
"appLayout",
"tabLayout",
"showColumnCommentsInHeader",