|
9 | 9 |
|
10 | 10 | import sqlancer.Randomly; |
11 | 11 | import sqlancer.common.ast.newast.NewOrderingTerm; |
| 12 | +import sqlancer.common.gen.NoRECGenerator; |
12 | 13 | import sqlancer.common.gen.TypedExpressionGenerator; |
| 14 | +import sqlancer.common.schema.AbstractTables; |
13 | 15 | import sqlancer.databend.DatabendBugs; |
14 | 16 | import sqlancer.databend.DatabendProvider.DatabendGlobalState; |
15 | 17 | import sqlancer.databend.DatabendSchema.DatabendColumn; |
| 18 | +import sqlancer.databend.DatabendSchema.DatabendCompositeDataType; |
16 | 19 | import sqlancer.databend.DatabendSchema.DatabendDataType; |
17 | 20 | import sqlancer.databend.DatabendSchema.DatabendRowValue; |
| 21 | +import sqlancer.databend.DatabendSchema.DatabendTable; |
| 22 | +import sqlancer.databend.DatabendToStringVisitor; |
18 | 23 | import sqlancer.databend.ast.DatabendAggregateOperation; |
19 | 24 | import sqlancer.databend.ast.DatabendAggregateOperation.DatabendAggregateFunction; |
20 | 25 | import sqlancer.databend.ast.DatabendBetweenOperation; |
|
24 | 29 | import sqlancer.databend.ast.DatabendBinaryComparisonOperation.DatabendBinaryComparisonOperator; |
25 | 30 | import sqlancer.databend.ast.DatabendBinaryLogicalOperation; |
26 | 31 | import sqlancer.databend.ast.DatabendBinaryLogicalOperation.DatabendBinaryLogicalOperator; |
| 32 | +import sqlancer.databend.ast.DatabendCastOperation; |
| 33 | +import sqlancer.databend.ast.DatabendColumnReference; |
27 | 34 | import sqlancer.databend.ast.DatabendColumnValue; |
28 | 35 | import sqlancer.databend.ast.DatabendConstant; |
29 | 36 | import sqlancer.databend.ast.DatabendExpression; |
30 | 37 | import sqlancer.databend.ast.DatabendInOperation; |
| 38 | +import sqlancer.databend.ast.DatabendJoin; |
31 | 39 | import sqlancer.databend.ast.DatabendLikeOperation; |
32 | 40 | import sqlancer.databend.ast.DatabendOrderByTerm; |
| 41 | +import sqlancer.databend.ast.DatabendPostFixText; |
| 42 | +import sqlancer.databend.ast.DatabendSelect; |
| 43 | +import sqlancer.databend.ast.DatabendTableReference; |
33 | 44 | import sqlancer.databend.ast.DatabendUnaryPostfixOperation; |
34 | 45 | import sqlancer.databend.ast.DatabendUnaryPostfixOperation.DatabendUnaryPostfixOperator; |
35 | 46 | import sqlancer.databend.ast.DatabendUnaryPrefixOperation; |
36 | 47 | import sqlancer.databend.ast.DatabendUnaryPrefixOperation.DatabendUnaryPrefixOperator; |
37 | 48 |
|
38 | 49 | public class DatabendNewExpressionGenerator |
39 | | - extends TypedExpressionGenerator<DatabendExpression, DatabendColumn, DatabendDataType> { |
| 50 | + extends TypedExpressionGenerator<DatabendExpression, DatabendColumn, DatabendDataType> |
| 51 | + implements NoRECGenerator<DatabendSelect, DatabendJoin, DatabendExpression, DatabendTable, DatabendColumn> { |
40 | 52 |
|
41 | 53 | private final DatabendGlobalState globalState; |
| 54 | + private List<DatabendTable> tables; |
42 | 55 |
|
43 | 56 | private final int maxDepth; |
44 | 57 | private boolean allowAggregateFunctions; |
@@ -248,7 +261,8 @@ DatabendExpression getLike(int depth, DatabendDataType dataType) { |
248 | 261 | } |
249 | 262 |
|
250 | 263 | public DatabendExpression generateExpressionWithExpectedResult(DatabendDataType type) { |
251 | | - // DatabendNewExpressionGenerator gen = new DatabendNewExpressionGenerator(globalState).setColumns(columns); |
| 264 | + // DatabendNewExpressionGenerator gen = new |
| 265 | + // DatabendNewExpressionGenerator(globalState).setColumns(columns); |
252 | 266 | // gen.setRowValue(rowValue); |
253 | 267 | DatabendExpression expr; |
254 | 268 | do { |
@@ -340,4 +354,71 @@ public DatabendExpression generateHavingClause() { |
340 | 354 | return expression; |
341 | 355 | } |
342 | 356 |
|
| 357 | + @Override |
| 358 | + public NoRECGenerator<DatabendSelect, DatabendJoin, DatabendExpression, DatabendTable, DatabendColumn> setTablesAndColumns( |
| 359 | + AbstractTables<DatabendTable, DatabendColumn> tables) { |
| 360 | + this.columns = tables.getColumns(); |
| 361 | + this.tables = tables.getTables(); |
| 362 | + |
| 363 | + return this; |
| 364 | + } |
| 365 | + |
| 366 | + @Override |
| 367 | + public DatabendExpression generateBooleanExpression() { |
| 368 | + return generateExpression(DatabendDataType.BOOLEAN); |
| 369 | + } |
| 370 | + |
| 371 | + @Override |
| 372 | + public DatabendSelect generateSelect() { |
| 373 | + return new DatabendSelect(); |
| 374 | + } |
| 375 | + |
| 376 | + @Override |
| 377 | + public List<DatabendJoin> getRandomJoinClauses() { |
| 378 | + List<DatabendTableReference> tableList = tables.stream().map(t -> new DatabendTableReference(t)) |
| 379 | + .collect(Collectors.toList()); |
| 380 | + List<DatabendJoin> joins = DatabendJoin.getJoins(tableList, globalState); |
| 381 | + tables = tableList.stream().map(t -> t.getTable()).collect(Collectors.toList()); |
| 382 | + return joins; |
| 383 | + } |
| 384 | + |
| 385 | + @Override |
| 386 | + public List<DatabendExpression> getTableRefs() { |
| 387 | + return tables.stream().map(t -> new DatabendTableReference(t)).collect(Collectors.toList()); |
| 388 | + } |
| 389 | + |
| 390 | + @Override |
| 391 | + public String generateOptimizedQueryString(DatabendSelect select, DatabendExpression whereCondition, |
| 392 | + boolean shouldUseAggregate) { |
| 393 | + if (shouldUseAggregate) { |
| 394 | + DatabendExpression aggr = new DatabendAggregateOperation( |
| 395 | + List.of(new DatabendColumnReference(new DatabendColumn("*", |
| 396 | + new DatabendCompositeDataType(DatabendDataType.INT, 0), false, false))), |
| 397 | + DatabendAggregateFunction.COUNT); |
| 398 | + select.setFetchColumns(List.of(aggr)); |
| 399 | + } else { |
| 400 | + List<DatabendExpression> allColumns = columns.stream().map((c) -> new DatabendColumnReference(c)) |
| 401 | + .collect(Collectors.toList()); |
| 402 | + select.setFetchColumns(allColumns); |
| 403 | + if (Randomly.getBooleanWithSmallProbability()) { |
| 404 | + select.setOrderByClauses(generateOrderBys()); |
| 405 | + } |
| 406 | + } |
| 407 | + select.setWhereClause(whereCondition); |
| 408 | + |
| 409 | + return select.asString(); |
| 410 | + } |
| 411 | + |
| 412 | + @Override |
| 413 | + public String generateUnoptimizedQueryString(DatabendSelect select, DatabendExpression whereCondition) { |
| 414 | + DatabendExpression asText = new DatabendPostFixText(new DatabendCastOperation( |
| 415 | + new DatabendPostFixText(whereCondition, |
| 416 | + " IS NOT NULL AND " + DatabendToStringVisitor.asString(whereCondition)), |
| 417 | + new DatabendCompositeDataType(DatabendDataType.INT, 8)), "as count"); |
| 418 | + select.setFetchColumns(List.of(asText)); |
| 419 | + select.setWhereClause(null); |
| 420 | + |
| 421 | + return "SELECT SUM(count) FROM (" + select.asString() + ") as res"; |
| 422 | + } |
| 423 | + |
343 | 424 | } |
0 commit comments