@Override protected Void visitExecute(Execute node, Integer indent) { append(indent, "EXECUTE "); builder.append(node.getName()); List<Expression> parameters = node.getParameters(); if (!parameters.isEmpty()) { builder.append(" USING "); Joiner.on(", ").appendTo(builder, parameters); } return null; }
@Override protected Void visitAddColumn(AddColumn node, Integer indent) { builder.append("ALTER TABLE ") .append(node.getName()) .append(" ADD COLUMN ") .append(formatColumnDefinition(node.getColumn())); return null; }
builder.append("IF NOT EXISTS "); String tableName = formatName(node.getName()); builder.append(tableName).append(" (\n"); String elementIndent = indentString(indent + 1); String columnList = node.getElements().stream() .map(element -> { if (element instanceof ColumnDefinition) { ColumnDefinition column = (ColumnDefinition) element; return elementIndent + formatColumnDefinition(column); StringBuilder builder = new StringBuilder(elementIndent); builder.append("LIKE ") .append(formatName(likeClause.getTableName())); if (likeClause.getPropertiesOption().isPresent()) { builder.append(" ") builder.append(formatPropertiesMultiLine(node.getProperties()));
builder.append("IF NOT EXISTS "); String tableName = formatName(node.getName()); builder.append(tableName).append(" (\n"); String elementIndent = indentString(indent + 1); String columnList = node.getElements().stream() .map(element -> { if (element instanceof ColumnDefinition) { ColumnDefinition column = (ColumnDefinition) element; return elementIndent + formatColumnDefinition(column); StringBuilder builder = new StringBuilder(elementIndent); builder.append("LIKE ") .append(formatName(likeClause.getTableName())); if (likeClause.getPropertiesOption().isPresent()) { builder.append(" ") builder.append(formatPropertiesMultiLine(node.getProperties()));
@Override protected Void visitExplain(Explain node, Integer indent) { builder.append("EXPLAIN "); if (node.isAnalyze()) { builder.append("ANALYZE "); } List<String> options = new ArrayList<>(); for (ExplainOption option : node.getOptions()) { if (option instanceof ExplainType) { options.add("TYPE " + ((ExplainType) option).getType()); } else if (option instanceof ExplainFormat) { options.add("FORMAT " + ((ExplainFormat) option).getType()); } else { throw new UnsupportedOperationException("unhandled explain option: " + option); } } if (!options.isEmpty()) { builder.append("("); Joiner.on(", ").appendTo(builder, options); builder.append(")"); } builder.append("\n"); process(node.getStatement(), indent); return null; }
append(indent, "WITH"); if (with.isRecursive()) { builder.append(" RECURSIVE"); while (queries.hasNext()) { WithQuery query = queries.next(); append(indent, formatExpression(query.getName(), parameters)); query.getColumnNames().ifPresent(columnNames -> appendAliasColumns(builder, columnNames)); builder.append(" AS "); process(new TableSubquery(query.getQuery()), indent); builder.append('\n'); if (queries.hasNext()) { processRelation(node.getQueryBody(), indent); process(node.getOrderBy().get(), indent);
append(indent, "WITH"); if (with.isRecursive()) { builder.append(" RECURSIVE"); while (queries.hasNext()) { WithQuery query = queries.next(); append(indent, formatExpression(query.getName(), parameters)); query.getColumnNames().ifPresent(columnNames -> appendAliasColumns(builder, columnNames)); builder.append(" AS "); process(new TableSubquery(query.getQuery()), indent); builder.append('\n'); if (queries.hasNext()) { processRelation(node.getQueryBody(), indent); process(node.getOrderBy().get(), indent);
@Override protected Void visitExplain(Explain node, Integer indent) { builder.append("EXPLAIN "); if (node.isAnalyze()) { builder.append("ANALYZE "); } List<String> options = new ArrayList<>(); for (ExplainOption option : node.getOptions()) { if (option instanceof ExplainType) { options.add("TYPE " + ((ExplainType) option).getType()); } else if (option instanceof ExplainFormat) { options.add("FORMAT " + ((ExplainFormat) option).getType()); } else { throw new UnsupportedOperationException("unhandled explain option: " + option); } } if (!options.isEmpty()) { builder.append("("); Joiner.on(", ").appendTo(builder, options); builder.append(")"); } builder.append("\n"); process(node.getStatement(), indent); return null; }
@Override protected Void visitSelect(Select node, Integer indent) { append(indent, "SELECT"); if (node.isDistinct()) { builder.append(" DISTINCT"); } if (node.getSelectItems().size() > 1) { boolean first = true; for (SelectItem item : node.getSelectItems()) { builder.append("\n") .append(indentString(indent)) .append(first ? " " : ", "); process(item, indent); first = false; } } else { builder.append(' '); process(getOnlyElement(node.getSelectItems()), indent); } builder.append('\n'); return null; }
@Override protected Void visitSelect(Select node, Integer indent) { append(indent, "SELECT"); if (node.isDistinct()) { builder.append(" DISTINCT"); } if (node.getSelectItems().size() > 1) { boolean first = true; for (SelectItem item : node.getSelectItems()) { builder.append("\n") .append(indentString(indent)) .append(first ? " " : ", "); process(item, indent); first = false; } } else { builder.append(' '); process(getOnlyElement(node.getSelectItems()), indent); } builder.append('\n'); return null; }
@Override public Void visitRevoke(Revoke node, Integer indent) { builder.append("REVOKE "); if (node.isGrantOptionFor()) { builder.append("GRANT OPTION FOR "); } if (node.getPrivileges().isPresent()) { builder.append(node.getPrivileges().get().stream() .collect(joining(", "))); } else { builder.append("ALL PRIVILEGES"); } builder.append(" ON "); if (node.isTable()) { builder.append("TABLE "); } builder.append(node.getTableName()) .append(" FROM ") .append(formatPrincipal(node.getGrantee())); return null; }
@Override public Void visitGrant(Grant node, Integer indent) { builder.append("GRANT "); if (node.getPrivileges().isPresent()) { builder.append(node.getPrivileges().get().stream() .collect(joining(", "))); } else { builder.append("ALL PRIVILEGES"); } builder.append(" ON "); if (node.isTable()) { builder.append("TABLE "); } builder.append(node.getTableName()) .append(" TO ") .append(formatPrincipal(node.getGrantee())); if (node.isWithGrantOption()) { builder.append(" WITH GRANT OPTION"); } return null; }
@Override public Void visitRevoke(Revoke node, Integer indent) { builder.append("REVOKE "); if (node.isGrantOptionFor()) { builder.append("GRANT OPTION FOR "); } if (node.getPrivileges().isPresent()) { builder.append(node.getPrivileges().get().stream() .collect(joining(", "))); } else { builder.append("ALL PRIVILEGES"); } builder.append(" ON "); if (node.isTable()) { builder.append("TABLE "); } builder.append(node.getTableName()) .append(" FROM ") .append(formatPrincipal(node.getGrantee())); return null; }
@Override protected Void visitCreateTableAsSelect(CreateTableAsSelect node, Integer indent) { builder.append("CREATE TABLE "); if (node.isNotExists()) { builder.append("IF NOT EXISTS "); } builder.append(formatName(node.getName())); if (node.getColumnAliases().isPresent()) { String columnList = node.getColumnAliases().get().stream().map(element -> formatExpression(element, parameters)).collect(joining(", ")); builder.append(format("( %s )", columnList)); } if (node.getComment().isPresent()) { builder.append("\nCOMMENT " + formatStringLiteral(node.getComment().get())); } builder.append(formatPropertiesMultiLine(node.getProperties())); builder.append(" AS "); process(node.getQuery(), indent); if (!node.isWithData()) { builder.append(" WITH NO DATA"); } return null; }
@Override public Void visitGrant(Grant node, Integer indent) { builder.append("GRANT "); if (node.getPrivileges().isPresent()) { builder.append(node.getPrivileges().get().stream() .collect(joining(", "))); } else { builder.append("ALL PRIVILEGES"); } builder.append(" ON "); if (node.isTable()) { builder.append("TABLE "); } builder.append(node.getTableName()) .append(" TO ") .append(formatPrincipal(node.getGrantee())); if (node.isWithGrantOption()) { builder.append(" WITH GRANT OPTION"); } return null; }