### Question:
SQLSerializer extends SerializerBase<SQLSerializer> { @Override public Void visit(ParamExpression<?> param, Void context) { append("?"); constants.add(param); if (constantPaths.size() < constants.size()) { constantPaths.add(null); } return null; } SQLSerializer(Configuration conf);  SQLSerializer(Configuration conf, boolean dml); List<Object> getConstants(); List<Path<?>> getConstantPaths(); void handle(String template, Object... args); final SQLSerializer handleSelect(final String sep, final List<? extends Expression<?>> expressions); void serialize(QueryMetadata metadata, boolean forCountRow); void serializeDelete(QueryMetadata metadata, RelationalPath<?> entity); void serializeMerge(QueryMetadata metadata, RelationalPath<?> entity, List<Path<?>> keys,
            List<Path<?>> columns, List<Expression<?>> values, @Nullable SubQueryExpression<?> subQuery); void serializeInsert(QueryMetadata metadata, RelationalPath<?> entity, List<Path<?>> columns,
            List<Expression<?>> values, @Nullable SubQueryExpression<?> subQuery); void serializeInsert(QueryMetadata metadata, RelationalPath<?> entity, List<SQLInsertBatch> batches); void serializeUpdate(QueryMetadata metadata, RelationalPath<?> entity,
            Map<Path<?>, Expression<?>> updates); void serializeUnion(Expression<?> union, QueryMetadata metadata, boolean unionAll); @SuppressWarnings("unchecked") @Override void visitConstant(Object constant); @Override Void visit(ParamExpression<?> param, Void context); @Override Void visit(Path<?> path, Void context); @Override Void visit(SubQueryExpression<?> query, Void context); @Override Void visit(TemplateExpression<?> expr, Void context); void setUseLiterals(boolean useLiterals);  }### Answer:
@Test public void select_normalization() { SQLSerializer serializer = new SQLSerializer(Configuration.DEFAULT); serializer.visit(select( Expressions.stringPath("id"), Expressions.stringPath("ID")), null); assertEquals("(select id, ID as col__ID1\n" + "from dual)", serializer.toString()); }