diff --git a/.changeset/sharp-emus-reflect.md b/.changeset/sharp-emus-reflect.md new file mode 100644 index 00000000..46d3165a --- /dev/null +++ b/.changeset/sharp-emus-reflect.md @@ -0,0 +1,5 @@ +--- +"@hyperdx/common-utils": patch +--- + +fix: Skip rendering empty SQL dashboard filter diff --git a/packages/common-utils/src/__tests__/renderChartConfig.test.ts b/packages/common-utils/src/__tests__/renderChartConfig.test.ts index aea88245..66651808 100644 --- a/packages/common-utils/src/__tests__/renderChartConfig.test.ts +++ b/packages/common-utils/src/__tests__/renderChartConfig.test.ts @@ -1989,6 +1989,25 @@ describe('renderChartConfig', () => { ); }); + it('skips empty sql filters when source has no tableName (metric source)', async () => { + const result = await renderChartConfig( + { + configType: 'sql', + sqlTemplate: 'SELECT * FROM logs WHERE $__filters', + connection: 'conn-1', + dateRange: [start, end], + source: 'source-1', + from: { databaseName: 'default', tableName: '' }, + filters: [{ type: 'sql', condition: '' }], + }, + mockMetadata, + undefined, + ); + expect(result.sql).toBe( + 'SELECT * FROM logs WHERE (1=1 /** no filters applied */)', + ); + }); + it('skips filters without source metadata (no from)', async () => { const result = await renderChartConfig( { diff --git a/packages/common-utils/src/core/renderChartConfig.ts b/packages/common-utils/src/core/renderChartConfig.ts index 5250aada..72b24d5d 100644 --- a/packages/common-utils/src/core/renderChartConfig.ts +++ b/packages/common-utils/src/core/renderChartConfig.ts @@ -1542,7 +1542,9 @@ async function renderFiltersToSql( if (filter.type === 'sql_ast') { return `(${filter.left} ${filter.operator} ${filter.right})`; } else if (filter.type === 'sql' && !hasSourceTable) { - return `(${filter.condition})`; // Don't pass to renderWhereExpressionStr since it requires source table metadata + return filter.condition.trim() + ? `(${filter.condition})` // Don't pass to renderWhereExpressionStr since it requires source table metadata + : undefined; } else if ( (filter.type === 'lucene' || filter.type === 'sql') && filter.condition.trim() &&