diff --git a/src/sqlancer/datafusion/DataFusionErrors.java b/src/sqlancer/datafusion/DataFusionErrors.java index 981ab913..d294b5cf 100644 --- a/src/sqlancer/datafusion/DataFusionErrors.java +++ b/src/sqlancer/datafusion/DataFusionErrors.java @@ -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 */ diff --git a/src/sqlancer/datafusion/gen/DataFusionExpressionGenerator.java b/src/sqlancer/datafusion/gen/DataFusionExpressionGenerator.java index 3d734061..ca0e0d2e 100644 --- a/src/sqlancer/datafusion/gen/DataFusionExpressionGenerator.java +++ b/src/sqlancer/datafusion/gen/DataFusionExpressionGenerator.java @@ -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; @@ -178,6 +179,19 @@ List filterColumns(DataFusionDataType type) { } } + @Override + public List> generateOrderBys() { + List> expr = super.generateOrderBys(); + List> newExpr = new ArrayList<>(expr.size()); + for (Node curExpr : expr) { + if (Randomly.getBoolean()) { + curExpr = new NewOrderingTerm<>(curExpr, NewOrderingTerm.Ordering.getRandom()); + } + newExpr.add(curExpr); + } + return newExpr; + } + @Override protected Node generateColumn(DataFusionDataType type) { // HACK: if no col of such type exist, generate constant value instead diff --git a/src/sqlancer/datafusion/server/datafusion_server/Cargo.toml b/src/sqlancer/datafusion/server/datafusion_server/Cargo.toml index b5df0b9a..59f52f74 100644 --- a/src/sqlancer/datafusion/server/datafusion_server/Cargo.toml +++ b/src/sqlancer/datafusion/server/datafusion_server/Cargo.toml @@ -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 } diff --git a/src/sqlancer/datafusion/test/DataFusionQueryPartitioningWhereTester.java b/src/sqlancer/datafusion/test/DataFusionQueryPartitioningWhereTester.java index 03948d05..6cc37cdf 100644 --- a/src/sqlancer/datafusion/test/DataFusionQueryPartitioningWhereTester.java +++ b/src/sqlancer/datafusion/test/DataFusionQueryPartitioningWhereTester.java @@ -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; @@ -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