Merge branch 'cassandra-5.0' into trunk

* cassandra-5.0:
  Fix CQLSSTableWriter serialization of vector of date and time patch by Lukasz Antoniak; reviewed by Andres de la Pena, Yifan Cai for CASSANDRA-20979
This commit is contained in:
Lukasz Antoniak 2025-12-18 07:40:43 +01:00
commit 25c7c71b19
3 changed files with 51 additions and 12 deletions

View File

@ -271,6 +271,7 @@
* Add the ability to disable bulk loading of SSTables (CASSANDRA-18781)
* Clean up obsolete functions and simplify cql_version handling in cqlsh (CASSANDRA-18787)
Merged from 5.0:
* Fix CQLSSTableWriter serialization of vector of date and time (CASSANDRA-20979)
* Correctly calculate default for FailureDetector max interval (CASSANDRA-21025)
* Adding missing configs in system_views.settings to be backward compatible (CASSANDRA-20863)
* Heap dump should not be generated on handled exceptions (CASSANDRA-20974)

View File

@ -1787,12 +1787,6 @@ public abstract class TypeCodec<T>
super(DataType.date(), LocalDate.class);
}
@Override
public int serializedSize()
{
return 8;
}
@Override
public LocalDate parse(String value)
{
@ -1876,6 +1870,13 @@ public abstract class TypeCodec<T>
super(DataType.time());
}
@Override
public int serializedSize()
{
// matching behavior of TimeType, which is not declared as fixed length
return VARIABLE_LENGTH;
}
@Override
public Long parse(String value)
{

View File

@ -35,7 +35,9 @@ import java.util.UUID;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.BiConsumer;
import java.util.function.BiPredicate;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
@ -50,6 +52,7 @@ import org.junit.rules.TemporaryFolder;
import com.datastax.driver.core.utils.UUIDs;
import org.apache.cassandra.Util;
import org.apache.cassandra.cql3.CQL3Type;
import org.apache.cassandra.cql3.QueryProcessor;
import org.apache.cassandra.cql3.UntypedResultSet;
import org.apache.cassandra.cql3.constraints.ConstraintViolationException;
@ -61,7 +64,10 @@ import org.apache.cassandra.cql3.functions.types.UserType;
import org.apache.cassandra.db.compression.CompressionDictionary;
import org.apache.cassandra.db.compression.CompressionDictionary.DictId;
import org.apache.cassandra.db.compression.ZstdCompressionDictionary;
import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.db.marshal.FloatType;
import org.apache.cassandra.db.marshal.SimpleDateType;
import org.apache.cassandra.db.marshal.TimeType;
import org.apache.cassandra.db.marshal.UTF8Type;
import org.apache.cassandra.dht.ByteOrderedPartitioner;
import org.apache.cassandra.dht.Murmur3Partitioner;
@ -1621,9 +1627,36 @@ public abstract class CQLSSTableWriterTest
@Test
public void testWritingVectorData() throws Exception
{
testWritingVectorData(CQL3Type.Native.FLOAT, FloatType.instance, (i) -> (float) i, (i, vector) -> {
assertThat(vector).allMatch(val -> val instanceof Float);
assertThat(vector).allMatch(val -> (float) val == (float) i);
});
perTestSetup();
testWritingVectorData(CQL3Type.Native.DATE, SimpleDateType.instance, LocalDate::fromDaysSinceEpoch, (i, vector) -> {
assertThat(vector).allMatch(val -> val instanceof Integer);
assertThat(vector).allMatch(val -> {
int days = (int) val - Integer.MIN_VALUE; // signed to unsigned conversion
return days == i;
});
});
perTestSetup();
testWritingVectorData(CQL3Type.Native.TIME, TimeType.instance, (i) -> (long) i, (i, vector) -> {
assertThat(vector).allMatch(val -> val instanceof Long);
assertThat(vector).allMatch(val -> (long) val == (long) i);
});
}
private void testWritingVectorData(CQL3Type.Native cqlType, AbstractType<?> subType, Function<Integer, ?> valueFactory,
BiConsumer<Integer, List<?>> checkFunction) throws Exception
{
final int dimensions = 5;
final String schema = "CREATE TABLE " + qualifiedTable + " ("
+ " k int,"
+ " v1 VECTOR<FLOAT, 5>,"
+ " v1 VECTOR<" + cqlType.name() + ", " + dimensions + ">,"
+ " PRIMARY KEY (k)"
+ ")";
@ -1635,7 +1668,12 @@ public abstract class CQLSSTableWriterTest
for (int i = 0; i < 100; i++)
{
writer.addRow(i, List.of( (float)i, (float)i, (float)i, (float)i, (float)i));
List<Object> vector = new ArrayList<>(dimensions);
for (int j = 0; j < dimensions; j++)
{
vector.add(valueFactory.apply(i));
}
writer.addRow(i, vector);
}
writer.close();
@ -1650,10 +1688,9 @@ public abstract class CQLSSTableWriterTest
for (UntypedResultSet.Row row : resultSet)
{
assertEquals(cnt, row.getInt("k"));
List<Float> vector = row.getVector("v1", FloatType.instance, 5);
assertThat(vector).hasSize(5);
final float floatCount = (float)cnt;
assertThat(vector).allMatch(val -> val == floatCount);
List<?> vector = row.getVector("v1", subType, dimensions);
assertThat(vector).hasSize(dimensions);
checkFunction.accept(cnt, vector);
cnt++;
}
}