Skip to content

Commit f33bb3a

Browse files
committed
fix(h2): bind routine details to schema
1 parent b608dff commit f33bb3a

2 files changed

Lines changed: 63 additions & 3 deletions

File tree

‎chat2db-community-server/chat2db-community-plugins/chat2db-community-h2/src/main/java/ai/chat2db/plugin/h2/H2Meta.java‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ private String getDDL(Connection connection, String databaseName, String schemaN
117117
public Function function(Connection connection, @NotEmpty String databaseName, String schemaName,
118118
String functionName) {
119119

120-
String sql = String.format(ROUTINES_SQL, "FUNCTION", getSQLIdentifierProcessor().escapeString(databaseName),
120+
String sql = String.format(ROUTINES_SQL, "FUNCTION", getSQLIdentifierProcessor().escapeString(schemaName),
121121
getSQLIdentifierProcessor().escapeString(functionName));
122122
return DefaultSQLExecutor.getInstance().execute(connection, sql, resultSet -> {
123123
Function function = new Function();
@@ -159,7 +159,7 @@ public List<Trigger> triggers(Connection connection, String databaseName, String
159159
public Trigger trigger(Connection connection, @NotEmpty String databaseName, String schemaName,
160160
String triggerName) {
161161

162-
String sql = String.format(TRIGGER_SQL, getSQLIdentifierProcessor().escapeString(databaseName),
162+
String sql = String.format(TRIGGER_SQL, getSQLIdentifierProcessor().escapeString(schemaName),
163163
getSQLIdentifierProcessor().escapeString(triggerName));
164164
return DefaultSQLExecutor.getInstance().execute(connection, sql, resultSet -> {
165165
Trigger trigger = new Trigger();
@@ -176,7 +176,7 @@ public Trigger trigger(Connection connection, @NotEmpty String databaseName, Str
176176
@Override
177177
public Procedure procedure(Connection connection, @NotEmpty String databaseName, String schemaName,
178178
String procedureName) {
179-
String sql = String.format(ROUTINES_SQL, "PROCEDURE", getSQLIdentifierProcessor().escapeString(databaseName),
179+
String sql = String.format(ROUTINES_SQL, "PROCEDURE", getSQLIdentifierProcessor().escapeString(schemaName),
180180
getSQLIdentifierProcessor().escapeString(procedureName));
181181
return DefaultSQLExecutor.getInstance().execute(connection, sql, resultSet -> {
182182
Procedure procedure = new Procedure();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package ai.chat2db.plugin.h2;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import java.lang.reflect.Proxy;
6+
import java.sql.Connection;
7+
import java.sql.PreparedStatement;
8+
import java.sql.ResultSet;
9+
import java.util.ArrayList;
10+
import java.util.List;
11+
12+
import static org.junit.jupiter.api.Assertions.assertTrue;
13+
14+
class H2MetaSchemaBindingTest {
15+
16+
@Test
17+
void routineAndTriggerDetailsFilterBySchemaInsteadOfCatalog() {
18+
List<String> sql = new ArrayList<>();
19+
Connection connection = connection(sql);
20+
H2Meta metaData = new H2Meta();
21+
22+
metaData.function(connection, "CATALOG", "APP", "F1");
23+
metaData.procedure(connection, "CATALOG", "APP", "P1");
24+
metaData.trigger(connection, "CATALOG", "APP", "T1");
25+
26+
assertTrue(sql.get(0).contains("ROUTINE_SCHEMA ='APP'"), sql.get(0));
27+
assertTrue(sql.get(1).contains("ROUTINE_SCHEMA ='APP'"), sql.get(1));
28+
assertTrue(sql.get(2).contains("TRIGGER_SCHEMA = 'APP'"), sql.get(2));
29+
}
30+
31+
private static Connection connection(List<String> sql) {
32+
ResultSet resultSet = (ResultSet) Proxy.newProxyInstance(
33+
H2MetaSchemaBindingTest.class.getClassLoader(),
34+
new Class<?>[]{ResultSet.class},
35+
(proxy, method, args) -> switch (method.getName()) {
36+
case "next" -> false;
37+
case "close" -> null;
38+
default -> throw new AssertionError("Unexpected ResultSet call: " + method.getName());
39+
});
40+
return (Connection) Proxy.newProxyInstance(
41+
H2MetaSchemaBindingTest.class.getClassLoader(),
42+
new Class<?>[]{Connection.class},
43+
(proxy, method, args) -> {
44+
if (!"prepareStatement".equals(method.getName())) {
45+
throw new AssertionError("Unexpected Connection call: " + method.getName());
46+
}
47+
sql.add((String) args[0]);
48+
return Proxy.newProxyInstance(
49+
H2MetaSchemaBindingTest.class.getClassLoader(),
50+
new Class<?>[]{PreparedStatement.class},
51+
(statement, statementMethod, statementArgs) -> switch (statementMethod.getName()) {
52+
case "execute" -> true;
53+
case "getResultSet" -> resultSet;
54+
case "close" -> null;
55+
default -> throw new AssertionError(
56+
"Unexpected PreparedStatement call: " + statementMethod.getName());
57+
});
58+
});
59+
}
60+
}

0 commit comments

Comments
 (0)