Skip to content

Fix many-to-many FK validation in records constraints - #952

Merged
huydo862003 merged 2 commits into
masterfrom
fix/record-validation-many-to-many-fk
Aug 6, 2026
Merged

Fix many-to-many FK validation in records constraints#952
huydo862003 merged 2 commits into
masterfrom
fix/record-validation-many-to-many-fk

Conversation

@huydo862003

Copy link
Copy Markdown
Contributor

Problem

Many-to-many FK validation in records are wrong

Table students { id int [pk] }
Table courses { id int [pk] }
Ref: students.id ?<>? courses.id

records students(id) {
  1
  2
  3
}

records courses(id) {
  10
  20
}

Before: False FK violations - students.id = 1 does not exist in courses.id (many to many should not require the non-null many side to exist on the other side)

After: No FK violations - ?<>? means neither side constrains the other

Rules

Operator Left Right Left existence Right existence
<> 1..* 1..* checked checked
?<> 0..* 1..* skipped checked
<>? 1..* 0..* checked skipped
?<>? 0..* 0..* skipped skipped

The guard: skip FK existence check when rightMax = * && leftMin = 0 && leftMax = *.

@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown

Benchmark Result

dbml-parse

suite 🏠 master 🔀 this branch change
18k 2288.782ms ±11.97% 2099.08ms ±16.57% 🟢 -8.3%
25k 4518.588ms ±8.54% 2917.605ms ±2.91% 🟢 -35.4%

@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown

Coverage Report

Commit: 6e5866d

Overall Coverage

Metric Coverage
Lines ✅ 85.52% (9076/10613)
Statements ✅ 82.63% (9855/11926)
Functions ✅ 87.71% (1899/2165)
Branches ⚠️ 73.63% (5849/7944)

Package Coverage

Package Lines Statements Functions Branches
dbml-cli ✅ 100.00% ✅ 100.00% ✅ 100.00% ✅ 100.00%
dbml-connector ⚠️ 64.62% ⚠️ 64.36% ⚠️ 59.53% ⚠️ 59.09%
dbml-core N/A N/A N/A N/A
dbml-parse ✅ 87.56% ✅ 84.32% ✅ 90.15% ⚠️ 74.67%

⚠️ Coverage Warnings

The following packages have coverage below 80%:

  • dbml-connector: 64.62% line coverage

Files with Coverage Below 80%

dbml-connector

9 file(s) below 80% coverage
File Lines Statements Functions Branches
src/connectors/bigquery/index.ts 0.00% 0.00% 0.00% 0.00%
src/utils/credential-loader.ts 0.00% 0.00% 0.00% 0.00%
src/utils/helpers.ts 0.00% 0.00% 0.00% 0.00%
src/connectors/snowflake/index.ts 10.56% 10.31% 0.00% 0.00%
src/utils/parseSchema.ts 46.15% 42.85% 28.57% 27.27%
src/connectors/connector.ts 66.66% 66.66% 100.00% 57.14%
src/connectors/oracle/tables.ts 71.25% 67.39% 100.00% 56.96%
src/connectors/oracle/index.ts 80.00% 80.76% 100.00% 25.00%
src/connectors/oracle/utils.ts 85.71% 85.71% 100.00% 71.42%

dbml-parse

86 file(s) below 80% coverage
File Lines Statements Functions Branches
src/compiler/queries/container/scope.ts 0.00% 0.00% 0.00% 0.00%
src/services/code_actions/provider.ts 0.00% 0.00% 0.00% 0.00%
src/services/diagnostics/provider.ts 0.00% 0.00% 0.00% 0.00%
src/compiler/queries/pipeline/interpret.ts 10.52% 12.19% 66.66% 41.66%
src/services/suggestions/crossFile.ts 19.35% 19.44% 33.33% 10.00%
src/core/local_modules/enum/index.ts 48.00% 46.29% 57.14% 52.63%
src/core/global_modules/project/interpret.ts 52.50% 46.66% 83.33% 23.07%
src/compiler/queries/legacy/parse.ts 53.84% 46.66% 50.00% 25.00%
src/compiler/projectLayout/layout.ts 54.16% 53.84% 75.00% 52.63%
src/core/local_modules/ref/index.ts 62.50% 61.76% 100.00% 57.14%
src/core/types/report.ts 62.96% 56.66% 76.92% 57.14%
src/core/global_modules/records/utils/data/values.ts 63.30% 55.71% 72.72% 49.28%
src/compiler/queries/legacy/token.ts 66.66% 66.66% 66.66% 100.00%
src/core/global_modules/enum/bind.ts 66.66% 68.75% 83.33% 50.00%
src/core/local_modules/program/index.ts 66.66% 69.23% 75.00% 62.50%
src/core/types/symbol/symbols.ts 67.36% 59.23% 61.71% 52.43%
src/core/global_modules/note/bind.ts 69.23% 71.42% 83.33% 50.00%
src/core/local_modules/checks/index.ts 69.23% 75.00% 100.00% 64.28%
src/core/local_modules/project/index.ts 69.23% 69.23% 100.00% 63.63%
src/compiler/queries/utils.ts 73.10% 73.38% 90.90% 51.11%
src/core/global_modules/project/bind.ts 73.33% 75.00% 100.00% 50.00%
src/core/local_modules/tablePartial/validate.ts 73.91% 73.04% 81.33% 58.42%
src/core/local_modules/use/index.ts 73.91% 75.00% 75.00% 78.12%
src/core/local_modules/indexes/validate.ts 74.28% 76.00% 90.90% 58.00%
src/core/local_modules/note/index.ts 75.00% 75.86% 75.00% 72.72%
src/services/suggestions/utils/index.ts 75.00% 75.00% 100.00% 62.06%
src/core/local_modules/records/index.ts 75.60% 76.19% 100.00% 68.08%
src/core/local_modules/project/validate.ts 75.86% 75.86% 100.00% 56.25%
src/core/local_modules/custom/index.ts 76.47% 76.19% 80.00% 75.00%
src/core/global_modules/records/utils/data/sqlTypes.ts 76.59% 80.64% 82.35% 72.22%
src/core/local_modules/indexes/index.ts 77.19% 72.58% 63.63% 69.04%
src/core/local_modules/metadata/index.ts 77.77% 76.92% 75.00% 75.00%
src/core/global_modules/tablePartial/interpret.ts 77.89% 70.64% 78.94% 53.84%
src/core/local_modules/note/validate.ts 78.00% 75.92% 82.35% 67.64%
src/core/global_modules/utils.ts 78.94% 74.41% 70.00% 55.81%
src/core/global_modules/indexes/bind.ts 78.94% 76.92% 90.90% 72.41%
src/core/types/relation.ts 79.31% 73.52% 58.33% 80.00%
src/core/types/filepath.ts 79.48% 78.57% 77.77% 70.37%
src/core/global_modules/program/utils.ts 80.00% 80.00% 100.00% 70.00%
src/core/global_modules/tableGroup/bind.ts 80.00% 80.00% 100.00% 57.14%
src/core/local_modules/records/validate.ts 80.28% 80.55% 93.75% 72.30%
src/core/global_modules/indexes/interpret.ts 81.39% 72.00% 100.00% 56.66%
src/core/local_modules/tablePartial/index.ts 81.48% 81.48% 100.00% 77.27%
src/core/local_modules/diagramView/validate.ts 81.57% 78.04% 84.21% 72.72%
src/core/local_modules/checks/validate.ts 81.63% 82.69% 93.75% 70.00%
src/core/global_modules/records/bind.ts 82.92% 83.72% 93.75% 67.30%
src/compiler/queries/container/token.ts 83.33% 85.71% 100.00% 75.00%
src/core/parser/parser.ts 83.33% 83.64% 98.50% 74.92%
src/core/global_modules/ref/bind.ts 83.87% 83.87% 90.00% 75.00%
src/core/local_modules/enum/validate.ts 83.87% 80.30% 81.25% 73.68%
__tests__/utils/compiler.ts 84.39% 81.91% 100.00% 57.14%
src/services/suggestions/provider.ts 85.43% 81.67% 92.53% 73.06%
__tests__/utils/mocks.ts 85.71% 86.20% 75.00% 100.00%
src/core/utils/setting.ts 86.84% 82.97% 85.71% 72.22%
src/services/suggestions/utils/useMerger.ts 86.95% 81.13% 100.00% 46.34%
src/core/global_modules/tablePartial/bind.ts 87.03% 87.27% 100.00% 71.42%
src/core/local_modules/metadata/validate.ts 87.50% 85.41% 100.00% 71.87%
src/services/suggestions/recordRowSnippet.ts 88.46% 87.09% 100.00% 73.80%
src/compiler/queries/nodeAtPosition.ts 88.88% 90.00% 100.00% 75.00%
src/core/global_modules/diagramView/index.ts 89.16% 86.23% 83.33% 78.18%
src/core/global_modules/tableGroup/interpret.ts 89.58% 89.58% 100.00% 77.27%
src/compiler/index.ts 90.00% 90.07% 70.00% 76.92%
src/core/types/symbol/metadata.ts 90.86% 76.86% 94.00% 60.43%
src/core/global_modules/records/index.ts 90.90% 87.15% 100.00% 79.16%
src/core/global_modules/records/utils/constraints/pk.ts 91.66% 88.88% 93.75% 63.15%
src/core/global_modules/table/interpret.ts 91.72% 85.97% 96.29% 67.64%
src/core/local_modules/table/validate.ts 91.86% 92.51% 97.95% 79.01%
src/core/global_modules/schema/index.ts 92.26% 82.46% 91.66% 70.07%
src/core/utils/interpret.ts 93.15% 90.00% 100.00% 71.79%
src/core/global_modules/diagramView/interpret.ts 94.59% 90.40% 92.85% 75.75%
src/services/suggestions/use.ts 94.68% 87.61% 100.00% 77.45%
src/core/global_modules/ref/interpret.ts 95.83% 94.11% 100.00% 78.84%
src/core/global_modules/records/interpret.ts 95.97% 92.59% 100.00% 79.54%
__tests__/examples/interpreter/multifile/utils.ts 96.00% 89.65% 100.00% 62.50%
src/core/global_modules/note/interpret.ts 96.29% 96.29% 100.00% 75.00%
src/compiler/queries/canonicalName.ts 96.96% 92.10% 100.00% 76.66%
src/core/global_modules/metadata/utils.ts 97.01% 90.58% 100.00% 75.55%
src/core/global_modules/program/interpret.ts 97.22% 91.82% 100.00% 69.76%
src/core/types/errors.ts 98.62% 98.62% 75.00% 100.00%
src/compiler/queries/transform/renameTable.ts 99.05% 90.47% 100.00% 78.82%
src/core/global_modules/checks/interpret.ts 100.00% 88.88% 100.00% 60.00%
src/core/global_modules/metadata/bind.ts 100.00% 89.47% 100.00% 75.00%
src/core/global_modules/metadata/interpret.ts 100.00% 80.00% 100.00% 58.33%
src/core/global_modules/program/index.ts 100.00% 85.71% 100.00% 75.00%
src/core/global_modules/records/utils/constraints/unique.ts 100.00% 94.28% 100.00% 58.33%
src/services/definition/provider.ts 100.00% 95.23% 100.00% 71.42%

@huydo862003
huydo862003 merged commit 42f4c53 into master Aug 6, 2026
6 of 7 checks passed
@huydo862003
huydo862003 deleted the fix/record-validation-many-to-many-fk branch August 6, 2026 05:02
@huydo862003 huydo862003 added the PR: Bug Fix 🐛 A type of pull request used for changelog categories label Aug 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

PR: Bug Fix 🐛 A type of pull request used for changelog categories

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants