Author: xedin Date: Thu Nov 3 19:00:00 2011 New Revision: 1197270 URL: http://svn.apache.org/viewvc?rev=1197270&view=rev Log: recognize that "SELECT first ... *" isn't really "SELECT *" patch by Pavel Yaskevich; reviewed by Jonathan Ellis for CASSANDRA-3445
Modified: cassandra/trunk/CHANGES.txt cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java cassandra/trunk/src/java/org/apache/cassandra/cql/SelectExpression.java cassandra/trunk/src/java/org/apache/cassandra/cql/SelectStatement.java Modified: cassandra/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=1197270&r1=1197269&r2=1197270&view=diff ============================================================================== --- cassandra/trunk/CHANGES.txt (original) +++ cassandra/trunk/CHANGES.txt Thu Nov 3 19:00:00 2011 @@ -2,7 +2,7 @@ * off-heap cache to use sun.misc.Unsafe instead of JNA (CASSANDRA-3271) * EACH_QUORUM is only supported for writes (CASSANDRA-3272) * replace compactionlock use in schema migration by checking CFS.isInvalidD - + * recognize that "SELECT first ... *" isn't really "SELECT *" (CASSANDRA-3445) 1.0.2 * "defragment" rows for name-based queries under STCS (CASSANDRA-2503) Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g?rev=1197270&r1=1197269&r2=1197270&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g (original) +++ cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g Thu Nov 3 19:00:00 2011 @@ -169,13 +169,14 @@ selectExpression returns [SelectExpressi : { int count = 10000; boolean reversed = false; + boolean hasFirstSet = false; } - ( K_FIRST cols=INTEGER { count = Integer.parseInt($cols.text); } )? + ( K_FIRST { hasFirstSet = true; } cols=INTEGER { count = Integer.parseInt($cols.text); } )? ( K_REVERSED { reversed = true; } )? - ( first=term { $expr = new SelectExpression(first, count, reversed); } + ( first=term { $expr = new SelectExpression(first, count, reversed, hasFirstSet); } (',' next=term { $expr.and(next); })* - | start=term RANGEOP finish=term { $expr = new SelectExpression(start, finish, count, reversed, false); } - | '\*' { $expr = new SelectExpression(new Term(), new Term(), count, reversed, true); } + | start=term RANGEOP finish=term { $expr = new SelectExpression(start, finish, count, reversed, false, hasFirstSet); } + | '\*' { $expr = new SelectExpression(new Term(), new Term(), count, reversed, true, hasFirstSet); } ) ; Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java?rev=1197270&r1=1197269&r2=1197270&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java Thu Nov 3 19:00:00 2011 @@ -587,7 +587,7 @@ public class QueryProcessor List<Column> thriftColumns = new ArrayList<Column>(); if (select.isColumnRange()) { - if (select.isWildcard()) + if (select.isFullWildcard()) { // prepend key thriftColumns.add(new Column(metadata.getKeyName()).setValue(row.key.key).setTimestamp(-1)); Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/SelectExpression.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/SelectExpression.java?rev=1197270&r1=1197269&r2=1197270&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/cql/SelectExpression.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/cql/SelectExpression.java Thu Nov 3 19:00:00 2011 @@ -37,6 +37,7 @@ public class SelectExpression private int numColumns = MAX_COLUMNS_DEFAULT; private boolean reverseColumns = false; + private boolean hasFirstSet; private final boolean wildcard; private Term start, finish; private List<Term> columns; @@ -48,14 +49,17 @@ public class SelectExpression * @param finish the finishing column name * @param count the number of columns to limit the results to * @param reverse true to reverse column order + * @param wildcard determines weather this statement is wildcard + * @param firstSet determines weather "FIRST" keyword was set */ - public SelectExpression(Term start, Term finish, int count, boolean reverse, boolean wildcard) + public SelectExpression(Term start, Term finish, int count, boolean reverse, boolean wildcard, boolean firstSet) { this.start = start; this.finish = finish; numColumns = count; reverseColumns = reverse; this.wildcard = wildcard; + hasFirstSet = firstSet; } /** @@ -64,14 +68,16 @@ public class SelectExpression * @param first the first (possibly only) column name to select on. * @param count the number of columns to limit the results on * @param reverse true to reverse column order + * @param firstSet determines weather "FIRST" keyword was set */ - public SelectExpression(Term first, int count, boolean reverse) + public SelectExpression(Term first, int count, boolean reverse, boolean firstSet) { wildcard = false; columns = new ArrayList<Term>(); columns.add(first); numColumns = count; reverseColumns = reverse; + hasFirstSet = firstSet; } /** @@ -114,6 +120,14 @@ public class SelectExpression numColumns = limit; } + /** + * @return weather expression includes "FIRST" keyword + */ + public boolean hasFirstSet() + { + return hasFirstSet; + } + public Term getStart() { return start; Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/SelectStatement.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/SelectStatement.java?rev=1197270&r1=1197269&r2=1197270&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/cql/SelectStatement.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/cql/SelectStatement.java Thu Nov 3 19:00:00 2011 @@ -90,7 +90,11 @@ public class SelectStatement { return expression.isWildcard(); } - + public boolean isFullWildcard() + { + return expression.isWildcard() && !expression.hasFirstSet(); + } + public List<Term> getColumnNames() { return expression.getColumns();