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. */