From 4f193a5eba87e80f939ddecfc76ec4221deb9161 Mon Sep 17 00:00:00 2001 From: dongmucat <1127093059@qq.com> Date: Mon, 6 Jul 2026 15:21:33 +0800 Subject: [PATCH] fix(ISSUE-64): guard malformed compliance search rows Signed-off-by: dongmucat <1127093059@qq.com> --- .../search/postgres/PostgresFullTextQueryService.java | 3 ++- .../search/postgres/PostgresFullTextQueryServiceTest.java | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/server/skillhub-search/src/main/java/com/iflytek/skillhub/search/postgres/PostgresFullTextQueryService.java b/server/skillhub-search/src/main/java/com/iflytek/skillhub/search/postgres/PostgresFullTextQueryService.java index bdc46a33..cff32f52 100644 --- a/server/skillhub-search/src/main/java/com/iflytek/skillhub/search/postgres/PostgresFullTextQueryService.java +++ b/server/skillhub-search/src/main/java/com/iflytek/skillhub/search/postgres/PostgresFullTextQueryService.java @@ -134,7 +134,8 @@ public class PostgresFullTextQueryService implements SearchQueryService { if (hasComplianceStandard) { sql.append("AND EXISTS ("); sql.append("SELECT 1 FROM jsonb_array_elements("); - sql.append("COALESCE(latest.parsed_metadata_json -> 'frontmatter' -> 'x-astron-compliance', '[]'::jsonb)"); + sql.append("CASE WHEN jsonb_typeof(latest.parsed_metadata_json -> 'frontmatter' -> 'x-astron-compliance') = 'array' "); + sql.append("THEN latest.parsed_metadata_json -> 'frontmatter' -> 'x-astron-compliance' ELSE '[]'::jsonb END"); sql.append(") AS compliance_item "); sql.append("WHERE LOWER(BTRIM(compliance_item ->> 'standard')) = :complianceStandard"); sql.append(") "); diff --git a/server/skillhub-search/src/test/java/com/iflytek/skillhub/search/postgres/PostgresFullTextQueryServiceTest.java b/server/skillhub-search/src/test/java/com/iflytek/skillhub/search/postgres/PostgresFullTextQueryServiceTest.java index 6e6dfc14..b5cf9190 100644 --- a/server/skillhub-search/src/test/java/com/iflytek/skillhub/search/postgres/PostgresFullTextQueryServiceTest.java +++ b/server/skillhub-search/src/test/java/com/iflytek/skillhub/search/postgres/PostgresFullTextQueryServiceTest.java @@ -326,7 +326,10 @@ class PostgresFullTextQueryServiceTest { ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); verify(entityManager, org.mockito.Mockito.times(2)).createNativeQuery(sqlCaptor.capture()); assertThat(sqlCaptor.getAllValues().getFirst()).contains( - "jsonb_array_elements(COALESCE(latest.parsed_metadata_json -> 'frontmatter' -> 'x-astron-compliance', '[]'::jsonb))" + "jsonb_array_elements(CASE WHEN jsonb_typeof(latest.parsed_metadata_json -> 'frontmatter' -> 'x-astron-compliance') = 'array'" + ); + assertThat(sqlCaptor.getAllValues().getFirst()).contains( + "THEN latest.parsed_metadata_json -> 'frontmatter' -> 'x-astron-compliance' ELSE '[]'::jsonb END)" ); assertThat(sqlCaptor.getAllValues().getFirst()).contains("LOWER(BTRIM(compliance_item ->> 'standard')) = :complianceStandard"); verify(nativeQuery).setParameter("complianceStandard", "gdpr");