R0tenur / visualization

MIT License
173 stars 26 forks source link

"[\"Could not build mermaid from db response\"]" #81

Closed francesco1119 closed 2 years ago

francesco1119 commented 2 years ago

Expected Behavior

Should show diagram

Current Behavior

Doesn't show diagram

Possible Solution

Not sure

Steps to Reproduce

I was trying to reply to a question on dba.stackexchange.com and I incur in this error

  1. Create 3 empty databases and call them Test1, Test2and Test3
  2. On Test1 execute this query:
CREATE TABLE [dbo].[EntityTypes]
(
    [EntityTypeId] [tinyint]     NOT NULL,
    [EntityType]   [varchar](10) NOT NULL,

    CONSTRAINT [PK_EntityTypes] PRIMARY KEY CLUSTERED ([EntityTypeId] ASC),

    CONSTRAINT [UK_EntityTypes_EntityType] UNIQUE NONCLUSTERED ([EntityType] ASC)
);

INSERT INTO [dbo].[EntityTypes] ([EntityTypeId], [EntityType]) VALUES (1, 'User'), (2, 'Person'), (3, 'Company');

CREATE TABLE [dbo].[Entities]
(
    [EntityId]     [int]          NOT NULL,
    [EntityTypeId] [tinyint]      NOT NULL,
    [DisplayName]  [varchar](150) NOT NULL,

    CONSTRAINT [PK_Entities] PRIMARY KEY CLUSTERED ([EntityId] ASC),

    CONSTRAINT [FK_Entities_EntityTypes] FOREIGN KEY ([EntityTypeId])
        REFERENCES [dbo].[EntityTypes] ([EntityTypeId])
        ON DELETE NO ACTION ON UPDATE NO ACTION,

    CONSTRAINT [UK_Entities_EntityId_EntityTypeId] UNIQUE NONCLUSTERED ([EntityId] ASC, [EntityTypeId] ASC)
)

CREATE TABLE [dbo].[User]
(
    [UserId]       [int]           NOT NULL, 
    [EntityTypeId] [tinyint]       NOT NULL  DEFAULT 1, -- 'User'
    [FirstName]    [varchar](75)   NOT NULL,
    [LastName]     [varchar](75)   NOT NULL,

    CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ([UserId] ASC),

    CONSTRAINT [FK_Users_Entities] FOREIGN KEY ([UserId], [EntityTypeId])
        REFERENCES [dbo].[Entities] ([EntityId], [EntityTypeId])
        ON DELETE CASCADE ON UPDATE NO ACTION,

    CONSTRAINT [CK_Users_EntityTypeId] CHECK ([EntityTypeId] = 1)
)

-- ClientDetails: v1

CREATE TABLE [dbo].[ClientDetails]
(
    [ClientDetailId]   [int]            NOT NULL,
    [AccountManagerId] [int]            NOT NULL,
    [Cost]             [decimal](10, 2) NOT NULL,
    [VAT]              [varchar](16)    NULL,

    CONSTRAINT [PK_ClientDetails] PRIMARY KEY CLUSTERED ([ClientDetailId] ASC),

    CONSTRAINT [FK_ClientDetails_Users] FOREIGN KEY ([AccountManagerId])
        REFERENCES [dbo].[User] ([UserId])
        ON DELETE NO ACTION ON UPDATE NO ACTION
)

CREATE TABLE [dbo].[Persons]
(
    [PersonId]       [int]         NOT NULL, 
    [EntityTypeId]   [tinyint]     NOT NULL  DEFAULT 2, -- 'Person'
    [ClientDetailId] [int]         NULL,
    [FirstName]      [varchar](75) NOT NULL,
    [LastName]       [varchar](75) NOT NULL,

    CONSTRAINT [PK_Persons] PRIMARY KEY CLUSTERED ([PersonId] ASC),

    CONSTRAINT [FK_Persons_Entities] FOREIGN KEY ([PersonId], [EntityTypeId])
        REFERENCES [dbo].[Entities] ([EntityId], [EntityTypeId])
        ON DELETE CASCADE ON UPDATE NO ACTION,

    CONSTRAINT [CK_Persons_EntityTypeId] CHECK ([EntityTypeId] = 2),

    CONSTRAINT [FK_Persons_ClientDetails] FOREIGN KEY ([ClientDetailId])
        REFERENCES [dbo].[ClientDetails] ([ClientDetailId])
        ON DELETE NO ACTION ON UPDATE NO ACTION
)

CREATE TABLE [dbo].[Companies]
(
    [CompanyId]      [int]          NOT NULL, 
    [EntityTypeId]   [tinyint]      NOT NULL  DEFAULT 3, -- 'Company'
    [ClientDetailId] [int]          NULL,
    [Name]           [varchar](150) NOT NULL,

    CONSTRAINT [PK_Companies] PRIMARY KEY CLUSTERED ([CompanyId] ASC),

    CONSTRAINT [FK_Companies_Entities] FOREIGN KEY ([CompanyId], [EntityTypeId])
        REFERENCES [dbo].[Entities] ([EntityId], [EntityTypeId])
        ON DELETE CASCADE ON UPDATE NO ACTION,

    CONSTRAINT [CK_Companies_EntityTypeId] CHECK ([EntityTypeId] = 3),

    CONSTRAINT [FK_Companies_ClientDetails] FOREIGN KEY ([ClientDetailId])
        REFERENCES [dbo].[ClientDetails] ([ClientDetailId])
        ON DELETE NO ACTION ON UPDATE NO ACTION,
)

-- Persons_Companies: v1

CREATE TABLE [dbo].[Persons_Companies]
(
    [PersonId]  [int]          NOT NULL, 
    [CompanyId] [int]          NOT NULL,
    [Role]      [varchar](100) NOT NULL,

    CONSTRAINT [PK_Persons_Companies] PRIMARY KEY CLUSTERED ([PersonId] ASC, [CompanyId] ASC),

    CONSTRAINT [FK_Persons_Companies_Persons] FOREIGN KEY ([PersonId])
        REFERENCES [dbo].[Persons] ([PersonId])
        ON DELETE NO ACTION ON UPDATE NO ACTION,

    CONSTRAINT [FK_Persons_Companies_Companies] FOREIGN KEY ([CompanyId])
        REFERENCES [dbo].[Companies] ([CompanyId])
        ON DELETE NO ACTION ON UPDATE NO ACTION
)
  1. On Test2 execute this query:
CREATE TABLE [dbo].[EntityTypes]
(
    [EntityTypeId] [tinyint]     NOT NULL,
    [EntityType]   [varchar](10) NOT NULL,

    CONSTRAINT [PK_EntityTypes] PRIMARY KEY CLUSTERED ([EntityTypeId] ASC),

    CONSTRAINT [UK_EntityTypes_EntityType] UNIQUE NONCLUSTERED ([EntityType] ASC)
);

INSERT INTO [dbo].[EntityTypes] ([EntityTypeId], [EntityType]) VALUES (1, 'User'), (2, 'Person'), (3, 'Company');

CREATE TABLE [dbo].[Entities]
(
    [EntityId]     [int]          NOT NULL,
    [EntityTypeId] [tinyint]      NOT NULL,
    [DisplayName]  [varchar](150) NOT NULL,

    CONSTRAINT [PK_Entities] PRIMARY KEY CLUSTERED ([EntityId] ASC),

    CONSTRAINT [FK_Entities_EntityTypes] FOREIGN KEY ([EntityTypeId])
        REFERENCES [dbo].[EntityTypes] ([EntityTypeId])
        ON DELETE NO ACTION ON UPDATE NO ACTION,

    CONSTRAINT [UK_Entities_EntityId_EntityTypeId] UNIQUE NONCLUSTERED ([EntityId] ASC, [EntityTypeId] ASC)
)

CREATE TABLE [dbo].[User]
(
    [UserId]       [int]           NOT NULL, 
    [EntityTypeId] [tinyint]       NOT NULL  DEFAULT 1, -- 'User'
    [FirstName]    [varchar](75)   NOT NULL,
    [LastName]     [varchar](75)   NOT NULL,

    CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ([UserId] ASC),

    CONSTRAINT [FK_Users_Entities] FOREIGN KEY ([UserId], [EntityTypeId])
        REFERENCES [dbo].[Entities] ([EntityId], [EntityTypeId])
        ON DELETE CASCADE ON UPDATE NO ACTION,

    CONSTRAINT [CK_Users_EntityTypeId] CHECK ([EntityTypeId] = 1)
)

-- ClientDetails: v2

CREATE TABLE [dbo].[ClientDetails]
(
    [ClientDetailId]       [int]            NOT NULL,
    [AccountManagerId]     [int]            NOT NULL,
    [AccountManagerTypeId] [tinyint]        NOT NULL,
    [Cost]                 [decimal](10, 2) NOT NULL,
    [VAT]                  [varchar](16)    NULL,

    CONSTRAINT [PK_ClientDetails] PRIMARY KEY CLUSTERED ([ClientDetailId] ASC),

    CONSTRAINT [FK_ClientDetails_Users] FOREIGN KEY ([AccountManagerId], [AccountManagerTypeId])
        REFERENCES [dbo].[User] ([UserId], [EntityTypeId])
        ON DELETE NO ACTION ON UPDATE NO ACTION,

    CONSTRAINT [CK_ClientDetails_AccountManagerTypeId] CHECK ([AccountManagerTypeId] = 1)
)

CREATE TABLE [dbo].[Persons]
(
    [PersonId]       [int]         NOT NULL, 
    [EntityTypeId]   [tinyint]     NOT NULL  DEFAULT 2, -- 'Person'
    [ClientDetailId] [int]         NULL,
    [FirstName]      [varchar](75) NOT NULL,
    [LastName]       [varchar](75) NOT NULL,

    CONSTRAINT [PK_Persons] PRIMARY KEY CLUSTERED ([PersonId] ASC),

    CONSTRAINT [FK_Persons_Entities] FOREIGN KEY ([PersonId], [EntityTypeId])
        REFERENCES [dbo].[Entities] ([EntityId], [EntityTypeId])
        ON DELETE CASCADE ON UPDATE NO ACTION,

    CONSTRAINT [CK_Persons_EntityTypeId] CHECK ([EntityTypeId] = 2),

    CONSTRAINT [FK_Persons_ClientDetails] FOREIGN KEY ([ClientDetailId])
        REFERENCES [dbo].[ClientDetails] ([ClientDetailId])
        ON DELETE NO ACTION ON UPDATE NO ACTION
)

CREATE TABLE [dbo].[Companies]
(
    [CompanyId]      [int]          NOT NULL, 
    [EntityTypeId]   [tinyint]      NOT NULL  DEFAULT 3, -- 'Company'
    [ClientDetailId] [int]          NULL,
    [Name]           [varchar](150) NOT NULL,

    CONSTRAINT [PK_Companies] PRIMARY KEY CLUSTERED ([CompanyId] ASC),

    CONSTRAINT [FK_Companies_Entities] FOREIGN KEY ([CompanyId], [EntityTypeId])
        REFERENCES [dbo].[Entities] ([EntityId], [EntityTypeId])
        ON DELETE CASCADE ON UPDATE NO ACTION,

    CONSTRAINT [CK_Companies_EntityTypeId] CHECK ([EntityTypeId] = 3),

    CONSTRAINT [FK_Companies_ClientDetails] FOREIGN KEY ([ClientDetailId])
        REFERENCES [dbo].[ClientDetails] ([ClientDetailId])
        ON DELETE NO ACTION ON UPDATE NO ACTION,
)

-- Persons_Companies: v2

CREATE TABLE [dbo].[Persons_Companies]
(
    [PersonId]      [int]          NOT NULL,
    [PersonTypeId]  [tinyint]      NOT NULL  DEFAULT 2,
    [CompanyId]     [int]          NOT NULL,
    [CompanyTypeId] [tinyint]      NOT NULL  DEFAULT 3,
    [Role]          [varchar](100) NOT NULL,

    CONSTRAINT [PK_Persons_Companies] PRIMARY KEY CLUSTERED ([PersonId] ASC, [CompanyId] ASC),

    CONSTRAINT [FK_Persons_Companies_Persons] FOREIGN KEY ([PersonId], [PersonTypeId])
        REFERENCES [dbo].[Persons] ([PersonId], [EntityTypeId])
        ON DELETE NO ACTION ON UPDATE NO ACTION,

    CONSTRAINT [CK_Persons_Companies_PersonTypeId] CHECK ([PersonTypeId] = 2),

    CONSTRAINT [FK_Persons_Companies_Companies] FOREIGN KEY ([CompanyId], [CompanyTypeId])
        REFERENCES [dbo].[Companies] ([CompanyId], [EntityTypeId])
        ON DELETE NO ACTION ON UPDATE NO ACTION

    CONSTRAINT [CK_Persons_Companies_CompanyTypeId] CHECK ([CompanyTypeId] = 3)
)
  1. On Test3 execute this query:
CREATE TABLE [dbo].[EntityTypes]
(
    [EntityTypeId] [tinyint]     NOT NULL,
    [EntityType]   [varchar](10) NOT NULL,

    CONSTRAINT [PK_EntityTypes] PRIMARY KEY CLUSTERED ([EntityTypeId] ASC),

    CONSTRAINT [UK_EntityTypes_EntityType] UNIQUE NONCLUSTERED ([EntityType] ASC)
);

INSERT INTO [dbo].[EntityTypes] ([EntityTypeId], [EntityType]) VALUES (1, 'User'), (2, 'Person'), (3, 'Company');

CREATE TABLE [dbo].[Entities]
(
    [EntityId]     [int]          NOT NULL,
    [EntityTypeId] [tinyint]      NOT NULL,
    [DisplayName]  [varchar](150) NOT NULL,

    CONSTRAINT [PK_Entities] PRIMARY KEY CLUSTERED ([EntityId] ASC),

    CONSTRAINT [FK_Entities_EntityTypes] FOREIGN KEY ([EntityTypeId])
        REFERENCES [dbo].[EntityTypes] ([EntityTypeId])
        ON DELETE NO ACTION ON UPDATE NO ACTION,

    CONSTRAINT [UK_Entities_EntityId_EntityTypeId] UNIQUE NONCLUSTERED ([EntityId] ASC, [EntityTypeId] ASC)
)

CREATE TABLE [dbo].[User]
(
    [UserId]       [int]           NOT NULL, 
    [EntityTypeId] [tinyint]       NOT NULL  DEFAULT 1, -- 'User'
    [FirstName]    [varchar](75)   NOT NULL,
    [LastName]     [varchar](75)   NOT NULL,

    CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ([UserId] ASC),

    CONSTRAINT [FK_Users_Entities] FOREIGN KEY ([UserId], [EntityTypeId])
        REFERENCES [dbo].[Entities] ([EntityId], [EntityTypeId])
        ON DELETE CASCADE ON UPDATE NO ACTION,

    CONSTRAINT [CK_Users_EntityTypeId] CHECK ([EntityTypeId] = 1)
)

-- ClientDetails: v3

CREATE TABLE [dbo].[ClientDetails]
(
    [ClientDetailId]       [int]            NOT NULL,
    [AccountManagerId]     [int]            NOT NULL,
    [AccountManagerTypeId] [tinyint]        NOT NULL,
    [Cost]                 [decimal](10, 2) NOT NULL,
    [VAT]                  [varchar](16)    NULL,

    CONSTRAINT [PK_ClientDetails] PRIMARY KEY CLUSTERED ([ClientDetailId] ASC),

    CONSTRAINT [FK_ClientDetails_Users] FOREIGN KEY ([AccountManagerId], [AccountManagerTypeId])
        REFERENCES [dbo].[Entities] ([EntityId], [EntityTypeId])
        ON DELETE NO ACTION ON UPDATE NO ACTION,

    CONSTRAINT [CK_ClientDetails_AccountManagerTypeId] CHECK ([AccountManagerTypeId] = 1)
)

CREATE TABLE [dbo].[Persons]
(
    [PersonId]       [int]         NOT NULL, 
    [EntityTypeId]   [tinyint]     NOT NULL  DEFAULT 2, -- 'Person'
    [ClientDetailId] [int]         NULL,
    [FirstName]      [varchar](75) NOT NULL,
    [LastName]       [varchar](75) NOT NULL,

    CONSTRAINT [PK_Persons] PRIMARY KEY CLUSTERED ([PersonId] ASC),

    CONSTRAINT [FK_Persons_Entities] FOREIGN KEY ([PersonId], [EntityTypeId])
        REFERENCES [dbo].[Entities] ([EntityId], [EntityTypeId])
        ON DELETE CASCADE ON UPDATE NO ACTION,

    CONSTRAINT [CK_Persons_EntityTypeId] CHECK ([EntityTypeId] = 2),

    CONSTRAINT [FK_Persons_ClientDetails] FOREIGN KEY ([ClientDetailId])
        REFERENCES [dbo].[ClientDetails] ([ClientDetailId])
        ON DELETE NO ACTION ON UPDATE NO ACTION
)

CREATE TABLE [dbo].[Companies]
(
    [CompanyId]      [int]          NOT NULL, 
    [EntityTypeId]   [tinyint]      NOT NULL  DEFAULT 3, -- 'Company'
    [ClientDetailId] [int]          NULL,
    [Name]           [varchar](150) NOT NULL,

    CONSTRAINT [PK_Companies] PRIMARY KEY CLUSTERED ([CompanyId] ASC),

    CONSTRAINT [FK_Companies_Entities] FOREIGN KEY ([CompanyId], [EntityTypeId])
        REFERENCES [dbo].[Entities] ([EntityId], [EntityTypeId])
        ON DELETE CASCADE ON UPDATE NO ACTION,

    CONSTRAINT [CK_Companies_EntityTypeId] CHECK ([EntityTypeId] = 3),

    CONSTRAINT [FK_Companies_ClientDetails] FOREIGN KEY ([ClientDetailId])
        REFERENCES [dbo].[ClientDetails] ([ClientDetailId])
        ON DELETE NO ACTION ON UPDATE NO ACTION,
)

-- Persons_Companies: v3

CREATE TABLE [dbo].[Persons_Companies]
(
    [PersonId]      [int]           NOT NULL,
    [PersonTypeId]  [tinyint]       NOT NULL  DEFAULT 2,
    [CompanyId]     [int]           NOT NULL,
    [CompanyTypeId] [tinyint]       NOT NULL  DEFAULT 3,
    [Role]          [varchar](100)  NOT NULL,

    CONSTRAINT [PK_Persons_Companies] PRIMARY KEY CLUSTERED ([PersonId] ASC, [CompanyId] ASC),

    CONSTRAINT [FK_Persons_Companies_PersonId_PersonTypeId] FOREIGN KEY ([PersonId], [PersonTypeId])
        REFERENCES [dbo].[Entities] ([EntityId], [EntityTypeId])
        ON DELETE NO ACTION ON UPDATE NO ACTION,

    CONSTRAINT [CK_Persons_Companies_PersonTypeId] CHECK ([PersonTypeId] = 2),

    CONSTRAINT [FK_Persons_Companies_CompanyId_CompanyTypeId] FOREIGN KEY ([CompanyId], [CompanyTypeId])
        REFERENCES [dbo].[Entities] ([EntityId], [EntityTypeId])
        ON DELETE NO ACTION ON UPDATE NO ACTION,

    CONSTRAINT [CK_Persons_Companies_CompanyTypeId] CHECK ([CompanyTypeId] = 3)
)
  1. The plugin brakes on database Test1 but works on the others:

image

Context (Environment)

Version: 1.34.0 (system setup) Commit: 83a4316cf89cbf961a0f09a72c861379cfd01fa9 Date: 2021-12-15T20:47:33.863Z VS Code: 1.58.0 Electron: 12.0.9 Chrome: 89.0.4389.128 Node.js: 14.16.0 V8: 8.9.255.25-electron.0 OS: Windows_NT x64 10.0.19044

R0tenur commented 2 years ago

@francesco1119 I have now tried with your databases and I am not able to reproduce the error. I found a bug in the error handling so if you could try this release instead: https://github.com/R0tenur/visualization/releases/tag/v0.8.3 That would give me a better stacktrace

francesco1119 commented 2 years ago

Could not reproduce it neither with your latest version.

Solved.