@@ -269,9 +269,9 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
269
269
J_DuckResultSetMeta = (jclass)env->NewGlobalRef (tmpLocalRef);
270
270
env->DeleteLocalRef (tmpLocalRef);
271
271
272
- J_DuckResultSetMeta_init =
273
- env-> GetMethodID (J_DuckResultSetMeta, " <init> " ,
274
- " (II[Ljava/ lang/String;[Ljava/lang/String;[Ljava/lang/String; Ljava/lang/String;)V" );
272
+ J_DuckResultSetMeta_init = env-> GetMethodID (J_DuckResultSetMeta, " <init> " ,
273
+ " (II[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;Ljava/ "
274
+ " lang/String;[Ljava/lang/String;[Ljava/lang/String;)V" );
275
275
276
276
tmpLocalRef = env->FindClass (" org/duckdb/DuckDBVector" );
277
277
J_DuckVector = (jclass)env->NewGlobalRef (tmpLocalRef);
@@ -782,7 +782,8 @@ static std::string type_to_jduckdb_type(LogicalType logical_type) {
782
782
}
783
783
784
784
static jobject build_meta (JNIEnv *env, size_t column_count, size_t n_param, const duckdb::vector<string> &names,
785
- const duckdb::vector<LogicalType> &types, StatementProperties properties) {
785
+ const duckdb::vector<LogicalType> &types, StatementProperties properties,
786
+ const duckdb::vector<LogicalType> ¶m_types) {
786
787
auto name_array = env->NewObjectArray (column_count, J_String, nullptr );
787
788
auto type_array = env->NewObjectArray (column_count, J_String, nullptr );
788
789
auto type_detail_array = env->NewObjectArray (column_count, J_String, nullptr );
@@ -802,10 +803,26 @@ static jobject build_meta(JNIEnv *env, size_t column_count, size_t n_param, cons
802
803
env->NewStringUTF (type_to_jduckdb_type (types[col_idx]).c_str ()));
803
804
}
804
805
806
+ auto param_type_array = env->NewObjectArray (n_param, J_String, nullptr );
807
+ auto param_type_detail_array = env->NewObjectArray (n_param, J_String, nullptr );
808
+
809
+ for (idx_t param_idx = 0 ; param_idx < n_param; param_idx++) {
810
+ std::string param_name;
811
+ if (param_types[param_idx].id () == LogicalTypeId::ENUM) {
812
+ param_name = " ENUM" ;
813
+ } else {
814
+ param_name = param_types[param_idx].ToString ();
815
+ }
816
+
817
+ env->SetObjectArrayElement (param_type_array, param_idx, env->NewStringUTF (param_name.c_str ()));
818
+ env->SetObjectArrayElement (param_type_detail_array, param_idx,
819
+ env->NewStringUTF (type_to_jduckdb_type (param_types[param_idx]).c_str ()));
820
+ }
821
+
805
822
auto return_type = env->NewStringUTF (StatementReturnTypeToString (properties.return_type ).c_str ());
806
823
807
824
return env->NewObject (J_DuckResultSetMeta, J_DuckResultSetMeta_init, n_param, column_count, name_array, type_array,
808
- type_detail_array, return_type);
825
+ type_detail_array, return_type, param_type_array, param_type_detail_array );
809
826
}
810
827
811
828
jobject _duckdb_jdbc_query_result_meta (JNIEnv *env, jclass, jobject res_ref_buf) {
@@ -815,9 +832,11 @@ jobject _duckdb_jdbc_query_result_meta(JNIEnv *env, jclass, jobject res_ref_buf)
815
832
}
816
833
auto &result = res_ref->res ;
817
834
818
- auto n_param = -1 ; // no params now
835
+ auto n_param = 0 ; // no params now
836
+ duckdb::vector<LogicalType> param_types (n_param);
819
837
820
- return build_meta (env, result->ColumnCount (), n_param, result->names , result->types , result->properties );
838
+ return build_meta (env, result->ColumnCount (), n_param, result->names , result->types , result->properties ,
839
+ param_types);
821
840
}
822
841
823
842
jobject _duckdb_jdbc_prepared_statement_meta (JNIEnv *env, jclass, jobject stmt_ref_buf) {
@@ -829,9 +848,14 @@ jobject _duckdb_jdbc_prepared_statement_meta(JNIEnv *env, jclass, jobject stmt_r
829
848
830
849
auto &stmt = stmt_ref->stmt ;
831
850
auto n_param = stmt->named_param_map .size ();
851
+ auto expected_parameter_types = stmt->GetExpectedParameterTypes ();
852
+ duckdb::vector<LogicalType> param_types (n_param);
853
+ for (auto &it : stmt->named_param_map ) {
854
+ param_types[it.second - 1 ] = expected_parameter_types[it.first ];
855
+ }
832
856
833
857
return build_meta (env, stmt->ColumnCount (), n_param, stmt->GetNames (), stmt->GetTypes (),
834
- stmt->GetStatementProperties ());
858
+ stmt->GetStatementProperties (), param_types );
835
859
}
836
860
837
861
jobject ProcessVector (JNIEnv *env, Connection *conn_ref, Vector &vec, idx_t row_count);
0 commit comments