From b2e8652bcdf1c8bcb8ed64d549e86bde331216d7 Mon Sep 17 00:00:00 2001 From: jagiro Date: Mon, 11 May 2026 15:24:23 +0200 Subject: [PATCH] Add pending spec for unique constraint with null discriminator (#14503) Adds a Spock @PendingFeature regression test to MultiColumnUniqueConstraintSpec in both grails-data-hibernate5 and grails-data-hibernate7 core test modules. The test exercises the bug described in #14503: when a domain declares `unique: [discriminator]` and the discriminator is nullable, saving a new row with the discriminator set to null currently fails validation if any row with the same main field value already exists, regardless of the existing row's discriminator value. The validator emits SQL without the discriminator clause. The test is marked @PendingFeature with a reason referencing the issue, so it does not fail the build. When the fix lands and the test starts passing, Spock will fail with PendingFeatureNotFinished as a reminder to remove the annotation. No fix is proposed here per the maintainers' request to discuss the fix approach as a team. This change only codifies the failing scenario as a reproducer in the framework's own test suite. --- .../MultiColumnUniqueConstraintSpec.groovy | 29 ++++++++++++++++++- .../MultiColumnUniqueConstraintSpec.groovy | 29 ++++++++++++++++++- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/MultiColumnUniqueConstraintSpec.groovy b/grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/MultiColumnUniqueConstraintSpec.groovy index 4182c133e3f..e0200e415dc 100644 --- a/grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/MultiColumnUniqueConstraintSpec.groovy +++ b/grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/MultiColumnUniqueConstraintSpec.groovy @@ -23,11 +23,12 @@ import org.apache.grails.data.hibernate5.core.GrailsDataHibernate5TckManager import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.springframework.dao.DataIntegrityViolationException import spock.lang.Issue +import spock.lang.PendingFeature @Issue('https://github.com/apache/grails-data-mapping/issues/617') class MultiColumnUniqueConstraintSpec extends GrailsDataTckSpec { void setupSpec() { - manager.addAllDomainClasses([DomainOne, Task1, TaskLink]) + manager.addAllDomainClasses([DomainOne, Task1, TaskLink, DomainTwo]) } void "test generated unique constraints"() { @@ -65,6 +66,20 @@ class MultiColumnUniqueConstraintSpec extends GrailsDataTckSpec)' + saved != null + saved.id != null + } } @Entity @@ -93,4 +108,16 @@ class TaskLink { static constraints = { toTask unique: ['fromTask'] } +} + +@Entity +class DomainTwo { + + String name + Date discriminator + + static constraints = { + name unique: ['discriminator'] + discriminator nullable: true + } } \ No newline at end of file diff --git a/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/MultiColumnUniqueConstraintSpec.groovy b/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/MultiColumnUniqueConstraintSpec.groovy index f169a76f6a0..a2838e3772a 100644 --- a/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/MultiColumnUniqueConstraintSpec.groovy +++ b/grails-data-hibernate7/core/src/test/groovy/grails/gorm/specs/MultiColumnUniqueConstraintSpec.groovy @@ -23,11 +23,12 @@ import org.apache.grails.data.hibernate7.core.GrailsDataHibernate7TckManager import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.springframework.dao.DataIntegrityViolationException import spock.lang.Issue +import spock.lang.PendingFeature @Issue('https://github.com/grails/grails-data-mapping/issues/617') class MultiColumnUniqueConstraintSpec extends GrailsDataTckSpec { void setupSpec() { - manager.addAllDomainClasses([DomainOne, Task1, TaskLink]) + manager.addAllDomainClasses([DomainOne, Task1, TaskLink, DomainTwo]) } void "test generated unique constraints"() { @@ -65,6 +66,20 @@ class MultiColumnUniqueConstraintSpec extends GrailsDataTckSpec)' + saved != null + saved.id != null + } } @Entity @@ -93,4 +108,16 @@ class TaskLink { static constraints = { toTask unique: ['fromTask'] } +} + +@Entity +class DomainTwo { + + String name + Date discriminator + + static constraints = { + name unique: ['discriminator'] + discriminator nullable: true + } } \ No newline at end of file