Skip to content

Commit bb676e6

Browse files
authored
Merge pull request #2752 from ClickHouse/02/20/26/fix_max_execution_time
[client-v2] Implemented settings max execution time as server setting
2 parents 147a375 + 867ed75 commit bb676e6

File tree

4 files changed

+37
-6
lines changed

4 files changed

+37
-6
lines changed

client-v2/src/main/java/com/clickhouse/client/api/internal/ServerSettings.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ public final class ServerSettings {
3737

3838
public static final String RESULT_OVERFLOW_MODE_BREAK = "break";
3939

40+
/**
41+
* Maximum query execution time in seconds on server. 0 means no limit.
42+
* If query is not finished in this time then server will send an exception.
43+
*/
44+
public static final String MAX_EXECUTION_TIME = "max_execution_time";
45+
4046
public static final String ASYNC_INSERT = "async_insert";
4147

4248
public static final String WAIT_ASYNC_INSERT = "wait_for_async_insert";

client-v2/src/main/java/com/clickhouse/client/api/query/QuerySettings.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,14 @@ public ClickHouseFormat getFormat() {
117117
* If query is not finished in this time then server will send an exception.
118118
*/
119119
public QuerySettings setMaxExecutionTime(Integer maxExecutionTime) {
120-
settings.setOption("max_execution_time", maxExecutionTime);
120+
serverSetting(ServerSettings.MAX_EXECUTION_TIME, String.valueOf(maxExecutionTime));
121121
return this;
122122
}
123123

124124
public Integer getMaxExecutionTime() {
125-
return (Integer) settings.getOption("max_execution_time");
125+
String val = (String) settings.getOption(
126+
ClientConfigProperties.serverSetting(ServerSettings.MAX_EXECUTION_TIME));
127+
return val == null ? null : Integer.valueOf(val);
126128
}
127129

128130
/**

client-v2/src/test/java/com/clickhouse/client/SettingsTests.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.clickhouse.client.api.ClientConfigProperties;
44
import com.clickhouse.client.api.insert.InsertSettings;
5+
import com.clickhouse.client.api.internal.ServerSettings;
56
import com.clickhouse.client.api.query.QuerySettings;
67
import org.testng.Assert;
78
import org.testng.annotations.Test;
@@ -81,8 +82,11 @@ void testQuerySettingsSpecific() throws Exception {
8182

8283
{
8384
final QuerySettings settings = new QuerySettings();
84-
settings.setMaxExecutionTime(10000);
85-
Assert.assertEquals(settings.getMaxExecutionTime(), 10000);
85+
int val = 10000;
86+
settings.setMaxExecutionTime(val);
87+
Assert.assertEquals(settings.getMaxExecutionTime(), val);
88+
Assert.assertEquals(settings.getAllSettings().get(
89+
ClientConfigProperties.serverSetting(ServerSettings.MAX_EXECUTION_TIME)), String.valueOf(val));
8690
}
8791

8892
{

client-v2/src/test/java/com/clickhouse/client/query/QueryTests.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import com.clickhouse.client.ClickHouseServerForTest;
99
import com.clickhouse.client.api.Client;
1010
import com.clickhouse.client.api.ClientException;
11-
import com.clickhouse.client.api.DataTypeUtils;
1211
import com.clickhouse.client.api.ServerException;
1312
import com.clickhouse.client.api.command.CommandSettings;
1413
import com.clickhouse.client.api.data_formats.ClickHouseBinaryFormatReader;
@@ -59,10 +58,10 @@
5958
import java.net.InetAddress;
6059
import java.nio.ByteBuffer;
6160
import java.nio.charset.StandardCharsets;
62-
import java.time.LocalDate;
6361
import java.time.LocalDateTime;
6462
import java.time.ZoneId;
6563
import java.time.ZonedDateTime;
64+
import java.time.temporal.ChronoUnit;
6665
import java.util.ArrayList;
6766
import java.util.Arrays;
6867
import java.util.Collection;
@@ -2151,4 +2150,24 @@ public void testDuplicateColumnNames() throws Exception {
21512150
Assert.assertEquals(record.getString(2), "another name");
21522151
}
21532152
}
2153+
2154+
@Test(groups = {"integration"})
2155+
public void testMaxExecutionTime() throws Exception {
2156+
try (Client localClient = newClient()
2157+
.setSocketTimeout(10, ChronoUnit.SECONDS)
2158+
.build()) {
2159+
2160+
QuerySettings settings = new QuerySettings().setMaxExecutionTime(1);
2161+
2162+
localClient.query("SELECT sleep(2)", settings).get(10, TimeUnit.SECONDS);
2163+
Assert.fail("Expected ServerException due to max_execution_time");
2164+
} catch (ServerException e) {
2165+
Assert.assertEquals(e.getCode(), 159, "Expected TIMEOUT_EXCEEDED error code");
2166+
} catch (ExecutionException e) {
2167+
Assert.assertTrue(e.getCause() instanceof ServerException,
2168+
"Expected cause to be ServerException but was: " + e.getCause().getClass().getName());
2169+
ServerException se = (ServerException) e.getCause();
2170+
Assert.assertEquals(se.getCode(), 159, "Expected TIMEOUT_EXCEEDED error code");
2171+
}
2172+
}
21542173
}

0 commit comments

Comments
 (0)