SQL Server 2025 CU4: Full-Text Search Strikes Again! Deep Troubleshooting. Test Day 4

Before we dive into today's topic, if you missed my previous post you can take a look at SQL Server 2025 CU4: The IStemmer Bug Fix – Did Microsoft Solve the FTS Crash or not? (Test Day 3). 👉 If you found this deep-dive helpful, feel free to check out the ads—your support helps me keep creating high-quality SQL Server content for the community.

SQL Server 2025 CU4: Full-Text Search Strikes Again! Deep Troubleshooting. Test Day 4

In this post, I’ll show you why a seemingly simple Full-Text patch for legacy documents can act as a "ghost bug". We will dive deep into troubleshooting fdhost.exe crashes to understand when SQL Server resilience actually hides a successful fix!

TL;DR

✔️ KB 5008479 fixes an issue where indexing legacy Word 6.0 documents crashes the filter daemon 🛠️ ✔️ Proper service permissions and valid NOT NULL single-column PKs are mandatory for Full-Text ingestion 📦 ✔️ Modern libraries like offfilt02.dll provide resilience by catching exceptions before they kill the daemon 🚀 ✔️ Testing on older CUs might fail to reproduce the bug if OS-level libraries are already updated ✔️

Hi SQL SERVER Guys,

Welcome back! Who follow me since some times, already knows that trying to reproduce a specific bug in SQL Server is sometime an art form. You need Knowledge but also intuition and sometime fantasy

When you read in the release notes that "indexing certain Microsoft Word 6.0 documents causes fdhost.exe to stop responding", the instinct of a DBA is clear: I want to see it crash with my own eyes. 

The Bug Reference 5008479 we want to reproduce is: "Fixes an issue in which indexing certain Microsoft Word 6.0 documents by including Full-Text Search causes the filter daemon host process (fdhost.exe) to stop responding"

Let's dive into these game-changing troubleshooting concepts!


🕵️‍♂️ Phase 1: Hunting the Artifact (Word 6.0)

The first hurdle is finding the "trigger"—a pre-OLE binary file (Word 6.0). After extensive digging, I unearthed one buried inside archived legacy antivirus documentation. It’s a perfect specimen, potentially capable of sending the parser into a fatal loop. You can download it here. Open the zip file and locate the file REGISTER.DOC 

🚧 Phase 2: Setup Obstacles & Best Practices

When attempting to feed this file into the Full-Text daemon, I encountered the classic DBA hurdles that you must avoid:

  • 💣 The Security Error (Cannot bulk load): The SQL Server service (MSSQLSERVER) runs under its own account and cannot access your Windows Downloads folder. To make it easy I Places the file in a neutral path (e.g., C:\temp</code>) with appropriate read permissions.

Now we are ready! 

This is the script to prep the environment flawlessly:

-- 1. Cleanup and Table Creation (Single-column PK, NOT NULL)
DROP TABLE IF EXISTS dbo.Word6Test;
GO
CREATE TABLE dbo.Word6Test (
FileID INT NOT NULL,
FileContent VARBINARY(MAX),
FileExtension NVARCHAR(10),
CONSTRAINT PK_Word6Test PRIMARY KEY CLUSTERED (FileID)
);
GO

-- 2. Ingesting the "Poisonous" Document
INSERT INTO dbo.Word6Test (FileID, FileContent, FileExtension)
SELECT 1, BulkColumn, '.doc'
FROM OPENROWSET(BULK 'C:\temp\REGISTER.doc', SINGLE_BLOB) AS x;
GO

-- 3. Enabling Full-Text Search
CREATE FULLTEXT CATALOG WordTestCatalog AS DEFAULT;
GO
CREATE FULLTEXT INDEX ON dbo.Word6Test(FileContent TYPE COLUMN FileExtension)
KEY INDEX PK_Word6Test WITH CHANGE_TRACKING AUTO;
GO

📉 Phase 3: Log Analysis (The Fake Failure)

Once indexing started, I expected fdhost.exe to spike to 100% CPU and crash. Instead, checking sys.dm_fts_fdhosts and the Full-Text log files (you can find these log files in the "..\MSSQL\Log" path, they start with the name SQLFT ), I found a graceful error handling state:

Error '0x8004fd02: The filter daemon MSFTEFD failed to load an IFilter interface for document, so it can't be indexed.' [...] Attempt will be made to reindex it. Informational: Full-text Full population completed [...] Number of documents failed: 1.

🧪 What's happened? This is not a crash. This is resilience. 

SQL Server tried to read the file, failed at the IFilter layer, but gracefully dropped the document, and completed the population without killing the parent process.

🧩 Phase 4: The CU3 Mystery

The real mystery? I was running on SQL Server CU3—a build theoretically still affected by the bug. 

Why didn't it crash? 

Running EXEC sp_help_fulltext_system_components 'filter'; revealed the .doc extension was pointing to offfilt02.dll.

Modern architectures update silent libraries in the background. The presence of the modern Office filter acts as a shield. It has built-in exception handling, gracefully trapping the 0x8004fd02 exception instead of allowing an Access Violation to nuke fdhost.exe.

In this case, we cannot reproduce the bug on CU3. We could potentially attempt a test by modifying the .doc file with a hex editor to force an error; however, I’ve decided not to pursue this route. If your configuration is up to date, you will no longer encounter this bug. My priority is to demonstrate the correct troubleshooting workflow for these scenarios.

🚀 My REAL Strategy

In my experience, bugs don't just depend on the engine version you see when querying @@VERSION. When dealing with Full-Text Search, external OS components or Office DLLs heavily dictate system stability. An IFilter load error is the desired behavior compared to a service crash. Even if you cannot force the system to break, the investigative process forces you to audit permissions, index structures, and DLL configurations—which ultimately elevates your mastery of the SQL Server engine.


📢 Support the Blog: Did you find this deep-dive helpful? The ads you see here are selected to reflect your interests. If a partner's offer catches your eye, give it a look! Your engagement helps me continue publishing premium SQL Server content for the community.

Biondi Luca @2026 - Sharing over 25 years of Gained Knowledge for Passion. Share if you like my posts!

Comments

I Post più popolari

Speaking to Sql Server, sniffing the TDS protocol

SQL Server, find text in a Trigger, Stored Procedures, View and Function. Two ways and what ways is better

SQL Server, Avoid that damn Table Spool!