🐛 fix(query-results): 修复金仓带模式表主键识别

- PG 类数据库保留 schema.table 作为查询结果表名和元数据表名
- 元数据连接继续使用当前数据库,避免把 schema 误当 database
- 补充金仓列、索引和前端可编辑定位回归测试
This commit is contained in:
Syngnat
2026-06-29 15:18:13 +08:00
parent 4798d3e8ec
commit 04bbab3d7e
4 changed files with 193 additions and 22 deletions

View File

@@ -6192,6 +6192,55 @@ describe('QueryEditor external SQL save', () => {
expect(messageApi.warning).not.toHaveBeenCalled();
});
it('keeps Kingbase schema-qualified query results writable without treating the schema as the database', async () => {
storeState.connections[0].config.type = 'kingbase';
storeState.connections[0].config.database = 'ldf_server_dbs_dev';
backendApp.DBQueryMulti.mockResolvedValueOnce({
success: true,
data: [{
columns: ['id', 'work_order_no'],
rows: [{ id: 1001, work_order_no: 'MO-1001' }],
}],
});
backendApp.DBGetColumns.mockResolvedValueOnce({
success: true,
data: [{ name: 'id', key: 'PRI' }, { name: 'work_order_no', key: '' }],
});
backendApp.DBGetIndexes.mockResolvedValueOnce({
success: true,
data: [{ name: 'mes_work_order_pkey', columnName: 'id', nonUnique: 0, seqInIndex: 1 }],
});
let renderer: ReactTestRenderer;
await act(async () => {
renderer = create(<QueryEditor tab={createTab({
dbName: 'ldf_server_dbs_dev',
query: 'SELECT * FROM ldf_server.mes_work_order',
})} />);
});
await act(async () => {
await findButton(renderer!, '运行').props.onClick();
});
await act(async () => {
await Promise.resolve();
await Promise.resolve();
});
expect(backendApp.DBGetColumns).toHaveBeenCalledWith(expect.anything(), 'ldf_server_dbs_dev', 'ldf_server.mes_work_order');
expect(backendApp.DBGetIndexes).toHaveBeenCalledWith(expect.anything(), 'ldf_server_dbs_dev', 'ldf_server.mes_work_order');
expect(dataGridState.latestProps?.tableName).toBe('ldf_server.mes_work_order');
expect(dataGridState.latestProps?.pkColumns).toEqual(['id']);
expect(dataGridState.latestProps?.editLocator).toMatchObject({
strategy: 'primary-key',
columns: ['id'],
valueColumns: ['id'],
readOnly: false,
});
expect(dataGridState.latestProps?.readOnly).toBe(false);
expect(messageApi.warning).not.toHaveBeenCalled();
});
it('uses hidden Oracle ROWID for query results without primary or unique keys', async () => {
storeState.connections[0].config.type = 'oracle';
storeState.connections[0].config.database = 'ORCLPDB1';