-
Notifications
You must be signed in to change notification settings - Fork 31
Open
Labels
Description
Describe the bug
The FLOAT32 type cannot be read using the Spanner R2DBC driver
Sample
Using reactor as a utility, do this:
System.out.println(
Flux.from(cf.create())
.flatMap(c -> c.createStatement(
"""
select cast(1 as float32)
""")
.execute())
.flatMap(it -> it.map((r, m) -> r.get(0)))
.collectList()
.block()
);This produces the following error:
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.util.function.BiFunction.apply(Object, Object)" because the return value of "java.util.Map.get(Object)" is null
at com.google.cloud.spanner.r2dbc.v2.ClientLibraryDecoder.readAndConvert(ClientLibraryDecoder.java:105)
at com.google.cloud.spanner.r2dbc.v2.ClientLibraryDecoder.decode(ClientLibraryDecoder.java:98)
at com.google.cloud.spanner.r2dbc.v2.SpannerClientLibraryRow.get(SpannerClientLibraryRow.java:34)
at org.jooq.testscripts.R2DBC.lambda$2(R2DBC.java:47)
at com.google.cloud.spanner.r2dbc.v2.SpannerClientLibraryResult.lambda$map$0(SpannerClientLibraryResult.java:55)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:113)
at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onNext(FluxContextWrite.java:107)
at reactor.core.publisher.FluxCreate$BufferAsyncSink.drain(FluxCreate.java:880)
at reactor.core.publisher.FluxCreate$BufferAsyncSink.next(FluxCreate.java:805)
at reactor.core.publisher.FluxCreate$SerializedFluxSink.next(FluxCreate.java:163)
at com.google.cloud.spanner.r2dbc.v2.ReactiveResultSetCallback.cursorReady(ReactiveResultSetCallback.java:82)
at com.google.cloud.spanner.AsyncResultSetImpl$CallbackRunnable.run(AsyncResultSetImpl.java:273)
at com.google.common.util.concurrent.SequentialExecutor$1.run(SequentialExecutor.java:125)
at com.google.common.util.concurrent.SequentialExecutor$QueueWorker.workOnQueue(SequentialExecutor.java:239)
at com.google.common.util.concurrent.SequentialExecutor$QueueWorker.run(SequentialExecutor.java:183)
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:68)
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:28)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1583)
Suppressed: java.lang.Exception: #block terminated with an error
at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:104)
at reactor.core.publisher.Mono.block(Mono.java:1779)
at org.jooq.testscripts.R2DBC.main(R2DBC.java:49)
It should produce a java.lang.Float value, instead.