You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by st...@apache.org on 2016/09/12 09:00:24 UTC
[1/3] cassandra git commit: Handle composite prefixes with final
EOC=0 as in 2.x and refactor LegacyLayout.decodeBound
Repository: cassandra
Updated Branches:
refs/heads/cassandra-3.0 932f3ebbe -> d600f51ee
refs/heads/trunk 4354db24c -> 64f12ab2c
Handle composite prefixes with final EOC=0 as in 2.x and refactor LegacyLayout.decodeBound
patch by Stefania Alborghetti and Sylvain Lebresne; reviewed by Tyler Hobbs and
Sylvain Lebresne for CASSANDRA-12423
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/d600f51e
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/d600f51e
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/d600f51e
Branch: refs/heads/cassandra-3.0
Commit: d600f51ee1a3eb7b30ce3c409129567b70c22012
Parents: 932f3eb
Author: Stefania Alborghetti <st...@datastax.com>
Authored: Tue Aug 30 16:08:09 2016 +0800
Committer: Stefania Alborghetti <st...@datastax.com>
Committed: Mon Sep 12 16:56:30 2016 +0800
----------------------------------------------------------------------
CHANGES.txt | 1 +
.../org/apache/cassandra/db/LegacyLayout.java | 64 +++++++++++---------
.../cassandra/db/marshal/CompositeType.java | 26 --------
3 files changed, 37 insertions(+), 54 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/d600f51e/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 459d591..f0ec3e3 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
3.0.9
+ * Handle composite prefixes with final EOC=0 as in 2.x and refactor LegacyLayout.decodeBound (CASSANDRA-12423)
* Fix paging for 2.x to 3.x upgrades (CASSANDRA-11195)
* select_distinct_with_deletions_test failing on non-vnode environments (CASSANDRA-11126)
* Stack Overflow returned to queries while upgrading (CASSANDRA-12527)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/d600f51e/src/java/org/apache/cassandra/db/LegacyLayout.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/LegacyLayout.java b/src/java/org/apache/cassandra/db/LegacyLayout.java
index 65f9d3f..c8e7536 100644
--- a/src/java/org/apache/cassandra/db/LegacyLayout.java
+++ b/src/java/org/apache/cassandra/db/LegacyLayout.java
@@ -186,41 +186,49 @@ public abstract class LegacyLayout
if (!bound.hasRemaining())
return isStart ? LegacyBound.BOTTOM : LegacyBound.TOP;
- List<CompositeType.CompositeComponent> components = metadata.isCompound()
- ? CompositeType.deconstruct(bound)
- : Collections.singletonList(new CompositeType.CompositeComponent(bound, (byte) 0));
-
- // Either it's a prefix of the clustering, or it's the bound of a collection range tombstone (and thus has
- // the collection column name)
- assert components.size() <= metadata.comparator.size() || (!metadata.isCompactTable() && components.size() == metadata.comparator.size() + 1);
-
- List<CompositeType.CompositeComponent> prefix = components.size() <= metadata.comparator.size()
- ? components
- : components.subList(0, metadata.comparator.size());
- Slice.Bound.Kind boundKind;
+ if (!metadata.isCompound())
+ {
+ // The non compound case is a lot easier, in that there is no EOC nor collection to worry about, so dealing
+ // with that first.
+ return new LegacyBound(isStart ? Slice.Bound.inclusiveStartOf(bound) : Slice.Bound.inclusiveEndOf(bound), false, null);
+ }
+
+ int clusteringSize = metadata.comparator.size();
+
+ List<ByteBuffer> components = CompositeType.splitName(bound);
+ byte eoc = CompositeType.lastEOC(bound);
+
+ // There can be more components than the clustering size only in the case this is the bound of a collection
+ // range tombstone. In which case, there is exactly one more component, and that component is the name of the
+ // collection being selected/deleted.
+ assert components.size() <= clusteringSize || (!metadata.isCompactTable() && components.size() == clusteringSize + 1);
+
+ ColumnDefinition collectionName = null;
+ if (components.size() > clusteringSize)
+ collectionName = metadata.getColumnDefinition(components.remove(clusteringSize));
+
+ boolean isInclusive;
if (isStart)
{
- if (components.get(components.size() - 1).eoc > 0)
- boundKind = Slice.Bound.Kind.EXCL_START_BOUND;
- else
- boundKind = Slice.Bound.Kind.INCL_START_BOUND;
+ isInclusive = eoc <= 0;
}
else
{
- if (components.get(components.size() - 1).eoc < 0)
- boundKind = Slice.Bound.Kind.EXCL_END_BOUND;
- else
- boundKind = Slice.Bound.Kind.INCL_END_BOUND;
- }
+ isInclusive = eoc >= 0;
- ByteBuffer[] prefixValues = new ByteBuffer[prefix.size()];
- for (int i = 0; i < prefix.size(); i++)
- prefixValues[i] = prefix.get(i).value;
- Slice.Bound sb = Slice.Bound.create(boundKind, prefixValues);
+ // for an end bound, if we only have a prefix of all the components and the final EOC is zero,
+ // then it should only match up to the prefix but no further, that is, it is an inclusive bound
+ // of the exact prefix but an exclusive bound of anything beyond it, so adding an empty
+ // composite value ensures this behavior, see CASSANDRA-12423 for more details
+ if (eoc == 0 && components.size() < clusteringSize)
+ {
+ components.add(ByteBufferUtil.EMPTY_BYTE_BUFFER);
+ isInclusive = false;
+ }
+ }
- ColumnDefinition collectionName = components.size() == metadata.comparator.size() + 1
- ? metadata.getColumnDefinition(components.get(metadata.comparator.size()).value)
- : null;
+ Slice.Bound.Kind boundKind = Slice.Bound.boundKind(isStart, isInclusive);
+ Slice.Bound sb = Slice.Bound.create(boundKind, components.toArray(new ByteBuffer[components.size()]));
return new LegacyBound(sb, metadata.isCompound() && CompositeType.isStaticName(bound), collectionName);
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/d600f51e/src/java/org/apache/cassandra/db/marshal/CompositeType.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/marshal/CompositeType.java b/src/java/org/apache/cassandra/db/marshal/CompositeType.java
index d005fd7..52d6d39 100644
--- a/src/java/org/apache/cassandra/db/marshal/CompositeType.java
+++ b/src/java/org/apache/cassandra/db/marshal/CompositeType.java
@@ -227,32 +227,6 @@ public class CompositeType extends AbstractCompositeType
return null;
}
- public static class CompositeComponent
- {
- public ByteBuffer value;
- public byte eoc;
-
- public CompositeComponent(ByteBuffer value, byte eoc)
- {
- this.value = value;
- this.eoc = eoc;
- }
- }
-
- public static List<CompositeComponent> deconstruct(ByteBuffer bytes)
- {
- List<CompositeComponent> list = new ArrayList<>();
- ByteBuffer bb = bytes.duplicate();
- readStatic(bb);
- while (bb.remaining() > 0)
- {
- ByteBuffer value = ByteBufferUtil.readBytesWithShortLength(bb);
- byte eoc = bb.get();
- list.add(new CompositeComponent(value, eoc));
- }
- return list;
- }
-
// Extract CQL3 column name from the full column name.
public ByteBuffer extractLastComponent(ByteBuffer bb)
{
[2/3] cassandra git commit: Handle composite prefixes with final
EOC=0 as in 2.x and refactor LegacyLayout.decodeBound
Posted by st...@apache.org.
Handle composite prefixes with final EOC=0 as in 2.x and refactor LegacyLayout.decodeBound
patch by Stefania Alborghetti and Sylvain Lebresne; reviewed by Tyler Hobbs and
Sylvain Lebresne for CASSANDRA-12423
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/d600f51e
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/d600f51e
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/d600f51e
Branch: refs/heads/trunk
Commit: d600f51ee1a3eb7b30ce3c409129567b70c22012
Parents: 932f3eb
Author: Stefania Alborghetti <st...@datastax.com>
Authored: Tue Aug 30 16:08:09 2016 +0800
Committer: Stefania Alborghetti <st...@datastax.com>
Committed: Mon Sep 12 16:56:30 2016 +0800
----------------------------------------------------------------------
CHANGES.txt | 1 +
.../org/apache/cassandra/db/LegacyLayout.java | 64 +++++++++++---------
.../cassandra/db/marshal/CompositeType.java | 26 --------
3 files changed, 37 insertions(+), 54 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/d600f51e/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 459d591..f0ec3e3 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
3.0.9
+ * Handle composite prefixes with final EOC=0 as in 2.x and refactor LegacyLayout.decodeBound (CASSANDRA-12423)
* Fix paging for 2.x to 3.x upgrades (CASSANDRA-11195)
* select_distinct_with_deletions_test failing on non-vnode environments (CASSANDRA-11126)
* Stack Overflow returned to queries while upgrading (CASSANDRA-12527)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/d600f51e/src/java/org/apache/cassandra/db/LegacyLayout.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/LegacyLayout.java b/src/java/org/apache/cassandra/db/LegacyLayout.java
index 65f9d3f..c8e7536 100644
--- a/src/java/org/apache/cassandra/db/LegacyLayout.java
+++ b/src/java/org/apache/cassandra/db/LegacyLayout.java
@@ -186,41 +186,49 @@ public abstract class LegacyLayout
if (!bound.hasRemaining())
return isStart ? LegacyBound.BOTTOM : LegacyBound.TOP;
- List<CompositeType.CompositeComponent> components = metadata.isCompound()
- ? CompositeType.deconstruct(bound)
- : Collections.singletonList(new CompositeType.CompositeComponent(bound, (byte) 0));
-
- // Either it's a prefix of the clustering, or it's the bound of a collection range tombstone (and thus has
- // the collection column name)
- assert components.size() <= metadata.comparator.size() || (!metadata.isCompactTable() && components.size() == metadata.comparator.size() + 1);
-
- List<CompositeType.CompositeComponent> prefix = components.size() <= metadata.comparator.size()
- ? components
- : components.subList(0, metadata.comparator.size());
- Slice.Bound.Kind boundKind;
+ if (!metadata.isCompound())
+ {
+ // The non compound case is a lot easier, in that there is no EOC nor collection to worry about, so dealing
+ // with that first.
+ return new LegacyBound(isStart ? Slice.Bound.inclusiveStartOf(bound) : Slice.Bound.inclusiveEndOf(bound), false, null);
+ }
+
+ int clusteringSize = metadata.comparator.size();
+
+ List<ByteBuffer> components = CompositeType.splitName(bound);
+ byte eoc = CompositeType.lastEOC(bound);
+
+ // There can be more components than the clustering size only in the case this is the bound of a collection
+ // range tombstone. In which case, there is exactly one more component, and that component is the name of the
+ // collection being selected/deleted.
+ assert components.size() <= clusteringSize || (!metadata.isCompactTable() && components.size() == clusteringSize + 1);
+
+ ColumnDefinition collectionName = null;
+ if (components.size() > clusteringSize)
+ collectionName = metadata.getColumnDefinition(components.remove(clusteringSize));
+
+ boolean isInclusive;
if (isStart)
{
- if (components.get(components.size() - 1).eoc > 0)
- boundKind = Slice.Bound.Kind.EXCL_START_BOUND;
- else
- boundKind = Slice.Bound.Kind.INCL_START_BOUND;
+ isInclusive = eoc <= 0;
}
else
{
- if (components.get(components.size() - 1).eoc < 0)
- boundKind = Slice.Bound.Kind.EXCL_END_BOUND;
- else
- boundKind = Slice.Bound.Kind.INCL_END_BOUND;
- }
+ isInclusive = eoc >= 0;
- ByteBuffer[] prefixValues = new ByteBuffer[prefix.size()];
- for (int i = 0; i < prefix.size(); i++)
- prefixValues[i] = prefix.get(i).value;
- Slice.Bound sb = Slice.Bound.create(boundKind, prefixValues);
+ // for an end bound, if we only have a prefix of all the components and the final EOC is zero,
+ // then it should only match up to the prefix but no further, that is, it is an inclusive bound
+ // of the exact prefix but an exclusive bound of anything beyond it, so adding an empty
+ // composite value ensures this behavior, see CASSANDRA-12423 for more details
+ if (eoc == 0 && components.size() < clusteringSize)
+ {
+ components.add(ByteBufferUtil.EMPTY_BYTE_BUFFER);
+ isInclusive = false;
+ }
+ }
- ColumnDefinition collectionName = components.size() == metadata.comparator.size() + 1
- ? metadata.getColumnDefinition(components.get(metadata.comparator.size()).value)
- : null;
+ Slice.Bound.Kind boundKind = Slice.Bound.boundKind(isStart, isInclusive);
+ Slice.Bound sb = Slice.Bound.create(boundKind, components.toArray(new ByteBuffer[components.size()]));
return new LegacyBound(sb, metadata.isCompound() && CompositeType.isStaticName(bound), collectionName);
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/d600f51e/src/java/org/apache/cassandra/db/marshal/CompositeType.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/marshal/CompositeType.java b/src/java/org/apache/cassandra/db/marshal/CompositeType.java
index d005fd7..52d6d39 100644
--- a/src/java/org/apache/cassandra/db/marshal/CompositeType.java
+++ b/src/java/org/apache/cassandra/db/marshal/CompositeType.java
@@ -227,32 +227,6 @@ public class CompositeType extends AbstractCompositeType
return null;
}
- public static class CompositeComponent
- {
- public ByteBuffer value;
- public byte eoc;
-
- public CompositeComponent(ByteBuffer value, byte eoc)
- {
- this.value = value;
- this.eoc = eoc;
- }
- }
-
- public static List<CompositeComponent> deconstruct(ByteBuffer bytes)
- {
- List<CompositeComponent> list = new ArrayList<>();
- ByteBuffer bb = bytes.duplicate();
- readStatic(bb);
- while (bb.remaining() > 0)
- {
- ByteBuffer value = ByteBufferUtil.readBytesWithShortLength(bb);
- byte eoc = bb.get();
- list.add(new CompositeComponent(value, eoc));
- }
- return list;
- }
-
// Extract CQL3 column name from the full column name.
public ByteBuffer extractLastComponent(ByteBuffer bb)
{
[3/3] cassandra git commit: Merge branch 'cassandra-3.0' into trunk
Posted by st...@apache.org.
Merge branch 'cassandra-3.0' into trunk
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/64f12ab2
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/64f12ab2
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/64f12ab2
Branch: refs/heads/trunk
Commit: 64f12ab2c82aea80bb8afdc0bf6b72fa706c0ff5
Parents: 4354db2 d600f51
Author: Stefania Alborghetti <st...@datastax.com>
Authored: Mon Sep 12 16:57:03 2016 +0800
Committer: Stefania Alborghetti <st...@datastax.com>
Committed: Mon Sep 12 16:58:08 2016 +0800
----------------------------------------------------------------------
CHANGES.txt | 1 +
.../org/apache/cassandra/db/LegacyLayout.java | 66 +++++++++++---------
.../cassandra/db/marshal/CompositeType.java | 26 --------
3 files changed, 38 insertions(+), 55 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/64f12ab2/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 520a338,f0ec3e3..3ab144e
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,64 -1,6 +1,65 @@@
-3.0.9
+3.10
+ * Fix Cassandra Stress reporting thread model and precision (CASSANDRA-12585)
+ * Add JMH benchmarks.jar (CASSANDRA-12586)
+ * Add row offset support to SASI (CASSANDRA-11990)
+ * Cleanup uses of AlterTableStatementColumn (CASSANDRA-12567)
+ * Add keep-alive to streaming (CASSANDRA-11841)
+ * Tracing payload is passed through newSession(..) (CASSANDRA-11706)
+ * avoid deleting non existing sstable files and improve related log messages (CASSANDRA-12261)
+ * json/yaml output format for nodetool compactionhistory (CASSANDRA-12486)
+ * Retry all internode messages once after a connection is
+ closed and reopened (CASSANDRA-12192)
+ * Add support to rebuild from targeted replica (CASSANDRA-9875)
+ * Add sequence distribution type to cassandra stress (CASSANDRA-12490)
+ * "SELECT * FROM foo LIMIT ;" does not error out (CASSANDRA-12154)
+ * Define executeLocally() at the ReadQuery Level (CASSANDRA-12474)
+ * Extend read/write failure messages with a map of replica addresses
+ to error codes in the v5 native protocol (CASSANDRA-12311)
+ * Fix rebuild of SASI indexes with existing index files (CASSANDRA-12374)
+ * Let DatabaseDescriptor not implicitly startup services (CASSANDRA-9054, 12550)
+ * Fix clustering indexes in presence of static columns in SASI (CASSANDRA-12378)
+ * Fix queries on columns with reversed type on SASI indexes (CASSANDRA-12223)
+ * Added slow query log (CASSANDRA-12403)
+ * Count full coordinated request against timeout (CASSANDRA-12256)
+ * Allow TTL with null value on insert and update (CASSANDRA-12216)
+ * Make decommission operation resumable (CASSANDRA-12008)
+ * Add support to one-way targeted repair (CASSANDRA-9876)
+ * Remove clientutil jar (CASSANDRA-11635)
+ * Fix compaction throughput throttle (CASSANDRA-12366)
+ * Delay releasing Memtable memory on flush until PostFlush has finished running (CASSANDRA-12358)
+ * Cassandra stress should dump all setting on startup (CASSANDRA-11914)
+ * Make it possible to compact a given token range (CASSANDRA-10643)
+ * Allow updating DynamicEndpointSnitch properties via JMX (CASSANDRA-12179)
+ * Collect metrics on queries by consistency level (CASSANDRA-7384)
+ * Add support for GROUP BY to SELECT statement (CASSANDRA-10707)
+ * Deprecate memtable_cleanup_threshold and update default for memtable_flush_writers (CASSANDRA-12228)
+ * Upgrade to OHC 0.4.4 (CASSANDRA-12133)
+ * Add version command to cassandra-stress (CASSANDRA-12258)
+ * Create compaction-stress tool (CASSANDRA-11844)
+ * Garbage-collecting compaction operation and schema option (CASSANDRA-7019)
+ * Add beta protocol flag for v5 native protocol (CASSANDRA-12142)
+ * Support filtering on non-PRIMARY KEY columns in the CREATE
+ MATERIALIZED VIEW statement's WHERE clause (CASSANDRA-10368)
+ * Unify STDOUT and SYSTEMLOG logback format (CASSANDRA-12004)
+ * COPY FROM should raise error for non-existing input files (CASSANDRA-12174)
+ * Faster write path (CASSANDRA-12269)
+ * Option to leave omitted columns in INSERT JSON unset (CASSANDRA-11424)
+ * Support json/yaml output in nodetool tpstats (CASSANDRA-12035)
+ * Expose metrics for successful/failed authentication attempts (CASSANDRA-10635)
+ * Prepend snapshot name with "truncated" or "dropped" when a snapshot
+ is taken before truncating or dropping a table (CASSANDRA-12178)
+ * Optimize RestrictionSet (CASSANDRA-12153)
+ * cqlsh does not automatically downgrade CQL version (CASSANDRA-12150)
+ * Omit (de)serialization of state variable in UDAs (CASSANDRA-9613)
+ * Create a system table to expose prepared statements (CASSANDRA-8831)
+ * Reuse DataOutputBuffer from ColumnIndex (CASSANDRA-11970)
+ * Remove DatabaseDescriptor dependency from SegmentedFile (CASSANDRA-11580)
+ * Add supplied username to authentication error messages (CASSANDRA-12076)
+ * Remove pre-startup check for open JMX port (CASSANDRA-12074)
+ * Remove compaction Severity from DynamicEndpointSnitch (CASSANDRA-11738)
+ * Restore resumable hints delivery (CASSANDRA-11960)
+Merged from 3.0:
+ * Handle composite prefixes with final EOC=0 as in 2.x and refactor LegacyLayout.decodeBound (CASSANDRA-12423)
- * Fix paging for 2.x to 3.x upgrades (CASSANDRA-11195)
* select_distinct_with_deletions_test failing on non-vnode environments (CASSANDRA-11126)
* Stack Overflow returned to queries while upgrading (CASSANDRA-12527)
* Fix legacy regex for temporary files from 2.2 (CASSANDRA-12565)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/64f12ab2/src/java/org/apache/cassandra/db/LegacyLayout.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/LegacyLayout.java
index 4fdf28c,c8e7536..ab62a0e
--- a/src/java/org/apache/cassandra/db/LegacyLayout.java
+++ b/src/java/org/apache/cassandra/db/LegacyLayout.java
@@@ -187,47 -186,55 +187,55 @@@ public abstract class LegacyLayou
if (!bound.hasRemaining())
return isStart ? LegacyBound.BOTTOM : LegacyBound.TOP;
- List<CompositeType.CompositeComponent> components = metadata.isCompound()
- ? CompositeType.deconstruct(bound)
- : Collections.singletonList(new CompositeType.CompositeComponent(bound, (byte) 0));
-
- // Either it's a prefix of the clustering, or it's the bound of a collection range tombstone (and thus has
- // the collection column name)
- assert components.size() <= metadata.comparator.size() || (!metadata.isCompactTable() && components.size() == metadata.comparator.size() + 1);
-
- List<CompositeType.CompositeComponent> prefix = components.size() <= metadata.comparator.size()
- ? components
- : components.subList(0, metadata.comparator.size());
- ClusteringPrefix.Kind boundKind;
+ if (!metadata.isCompound())
+ {
+ // The non compound case is a lot easier, in that there is no EOC nor collection to worry about, so dealing
+ // with that first.
- return new LegacyBound(isStart ? Slice.Bound.inclusiveStartOf(bound) : Slice.Bound.inclusiveEndOf(bound), false, null);
++ return new LegacyBound(isStart ? ClusteringBound.inclusiveStartOf(bound) : ClusteringBound.inclusiveEndOf(bound), false, null);
+ }
+
+ int clusteringSize = metadata.comparator.size();
+
+ List<ByteBuffer> components = CompositeType.splitName(bound);
+ byte eoc = CompositeType.lastEOC(bound);
+
+ // There can be more components than the clustering size only in the case this is the bound of a collection
+ // range tombstone. In which case, there is exactly one more component, and that component is the name of the
+ // collection being selected/deleted.
+ assert components.size() <= clusteringSize || (!metadata.isCompactTable() && components.size() == clusteringSize + 1);
+
+ ColumnDefinition collectionName = null;
+ if (components.size() > clusteringSize)
+ collectionName = metadata.getColumnDefinition(components.remove(clusteringSize));
+
+ boolean isInclusive;
if (isStart)
{
- if (components.get(components.size() - 1).eoc > 0)
- boundKind = ClusteringPrefix.Kind.EXCL_START_BOUND;
- else
- boundKind = ClusteringPrefix.Kind.INCL_START_BOUND;
+ isInclusive = eoc <= 0;
}
else
{
- if (components.get(components.size() - 1).eoc < 0)
- boundKind = ClusteringPrefix.Kind.EXCL_END_BOUND;
- else
- boundKind = ClusteringPrefix.Kind.INCL_END_BOUND;
- }
+ isInclusive = eoc >= 0;
- ByteBuffer[] prefixValues = new ByteBuffer[prefix.size()];
- for (int i = 0; i < prefix.size(); i++)
- prefixValues[i] = prefix.get(i).value;
- ClusteringBound sb = ClusteringBound.create(boundKind, prefixValues);
+ // for an end bound, if we only have a prefix of all the components and the final EOC is zero,
+ // then it should only match up to the prefix but no further, that is, it is an inclusive bound
+ // of the exact prefix but an exclusive bound of anything beyond it, so adding an empty
+ // composite value ensures this behavior, see CASSANDRA-12423 for more details
+ if (eoc == 0 && components.size() < clusteringSize)
+ {
+ components.add(ByteBufferUtil.EMPTY_BYTE_BUFFER);
+ isInclusive = false;
+ }
+ }
- ColumnDefinition collectionName = components.size() == metadata.comparator.size() + 1
- ? metadata.getColumnDefinition(components.get(metadata.comparator.size()).value)
- : null;
- Slice.Bound.Kind boundKind = Slice.Bound.boundKind(isStart, isInclusive);
- Slice.Bound sb = Slice.Bound.create(boundKind, components.toArray(new ByteBuffer[components.size()]));
-- return new LegacyBound(sb, metadata.isCompound() && CompositeType.isStaticName(bound), collectionName);
++ ClusteringPrefix.Kind boundKind = ClusteringBound.boundKind(isStart, isInclusive);
++ ClusteringBound cb = ClusteringBound.create(boundKind, components.toArray(new ByteBuffer[components.size()]));
++ return new LegacyBound(cb, metadata.isCompound() && CompositeType.isStaticName(bound), collectionName);
}
- public static ByteBuffer encodeBound(CFMetaData metadata, Slice.Bound bound, boolean isStart)
+ public static ByteBuffer encodeBound(CFMetaData metadata, ClusteringBound bound, boolean isStart)
{
- if (bound == Slice.Bound.BOTTOM || bound == Slice.Bound.TOP || metadata.comparator.size() == 0)
+ if (bound == ClusteringBound.BOTTOM || bound == ClusteringBound.TOP || metadata.comparator.size() == 0)
return ByteBufferUtil.EMPTY_BYTE_BUFFER;
ClusteringPrefix clustering = bound.clustering();
http://git-wip-us.apache.org/repos/asf/cassandra/blob/64f12ab2/src/java/org/apache/cassandra/db/marshal/CompositeType.java
----------------------------------------------------------------------