-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdbo.LabelMap.sql
More file actions
80 lines (73 loc) · 1.78 KB
/
dbo.LabelMap.sql
File metadata and controls
80 lines (73 loc) · 1.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
DROP TABLE IF EXISTS LabelMap
CREATE TABLE LabelMap
(
SPID int NOT NULL,
SourceLabel nvarchar(8),
GeneratedLabel nvarchar(10),
LineNumber int NOT NULL,
CONSTRAINT PK_LabelMap PRIMARY KEY CLUSTERED(SPID, SourceLabel),
CONSTRAINT AK_LabelMap_SPID_GeneratedLabel UNIQUE (SPID, GeneratedLabel)
)
GO
CREATE OR ALTER VIEW vwLabelMap
AS
SELECT *
FROM dbo.LabelMap
WHERE SPID = @@SPID
GO
CREATE OR ALTER PROCEDURE [dbo].[spLabelMapCreate]
AS
SET NOCOUNT, XACT_ABORT, CONCAT_NULL_YIELDS_NULL ON
BEGIN TRY
DELETE vwLabelMap
DECLARE @DuplicateLabels nvarchar(max) = N''
SELECT @DuplicateLabels = STUFF
((
SELECT N', [Line' + CONVERT(nvarchar(8), MAX(Idx)) + N'] ' + Label
FROM dbo.Instructions
GROUP BY Label
HAVING COUNT(Label) > 1
FOR XML PATH('')
), 1, 2, N'')
DECLARE @NonExistentLabels nvarchar(max) = N''
SELECT @NonExistentLabels = STUFF
((
SELECT N', [Line' + CONVERT(nvarchar(8), MAX(I.Idx)) + N'] ' + I.Arg1
FROM dbo.Instructions I
INNER JOIN dbo.OpCodeArgument A ON I.OpCode = A.OpCode
WHERE I.Arg1 IS NOT NULL
AND A.TypeLookup = N'LBL'
AND NOT EXISTS
(
SELECT Label
FROM dbo.Instructions II
WHERE I.Arg1 = II.Label
)
GROUP BY I.Arg1
FOR XML PATH('')
), 1, 2, N'')
IF(LEN(@DuplicateLabels) > 1 OR LEN(@NonExistentLabels) > 1)
BEGIN
DECLARE @Err nvarchar(200) =
N'Compiler Error:
' + ISNULL(N'Duplicate Labels: ' + @DuplicateLabels, N'') + N'
' + ISNULL(N'Non Existent Labels: ' + @NonExistentLabels, N'')
RAISERROR(@Err, 16, 1)
END
INSERT dbo.vwLabelMap
(
SourceLabel,
GeneratedLabel,
LineNumber
)
SELECT I.Label,
N'#LBL' + CONVERT(nvarchar(6), ROW_NUMBER() OVER (ORDER BY @@SPID)),
I.Idx
FROM dbo.Instructions I
WHERE Label IS NOT NULL
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 1 ROLLBACK TRAN
EXEC spErrorHandle
RETURN 5
END CATCH