diff --git a/src/java/org/apache/cassandra/cql3/selection/Selection.java b/src/java/org/apache/cassandra/cql3/selection/Selection.java index 12d8aa014e19..a860f28661e5 100644 --- a/src/java/org/apache/cassandra/cql3/selection/Selection.java +++ b/src/java/org/apache/cassandra/cql3/selection/Selection.java @@ -146,20 +146,26 @@ public static Selection wildcard(TableMetadata table, boolean isJson, boolean re public static Selection wildcard(TableMetadata table, Set orderingColumns, boolean isJson, boolean returnStaticContentOnPartitionWithNoRows) { + // Add all table columns, but skip orderingColumns: List all = new ArrayList<>(table.columns().size()); Iterators.addAll(all, table.allColumnsInSelectOrder()); - return new SimpleSelection(table, all, orderingColumns, true, isJson, returnStaticContentOnPartitionWithNoRows); + + Set newOrderingColumns = new HashSet<>(orderingColumns); + all.forEach(newOrderingColumns::remove); + + return new SimpleSelection(table, all, newOrderingColumns, true, isJson, returnStaticContentOnPartitionWithNoRows); } public static Selection wildcardWithGroupBy(TableMetadata table, VariableSpecifications boundNames, + Set orderingColumns, boolean isJson, boolean returnStaticContentOnPartitionWithNoRows) { return fromSelectors(table, Lists.newArrayList(table.allColumnsInSelectOrder()), boundNames, - Collections.emptySet(), + orderingColumns, Collections.emptySet(), true, isJson, diff --git a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java index ace05ee3545f..d4d5a0a44e75 100644 --- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java @@ -1304,8 +1304,8 @@ private Selection prepareSelection(TableMetadata table, if (selectables.isEmpty()) // wildcard query { return hasGroupBy - ? Selection.wildcardWithGroupBy(table, boundNames, parameters.isJson, restrictions.returnStaticContentOnPartitionWithNoRows()) - : Selection.wildcard(table, parameters.isJson, restrictions.returnStaticContentOnPartitionWithNoRows()); + ? Selection.wildcardWithGroupBy(table, boundNames, resultSetOrderingColumns, parameters.isJson, restrictions.returnStaticContentOnPartitionWithNoRows()) + : Selection.wildcard(table, resultSetOrderingColumns, parameters.isJson, restrictions.returnStaticContentOnPartitionWithNoRows()); } return Selection.fromSelectors(table, diff --git a/test/unit/org/apache/cassandra/index/sai/cql/BM25Test.java b/test/unit/org/apache/cassandra/index/sai/cql/BM25Test.java index 530daa0d66ea..facf8c52b579 100644 --- a/test/unit/org/apache/cassandra/index/sai/cql/BM25Test.java +++ b/test/unit/org/apache/cassandra/index/sai/cql/BM25Test.java @@ -547,4 +547,18 @@ public void testBM25RaceConditionConcurrentQueriesInInvertedIndexSearcher() thro // Shutdown executor assertEquals(0, executor.shutdownNow().size()); } + + @Test + public void testWildcardSelection() + { + createTable("CREATE TABLE %s (k int, c int, v text, PRIMARY KEY (k, c))"); + analyzeIndex(); + execute("INSERT INTO %s (k, c, v) VALUES (1, 1, 'apple')"); + + var result = execute("SELECT * FROM %s ORDER BY v BM25 OF 'apple' LIMIT 3"); + assertThat(result).hasSize(1); + + var result2 = execute("SELECT * FROM %s GROUP BY k, c ORDER BY v BM25 OF 'apple' LIMIT 3"); + assertThat(result2).hasSize(1); + } }