Quantcast
Channel: SQL Server Database Engine forum
Viewing all articles
Browse latest Browse all 15930

Non Yielding Schduler on SQL 2019 relating to bug in UDF Scalar inlining

$
0
0
I asked this question here previously: https://social.msdn.microsoft.com/Forums/en-US/7d6df408-4c65-42f4-9666-2db0623100f8/nonyielding-scheduler-on-sql-server-2019?forum=sqldatabaseengine

However the answer indicated it would likely be fixed in CU2... it's now CU5 and we still have the same issue.

Repro here:
CREATE FUNCTION [dbo].[fn_remove_nonstandard_characters]
  (
    @p_string_to_cleanse   varchar(1000)
  )
  RETURNS varchar(1000)
  AS
  --===============================================================================
  --   removes nonstandard characters from string (except commas and dashes)
  --===============================================================================
  BEGIN
    DECLARE @v_nonstandard_character_mask   varchar(110)

    SET @v_nonstandard_character_mask = '%[!?\"$.;:*#()@\\]%'

    WHILE @p_string_to_cleanse LIKE @v_nonstandard_character_mask
      BEGIN
         SET @p_string_to_cleanse = LEFT( @p_string_to_cleanse,
                                          PATINDEX( @v_nonstandard_character_mask,
                                          @p_string_to_cleanse )-1 )
    + REVERSE( LEFT( REVERSE( @p_string_to_cleanse),
                                          LEN( @p_string_to_cleanse ) -
                                          PATINDEX( @v_nonstandard_character_mask, @p_string_to_cleanse )))
      END

  --===============================================================================
  --   removes commas and dashes characters from string
  --===============================================================================
    IF @p_string_to_cleanse LIKE '%,%'
      SET @p_string_to_cleanse = REPLACE( @p_string_to_cleanse, ',', '' )

    IF @p_string_to_cleanse LIKE '%-%'
      SET @p_string_to_cleanse = REPLACE( @p_string_to_cleanse, '-', '' )

    IF @p_string_to_cleanse LIKE '%''%'
      SET @p_string_to_cleanse = REPLACE( @p_string_to_cleanse, '''', '' )

    IF @p_string_to_cleanse LIKE '%~[%' ESCAPE '~'
      SET @p_string_to_cleanse = REPLACE( @p_string_to_cleanse, '[', '' )

    IF @p_string_to_cleanse LIKE '%]%'
      SET @p_string_to_cleanse = REPLACE( @p_string_to_cleanse, ']', '' )

    IF @p_string_to_cleanse LIKE '%`%'
      SET @p_string_to_cleanse = REPLACE( @p_string_to_cleanse, '`', '' )
            
    RETURN @p_string_to_cleanse
  END



CREATE FUNCTION [dbo].[fn_pack_legal_name]
(
  @p_legal_name	      varchar(1000)
, @p_max_return_length  integer
)
RETURNS varchar(1000)
AS

--===============================================================================
--	removes the following terms from employer_name
--	AND, MANAGEMENT, LTD, LIMITED, GROUP, COMPANY, CO, DIVISION, NEW ZEALAND, NZ, MR, MRS
--===============================================================================
  BEGIN
    SET @p_legal_name = dbo.fn_remove_nonstandard_characters( @p_legal_name )

    IF @p_legal_name LIKE '% AND%'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' AND', ' ' )

    IF @p_legal_name LIKE '% MANAGEMENT%'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' MANAGEMENT', ' ' )

    IF @p_legal_name LIKE '% LTD%'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' LTD', ' ' )

    IF @p_legal_name LIKE '% LIMITED%'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' LIMITED', ' ' )

    IF @p_legal_name LIKE '% GROUP%'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' GROUP', ' ' )

    IF @p_legal_name LIKE '% COMPANY%'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' COMPANY', ' ' )

    IF @p_legal_name LIKE '% CO %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' CO ', ' ' )

    IF @p_legal_name LIKE '% DIVISION%'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' DIVISION', ' ' )

    IF @p_legal_name LIKE '%NEW ZEALAND%'
		  SET @p_legal_name = REPLACE( @p_legal_name, 'NEW ZEALAND', ' ' )

    IF @p_legal_name LIKE '% NZ%'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' NZ', ' ' )

    IF @p_legal_name LIKE '% MRS%'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' MRS', ' ' )

    IF @p_legal_name LIKE '% MR%'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' MR', ' ' )
--lbf repair
    IF @p_legal_name LIKE '% AN %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' AN ', ' ' )

    IF @p_legal_name LIKE '% AS %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' AS ', ' ' )

    IF @p_legal_name LIKE '% AT %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' AT ', ' ' )

    IF @p_legal_name LIKE '% BY %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' BY ', ' ' )

    IF @p_legal_name LIKE '% FOR %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' FOR ', ' ' )

    IF @p_legal_name LIKE '% FROM %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' FROM ', ' ' )

    IF @p_legal_name LIKE '% IN %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' IN ', ' ' )

    IF @p_legal_name LIKE '% OF %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' OF ', ' ' )

    IF @p_legal_name LIKE '% ON %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' OF ', ' ' )

    IF @p_legal_name LIKE '% OR %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' OR ', ' ' )

    IF @p_legal_name LIKE '% THE %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' THE ', ' ' )

    IF @p_legal_name LIKE '% TO %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' TO ', ' ' )

    IF @p_legal_name LIKE '% WITH %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' WITH ', ' ' )

    IF @p_legal_name LIKE '% COMP %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' COMP ', ' ' )

    IF @p_legal_name LIKE '% COMPAN %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' COMPAN ', ' ' )

    IF @p_legal_name LIKE '% COMPANIES %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' COMPANIES ', ' ' )

    IF @p_legal_name LIKE '% COMPANY %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' COMPANY ', ' ' )

    IF @p_legal_name LIKE '% COMPNY %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' COMPNY ', ' ' )

    IF @p_legal_name LIKE '% CORP %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' CORP ', ' ' )

    IF @p_legal_name LIKE '% PTY %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' PTY ', ' ' )

    IF @p_legal_name LIKE '% CORPORATION %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' CORPORATION ', ' ' )

    IF @p_legal_name LIKE '% INC %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' INC ', ' ' )

    IF @p_legal_name LIKE '% INCORP %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' INCORP ', ' ' )

    IF @p_legal_name LIKE '% INCORPORATED %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' INCORPORATED ', ' ' )

    IF @p_legal_name LIKE '% PROPRIETARY %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' PROPRIETARY ', ' ' )

    IF @p_legal_name LIKE '% LMTD %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' LMTD ', ' ' )

    IF @p_legal_name LIKE '% NL %'
		  SET @p_legal_name = REPLACE( @p_legal_name, ' NL ', ' ' )

    SET @p_legal_name = UPPER( LEFT( REPLACE( @p_legal_name, ' ', '' ), @p_max_return_length) )

    RETURN @p_legal_name
  END


--Now lets run these functions using a simple table:

DROP TABLE IF EXISTS dbo.Function_calling_function

CREATE TABLE dbo.Function_calling_function (
	ID int IDENTITY(1,1) PRIMARY KEY,
	CompanyName varchar(300)
)

INSERT INTO dbo.Function_calling_function (CompanyName)
VALUES ('Microsoft software LMTD'),('Amazon shopping [.com] limited'),('Gillette, shaving foam limited'),('Facebook.com'),('New Zealand company inc'),('Xero'),('Some [],; Company')

--Try selecting everything, works a-ok
SELECT * FROM dbo.Function_calling_function

--Try non nested scalar function, works a-ok
SELECT *, [dbo].[fn_remove_nonstandard_characters](CompanyName) FROM dbo.Function_calling_function

--Try nested scalar function, seems to never end
SELECT *, [dbo].[fn_pack_legal_name](CompanyName,200) as CheckNestedFunc FROM dbo.Function_calling_function



I would prefer we didn't have to turn off Scalar UDF inlining per database, but that is what we have done.  It's not an option to review the hundreds of calls to these functions and provide query hints or to selectively turn off the feature for certain functions as we don't know what will/will not cause the bug. It seems to be related to nesting a "inlineable" function with a "non inlineable" function.  Prefer it was fixed!



Viewing all articles
Browse latest Browse all 15930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>