/** * Escapes name to be valid SQL identifier. Currently just replaces '.' and '$' sign with '_'. * * @param name Name. * @param escapeAll Escape flag. * @return Escaped name. */ private static String escapeName(String name, boolean escapeAll) { if (escapeAll) return "\"" + name + "\""; SB sb = null; for (int i = 0; i < name.length(); i++) { char ch = name.charAt(i); if (!Character.isLetter(ch) && !Character.isDigit(ch) && ch != '_' && !(ch == '"' && (i == 0 || i == name.length() - 1)) && ch != '-') { // Class name can also contain '$' or '.' - these should be escaped. assert ch == '$' || ch == '.'; if (sb == null) sb = new SB(); sb.a(name.substring(sb.length(), i)); // Replace illegal chars with '_'. sb.a('_'); } } if (sb == null) return name; sb.a(name.substring(sb.length(), name.length())); return sb.toString(); }
/** * @param node Node. * @param s String builders. * @param level Level. * @param offset Offset. * @return Length. */ private int print(long node, ArrayList<SB> s, int level, int offset) { if (node == 0) return s.get(level - 1).length(); SB sb = s.size() <= level ? null : s.get(level); if (sb == null) { sb = new SB(); s.add(level, sb); } int o = Math.max(print(left(node), s, level + 1, offset), offset); String v = print0(node); while(sb.length() < o) sb.a(' '); sb.a(v); return print(right(node), s, level + 1, o + v.length()); }
if (sb.length() > 0) { String msg;