The reason why it doesn’t work on linux for your example is the difference in filesystems, so different methods are used:
All the filtered paths are added to a table Filenames-XXX
, which is then used in a where clause (at the bottom of this):
INSERT INTO "Previous-F574194ACDA6CB48885A8818019D565E" ("Path",
"FileHash",
"MetaHash",
"Size",
"Type")
SELECT "Path",
"FileHash",
"MetaHash",
"Size",
"Type"
FROM
(SELECT "File"."Path" AS "Path",
NULL AS "FileHash",
"Blockset"."Fullhash" AS "MetaHash",
-1 AS "Size",
0 AS "Type",
"FilesetEntry"."FilesetID" AS "FilesetID"
FROM "File",
"FilesetEntry",
"Metadataset",
"Blockset"
WHERE "File"."ID" = "FilesetEntry"."FileID"
AND "File"."BlocksetID" = -100
AND "Metadataset"."ID"="File"."MetadataID"
AND "Metadataset"."BlocksetID" = "Blockset"."ID"
UNION SELECT "File"."Path" AS "Path",
NULL AS "FileHash",
"Blockset"."Fullhash" AS "MetaHash",
-1 AS "Size",
1 AS "Type",
"FilesetEntry"."FilesetID" AS "FilesetID"
FROM "File",
"FilesetEntry",
"Metadataset",
"Blockset"
WHERE "File"."ID" = "FilesetEntry"."FileID"
AND "File"."BlocksetID" = -200
AND "Metadataset"."ID"="File"."MetadataID"
AND "Metadataset"."BlocksetID" = "Blockset"."ID"
UNION SELECT "File"."Path" AS "Path",
"FB"."FullHash" AS "FileHash",
"MB"."Fullhash" AS "MetaHash",
"FB"."Length" AS "Size",
2 AS "Type",
"FilesetEntry"."FilesetID" AS "FilesetID"
FROM "File",
"FilesetEntry",
"Metadataset",
"Blockset" MB,
"Blockset" FB
WHERE "File"."ID" = "FilesetEntry"."FileID"
AND "File"."BlocksetID" >= 0
AND "Metadataset"."ID"="File"."MetadataID"
AND "Metadataset"."BlocksetID" = "MB"."ID"
AND "File"."BlocksetID" = "FB"."ID" ) A
-- This assumes all filters are include filters:
WHERE "A"."FilesetID" = ?
AND "A"."Path" IN
(SELECT DISTINCT "Path"
FROM "Filenames-7B2A7B9904DC7743987C29221B815A75")
For the case-insensitive filesystems, this is instead done by iterating over all the results and applying the filter in C# rather than SQL.
Fix: #5232