From d49e01f68f741b8ec50a5610cba656f66652c298 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 16 Jul 2025 10:05:35 +0000 Subject: [PATCH 1/2] Initial plan From 53cf947d18ed8f449cbc0e4fb1f63b142760f0e1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 16 Jul 2025 10:26:01 +0000 Subject: [PATCH 2/2] Implement pragmas support for table preview queries Co-authored-by: adameat <34044711+adameat@users.noreply.github.com> --- .../Query/Preview/components/TablePreview.tsx | 3 ++ .../components/__test__/TablePreview.test.tsx | 41 +++++++++++++++++++ src/store/reducers/preview.ts | 10 ++++- 3 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 src/containers/Tenant/Query/Preview/components/__test__/TablePreview.test.tsx diff --git a/src/containers/Tenant/Query/Preview/components/TablePreview.tsx b/src/containers/Tenant/Query/Preview/components/TablePreview.tsx index c8df79abaf..87edd454f2 100644 --- a/src/containers/Tenant/Query/Preview/components/TablePreview.tsx +++ b/src/containers/Tenant/Query/Preview/components/TablePreview.tsx @@ -1,5 +1,6 @@ import {QueryResultTable} from '../../../../../components/QueryResultTable'; import {previewApi} from '../../../../../store/reducers/preview'; +import {useQueryExecutionSettings} from '../../../../../utils/hooks'; import {isExternalTableType} from '../../../utils/schema'; import type {PreviewContainerProps} from '../types'; @@ -9,12 +10,14 @@ const TABLE_PREVIEW_LIMIT = 100; export function TablePreview({database, path, type}: PreviewContainerProps) { const query = `select * from \`${path}\` limit 101`; + const [querySettings] = useQueryExecutionSettings(); const {currentData, isFetching, error} = previewApi.useSendQueryQuery( { database, query, action: isExternalTableType(type) ? 'execute-query' : 'execute-scan', limitRows: TABLE_PREVIEW_LIMIT, + pragmas: querySettings.pragmas, }, { refetchOnMountOrArgChange: true, diff --git a/src/containers/Tenant/Query/Preview/components/__test__/TablePreview.test.tsx b/src/containers/Tenant/Query/Preview/components/__test__/TablePreview.test.tsx new file mode 100644 index 0000000000..255a0581d7 --- /dev/null +++ b/src/containers/Tenant/Query/Preview/components/__test__/TablePreview.test.tsx @@ -0,0 +1,41 @@ +import {prepareQueryWithPragmas} from '../../../../../../store/reducers/query/utils'; + +describe('TablePreview Pragmas Integration', () => { + test('prepareQueryWithPragmas should work with table preview queries', () => { + const tablePreviewQuery = 'select * from `test-table` limit 101'; + const pragmas = 'PRAGMA OrderedColumns;'; + + const result = prepareQueryWithPragmas(tablePreviewQuery, pragmas); + + expect(result).toBe('PRAGMA OrderedColumns;\n\nselect * from `test-table` limit 101'); + }); + + test('prepareQueryWithPragmas should handle empty pragmas for table preview', () => { + const tablePreviewQuery = 'select * from `test-table` limit 101'; + const pragmas = ''; + + const result = prepareQueryWithPragmas(tablePreviewQuery, pragmas); + + expect(result).toBe('select * from `test-table` limit 101'); + }); + + test('prepareQueryWithPragmas should handle undefined pragmas for table preview', () => { + const tablePreviewQuery = 'select * from `test-table` limit 101'; + const pragmas = undefined; + + const result = prepareQueryWithPragmas(tablePreviewQuery, pragmas); + + expect(result).toBe('select * from `test-table` limit 101'); + }); + + test('prepareQueryWithPragmas should handle multiple pragmas for table preview', () => { + const tablePreviewQuery = 'select * from `test-table` limit 101'; + const pragmas = 'PRAGMA OrderedColumns;\nPRAGMA AnsiInForEmptyOrNullableItemsCollections;'; + + const result = prepareQueryWithPragmas(tablePreviewQuery, pragmas); + + expect(result).toBe( + 'PRAGMA OrderedColumns;\nPRAGMA AnsiInForEmptyOrNullableItemsCollections;\n\nselect * from `test-table` limit 101', + ); + }); +}); diff --git a/src/store/reducers/preview.ts b/src/store/reducers/preview.ts index 780fc21bba..c72c0ae9c3 100644 --- a/src/store/reducers/preview.ts +++ b/src/store/reducers/preview.ts @@ -2,21 +2,27 @@ import type {ExecuteActions} from '../../types/api/query'; import {isQueryErrorResponse, parseQueryAPIResponse} from '../../utils/query'; import {api} from './api'; +import {prepareQueryWithPragmas} from './query/utils'; interface SendQueryParams { query?: string; database?: string; action?: ExecuteActions; limitRows?: number; + pragmas?: string; } export const previewApi = api.injectEndpoints({ endpoints: (build) => ({ sendQuery: build.query({ - queryFn: async ({query, database, action, limitRows}: SendQueryParams, {signal}) => { + queryFn: async ( + {query, database, action, limitRows, pragmas}: SendQueryParams, + {signal}, + ) => { try { + const finalQuery = prepareQueryWithPragmas(query || '', pragmas); const response = await window.api.viewer.sendQuery( - {query, database, action, limit_rows: limitRows}, + {query: finalQuery, database, action, limit_rows: limitRows}, {signal, withRetries: true}, );