1414import sqlancer .databend .ast .DatabendUnaryPrefixOperation .DatabendUnaryPrefixOperator ;
1515import sqlancer .databend .ast .DatabendBinaryLogicalOperation .DatabendBinaryLogicalOperator ;
1616import sqlancer .databend .ast .DatabendBinaryComparisonOperation .DatabendBinaryComparisonOperator ;
17+ import sqlancer .databend .ast .DatabendBinaryArithmeticOperation .DatabendBinaryArithmeticOperator ;
1718import java .util .ArrayList ;
1819import java .util .Arrays ;
1920import java .util .List ;
@@ -29,11 +30,6 @@ public DatabendNewExpressionGenerator(DatabendGlobalState globalState) {
2930 this .globalState = globalState ;
3031 }
3132
32- private enum BooleanExpression {
33- POSTFIX_OPERATOR , NOT , BINARY_LOGICAL_OPERATOR , BINARY_COMPARISON , LIKE , BETWEEN , IN_OPERATION ;
34- // SIMILAR_TO, POSIX_REGEX, BINARY_RANGE_COMPARISON,FUNCTION, CAST,;
35- }
36-
3733 public Node <DatabendExpression > generateLeafNode (DatabendDataType dataType ) {
3834 return generateConstant (dataType );
3935 }
@@ -49,6 +45,7 @@ protected Node<DatabendExpression> generateExpression(DatabendDataType type, int
4945 case BOOLEAN :
5046 return generateBooleanExpression (depth );
5147 case INT :
48+ return generateIntExpression (depth );
5249 case FLOAT :
5350 case VARCHAR :
5451 case NULL :
@@ -66,9 +63,28 @@ public List<Node<DatabendExpression>> generateExpressions(int nr, DatabendDataTy
6663 return expressions ;
6764 }
6865
66+ private enum IntExpression {
67+ UNARY_OPERATION , BINARY_ARITHMETIC_OPERATION
68+ }
69+
6970 private Node <DatabendExpression > generateIntExpression (int depth ) {
71+ IntExpression intExpression = Randomly .fromOptions (IntExpression .values ());
72+ switch (intExpression ) {
73+ case UNARY_OPERATION :
74+ return new DatabendUnaryPrefixOperation (generateExpression (DatabendDataType .INT ,depth +1 ),
75+ Randomly .getBoolean ()? DatabendUnaryPrefixOperator .UNARY_PLUS : DatabendUnaryPrefixOperator .UNARY_MINUS );
76+ case BINARY_ARITHMETIC_OPERATION :
77+ return new DatabendBinaryArithmeticOperation (generateExpression (DatabendDataType .INT ,depth +1 ),
78+ generateExpression (DatabendDataType .INT ,depth +1 ),
79+ Randomly .fromOptions (DatabendBinaryArithmeticOperator .values ()));
80+ default :
81+ throw new AssertionError ();
82+ }
83+ }
7084
71- return null ;
85+ private enum BooleanExpression {
86+ POSTFIX_OPERATOR , NOT , BINARY_LOGICAL_OPERATOR , BINARY_COMPARISON , LIKE , BETWEEN , IN_OPERATION ;
87+ // SIMILAR_TO, POSIX_REGEX, BINARY_RANGE_COMPARISON,FUNCTION, CAST,;
7288 }
7389
7490 Node <DatabendExpression > generateBooleanExpression (int depth ) {
@@ -172,28 +188,29 @@ public Node<DatabendExpression> isNull(Node<DatabendExpression> predicate) {
172188 return new DatabendUnaryPostfixOperation (predicate ,DatabendUnaryPostfixOperator .IS_NULL );
173189 }
174190
175- // public Node<DatabendExpression> generateConstant(boolean isNullable) { //TODO 极小概率生成NULL值
176- // DatabendDataType type;
177- // do {
178- // type = Randomly.fromOptions(DatabendDataType.values());
179- // } while(!isNullable && type.equals(DatabendDataType.NULL)); //isNullable为假,同时获得NULL就重新获取
180- //
181- // return generateConstant(type);
182- // }
191+ public Node <DatabendExpression > generateConstant (DatabendDataType type ,boolean isNullable ) {
192+ if (isNullable && Randomly .getBooleanWithSmallProbability ()) {
193+ createConstant (DatabendDataType .NULL );
194+ }
195+ return createConstant (type );
196+ }
183197
184198 @ Override
185199 public Node <DatabendExpression > generateConstant (DatabendDataType type ) {
186- Randomly r = globalState .getRandomly ();
187200 if (Randomly .getBooleanWithSmallProbability ()) {
188201 return DatabendConstant .createNullConstant ();
189202 }
203+ return createConstant (type );
204+ }
190205
206+ public Node <DatabendExpression > createConstant (DatabendDataType type ) {
207+ Randomly r = globalState .getRandomly ();
191208 switch (type ) {
192209 case INT :
193- //不支持string转化故直接返回int constant
210+ //TODO 已支持数值型string转化,待添加
194211 return DatabendConstant .createIntConstant (r .getInteger ());
195212 case BOOLEAN :
196- //不支持string转化故直接返回boolean constant
213+ //TODO 已支持boolean型string转化,待添加
197214 return DatabendConstant .createBooleanConstant (Randomly .getBoolean ());
198215 case FLOAT :
199216 return DatabendConstant .createFloatConstant ((float ) r .getDouble ());
0 commit comments