diff --git a/plugin/trino-elasticsearch/src/main/java/io/trino/plugin/elasticsearch/client/ElasticsearchClient.java b/plugin/trino-elasticsearch/src/main/java/io/trino/plugin/elasticsearch/client/ElasticsearchClient.java index c6e4e6bd877d..1f81f6a40129 100644 --- a/plugin/trino-elasticsearch/src/main/java/io/trino/plugin/elasticsearch/client/ElasticsearchClient.java +++ b/plugin/trino-elasticsearch/src/main/java/io/trino/plugin/elasticsearch/client/ElasticsearchClient.java @@ -666,7 +666,7 @@ public long count(String index, int shard, QueryBuilder query) "GET", format("/%s/_count?preference=_shards:%s", index, shard), ImmutableMap.of(), - new StringEntity(sourceBuilder.toString()), + new StringEntity(sourceBuilder.toString(), UTF_8), new BasicHeader("Content-Type", "application/json")); } catch (ResponseException e) { diff --git a/plugin/trino-elasticsearch/src/test/java/io/trino/plugin/elasticsearch/BaseElasticsearchConnectorTest.java b/plugin/trino-elasticsearch/src/test/java/io/trino/plugin/elasticsearch/BaseElasticsearchConnectorTest.java index 72a0d5319cc3..0ff5bd35bbf9 100644 --- a/plugin/trino-elasticsearch/src/test/java/io/trino/plugin/elasticsearch/BaseElasticsearchConnectorTest.java +++ b/plugin/trino-elasticsearch/src/test/java/io/trino/plugin/elasticsearch/BaseElasticsearchConnectorTest.java @@ -1536,6 +1536,38 @@ public void testFilters() assertQuery("SELECT count(*) FROM filter_pushdown WHERE ipv6_column = IPADDRESS '2001:db8::1:0:0:1'", "VALUES 1"); } + @Test + public void testFiltersCharset() + throws IOException + { + String indexName = "filter_charset_pushdown"; + + @Language("JSON") + String mappings = """ + { + "properties": { + "keyword_column": { "type": "keyword" }, + "text_column": { "type": "text" } + } + } + """; + + createIndex(indexName, mappings); + + index(indexName, ImmutableMap.builder() + .put("keyword_column", "Türkiye") + .put("text_column", "Türkiye") + .buildOrThrow()); + + assertQuery("SELECT count(*) FROM filter_charset_pushdown WHERE keyword_column = 'Türkiye'", "VALUES 1"); + assertQuery("SELECT count(*) FROM filter_charset_pushdown WHERE keyword_column = 'bar'", "VALUES 0"); + assertQuery("SELECT count(*) FROM filter_charset_pushdown WHERE text_column = 'Türkiye'", "VALUES 1"); + assertQuery("SELECT count(*) FROM filter_charset_pushdown WHERE text_column = 'some'", "VALUES 0"); + + assertQuery("SELECT keyword_column FROM filter_charset_pushdown WHERE keyword_column = 'Türkiye'", "VALUES ('Türkiye')"); + assertQuery("SELECT text_column FROM filter_charset_pushdown WHERE text_column = 'Türkiye'", "VALUES ('Türkiye')"); + } + @Test public void testLimitPushdown() throws IOException diff --git a/plugin/trino-opensearch/src/main/java/io/trino/plugin/opensearch/client/OpenSearchClient.java b/plugin/trino-opensearch/src/main/java/io/trino/plugin/opensearch/client/OpenSearchClient.java index 45d86be2f50c..bdd187673230 100644 --- a/plugin/trino-opensearch/src/main/java/io/trino/plugin/opensearch/client/OpenSearchClient.java +++ b/plugin/trino-opensearch/src/main/java/io/trino/plugin/opensearch/client/OpenSearchClient.java @@ -667,7 +667,7 @@ public long count(String index, int shard, QueryBuilder query) "GET", format("/%s/_count?preference=_shards:%s", index, shard), ImmutableMap.of(), - new StringEntity(sourceBuilder.toString()), + new StringEntity(sourceBuilder.toString(), UTF_8), new BasicHeader("Content-Type", "application/json")); } catch (ResponseException e) { diff --git a/plugin/trino-opensearch/src/test/java/io/trino/plugin/opensearch/BaseOpenSearchConnectorTest.java b/plugin/trino-opensearch/src/test/java/io/trino/plugin/opensearch/BaseOpenSearchConnectorTest.java index 25dc5fcfe106..bb8b95679d07 100644 --- a/plugin/trino-opensearch/src/test/java/io/trino/plugin/opensearch/BaseOpenSearchConnectorTest.java +++ b/plugin/trino-opensearch/src/test/java/io/trino/plugin/opensearch/BaseOpenSearchConnectorTest.java @@ -1583,6 +1583,38 @@ public void testFilters() assertQuery("SELECT count(*) FROM filter_pushdown WHERE ipv6_column = IPADDRESS '2001:db8::1:0:0:1'", "VALUES 1"); } + @Test + public void testFiltersCharset() + throws IOException + { + String indexName = "filter_charset_pushdown"; + + @Language("JSON") + String mappings = """ + { + "properties": { + "keyword_column": { "type": "keyword" }, + "text_column": { "type": "text" } + } + } + """; + + createIndex(indexName, mappings); + + index(indexName, ImmutableMap.builder() + .put("keyword_column", "Türkiye") + .put("text_column", "Türkiye") + .buildOrThrow()); + + assertQuery("SELECT count(*) FROM filter_charset_pushdown WHERE keyword_column = 'Türkiye'", "VALUES 1"); + assertQuery("SELECT count(*) FROM filter_charset_pushdown WHERE keyword_column = 'bar'", "VALUES 0"); + assertQuery("SELECT count(*) FROM filter_charset_pushdown WHERE text_column = 'Türkiye'", "VALUES 1"); + assertQuery("SELECT count(*) FROM filter_charset_pushdown WHERE text_column = 'some'", "VALUES 0"); + + assertQuery("SELECT keyword_column FROM filter_charset_pushdown WHERE keyword_column = 'Türkiye'", "VALUES ('Türkiye')"); + assertQuery("SELECT text_column FROM filter_charset_pushdown WHERE text_column = 'Türkiye'", "VALUES ('Türkiye')"); + } + @Test public void testLimitPushdown() throws IOException