You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by if...@apache.org on 2020/10/12 08:13:55 UTC
[cassandra] branch trunk updated: Fix ByteBufferAccessor cast
exceptions are thrown when trying to query a virtual table
This is an automated email from the ASF dual-hosted git repository.
ifesdjeen pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git
The following commit(s) were added to refs/heads/trunk by this push:
new 896baf6 Fix ByteBufferAccessor cast exceptions are thrown when trying to query a virtual table
896baf6 is described below
commit 896baf64159463d9dd72a8829eec8311f8a888da
Author: Alex Petrov <ol...@gmail.com>
AuthorDate: Thu Oct 1 17:01:01 2020 +0200
Fix ByteBufferAccessor cast exceptions are thrown when trying to query a virtual table
Patch by Alex Petrov and Caleb Rackliffe; reviewed by David Capwell and Chris Lohfink for CASSANDRA-16155
Co-authored-by: Caleb Rackliffe <ca...@gmail.com>
---
.../apache/cassandra/db/virtual/SimpleDataSet.java | 23 ++++++--
.../cql3/validation/entities/VirtualTableTest.java | 65 ++++++++++++++++++----
2 files changed, 70 insertions(+), 18 deletions(-)
diff --git a/src/java/org/apache/cassandra/db/virtual/SimpleDataSet.java b/src/java/org/apache/cassandra/db/virtual/SimpleDataSet.java
index 8b6f7ca..b8cb9f5 100644
--- a/src/java/org/apache/cassandra/db/virtual/SimpleDataSet.java
+++ b/src/java/org/apache/cassandra/db/virtual/SimpleDataSet.java
@@ -18,18 +18,29 @@
package org.apache.cassandra.db.virtual;
import java.nio.ByteBuffer;
-import java.util.*;
-import java.util.concurrent.TimeUnit;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.NavigableMap;
+import java.util.TreeMap;
import com.google.common.collect.Iterables;
-import org.apache.cassandra.db.*;
+import org.apache.cassandra.db.Clustering;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.DeletionTime;
+import org.apache.cassandra.db.RegularAndStaticColumns;
import org.apache.cassandra.db.filter.ClusteringIndexFilter;
import org.apache.cassandra.db.filter.ColumnFilter;
import org.apache.cassandra.db.marshal.AbstractType;
-import org.apache.cassandra.db.marshal.ByteBufferAccessor;
import org.apache.cassandra.db.marshal.CompositeType;
-import org.apache.cassandra.db.rows.*;
+import org.apache.cassandra.db.rows.AbstractUnfilteredRowIterator;
+import org.apache.cassandra.db.rows.BTreeRow;
+import org.apache.cassandra.db.rows.BufferCell;
+import org.apache.cassandra.db.rows.EncodingStats;
+import org.apache.cassandra.db.rows.Rows;
+import org.apache.cassandra.db.rows.Unfiltered;
+import org.apache.cassandra.db.rows.UnfilteredRowIterator;
import org.apache.cassandra.schema.ColumnMetadata;
import org.apache.cassandra.schema.TableMetadata;
import org.apache.cassandra.utils.ByteBufferUtil;
@@ -84,7 +95,7 @@ public class SimpleDataSet extends AbstractVirtualTable.AbstractDataSet
{
ByteBuffer partitionKey = partitionKeyValues.length == 1
? decompose(metadata.partitionKeyType, partitionKeyValues[0])
- : ((CompositeType) metadata.partitionKeyType).decompose(ByteBufferAccessor.instance, partitionKeyValues);
+ : ((CompositeType) metadata.partitionKeyType).decompose(partitionKeyValues);
return metadata.partitioner.decorateKey(partitionKey);
}
diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/VirtualTableTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/VirtualTableTest.java
index cd67cc9..9808c96 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/entities/VirtualTableTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/entities/VirtualTableTest.java
@@ -51,6 +51,7 @@ public class VirtualTableTest extends CQLTester
private static final String KS_NAME = "test_virtual_ks";
private static final String VT1_NAME = "vt1";
private static final String VT2_NAME = "vt2";
+ private static final String VT3_NAME = "vt3";
private static class WritableVirtualTable extends AbstractVirtualTable
{
@@ -80,10 +81,10 @@ public class VirtualTableTest extends CQLTester
{
String key = (String) metadata().partitionKeyType.compose(update.partitionKey().getKey());
update.forEach(row ->
- {
- Integer value = Int32Type.instance.compose(row.getCell(valueColumn).buffer());
- backingMap.put(key, value);
- });
+ {
+ Integer value = Int32Type.instance.compose(row.getCell(valueColumn).buffer());
+ backingMap.put(key, value);
+ });
}
}
@@ -91,13 +92,13 @@ public class VirtualTableTest extends CQLTester
public static void setUpClass()
{
TableMetadata vt1Metadata =
- TableMetadata.builder(KS_NAME, VT1_NAME)
- .kind(TableMetadata.Kind.VIRTUAL)
- .addPartitionKeyColumn("pk", UTF8Type.instance)
- .addClusteringColumn("c", UTF8Type.instance)
- .addRegularColumn("v1", Int32Type.instance)
- .addRegularColumn("v2", LongType.instance)
- .build();
+ TableMetadata.builder(KS_NAME, VT1_NAME)
+ .kind(TableMetadata.Kind.VIRTUAL)
+ .addPartitionKeyColumn("pk", UTF8Type.instance)
+ .addClusteringColumn("c", UTF8Type.instance)
+ .addRegularColumn("v1", Int32Type.instance)
+ .addRegularColumn("v2", LongType.instance)
+ .build();
SimpleDataSet vt1data = new SimpleDataSet(vt1Metadata);
@@ -117,7 +118,30 @@ public class VirtualTableTest extends CQLTester
};
VirtualTable vt2 = new WritableVirtualTable(KS_NAME, VT2_NAME);
- VirtualKeyspaceRegistry.instance.register(new VirtualKeyspace(KS_NAME, ImmutableList.of(vt1, vt2)));
+ TableMetadata vt3Metadata =
+ TableMetadata.builder(KS_NAME, VT3_NAME)
+ .kind(TableMetadata.Kind.VIRTUAL)
+ .addPartitionKeyColumn("pk1", UTF8Type.instance)
+ .addPartitionKeyColumn("pk2", UTF8Type.instance)
+ .addClusteringColumn("ck1", UTF8Type.instance)
+ .addClusteringColumn("ck2", UTF8Type.instance)
+ .addRegularColumn("v1", Int32Type.instance)
+ .addRegularColumn("v2", LongType.instance)
+ .build();
+
+ SimpleDataSet vt3data = new SimpleDataSet(vt3Metadata);
+
+ vt3data.row("pk11", "pk11", "ck11", "ck11").column("v1", 1111).column("v2", 1111L)
+ .row("pk11", "pk11", "ck22", "ck22").column("v1", 1122).column("v2", 1122L);
+
+ VirtualTable vt3 = new AbstractVirtualTable(vt3Metadata)
+ {
+ public DataSet data()
+ {
+ return vt3data;
+ }
+ };
+ VirtualKeyspaceRegistry.instance.register(new VirtualKeyspace(KS_NAME, ImmutableList.of(vt1, vt2, vt3)));
CQLTester.setUpClass();
}
@@ -208,6 +232,23 @@ public class VirtualTableTest extends CQLTester
}
@Test
+ public void testQueriesOnTableWithMultiplePks() throws Throwable
+ {
+ assertRowsNet(executeNet("SELECT * FROM test_virtual_ks.vt3 WHERE pk1 = 'UNKNOWN' AND pk2 = 'UNKNOWN'"));
+
+ assertRowsNet(executeNet("SELECT * FROM test_virtual_ks.vt3 WHERE pk1 = 'pk11' AND pk2 = 'pk22' AND ck1 = 'UNKNOWN'"));
+
+ // Test DISTINCT query
+ assertRowsNet(executeNet("SELECT DISTINCT pk1, pk2 FROM test_virtual_ks.vt3"),
+ row("pk11", "pk11"));
+
+ // Test single partition queries
+ assertRowsNet(executeNet("SELECT v1, v2 FROM test_virtual_ks.vt3 WHERE pk1 = 'pk11' AND pk2 = 'pk11'"),
+ row(1111, 1111L),
+ row(1122, 1122L));
+ }
+
+ @Test
public void testModifications() throws Throwable
{
// check for clean state
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org