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