From 794554ffccb277c315ae5da29a9c0fd1c383717a Mon Sep 17 00:00:00 2001 From: Phillip Davis Date: Tue, 31 Mar 2026 16:43:05 -0400 Subject: [PATCH] Fix locale-dependent SQL in truncatedAttributesColumn() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit String.format with %d uses the default locale's numeral system. On Persian (fa) locale this produces ۶۵۵۳۴ instead of 65534, causing an SQLite error. Extract the expression into truncatedAttributesColumn() so it can be tested under a non-default locale, and replace String.format with concatenation which always uses ASCII digits. --- .../conversations/entities/Conversation.java | 11 +++-- .../ConversationAllColumnsLocaleTest.java | 42 +++++++++++++++++++ 2 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 src/test/java/eu/siacs/conversations/entities/ConversationAllColumnsLocaleTest.java diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java index 492f11503aadbb336581951b3ccf65dca6a56b03..175c67be0208f3c1666553a14086403d458d4b33 100644 --- a/src/main/java/eu/siacs/conversations/entities/Conversation.java +++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java @@ -189,6 +189,10 @@ public class Conversation extends AbstractEntity public static final String MODE = "mode"; public static final String ATTRIBUTES = "attributes"; + static String truncatedAttributesColumn() { + return "SUBSTR(" + ATTRIBUTES + ", 0, " + (Short.MAX_VALUE << 1) + ") AS " + ATTRIBUTES; + } + public static final String[] ALL_COLUMNS = new String[] { UUID, NAME, @@ -198,12 +202,7 @@ public class Conversation extends AbstractEntity STATUS, CREATED, MODE, - String.format( - "SUBSTR(%s, 0, %d) AS %s", - ATTRIBUTES, - Short.MAX_VALUE << 1, - ATTRIBUTES - ) + truncatedAttributesColumn() }; diff --git a/src/test/java/eu/siacs/conversations/entities/ConversationAllColumnsLocaleTest.java b/src/test/java/eu/siacs/conversations/entities/ConversationAllColumnsLocaleTest.java new file mode 100644 index 0000000000000000000000000000000000000000..e0866738f56695c0f597237058ee434a442c05f1 --- /dev/null +++ b/src/test/java/eu/siacs/conversations/entities/ConversationAllColumnsLocaleTest.java @@ -0,0 +1,42 @@ +package eu.siacs.conversations.entities; + +import static org.junit.Assert.assertEquals; + +import java.util.Locale; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; +import org.robolectric.annotation.ConscryptMode; + +import android.os.Build; +import eu.siacs.conversations.Conversations; + +@RunWith(RobolectricTestRunner.class) +@Config(sdk = Build.VERSION_CODES.TIRAMISU, application = Conversations.class) +@ConscryptMode(ConscryptMode.Mode.OFF) +public class ConversationAllColumnsLocaleTest { + private Locale originalLocale; + + @Before + public void setUp() { + originalLocale = Locale.getDefault(); + Locale.setDefault(new Locale("fa")); + } + + @After + public void tearDown() { + Locale.setDefault(originalLocale); + } + + @Test + public void truncatedAttributesColumnUsesAsciiDigits() { + assertEquals( + "SUBSTR(attributes, 0, 65534) AS attributes", + Conversation.truncatedAttributesColumn() + ); + } +}