11package sqlancer .databend .gen ;
22
3- import com .google .common .collect .RangeMap ;
43import sqlancer .Randomly ;
54import sqlancer .common .ast .newast .NewBetweenOperatorNode ;
5+ import sqlancer .common .ast .newast .NewFunctionNode ;
66import sqlancer .common .ast .newast .NewInOperatorNode ;
77import sqlancer .common .ast .newast .Node ;
88import sqlancer .common .gen .TypedExpressionGenerator ;
1414import sqlancer .databend .ast .DatabendUnaryPrefixOperation .DatabendUnaryPrefixOperator ;
1515import sqlancer .databend .ast .DatabendBinaryLogicalOperation .DatabendBinaryLogicalOperator ;
1616import sqlancer .databend .ast .DatabendBinaryComparisonOperation .DatabendBinaryComparisonOperator ;
17-
1817import java .util .ArrayList ;
1918import java .util .Arrays ;
2019import 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}
0 commit comments