Skip to content

Add order by support #19

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions src/sqlancer/datafusion/DataFusionErrors.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,19 @@ public static void registerExpectedExecutionErrors(ExpectedErrors errors) {
errors.add("overflow");
errors.add("Unsupported data type");
errors.add("Divide by zero");
errors.add("Sort requires at least one column");
errors.add("The data type type Null has no natural order");
/*
* Known bugs
*/
errors.add("to type Int64"); // https://github.com/apache/datafusion/issues/11249
errors.add("bitwise"); // https://github.com/apache/datafusion/issues/11260
errors.add(" Not all InterleaveExec children have a consistent hash partitioning."); // https://github.com/apache/datafusion/issues/11409
Pattern pattern = Pattern.compile("JOIN.*NULL", Pattern.CASE_INSENSITIVE);
errors.addRegex(pattern); // https://github.com/apache/datafusion/issues/11414
Pattern pattern = Pattern.compile("ORDER BY.*LOG", Pattern.CASE_INSENSITIVE);
errors.addRegex(pattern); // https://github.com/apache/datafusion/issues/11549
Pattern patternTriaFunc = Pattern.compile("ORDER BY.*\\b(ACOS|ACOSH|ASIN|ATANH)\\b", Pattern.CASE_INSENSITIVE);
errors.addRegex(patternTriaFunc); // https://github.com/apache/datafusion/issues/11552
errors.add("Sort expressions cannot be empty for streaming merge."); // https://github.com/apache/datafusion/issues/11561
/*
* False positives
*/
Expand Down
14 changes: 14 additions & 0 deletions src/sqlancer/datafusion/gen/DataFusionExpressionGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import sqlancer.common.ast.newast.ColumnReferenceNode;
import sqlancer.common.ast.newast.NewBinaryOperatorNode;
import sqlancer.common.ast.newast.NewFunctionNode;
import sqlancer.common.ast.newast.NewOrderingTerm;
import sqlancer.common.ast.newast.NewUnaryPostfixOperatorNode;
import sqlancer.common.ast.newast.NewUnaryPrefixOperatorNode;
import sqlancer.common.ast.newast.Node;
Expand Down Expand Up @@ -178,6 +179,19 @@ List<DataFusionColumn> filterColumns(DataFusionDataType type) {
}
}

@Override
public List<Node<DataFusionExpression>> generateOrderBys() {
List<Node<DataFusionExpression>> expr = super.generateOrderBys();
List<Node<DataFusionExpression>> newExpr = new ArrayList<>(expr.size());
for (Node<DataFusionExpression> curExpr : expr) {
if (Randomly.getBoolean()) {
curExpr = new NewOrderingTerm<>(curExpr, NewOrderingTerm.Ordering.getRandom());
}
newExpr.add(curExpr);
}
return newExpr;
}

@Override
protected Node<DataFusionExpression> generateColumn(DataFusionDataType type) {
// HACK: if no col of such type exist, generate constant value instead
Expand Down
4 changes: 2 additions & 2 deletions src/sqlancer/datafusion/server/datafusion_server/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ bytes = "1.4"
chrono = { version = "0.4.34", default-features = false }
dashmap = "5.5.0"
# This version is for SQLancer CI run
datafusion = { version = "40.0.0" }
#datafusion = { version = "40.0.0" }
# Use following line if you want to test against the latest main branch of DataFusion
# datafusion = { git = "https://github.com/apache/datafusion.git", branch = "main" }
datafusion = { git = "https://github.com/apache/datafusion.git", branch = "main" }
env_logger = "0.11"
futures = "0.3"
half = { version = "2.2.1", default-features = false }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import java.util.List;

import sqlancer.ComparatorHelper;
import sqlancer.Randomly;
import sqlancer.datafusion.DataFusionErrors;
import sqlancer.datafusion.DataFusionProvider.DataFusionGlobalState;
import sqlancer.datafusion.DataFusionToStringVisitor;
Expand Down Expand Up @@ -39,6 +40,12 @@ public void check() throws SQLException {
DataFusionSelect randomSelect = select;
randomSelect.setWhereClause(null);

// set 'order by'
boolean orderBy = Randomly.getBooleanWithRatherLowProbability();
if (orderBy) {
select.setOrderByClauses(gen.generateOrderBys());
}

// Construct q
String qString = DataFusionToStringVisitor.asString(randomSelect);
// Construct qp1, qp2, qp3
Expand Down
Loading