Skip to content

Commit 66a4392

Browse files
committed
feat(databend): add int expression generator
Signed-off-by: Yisong Han <[email protected]>
1 parent 7bd59dc commit 66a4392

3 files changed

Lines changed: 58 additions & 18 deletions

File tree

src/sqlancer/databend/ast/DatabendUnaryPrefixOperation.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,29 @@ public DatabendDataType getExpressionType() {
4646
protected DatabendConstant getExpectedValue(DatabendConstant expectedValue) {
4747
return null; // TODO
4848
}
49+
},
50+
51+
UNARY_PLUS("+",DatabendDataType.INT) {
52+
@Override
53+
public DatabendDataType getExpressionType() {
54+
return DatabendDataType.INT;
55+
}
56+
57+
@Override
58+
protected DatabendConstant getExpectedValue(DatabendConstant expectedValue) {
59+
return expectedValue;
60+
}
61+
},
62+
UNARY_MINUS("-", DatabendDataType.INT) {
63+
@Override
64+
public DatabendDataType getExpressionType() {
65+
return DatabendDataType.INT;
66+
}
67+
68+
@Override
69+
protected DatabendConstant getExpectedValue(DatabendConstant expectedValue) {
70+
return null;
71+
}
4972
};
5073

5174

src/sqlancer/databend/gen/DatabendInsertGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ protected void insertValue(DatabendColumn column) {
4949
// }
5050
String value = DatabendToStringVisitor.asString(
5151
new DatabendNewExpressionGenerator(globalState).
52-
generateConstant(column.getType().getPrimitiveDataType())); //生成一个与column相同的常量类型
52+
generateConstant(column.getType().getPrimitiveDataType(),column.isNullable())); //生成一个与column相同的常量类型
5353
sb.append(value);
5454

5555
}

src/sqlancer/databend/gen/DatabendNewExpressionGenerator.java

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import sqlancer.databend.ast.DatabendUnaryPrefixOperation.DatabendUnaryPrefixOperator;
1515
import sqlancer.databend.ast.DatabendBinaryLogicalOperation.DatabendBinaryLogicalOperator;
1616
import sqlancer.databend.ast.DatabendBinaryComparisonOperation.DatabendBinaryComparisonOperator;
17+
import sqlancer.databend.ast.DatabendBinaryArithmeticOperation.DatabendBinaryArithmeticOperator;
1718
import java.util.ArrayList;
1819
import java.util.Arrays;
1920
import 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

Comments
 (0)