Skip to content

Commit f780a96

Browse files
committed
Add Java table functions support
This PR is a continuation of duckdb#630, it adds support for writing DuckDB table functions in Java. Example: ```java try (Connection conn = DriverManager.getConnection(JDBC_URL); Statement stmt = conn.createStatement()) { DuckDBFunctions.tableFunction() .withName("java_table_basic") .withParameter(int.class) .withFunction(new DuckDBTableFunction<Integer, AtomicBoolean, Object>() { @OverRide public Integer bind(DuckDBTableFunctionBindInfo info) throws Exception { info.addResultColumn("col1", Integer.TYPE) .addResultColumn("col2", String.class); return info.getParameter(0).getInt(); } @OverRide public AtomicBoolean init(DuckDBTableFunctionInitInfo info) throws Exception { info.setMaxThreads(1); return new AtomicBoolean(false); } @OverRide public long apply(DuckDBTableFunctionCallInfo info, DuckDBDataChunkWriter output) throws Exception { Integer bindData = info.getBindData(); AtomicBoolean done = info.getInitData(); if (done.get()) { return 0; } output.vector(0).setInt(0, bindData); output.vector(1).setString(0, "foo"); output.vector(0).setNull(1); output.vector(1).setString(1, "bar"); done.set(true); return 2; } }) .register(conn); ... } ``` ```sql FROM java_table_basic(42); ``` Documentation is pending. Testing: new test added
1 parent 2f4ed44 commit f780a96

29 files changed

+2530
-205
lines changed

CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,8 +592,12 @@ add_library(duckdb_java SHARED
592592
src/jni/bindings_data_chunk.cpp
593593
src/jni/bindings_logical_type.cpp
594594
src/jni/bindings_scalar_function.cpp
595+
src/jni/bindings_table_function.cpp
596+
src/jni/bindings_table_function_bind.cpp
597+
src/jni/bindings_table_function_init.cpp
595598
src/jni/bindings_validity.cpp
596599
src/jni/bindings_vector.cpp
600+
src/jni/bindings_value.cpp
597601
src/jni/config.cpp
598602
src/jni/duckdb_java.cpp
599603
src/jni/functions.cpp

CMakeLists.txt.in

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,12 @@ add_library(duckdb_java SHARED
110110
src/jni/bindings_data_chunk.cpp
111111
src/jni/bindings_logical_type.cpp
112112
src/jni/bindings_scalar_function.cpp
113+
src/jni/bindings_table_function.cpp
114+
src/jni/bindings_table_function_bind.cpp
115+
src/jni/bindings_table_function_init.cpp
113116
src/jni/bindings_validity.cpp
114117
src/jni/bindings_vector.cpp
118+
src/jni/bindings_value.cpp
115119
src/jni/config.cpp
116120
src/jni/duckdb_java.cpp
117121
src/jni/functions.cpp

duckdb_java.map

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,66 @@ DUCKDB_JAVA {
113113
Java_org_duckdb_DuckDBBindings_duckdb_1append_1data_1chunk;
114114
Java_org_duckdb_DuckDBBindings_duckdb_1append_1default_1to_1chunk;
115115

116+
Java_org_duckdb_DuckDBBindings_duckdb_1bind_1add_1result_1column;
117+
Java_org_duckdb_DuckDBBindings_duckdb_1bind_1get_1parameter_1count;
118+
Java_org_duckdb_DuckDBBindings_duckdb_1bind_1get_1parameter;
119+
Java_org_duckdb_DuckDBBindings_duckdb_1bind_1get_1named_1parameter;
120+
Java_org_duckdb_DuckDBBindings_duckdb_1bind_1set_1bind_1data;
121+
Java_org_duckdb_DuckDBBindings_duckdb_1bind_1set_1cardinality;
122+
Java_org_duckdb_DuckDBBindings_duckdb_1bind_1set_1error;
123+
124+
Java_org_duckdb_DuckDBBindings_duckdb_1init_1get_1bind_1data;
125+
Java_org_duckdb_DuckDBBindings_duckdb_1init_1set_1init_1data;
126+
Java_org_duckdb_DuckDBBindings_duckdb_1init_1get_1column_1count;
127+
Java_org_duckdb_DuckDBBindings_duckdb_1init_1get_1column_1index;
128+
Java_org_duckdb_DuckDBBindings_duckdb_1init_1set_1max_1threads;
129+
Java_org_duckdb_DuckDBBindings_duckdb_1init_1set_1error;
130+
131+
Java_org_duckdb_DuckDBBindings_duckdb_1create_1table_1function;
132+
Java_org_duckdb_DuckDBBindings_duckdb_1destroy_1table_1function;
133+
Java_org_duckdb_DuckDBBindings_duckdb_1table_1function_1set_1name;
134+
Java_org_duckdb_DuckDBBindings_duckdb_1table_1function_1add_1parameter;
135+
Java_org_duckdb_DuckDBBindings_duckdb_1table_1function_1add_1named_1parameter;
136+
Java_org_duckdb_DuckDBBindings_duckdb_1table_1function_1set_1extra_1info;
137+
Java_org_duckdb_DuckDBBindings_duckdb_1table_1function_1set_1bind;
138+
Java_org_duckdb_DuckDBBindings_duckdb_1table_1function_1set_1init;
139+
Java_org_duckdb_DuckDBBindings_duckdb_1table_1function_1set_1local_1init;
140+
Java_org_duckdb_DuckDBBindings_duckdb_1table_1function_1set_1function;
141+
Java_org_duckdb_DuckDBBindings_duckdb_1table_1function_1supports_1projection_1pushdown;
142+
Java_org_duckdb_DuckDBBindings_duckdb_1register_1table_1function;
143+
Java_org_duckdb_DuckDBBindings_duckdb_1function_1get_1bind_1data;
144+
Java_org_duckdb_DuckDBBindings_duckdb_1function_1get_1init_1data;
145+
Java_org_duckdb_DuckDBBindings_duckdb_1function_1get_1local_1init_1data;
146+
Java_org_duckdb_DuckDBBindings_duckdb_1function_1set_1error;
147+
148+
Java_org_duckdb_DuckDBBindings_duckdb_1is_1null_1value;
149+
Java_org_duckdb_DuckDBBindings_duckdb_1destroy_1value;
150+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1bool;
151+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1int8;
152+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1uint8;
153+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1int16;
154+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1uint16;
155+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1int32;
156+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1uint32;
157+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1int64;
158+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1uint64;
159+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1hugeint;
160+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1uhugeint;
161+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1bignum;
162+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1decimal;
163+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1float;
164+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1double;
165+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1date;
166+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1time;
167+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1time_1ns;
168+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1time_1tz;
169+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1timestamp;
170+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1timestamp_1tz;
171+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1timestamp_1s;
172+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1timestamp_1ms;
173+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1timestamp_1ns;
174+
Java_org_duckdb_DuckDBBindings_duckdb_1get_1varchar;
175+
116176
duckdb_adbc_init;
117177
duckdb_add_aggregate_function_to_set;
118178
duckdb_add_replacement_scan;

0 commit comments

Comments
 (0)