Skip to content

Conversation

roji
Copy link
Member

@roji roji commented Oct 2, 2023

Fixes #31912

Description

The primitive collection improvements to 8.0 changed the translation of Contains to use OPENJSON with WITH, but that's incompatible with hierarchyid (SQL Server CLR type).

Customer impact

Queries which apply Contains to a parameter list of HierarchyId no longer work in 8.0.

How found

Customer reported.

Regression

Yes (when the community hierarchyid package was used)

Testing

Added.

Risk

Very low, the mechanism to transform the incompatible OPENJSON with WITH to OPENJSON without WITH already existed for other purposes; this change only extends its usage for hierarchyid.

@roji roji requested a review from maumar October 2, 2023 12:30
@roji roji force-pushed the ContainsWithClrTypes branch from 889c9d3 to 2b22b71 Compare October 2, 2023 13:04
@ajcvickers ajcvickers added this to the 8.0.0 milestone Oct 2, 2023
@roji roji changed the title Make Contains work again over hierarchyid [release/8.0] Make Contains work again over hierarchyid Oct 2, 2023
@ajcvickers
Copy link
Contributor

@roji This is approved by Tactics.

@roji roji merged commit ff1feb3 into dotnet:release/8.0 Oct 3, 2023
@roji roji deleted the ContainsWithClrTypes branch October 3, 2023 09:49
@IT-CASADO
Copy link

This is still broken in some use cases. In my case with some .Includes and .AsSplitQuery().

var result = await query
   .Include()
   .AsSplitQuery()       
   .ToListAsync(cancellationToken);

This results to follwoing two queries.

exec sp_executesql N'SELECT [i].[Id], [i].[NodeId]
FROM [Initiative] AS [i]

WHERE [i].[NodeId] IN (
    SELECT CAST([q].[value] AS hierarchyid) AS [value]
    FROM OPENJSON(@__qFiltered_1) AS [q]
)'

,N'@__qFiltered_1 nvarchar(4000)',@__qFiltered_1=N'["/3/1/1/"]'


exec sp_executesql N'SELECT [i].[Id], [i].[NodeId]
FROM [Initiative] AS [i]
INNER JOIN [InitiativeDimensionValue] AS [t] ON [i].[Id] = [t].[InitiativeId]

WHERE [i].[NodeId] IN (
    SELECT [q].[value]
    FROM OPENJSON(@__qFiltered_4) WITH ([value] hierarchyid ''$'') AS [q]         --> this is wrong
)'

,N'@__qFiltered_1 nvarchar(4000)',@__qFiltered_1=N'["/3/1/1/"]'

Unfortunately the second query is still using the WITH syntax.

@roji
Copy link
Member Author

roji commented Jan 31, 2024

@IT-CASADO can you please open a new issue for this, including a minimal, runnable code sample? Then I can look at fixing that case as well.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Hierarchyid in a parameter collection does not work in 8.0-rc1 with MSSQL

4 participants