diff --git a/plugin/trino-bigquery/src/main/java/io/trino/plugin/bigquery/BigQueryType.java b/plugin/trino-bigquery/src/main/java/io/trino/plugin/bigquery/BigQueryType.java index 157ef6ab2b4c..1838da94c5b2 100644 --- a/plugin/trino-bigquery/src/main/java/io/trino/plugin/bigquery/BigQueryType.java +++ b/plugin/trino-bigquery/src/main/java/io/trino/plugin/bigquery/BigQueryType.java @@ -176,8 +176,8 @@ private static OptionalToStringConverter unsupportedToStringConverter() @VisibleForTesting public static String dateToStringConverter(Object value) { - LocalDate date = LocalDate.ofEpochDay(((Long) value).longValue()); - return quote(date.toString()); + LocalDate date = LocalDate.ofEpochDay((long) value); + return "'" + date + "'"; } private static String datetimeToStringConverter(Object value) @@ -223,8 +223,10 @@ private static ZonedDateTime toZonedDateTime(long epochSeconds, long nanoAdjustm static String stringToStringConverter(Object value) { Slice slice = (Slice) value; - // TODO (https://github.com/trinodb/trino/issues/7900) Add support for all String and Bytes literals - return quote(slice.toStringUtf8().replace("'", "\\'")); + return "'%s'".formatted(slice.toStringUtf8() + .replace("\\", "\\\\") + .replace("\n", "\\n") + .replace("'", "\\'")); } static String numericToStringConverter(Object value) @@ -314,11 +316,6 @@ private static StandardSQLTypeName toStandardSqlTypeName(Type type) throw new TrinoException(NOT_SUPPORTED, "Unsupported column type: " + type.getDisplayName()); } - private static String quote(String value) - { - return "'" + value + "'"; - } - public Optional convertToString(Type type, Object value) { if (type instanceof ArrayType) { diff --git a/testing/trino-testing/src/main/java/io/trino/testing/BaseConnectorTest.java b/testing/trino-testing/src/main/java/io/trino/testing/BaseConnectorTest.java index f4a9aead9ffc..2eec3bad2564 100644 --- a/testing/trino-testing/src/main/java/io/trino/testing/BaseConnectorTest.java +++ b/testing/trino-testing/src/main/java/io/trino/testing/BaseConnectorTest.java @@ -4156,7 +4156,9 @@ private List testDataMappingSmokeTestData() .add(new DataMappingTestSetup("char(3)", "'ab'", "'zzz'")) .add(new DataMappingTestSetup("varchar(3)", "'de'", "'zzz'")) .add(new DataMappingTestSetup("varchar", "'łąka for the win'", "'ŻŻŻŻŻŻŻŻŻŻ'")) - .add(new DataMappingTestSetup("varchar", "'a \\backslash'", "'a a'")) // `a` sorts after `\` + .add(new DataMappingTestSetup("varchar", "'a \\backslash'", "'a a'")) // `a` sorts after `\`; \b may be interpreted as an escape sequence + .add(new DataMappingTestSetup("varchar", "'end backslash \\'", "'end backslash a'")) // `a` sorts after `\`; final \ before end quote may confuse a parser + .add(new DataMappingTestSetup("varchar", "U&'a \\000a newline'", "'a a'")) // `a` sorts after `\n`; newlines can require special handling in a remote system's language .add(new DataMappingTestSetup("varbinary", "X'12ab3f'", "X'ffffffffffffffffffff'")) .build(); } @@ -4877,8 +4879,9 @@ public DataMappingTestSetup asUnsupported() @Override public String toString() { - // toString is brief because it's used for test case labels in IDE - return trinoTypeName + (unsupportedType ? "!" : ""); + // Used for test case labels in IDE + return trinoTypeName + (unsupportedType ? "!" : "") + + ":" + sampleValueLiteral.replaceAll("[^a-zA-Z0-9_-]", ""); } } }