From 10a9394ba81b555eaa67776b2cc615c3c5bef2ce Mon Sep 17 00:00:00 2001 From: XingY Date: Fri, 17 Oct 2025 13:12:11 -0700 Subject: [PATCH 1/2] ObjectFactory fails to map reserved field names --- api/src/org/labkey/api/data/BeanObjectFactory.java | 8 ++++++++ api/src/org/labkey/api/exp/property/DomainUtil.java | 4 ++++ .../experiment/api/property/StorageProvisionerImpl.java | 4 ++++ 3 files changed, 16 insertions(+) diff --git a/api/src/org/labkey/api/data/BeanObjectFactory.java b/api/src/org/labkey/api/data/BeanObjectFactory.java index 25e129e41e7..377fdbb770d 100644 --- a/api/src/org/labkey/api/data/BeanObjectFactory.java +++ b/api/src/org/labkey/api/data/BeanObjectFactory.java @@ -256,6 +256,14 @@ public ArrayList handleArrayList(ResultSet rs) throws SQLException String prop = propMap.get(label); //Map to correct casing... if (null != prop) properties[i] = prop; + else if (label.endsWith("_")) + { + // Try stripping trailing underscore (added by some databases for reserved words) + // For example "File" is a reserved word in SQL Server, but it's used by FileSystemAuditDomainKind/FileSystemAuditEvent + prop = propMap.get(label.substring(0, label.length() - 1)); + if (null != prop) + properties[i] = prop; + } } ArrayList list = new ArrayList<>(); diff --git a/api/src/org/labkey/api/exp/property/DomainUtil.java b/api/src/org/labkey/api/exp/property/DomainUtil.java index 5d929ddbbd2..cb2a5a44414 100644 --- a/api/src/org/labkey/api/exp/property/DomainUtil.java +++ b/api/src/org/labkey/api/exp/property/DomainUtil.java @@ -35,6 +35,7 @@ import org.labkey.api.data.ContainerFilter; import org.labkey.api.data.ContainerManager; import org.labkey.api.data.ContainerService; +import org.labkey.api.data.CoreSchema; import org.labkey.api.data.NameGenerator; import org.labkey.api.data.PHI; import org.labkey.api.data.PropertyStorageSpec; @@ -1485,6 +1486,9 @@ public static ValidationException validateProperties(@Nullable Domain domain, @N } } + if (CoreSchema.getInstance().getSqlDialect().isReserved(name)) + LOG.warn("Field name '" + name + "' is a reserved word in the current SQL dialect."); + if (namePropertyIdMap.containsKey(name)) { String errorMsg = getDomainErrorMessage(updates, "The field name '" + name + "' is already taken. Please provide a unique name for each field."); diff --git a/experiment/src/org/labkey/experiment/api/property/StorageProvisionerImpl.java b/experiment/src/org/labkey/experiment/api/property/StorageProvisionerImpl.java index 930ea8c0d58..6ebc330eea3 100644 --- a/experiment/src/org/labkey/experiment/api/property/StorageProvisionerImpl.java +++ b/experiment/src/org/labkey/experiment/api/property/StorageProvisionerImpl.java @@ -384,6 +384,10 @@ public void addProperties(Domain domain, Collection properties, log.warn("StorageProvisioner ignored property with name of built-in column: " + prop.getPropertyURI()); continue; } + + if (CoreSchema.getInstance().getSqlDialect().isReserved(prop.getName())) + log.warn("Property name '" + prop.getName() + "' is a reserved word in the current SQL dialect."); + PropertyStorageSpec spec = kind.getPropertySpec(prop.getPropertyDescriptor(), domain); if (null != spec) { From a08c524e9e2941b52ab7adb66c25317a6ef214ac Mon Sep 17 00:00:00 2001 From: XingY Date: Mon, 20 Oct 2025 11:01:49 -0700 Subject: [PATCH 2/2] allow user domain to use reserved db fields --- api/src/org/labkey/api/exp/property/DomainUtil.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/api/src/org/labkey/api/exp/property/DomainUtil.java b/api/src/org/labkey/api/exp/property/DomainUtil.java index cb2a5a44414..5d929ddbbd2 100644 --- a/api/src/org/labkey/api/exp/property/DomainUtil.java +++ b/api/src/org/labkey/api/exp/property/DomainUtil.java @@ -35,7 +35,6 @@ import org.labkey.api.data.ContainerFilter; import org.labkey.api.data.ContainerManager; import org.labkey.api.data.ContainerService; -import org.labkey.api.data.CoreSchema; import org.labkey.api.data.NameGenerator; import org.labkey.api.data.PHI; import org.labkey.api.data.PropertyStorageSpec; @@ -1486,9 +1485,6 @@ public static ValidationException validateProperties(@Nullable Domain domain, @N } } - if (CoreSchema.getInstance().getSqlDialect().isReserved(name)) - LOG.warn("Field name '" + name + "' is a reserved word in the current SQL dialect."); - if (namePropertyIdMap.containsKey(name)) { String errorMsg = getDomainErrorMessage(updates, "The field name '" + name + "' is already taken. Please provide a unique name for each field.");