fix(kingbase): use connection identifier quotes in MySQL mode

This commit is contained in:
zipg 2026-07-16 15:20:41 +08:00 committed by GitHub
parent e226a5670e
commit 36d8fabc8f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 284 additions and 32 deletions

View File

@ -855,6 +855,7 @@ async function loadServerFilterValues(columnIndex: number, searchValue: string)
const columnInfo = tableMeta.columns.find((column) => column.name === columnName);
const sql = await buildDataGridColumnDistinctValuesSql({
databaseType: resolvedDatabaseType.value,
identifierQuote: connectionStore.connectionIdentifierQuote?.(props.connectionId),
catalog: tableMeta.catalog,
database: tableMeta.database,
schema: tableMeta.schema,
@ -1179,6 +1180,7 @@ async function applyServerColumnFilter(draft: LocalColumnFilterDraft) {
}
const condition = await buildColumnValuesFilterCondition({
databaseType: resolvedDatabaseType.value,
identifierQuote: connectionStore.connectionIdentifierQuote?.(props.connectionId),
columnName,
columnInfo: props.tableMeta?.columns.find((column) => column.name === columnName),
values,
@ -1209,6 +1211,7 @@ async function applyTypedLocalFilterValue() {
const columnInfo = props.tableMeta?.columns.find((column) => column.name === columnName);
const condition = await buildColumnValueFilterCondition({
databaseType: resolvedDatabaseType.value,
identifierQuote: connectionStore.connectionIdentifierQuote?.(props.connectionId),
columnName,
columnInfo,
rawValue: localFilterTypedValue.value,
@ -1301,6 +1304,7 @@ async function buildStructuredWhereFromRules(rules: StructuredFilterRule[]): Pro
condition:
(await buildDataGridContextFilterCondition({
databaseType: resolvedDatabaseType.value,
identifierQuote: connectionStore.connectionIdentifierQuote?.(props.connectionId),
columnName: rule.columnName,
columnInfo,
mode: rule.mode,
@ -3682,6 +3686,7 @@ async function prefetchDetailSqlCondition() {
try {
const condition = await buildDataGridContextFilterCondition({
databaseType: resolvedDatabaseType.value,
identifierQuote: connectionStore.connectionIdentifierQuote?.(props.connectionId),
columnName: detail.column,
columnInfo: props.tableMeta?.columns.find((column) => column.name === detail.column),
mode: "equals",
@ -3977,6 +3982,7 @@ async function contextFilterCondition(mode: FilterMode): Promise<string | null>
return (
(await buildDataGridContextFilterCondition({
databaseType: resolvedDatabaseType.value,
identifierQuote: connectionStore.connectionIdentifierQuote?.(props.connectionId),
columnName: contextColumn.value,
columnInfo: props.tableMeta?.columns.find((column) => column.name === contextColumn.value),
mode,

View File

@ -1088,6 +1088,7 @@ export function useDataGridEditor(options: UseDataGridEditorOptions) {
if (!tableMeta.value) return null;
return {
databaseType: resolvedDatabaseType.value,
identifierQuote: connectionStore.connectionIdentifierQuote?.(connectionId.value),
tableMeta: tableMeta.value,
columns: result.value.columns,
sourceColumns: sourceColumns.value,

View File

@ -3,9 +3,10 @@ import type { DataGridColumnInfo, DataGridContextFilterMode, GridCellValue } fro
import { buildDataGridColumnValueFilterCondition, buildDataGridColumnValuesFilterCondition } from "@/lib/dataGrid/dataGridSql";
import { normalizeWhereInput } from "@/lib/table/tableSelectSql";
export function buildColumnValueFilterCondition(options: { databaseType?: DatabaseType; columnName: string; columnInfo?: Pick<ColumnInfo, "data_type">; rawValue: string }): Promise<string | undefined> {
export function buildColumnValueFilterCondition(options: { databaseType?: DatabaseType; identifierQuote?: string; columnName: string; columnInfo?: Pick<ColumnInfo, "data_type">; rawValue: string }): Promise<string | undefined> {
return buildDataGridColumnValueFilterCondition({
databaseType: options.databaseType,
identifierQuote: options.identifierQuote,
columnName: options.columnName,
columnInfo: options.columnInfo
? {
@ -18,9 +19,10 @@ export function buildColumnValueFilterCondition(options: { databaseType?: Databa
});
}
export function buildColumnValuesFilterCondition(options: { databaseType?: DatabaseType; columnName: string; columnInfo?: Pick<ColumnInfo, "data_type">; values: GridCellValue[] }): Promise<string | undefined> {
export function buildColumnValuesFilterCondition(options: { databaseType?: DatabaseType; identifierQuote?: string; columnName: string; columnInfo?: Pick<ColumnInfo, "data_type">; values: GridCellValue[] }): Promise<string | undefined> {
return buildDataGridColumnValuesFilterCondition({
databaseType: options.databaseType,
identifierQuote: options.identifierQuote,
columnName: options.columnName,
columnInfo: options.columnInfo
? {

View File

@ -23,6 +23,7 @@ export interface DataGridColumnInfo {
export interface DataGridSaveStatementOptions {
databaseType?: DatabaseType;
identifierQuote?: string;
tableMeta: DataGridTableMeta;
columns: string[];
sourceColumns?: Array<string | undefined>;
@ -57,6 +58,7 @@ export type DataGridContextFilterMode = "equals" | "not-equals" | "is-null" | "i
export interface DataGridContextFilterConditionOptions {
databaseType?: DatabaseType;
identifierQuote?: string;
columnName: string;
mode: DataGridContextFilterMode;
value: GridCellValue;
@ -67,6 +69,7 @@ export interface DataGridContextFilterConditionOptions {
export interface DataGridColumnValueFilterConditionOptions {
databaseType?: DatabaseType;
identifierQuote?: string;
columnName: string;
columnInfo?: DataGridColumnInfo;
rawValue: string;
@ -74,6 +77,7 @@ export interface DataGridColumnValueFilterConditionOptions {
export interface DataGridColumnValuesFilterConditionOptions {
databaseType?: DatabaseType;
identifierQuote?: string;
columnName: string;
columnInfo?: DataGridColumnInfo;
values: GridCellValue[];
@ -81,6 +85,7 @@ export interface DataGridColumnValuesFilterConditionOptions {
export interface DataGridColumnDistinctValuesSqlOptions {
databaseType?: DatabaseType;
identifierQuote?: string;
catalog?: string;
database?: string;
schema?: string;

File diff suppressed because it is too large Load Diff

View File

@ -188,6 +188,7 @@ fn build_tdengine_delete_statement(
save_columns,
row,
options.table_meta.columns.as_deref().unwrap_or(&[]),
None,
);
if where_clause.is_empty() {
return None;

View File

@ -14,6 +14,6 @@ pub use identifiers::{
normalize_where_input, qualified_table_name, qualified_table_name_with_catalog, quote_table_identifier,
};
pub(crate) use identifiers::{parse_sqlserver_linked_schema_ref, qualified_transfer_table, quote_transfer_identifier};
pub(crate) use table_select::table_data_qualified_table_name;
pub use table_select::{build_count_table_sql, build_table_data_select_sql, build_table_select_sql};
pub(crate) use table_select::{quote_table_data_identifier, table_data_qualified_table_name};
pub use types::*;

View File

@ -171,7 +171,7 @@ pub(crate) fn table_data_qualified_table_name(
.unwrap_or(table)
}
fn quote_table_data_identifier(
pub(crate) fn quote_table_data_identifier(
database_type: Option<DatabaseType>,
name: &str,
identifier_quote: Option<&str>,

View File

@ -54,6 +54,7 @@ fn mysql_cross_database_query_flow_preserves_target_database() {
let save = prepare_data_grid_save(DataGridSaveStatementOptions {
database_type: Some(DatabaseType::Mysql),
identifier_quote: None,
table_meta: DataGridTableMeta {
catalog: None,
database: None,

View File

@ -178,3 +178,22 @@ test("passes list and range values through the shared context filter API", async
endValue: 20,
});
});
test("passes the connection identifier quote to Kingbase filters", async () => {
installFilterFetchMock();
await buildDataGridContextFilterCondition({
databaseType: "kingbase",
identifierQuote: "`",
columnName: "file_name",
mode: "equals",
value: "34-B-0048",
});
assert.deepEqual(lastContextFilterOptions, {
databaseType: "kingbase",
identifierQuote: "`",
columnName: "file_name",
mode: "equals",
value: "34-B-0048",
});
});