Skip to content

Commit c8d0e63

Browse files
committed
fix: implement where tester of tlp
1 parent b55486b commit c8d0e63

File tree

6 files changed

+59
-76
lines changed

6 files changed

+59
-76
lines changed

src/sqlancer/databend/ast/DatabendUnaryPostfixOperation.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ public DatabendUnaryPostfixOperation(Node<DatabendExpression> expr, DatabendUnar
1818
setNegate(negate);
1919
}
2020

21+
public DatabendUnaryPostfixOperation(Node<DatabendExpression> expr, DatabendUnaryPostfixOperator op) {
22+
super(expr,op);
23+
}
24+
2125
public enum DatabendUnaryPostfixOperator implements BinaryOperatorNode.Operator {
2226
IS_NULL("IS NULL"){
2327
@Override

src/sqlancer/databend/ast/DatabendUnaryPrefixOperation.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ public DatabendUnaryPrefixOperation(Node<DatabendExpression> expr, DatabendUnary
1717
setNegate(negate);
1818
}
1919

20+
public DatabendUnaryPrefixOperation(Node<DatabendExpression> expr, DatabendUnaryPrefixOperator op) {
21+
super(expr,op);
22+
}
23+
2024
void setNegate(boolean negate){
2125
this.negate = negate;
2226
}
@@ -26,18 +30,11 @@ public Node<DatabendExpression> getExpression() {
2630
return getExpr();
2731
}
2832

29-
@Override
30-
public String getOperatorRepresentation() {
31-
return null;
32-
}
33-
3433
// @Override
3534
// public OperatorKind getOperatorKind() {
3635
// return OperatorKind.PREFIX;
3736
// }
3837

39-
40-
4138
public enum DatabendUnaryPrefixOperator implements BinaryOperatorNode.Operator {
4239
NOT("NOT", DatabendDataType.BOOLEAN, DatabendDataType.INT) {
4340
@Override

src/sqlancer/databend/gen/DatabendIndexGenerator.java

Lines changed: 0 additions & 59 deletions
This file was deleted.

src/sqlancer/databend/gen/DatabendNoRECExpressionGenerator.java

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package sqlancer.databend.gen;
22

3-
import com.google.common.collect.RangeMap;
43
import sqlancer.Randomly;
54
import sqlancer.common.ast.newast.NewBetweenOperatorNode;
5+
import sqlancer.common.ast.newast.NewFunctionNode;
66
import sqlancer.common.ast.newast.NewInOperatorNode;
77
import sqlancer.common.ast.newast.Node;
88
import sqlancer.common.gen.TypedExpressionGenerator;
@@ -14,7 +14,6 @@
1414
import sqlancer.databend.ast.DatabendUnaryPrefixOperation.DatabendUnaryPrefixOperator;
1515
import sqlancer.databend.ast.DatabendBinaryLogicalOperation.DatabendBinaryLogicalOperator;
1616
import sqlancer.databend.ast.DatabendBinaryComparisonOperation.DatabendBinaryComparisonOperator;
17-
1817
import java.util.ArrayList;
1918
import java.util.Arrays;
2019
import java.util.List;
@@ -24,6 +23,7 @@ public class DatabendNoRECExpressionGenerator extends
2423
TypedExpressionGenerator<Node<DatabendExpression>, DatabendColumn, DatabendDataType> {
2524

2625
private final DatabendGlobalState globalState;
26+
private boolean allowAggregateFunctions;
2727

2828
public DatabendNoRECExpressionGenerator(DatabendGlobalState globalState) {
2929
this.globalState = globalState;
@@ -89,7 +89,6 @@ Node<DatabendExpression> generateBooleanExpression(int depth) {
8989

9090
Node<DatabendExpression> getPostfix(int depth) {
9191
DatabendUnaryPostfixOperator randomOp = DatabendUnaryPostfixOperator.getRandom();
92-
// System.out.println("getPostfix:" + generateExpression(Randomly.fromOptions(randomOp.getInputDataTypes()), depth));
9392
return new DatabendUnaryPostfixOperation(
9493
generateExpression(Randomly.fromOptions(randomOp.getInputDataTypes()), depth),
9594
randomOp,Randomly.getBoolean());
@@ -152,17 +151,17 @@ Node<DatabendExpression> getLike(int depth, DatabendDataType dataType) {
152151

153152
@Override
154153
public Node<DatabendExpression> generatePredicate() {
155-
return null;
154+
return generateExpression(DatabendDataType.BOOLEAN);
156155
}
157156

158157
@Override
159158
public Node<DatabendExpression> negatePredicate(Node<DatabendExpression> predicate) {
160-
return null;
159+
return new DatabendUnaryPrefixOperation(predicate,DatabendUnaryPrefixOperator.NOT);
161160
}
162161

163162
@Override
164-
public Node<DatabendExpression> isNull(Node<DatabendExpression> expr) {
165-
return null;
163+
public Node<DatabendExpression> isNull(Node<DatabendExpression> predicate) {
164+
return new DatabendUnaryPostfixOperation(predicate,DatabendUnaryPostfixOperator.IS_NULL);
166165
}
167166

168167
// public Node<DatabendExpression> generateConstant(boolean isNullable) { //TODO 极小概率生成NULL值
@@ -213,4 +212,44 @@ protected DatabendDataType getRandomType() {
213212
protected boolean canGenerateColumnOfType(DatabendDataType type) {
214213
return false;
215214
}
215+
216+
public enum DatabendAggregateFunction {
217+
MAX(1), MIN(1), AVG(1), COUNT(1),SUM(1), STDDEV_POP(1),
218+
COVAR_POP(1), COVAR_SAMP(2);
219+
//, STRING_AGG(1), STDDEV_SAMP(1),VAR_SAMP(1), VAR_POP(1)
220+
221+
private int nrArgs;
222+
223+
DatabendAggregateFunction(int nrArgs) {
224+
this.nrArgs = nrArgs;
225+
}
226+
227+
public static DatabendAggregateFunction getRandom() {
228+
return Randomly.fromOptions(values());
229+
}
230+
231+
public int getNrArgs() {
232+
return nrArgs;
233+
}
234+
235+
}
236+
237+
public NewFunctionNode<DatabendExpression, DatabendAggregateFunction> generateArgsForAggregate(
238+
DatabendAggregateFunction aggregateFunction) {
239+
return new NewFunctionNode<DatabendExpression, DatabendAggregateFunction>(
240+
generateExpressions(aggregateFunction.getNrArgs()), aggregateFunction);
241+
}
242+
243+
public Node<DatabendExpression> generateAggregate() {
244+
DatabendAggregateFunction aggrFunc = DatabendAggregateFunction.getRandom();
245+
return generateArgsForAggregate(aggrFunc);
246+
}
247+
248+
public Node<DatabendExpression> generateHavingClause() {
249+
this.allowAggregateFunctions = true;
250+
Node<DatabendExpression> expression = generateExpression(DatabendDataType.BOOLEAN);
251+
this.allowAggregateFunctions = false;
252+
return expression;
253+
}
254+
216255
}

src/sqlancer/databend/test/DatabendQueryPartitioningBase.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import sqlancer.databend.DatabendSchema.DatabendColumn;
1818
import sqlancer.databend.DatabendSchema.DatabendTable;
1919
import sqlancer.databend.DatabendSchema.DatabendTables;
20+
import sqlancer.databend.gen.DatabendNoRECExpressionGenerator;
2021

2122
import java.sql.SQLException;
2223
import java.util.ArrayList;
@@ -29,7 +30,7 @@ public class DatabendQueryPartitioningBase
2930

3031
DatabendSchema s;
3132
DatabendTables targetTables;
32-
DatabendExpressionGenerator gen;
33+
DatabendNoRECExpressionGenerator gen;
3334
DatabendSelect select;
3435

3536
public DatabendQueryPartitioningBase(DatabendGlobalState state) {
@@ -50,7 +51,7 @@ public static String canonicalizeResultValue(String value) {
5051
public void check() throws SQLException {
5152
s = state.getSchema();
5253
targetTables = s.getRandomTableNonEmptyTables();
53-
gen = new DatabendExpressionGenerator(state).setColumns(targetTables.getColumns());
54+
gen = new DatabendNoRECExpressionGenerator(state).setColumns(targetTables.getColumns());
5455
initializeTernaryPredicateVariants();
5556
select = new DatabendSelect();
5657
select.setFetchColumns(generateFetchColumns());

src/sqlancer/databend/test/DatabendQueryPartitioningHavingTester.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import sqlancer.common.ast.newast.Node;
66
import sqlancer.common.oracle.TestOracle;
77
import sqlancer.databend.DatabendErrors;
8+
import sqlancer.databend.DatabendSchema;
89
import sqlancer.databend.DatabendToStringVisitor;
910
import sqlancer.databend.ast.DatabendExpression;
1011
import sqlancer.databend.DatabendProvider.DatabendGlobalState;
@@ -25,7 +26,7 @@ public DatabendQueryPartitioningHavingTester(DatabendGlobalState state) {
2526
public void check() throws SQLException {
2627
super.check();
2728
if (Randomly.getBoolean()) {
28-
select.setWhereClause(gen.generateExpression());
29+
select.setWhereClause(gen.generateExpression(DatabendSchema.DatabendDataType.BOOLEAN));
2930
}
3031
boolean orderBy = Randomly.getBoolean();
3132
if (orderBy) {

0 commit comments

Comments
 (0)