Skip to content

Commit 40bb455

Browse files
committed
Fix Oracle issues
1 parent 860a204 commit 40bb455

File tree

9 files changed

+154
-26
lines changed

9 files changed

+154
-26
lines changed

gateway-ha/src/main/java/io/trino/gateway/ha/module/RouterBaseModule.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,11 @@ public class RouterBaseModule
3636
public RouterBaseModule(HaGatewayConfiguration configuration)
3737
{
3838
Jdbi jdbi = Jdbi.create(configuration.getDataStore().getJdbcUrl(), configuration.getDataStore().getUser(), configuration.getDataStore().getPassword());
39+
boolean isOracleBackend = configuration.getDataStore().getJdbcUrl().startsWith("jdbc:oracle");
3940
connectionManager = new JdbcConnectionManager(jdbi, configuration.getDataStore());
4041
resourceGroupsManager = new HaResourceGroupsManager(connectionManager);
41-
gatewayBackendManager = new HaGatewayManager(jdbi);
42-
queryHistoryManager = new HaQueryHistoryManager(jdbi, configuration.getDataStore().getJdbcUrl().startsWith("jdbc:oracle"));
42+
gatewayBackendManager = new HaGatewayManager(jdbi, isOracleBackend);
43+
queryHistoryManager = new HaQueryHistoryManager(jdbi, isOracleBackend);
4344
}
4445

4546
@Provides

gateway-ha/src/main/java/io/trino/gateway/ha/persistence/dao/GatewayBackendDao.java

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,60 +13,169 @@
1313
*/
1414
package io.trino.gateway.ha.persistence.dao;
1515

16+
import org.jdbi.v3.core.mapper.RowMapper;
17+
import org.jdbi.v3.core.statement.StatementContext;
1618
import org.jdbi.v3.sqlobject.statement.SqlQuery;
1719
import org.jdbi.v3.sqlobject.statement.SqlUpdate;
20+
import org.jdbi.v3.sqlobject.statement.UseRowMapper;
1821

22+
import java.sql.ResultSet;
23+
import java.sql.ResultSetMetaData;
24+
import java.sql.SQLException;
1925
import java.util.List;
2026

27+
import static java.util.Locale.ENGLISH;
28+
2129
public interface GatewayBackendDao
2230
{
31+
@UseRowMapper(GatewayBackendIntToBooleanMapper.class)
2332
@SqlQuery("SELECT * FROM gateway_backend")
2433
List<GatewayBackend> findAll();
2534

35+
@UseRowMapper(GatewayBackendIntToBooleanMapper.class)
2636
@SqlQuery("""
2737
SELECT * FROM gateway_backend
2838
WHERE active = true
2939
""")
3040
List<GatewayBackend> findActiveBackend();
3141

42+
@UseRowMapper(GatewayBackendIntToBooleanMapper.class)
43+
@SqlQuery("""
44+
SELECT * FROM gateway_backend
45+
WHERE active = 1
46+
""")
47+
List<GatewayBackend> findActiveBackendNoBoolean();
48+
49+
default List<GatewayBackend> findActiveBackend(boolean isSupportsBooleanColumn)
50+
{
51+
if (isSupportsBooleanColumn) {
52+
return findActiveBackend();
53+
}
54+
55+
return findActiveBackendNoBoolean();
56+
}
57+
58+
@UseRowMapper(GatewayBackendIntToBooleanMapper.class)
3259
@SqlQuery("""
3360
SELECT * FROM gateway_backend
3461
WHERE active = true AND routing_group = 'adhoc'
3562
""")
3663
List<GatewayBackend> findActiveAdhocBackend();
3764

65+
@UseRowMapper(GatewayBackendIntToBooleanMapper.class)
66+
@SqlQuery("""
67+
SELECT * FROM gateway_backend
68+
WHERE active = 1 AND routing_group = 'adhoc'
69+
""")
70+
List<GatewayBackend> findActiveAdhocBackendNoBoolean();
71+
72+
default List<GatewayBackend> findActiveAdhocBackend(boolean isSupportsBooleanColumn)
73+
{
74+
if (isSupportsBooleanColumn) {
75+
return findActiveAdhocBackend();
76+
}
77+
78+
return findActiveAdhocBackendNoBoolean();
79+
}
80+
81+
@UseRowMapper(GatewayBackendIntToBooleanMapper.class)
3882
@SqlQuery("""
3983
SELECT * FROM gateway_backend
4084
WHERE active = true AND routing_group = :routingGroup
4185
""")
4286
List<GatewayBackend> findActiveBackendByRoutingGroup(String routingGroup);
4387

88+
@UseRowMapper(GatewayBackendIntToBooleanMapper.class)
89+
@SqlQuery("""
90+
SELECT * FROM gateway_backend
91+
WHERE active = 1 AND routing_group = :routingGroup
92+
""")
93+
List<GatewayBackend> findActiveBackendByRoutingGroupNoBoolean(String routingGroup);
94+
95+
default List<GatewayBackend> findActiveBackendByRoutingGroup(String routingGroup, boolean isSupportsBooleanColumn)
96+
{
97+
if (isSupportsBooleanColumn) {
98+
return findActiveBackendByRoutingGroup(routingGroup);
99+
}
100+
101+
return findActiveBackendByRoutingGroupNoBoolean(routingGroup);
102+
}
103+
104+
@UseRowMapper(GatewayBackendIntToBooleanMapper.class)
44105
@SqlQuery("""
45106
SELECT * FROM gateway_backend
46107
WHERE name = :name
47108
""")
48109
List<GatewayBackend> findByName(String name);
49110

111+
@UseRowMapper(GatewayBackendIntToBooleanMapper.class)
50112
@SqlQuery("""
51113
SELECT * FROM gateway_backend
52114
WHERE name = :name
53115
LIMIT 1
54116
""")
55117
GatewayBackend findFirstByName(String name);
56118

119+
@UseRowMapper(GatewayBackendIntToBooleanMapper.class)
120+
@SqlQuery("""
121+
SELECT * FROM gateway_backend
122+
WHERE name = :name
123+
FETCH FIRST 1 ROWS ONLY
124+
""")
125+
GatewayBackend findFirstByNameWithFetch(String name);
126+
127+
default GatewayBackend findFirstByName(String name, boolean isLimitUnsupported){
128+
if (isLimitUnsupported) {
129+
return findFirstByNameWithFetch(name);
130+
}
131+
132+
return findFirstByName(name);
133+
}
134+
57135
@SqlUpdate("""
58136
INSERT INTO gateway_backend (name, routing_group, backend_url, external_url, active)
59137
VALUES (:name, :routingGroup, :backendUrl, :externalUrl, :active)
60138
""")
61139
void create(String name, String routingGroup, String backendUrl, String externalUrl, boolean active);
62140

141+
@SqlUpdate("""
142+
INSERT INTO gateway_backend (name, routing_group, backend_url, external_url, active)
143+
VALUES (:name, :routingGroup, :backendUrl, :externalUrl, :active)
144+
""")
145+
void createNoBoolean(String name, String routingGroup, String backendUrl, String externalUrl, int active);
146+
147+
default void create(String name, String routingGroup, String backendUrl, String externalUrl, boolean active, boolean isSupportsBooleanColumn)
148+
{
149+
if (isSupportsBooleanColumn) {
150+
create(name, routingGroup, backendUrl, externalUrl, active);
151+
return;
152+
}
153+
createNoBoolean(name, routingGroup, backendUrl, externalUrl, active ? 1 : 0);
154+
}
155+
63156
@SqlUpdate("""
64157
UPDATE gateway_backend
65158
SET routing_group = :routingGroup, backend_url = :backendUrl, external_url = :externalUrl, active = :active
66159
WHERE name = :name
67160
""")
68161
void update(String name, String routingGroup, String backendUrl, String externalUrl, boolean active);
69162

163+
@SqlUpdate("""
164+
UPDATE gateway_backend
165+
SET routing_group = :routingGroup, backend_url = :backendUrl, external_url = :externalUrl, active = :active
166+
WHERE name = :name
167+
""")
168+
void updateNoBoolean(String name, String routingGroup, String backendUrl, String externalUrl, int active);
169+
170+
default void update(String name, String routingGroup, String backendUrl, String externalUrl, boolean active, boolean isSupportsBooleanColumn)
171+
{
172+
if (isSupportsBooleanColumn) {
173+
update(name, routingGroup, backendUrl, externalUrl, active);
174+
return;
175+
}
176+
updateNoBoolean(name, routingGroup, backendUrl, externalUrl, active ? 1 : 0);
177+
}
178+
70179
@SqlUpdate("""
71180
UPDATE gateway_backend
72181
SET active = false
@@ -86,4 +195,28 @@ INSERT INTO gateway_backend (name, routing_group, backend_url, external_url, act
86195
WHERE name = :name
87196
""")
88197
void deleteByName(String name);
198+
199+
class GatewayBackendIntToBooleanMapper
200+
implements RowMapper<GatewayBackend>
201+
{
202+
@Override
203+
public GatewayBackend map(ResultSet resultSet, StatementContext ctx)
204+
throws SQLException
205+
{
206+
boolean active;
207+
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
208+
if (resultSetMetaData.getColumnClassName(5).toLowerCase(ENGLISH).startsWith("int")) {
209+
active = resultSet.getInt(5) != 0;
210+
}
211+
else {
212+
active = resultSet.getBoolean(5);
213+
}
214+
return new GatewayBackend(
215+
resultSet.getString("name"),
216+
resultSet.getString("routing_group"),
217+
resultSet.getString("backend_url"),
218+
resultSet.getString("external_url"),
219+
active);
220+
}
221+
}
89222
}

gateway-ha/src/main/java/io/trino/gateway/ha/router/ForwardingRoutingRulesManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public class ForwardingRoutingRulesManager
4444
.installPlugin(new SqlObjectPlugin())
4545
.registerRowMapper(new RecordAndAnnotatedConstructorMapper());
4646

47-
yield new DbRoutingRulesManager(jdbi.onDemand(RoutingRulesDao.class), !jdbcUrl.startsWith("jdbc:mysql"));
47+
yield new DbRoutingRulesManager(jdbi.onDemand(RoutingRulesDao.class), jdbcUrl.startsWith("jdbc:postgresql"));
4848
}
4949
default -> throw new RuntimeException("No routing manager for " + routingRulesConfig.getRulesType());
5050
};

gateway-ha/src/main/java/io/trino/gateway/ha/router/HaGatewayManager.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,12 @@ public class HaGatewayManager
3232
private static final Logger log = Logger.get(HaGatewayManager.class);
3333

3434
private final GatewayBackendDao dao;
35+
private final boolean isOracleBackend;
3536

36-
public HaGatewayManager(Jdbi jdbi)
37+
public HaGatewayManager(Jdbi jdbi, boolean isOracleBackend)
3738
{
3839
dao = requireNonNull(jdbi, "jdbi is null").onDemand(GatewayBackendDao.class);
40+
this.isOracleBackend = isOracleBackend;
3941
}
4042

4143
@Override
@@ -48,15 +50,15 @@ public List<ProxyBackendConfiguration> getAllBackends()
4850
@Override
4951
public List<ProxyBackendConfiguration> getAllActiveBackends()
5052
{
51-
List<GatewayBackend> proxyBackendList = dao.findActiveBackend();
53+
List<GatewayBackend> proxyBackendList = dao.findActiveBackend(!isOracleBackend);
5254
return upcast(proxyBackendList);
5355
}
5456

5557
@Override
5658
public List<ProxyBackendConfiguration> getActiveAdhocBackends()
5759
{
5860
try {
59-
List<GatewayBackend> proxyBackendList = dao.findActiveAdhocBackend();
61+
List<GatewayBackend> proxyBackendList = dao.findActiveAdhocBackend(!isOracleBackend);
6062
return upcast(proxyBackendList);
6163
}
6264
catch (Exception e) {
@@ -68,7 +70,7 @@ public List<ProxyBackendConfiguration> getActiveAdhocBackends()
6870
@Override
6971
public List<ProxyBackendConfiguration> getActiveBackends(String routingGroup)
7072
{
71-
List<GatewayBackend> proxyBackendList = dao.findActiveBackendByRoutingGroup(routingGroup);
73+
List<GatewayBackend> proxyBackendList = dao.findActiveBackendByRoutingGroup(routingGroup, !isOracleBackend);
7274
return upcast(proxyBackendList);
7375
}
7476

@@ -94,19 +96,19 @@ public void activateBackend(String backendName)
9496
@Override
9597
public ProxyBackendConfiguration addBackend(ProxyBackendConfiguration backend)
9698
{
97-
dao.create(backend.getName(), backend.getRoutingGroup(), backend.getProxyTo(), backend.getExternalUrl(), backend.isActive());
99+
dao.create(backend.getName(), backend.getRoutingGroup(), backend.getProxyTo(), backend.getExternalUrl(), backend.isActive(), !isOracleBackend);
98100
return backend;
99101
}
100102

101103
@Override
102104
public ProxyBackendConfiguration updateBackend(ProxyBackendConfiguration backend)
103105
{
104-
GatewayBackend model = dao.findFirstByName(backend.getName());
106+
GatewayBackend model = dao.findFirstByName(backend.getName(), isOracleBackend);
105107
if (model == null) {
106-
dao.create(backend.getName(), backend.getRoutingGroup(), backend.getProxyTo(), backend.getExternalUrl(), backend.isActive());
108+
dao.create(backend.getName(), backend.getRoutingGroup(), backend.getProxyTo(), backend.getExternalUrl(), backend.isActive(), !isOracleBackend);
107109
}
108110
else {
109-
dao.update(backend.getName(), backend.getRoutingGroup(), backend.getProxyTo(), backend.getExternalUrl(), backend.isActive());
111+
dao.update(backend.getName(), backend.getRoutingGroup(), backend.getProxyTo(), backend.getExternalUrl(), backend.isActive(), !isOracleBackend);
110112
}
111113
return backend;
112114
}

gateway-ha/src/main/resources/mysql/V2__add_routing_rules.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ CREATE TABLE IF NOT EXISTS routing_rules (
22
name varchar(128) primary key,
33
description varchar(256),
44
priority INT,
5-
conditionExpression varchar(256),
6-
actions varchar(256),
5+
conditionExpression varchar(512),
6+
actions varchar(1024),
77
routingRuleEngine varchar(128)
88
)
99

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
1-
-- PL/SQL is used to work around lack of support for create type statements in Flyway
2-
begin
3-
execute immediate 'CREATE TYPE string_array AS VARRAY(100) OF VARCHAR2(512)';
4-
5-
EXECUTE IMMEDIATE q'[ CREATE TABLE routing_rules (
1+
CREATE TABLE routing_rules (
62
name varchar(128),
73
description varchar(512),
84
priority int,
95
conditionExpression varchar(512),
10-
actions string_array,
6+
actions varchar(1024),
117
routingRuleEngine varchar(128),
128
PRIMARY KEY (name)
13-
)]';
14-
end;
9+
);

gateway-ha/src/test/java/io/trino/gateway/ha/persistence/TestDatabaseMigrationsOracle.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,6 @@ protected void dropAllTables()
6161
verifyResultSetCount(sql, 8);
6262
tables.forEach(table -> jdbiHandle.execute("DROP TABLE " + table));
6363
verifyResultSetCount(sql, 0);
64-
verifyResultSetCount("SELECT 1 FROM USER_TYPES", 1);
65-
jdbiHandle.execute("DROP TYPE string_array");
66-
verifyResultSetCount("SELECT 1 FROM USER_TYPES", 0);
6764
jdbiHandle.close();
6865
}
6966

gateway-ha/src/test/java/io/trino/gateway/ha/router/TestHaGatewayManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ final class TestHaGatewayManager
3232
void setUp()
3333
{
3434
JdbcConnectionManager connectionManager = createTestingJdbcConnectionManager();
35-
haGatewayManager = new HaGatewayManager(connectionManager.getJdbi());
35+
haGatewayManager = new HaGatewayManager(connectionManager.getJdbi(), false);
3636
}
3737

3838
@Test

gateway-ha/src/test/java/io/trino/gateway/ha/router/TestStochasticRoutingManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ final class TestStochasticRoutingManager
3535
void setUp()
3636
{
3737
JdbcConnectionManager connectionManager = createTestingJdbcConnectionManager();
38-
backendManager = new HaGatewayManager(connectionManager.getJdbi());
38+
backendManager = new HaGatewayManager(connectionManager.getJdbi(), false);
3939
historyManager = new HaQueryHistoryManager(connectionManager.getJdbi(), false);
4040
haRoutingManager = new StochasticRoutingManager(backendManager, historyManager);
4141
}

0 commit comments

Comments
 (0)