/
NikolayIvkin
/
sqlancer2
Обзор
Документация
Войти
/
NikolayIvkin
/
sqlancer2
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/sqlancer/clickhouse/ClickHouseToStringVisitor.java
149 строк
4 KB
Manuel Rigger
Introduce a new sqlancer.common package
13 авг 2020, 00:31
13 авг 2020, 00:31
cb1ba25
Код
Авторство
О чём код?
package sqlancer.clickhouse; import sqlancer.clickhouse.ast.ClickHouseAggregate; import sqlancer.clickhouse.ast.ClickHouseBinaryComparisonOperation; import sqlancer.clickhouse.ast.ClickHouseBinaryLogicalOperation; import sqlancer.clickhouse.ast.ClickHouseCastOperation; import sqlancer.clickhouse.ast.ClickHouseColumnReference; import sqlancer.clickhouse.ast.ClickHouseConstant; import sqlancer.clickhouse.ast.ClickHouseExpression; import sqlancer.clickhouse.ast.ClickHouseSelect; import sqlancer.clickhouse.ast.ClickHouseTableReference; import sqlancer.clickhouse.ast.ClickHouseUnaryPostfixOperation; import sqlancer.clickhouse.ast.ClickHouseUnaryPrefixOperation; import sqlancer.common.visitor.ToStringVisitor; public class ClickHouseToStringVisitor extends ToStringVisitor<ClickHouseExpression> implements ClickHouseVisitor { @Override public void visitSpecific(ClickHouseExpression expr) { ClickHouseVisitor.super.visit(expr); } @Override public void visit(ClickHouseBinaryComparisonOperation op) { sb.append("("); visit(op.getLeft()); sb.append(") "); sb.append(op.getOperator().getTextRepresentation()); sb.append(" ("); visit(op.getRight()); sb.append(")"); } @Override public void visit(ClickHouseBinaryLogicalOperation op) { sb.append("("); visit(op.getLeft()); sb.append(") "); sb.append(op.getTextRepresentation()); sb.append(" ("); visit(op.getRight()); sb.append(")"); } @Override public void visit(ClickHouseUnaryPrefixOperation op) { sb.append(op.getOperatorRepresentation()); sb.append(" ("); visit(op.getExpression()); sb.append(")"); } @Override public void visit(ClickHouseUnaryPostfixOperation op) { sb.append("("); visit(op.getExpression()); sb.append(")"); sb.append(" "); sb.append(op.getOperatorRepresentation()); } @Override public void visit(ClickHouseConstant constant) { sb.append(constant.toString()); } @Override public void visit(ClickHouseSelect select, boolean inner) { if (inner) { sb.append("("); } sb.append("SELECT "); switch (select.getFromOptions()) { case DISTINCT: sb.append("DISTINCT "); break; case ALL: sb.append(""); break; default: throw new AssertionError(select.getFromOptions()); } visit(select.getFetchColumns()); sb.append(" FROM "); visit(select.getFromList()); if (select.getWhereClause() != null) { sb.append(" WHERE "); visit(select.getWhereClause()); } if (!select.getGroupByClause().isEmpty()) { sb.append(" GROUP BY "); visit(select.getGroupByClause()); } if (select.getHavingClause() != null) { sb.append(" HAVING "); visit(select.getHavingClause()); } if (!select.getOrderByClause().isEmpty()) { sb.append(" ORDER BY "); visit(select.getOrderByClause()); } if (inner) { sb.append(")"); } } @Override public void visit(ClickHouseTableReference tableReference) { sb.append(tableReference.getTable().getName()); } @Override public void visit(ClickHouseAggregate aggregate) { sb.append(aggregate.getFunc()); sb.append("("); visit(aggregate.getExpr()); sb.append(")"); } @Override public void visit(ClickHouseCastOperation cast) { sb.append("CAST("); visit(cast.getExpression()); sb.append(" AS "); sb.append(cast.getType().toString()); sb.append(")"); } @Override public void visit(ClickHouseExpression.ClickHouseJoin join) { } @Override public void visit(ClickHouseColumnReference c) { if (c.getColumn().getTable() == null) { sb.append(c.getColumn().getName()); } else { sb.append(c.getColumn().getFullQualifiedName()); } } public static String asString(ClickHouseExpression expr) { ClickHouseToStringVisitor visitor = new ClickHouseToStringVisitor(); visitor.visit(expr); return visitor.get(); } }