From 1c718ab40f9753a549ed75c08e748df4aaeda99f Mon Sep 17 00:00:00 2001 From: JwahoonKim Date: Mon, 4 May 2026 12:34:40 +0200 Subject: [PATCH] Fix failing select on system_views.settings for non-string keys patch by JwahoonKim; reviewed by Jyothsna Konisa, Dmitry Konstantinov, Stefan Miklosovic for CASSANDRA-21348 --- CHANGES.txt | 1 + .../apache/cassandra/db/virtual/SettingsTable.java | 9 +++++---- .../cassandra/db/virtual/SettingsTableTest.java | 12 ++++++++++++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index e197805c11..46dda4b17e 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 5.0.9 + * Fix failing select on system_views.settings for non-string keys (CASSANDRA-21348) * Ensure SAI sends range tombstones to the coordinator for queries on static columns (CASSANDRA-21332) Merged from 4.1: * Add Paxos v2 option and informatin in cassandra.yaml (CASSANDRA-21316) diff --git a/src/java/org/apache/cassandra/db/virtual/SettingsTable.java b/src/java/org/apache/cassandra/db/virtual/SettingsTable.java index 526d7b538f..5e42db6532 100644 --- a/src/java/org/apache/cassandra/db/virtual/SettingsTable.java +++ b/src/java/org/apache/cassandra/db/virtual/SettingsTable.java @@ -111,15 +111,16 @@ public final class SettingsTable extends AbstractVirtualTable else if (value instanceof Map) { Map map = new HashMap<>(); - for (Map.Entry entry : ((Map) value).entrySet()) + for (Map.Entry entry : ((Map) value).entrySet()) { + String key = String.valueOf(entry.getKey()); // this is done on best-effort basis as we do not have names in parameters // inherently under control as this is what a user is responsible for // when dealing with custom implementations - if (entry.getKey().endsWith("_password") || entry.getKey().equals("password")) - map.put(entry.getKey(), Redacted.REDACTED_STRING); + if (key.endsWith("_password") || key.equals("password")) + map.put(key, Redacted.REDACTED_STRING); else - map.put(entry.getKey(), entry.getValue()); + map.put(key, entry.getValue()); } return tryConstructJson(map); diff --git a/test/unit/org/apache/cassandra/db/virtual/SettingsTableTest.java b/test/unit/org/apache/cassandra/db/virtual/SettingsTableTest.java index 66778f3e16..59b64f3dc5 100644 --- a/test/unit/org/apache/cassandra/db/virtual/SettingsTableTest.java +++ b/test/unit/org/apache/cassandra/db/virtual/SettingsTableTest.java @@ -45,6 +45,7 @@ import org.apache.cassandra.config.TransparentDataEncryptionOptions; import org.apache.cassandra.cql3.CQLTester; import org.apache.cassandra.distributed.shared.WithProperties; import org.apache.cassandra.security.SSLFactory; +import org.apache.cassandra.service.StartupChecks.StartupCheckType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.yaml.snakeyaml.introspector.Property; @@ -135,6 +136,17 @@ public class SettingsTableTest extends CQLTester assertRowsNet(executeNet(q)); } + @Test + public void testStartupChecksWithEnumKeys() throws Throwable + { + Map checkDataResurrection = new LinkedHashMap<>(); + checkDataResurrection.put("enabled", true); + config.startup_checks.put(StartupCheckType.check_data_resurrection, checkDataResurrection); + + check("startup_checks", "{check_data_resurrection={enabled=true}}"); + Assert.assertFalse(executeNet("SELECT * FROM vts.settings").all().isEmpty()); + } + @Test public void testSelectOverride() throws Throwable {