From 63546cb67bd2e5babd9feb44b00aa4fd04d1f558 Mon Sep 17 00:00:00 2001 From: Rui Batista Date: Sun, 15 Mar 2026 18:32:37 +0000 Subject: [PATCH] Support hyphens in LTree labels and increase max label length to 1000 PostgreSQL 16 added support for hyphens (-) in ltree labels and increased the maximum label length from 256 to 1000 characters. Fixes #1271 --- modules/core/shared/src/main/scala/data/LTree.scala | 6 +++--- modules/tests/shared/src/test/scala/data/LTreeTest.scala | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/core/shared/src/main/scala/data/LTree.scala b/modules/core/shared/src/main/scala/data/LTree.scala index a8ce1f054..889cfca20 100644 --- a/modules/core/shared/src/main/scala/data/LTree.scala +++ b/modules/core/shared/src/main/scala/data/LTree.scala @@ -39,7 +39,7 @@ object LTree { labels.foreach(l => l match { case ValidLabelRegex() => () - case _ => fail(s"invalid ltree label '$l'. Only alphanumeric characters and '_' are allowed.") + case _ => fail(s"invalid ltree label '$l'. Only alphanumeric characters, '_' and '-' are allowed.") }) if(failure != null) @@ -49,11 +49,11 @@ object LTree { } } - final val MaxLabelLength = 255 + final val MaxLabelLength = 1000 final val MaxTreeLength = 65535 private final val Separator = '.' - private final val ValidLabelRegex = s"""^[\\p{L}0-9_]{1,$MaxLabelLength}$$""".r + private final val ValidLabelRegex = s"""^[\\p{L}0-9_-]{1,$MaxLabelLength}$$""".r implicit val ltreeEq: Eq[LTree] = Eq.fromUniversalEquals[LTree] } diff --git a/modules/tests/shared/src/test/scala/data/LTreeTest.scala b/modules/tests/shared/src/test/scala/data/LTreeTest.scala index f7eee490c..57f5d0f8e 100644 --- a/modules/tests/shared/src/test/scala/data/LTreeTest.scala +++ b/modules/tests/shared/src/test/scala/data/LTreeTest.scala @@ -20,6 +20,8 @@ class LTreeTest extends ffstest.FTest { assert(LTree.fromString("abc1.d_f2").isRight, "regex failed") assert(LTree.fromString("foo.βar.baΣΩ").isRight, "regex failed") assert(LTree.fromString("foo.βar.❤").isLeft, "regex failed") + assert(LTree.fromString("abc.d-f").isRight, "hyphen in label failed") + assert(LTree.fromString("a-b.c-d.e-f").isRight, "hyphens in multiple labels failed") assert(LTree.fromString(List.fill(LTree.MaxTreeLength)("a").mkString(".")).isRight, "max tree len failed") assert(LTree.fromString(List.fill(LTree.MaxTreeLength + 1)("a").mkString(".")).isLeft, "max tree len failed")