Skip to content

Commit bdb3d8a

Browse files
authored
feat(jdbc): implement PreparedStatement getParameterType and getParameterTypeName
1 parent d0adb0f commit bdb3d8a

File tree

3 files changed

+49
-4
lines changed

3 files changed

+49
-4
lines changed

src/main/java/org/sqlite/core/CoreStatement.java

+6
Original file line numberDiff line numberDiff line change
@@ -140,4 +140,10 @@ protected void notifyFirstStatementExecuted() {
140140
}
141141

142142
public abstract ResultSet executeQuery(String sql, boolean closeStmt) throws SQLException;
143+
144+
protected void checkIndex(int index) throws SQLException {
145+
if (index < 1 || index > batch.length) {
146+
throw new SQLException("Parameter index is invalid");
147+
}
148+
}
143149
}

src/main/java/org/sqlite/jdbc3/JDBC3PreparedStatement.java

+21-4
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.sql.Blob;
1111
import java.sql.Clob;
1212
import java.sql.Date;
13+
import java.sql.JDBCType;
1314
import java.sql.ParameterMetaData;
1415
import java.sql.Ref;
1516
import java.sql.ResultSet;
@@ -154,13 +155,29 @@ public String getParameterClassName(int param) throws SQLException {
154155
}
155156

156157
/** @see java.sql.ParameterMetaData#getParameterTypeName(int) */
157-
public String getParameterTypeName(int pos) {
158-
return "VARCHAR";
158+
public String getParameterTypeName(int pos) throws SQLException {
159+
checkIndex(pos);
160+
return JDBCType.valueOf(getParameterType(pos)).getName();
159161
}
160162

161163
/** @see java.sql.ParameterMetaData#getParameterType(int) */
162-
public int getParameterType(int pos) {
163-
return Types.VARCHAR;
164+
public int getParameterType(int pos) throws SQLException {
165+
checkIndex(pos);
166+
Object paramValue = batch[pos - 1];
167+
168+
if (paramValue == null) {
169+
return Types.NULL;
170+
} else if (paramValue instanceof Integer
171+
|| paramValue instanceof Short
172+
|| paramValue instanceof Boolean) {
173+
return Types.INTEGER;
174+
} else if (paramValue instanceof Long) {
175+
return Types.BIGINT;
176+
} else if (paramValue instanceof Double || paramValue instanceof Float) {
177+
return Types.REAL;
178+
} else {
179+
return Types.VARCHAR;
180+
}
164181
}
165182

166183
/** @see java.sql.ParameterMetaData#getParameterMode(int) */

src/test/java/org/sqlite/PrepStmtTest.java

+22
Original file line numberDiff line numberDiff line change
@@ -777,4 +777,26 @@ public void gh811_getMetadata_before_execution() throws SQLException {
777777
assertThat(meta.getColumnClassName(1)).isEqualTo("java.lang.Object");
778778
}
779779
}
780+
781+
@Test
782+
public void getParameterTypeTest() throws SQLException {
783+
stat.executeUpdate("create table t_int(i INT)");
784+
785+
try (PreparedStatement ps = conn.prepareStatement("INSERT INTO t_int VALUES(?)")) {
786+
ps.setLong(1, 100);
787+
assertThat(ps.getParameterMetaData().getParameterType(1)).isEqualTo(Types.BIGINT);
788+
assertThat(ps.getParameterMetaData().getParameterTypeName(1)).isEqualTo("BIGINT");
789+
}
790+
791+
stat.executeUpdate("create table t_real(a REAL, b REAL)");
792+
793+
try (PreparedStatement ps = conn.prepareStatement("INSERT INTO t_real VALUES(?, ?)")) {
794+
ps.setDouble(1, 100.0);
795+
ps.setFloat(2, 100.0f);
796+
assertThat(ps.getParameterMetaData().getParameterType(1)).isEqualTo(Types.REAL);
797+
assertThat(ps.getParameterMetaData().getParameterTypeName(1)).isEqualTo("REAL");
798+
assertThat(ps.getParameterMetaData().getParameterType(2)).isEqualTo(Types.REAL);
799+
assertThat(ps.getParameterMetaData().getParameterTypeName(2)).isEqualTo("REAL");
800+
}
801+
}
780802
}

0 commit comments

Comments
 (0)