diff --git a/core/src/main/java/org/apache/calcite/rex/RexLiteral.java b/core/src/main/java/org/apache/calcite/rex/RexLiteral.java index a51480691297..95f0d19f6673 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexLiteral.java +++ b/core/src/main/java/org/apache/calcite/rex/RexLiteral.java @@ -663,7 +663,7 @@ private static void appendAsJava(@Nullable Comparable value, StringBuilder sb, (nlsString.getCharsetName() != null) && !nlsString.getCharsetName().equals( CalciteSystemProperty.DEFAULT_CHARSET.value()); - sb.append(nlsString.asSql(includeCharset, false)); + nlsString.asSql(sb, includeCharset, false); } break; case BOOLEAN: diff --git a/core/src/main/java/org/apache/calcite/util/NlsString.java b/core/src/main/java/org/apache/calcite/util/NlsString.java index b00041186476..dfec20a0546d 100644 --- a/core/src/main/java/org/apache/calcite/util/NlsString.java +++ b/core/src/main/java/org/apache/calcite/util/NlsString.java @@ -315,6 +315,12 @@ public String asSql(boolean prefix, boolean suffix) { return asSql(prefix, suffix, AnsiSqlDialect.DEFAULT); } + /** As {@link #asSql(StringBuilder, boolean, boolean, SqlDialect)} but with + * SQL standard dialect. */ + public void asSql(StringBuilder buf, boolean prefix, boolean suffix) { + asSql(buf, prefix, suffix, AnsiSqlDialect.DEFAULT); + } + /** * Returns the string quoted for SQL, for example _ISO-8859-1'is it a * plane? no it''s superman!'. @@ -329,16 +335,32 @@ public String asSql( boolean suffix, SqlDialect dialect) { StringBuilder ret = new StringBuilder(); - dialect.quoteStringLiteral(ret, prefix ? charsetName : null, getValue()); + asSql(ret, prefix, suffix, dialect); + return ret.toString(); + } + + /** + * Appends this string quoted for SQL. + * + * @param buf Buffer to append to + * @param prefix if true, prefix the character set name + * @param suffix if true, suffix the collation clause + * @param dialect Dialect + */ + public void asSql( + StringBuilder buf, + boolean prefix, + boolean suffix, + SqlDialect dialect) { + dialect.quoteStringLiteral(buf, prefix ? charsetName : null, getValue()); // NOTE jvs 3-Feb-2005: see FRG-78 for why this should go away if (false) { if (suffix && (null != collation)) { - ret.append(" "); - ret.append(collation.toString()); + buf.append(" "); + buf.append(collation.toString()); } } - return ret.toString(); } /** diff --git a/core/src/test/java/org/apache/calcite/util/UtilTest.java b/core/src/test/java/org/apache/calcite/util/UtilTest.java index c7cf33a66c0a..5cd1a4d6ab8a 100644 --- a/core/src/test/java/org/apache/calcite/util/UtilTest.java +++ b/core/src/test/java/org/apache/calcite/util/UtilTest.java @@ -3002,6 +3002,13 @@ private void checkNameMultimap(String s, NameMultimap map) { assertThat(s2, hasToString(s.toString())); } + @Test void testNlsStringAsSqlStringBuilder() { + final NlsString s = new NlsString("isn't", "LATIN1", SqlCollation.IMPLICIT); + final StringBuilder buf = new StringBuilder("literal: "); + s.asSql(buf, true, false); + assertThat(buf, hasToString("literal: _LATIN1'isn''t'")); + } + /** Tests that {@link NlsString#compareTo} is consistent with * {@link NlsString#equals}: {@code x.compareTo(y) == 0} iff * {@code x.equals(y)} for values that differ in charset or collation. */