Skip to content

NullPointerException when reading a FLOAT32 type #935

@lukaseder

Description

@lukaseder

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P3type: bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions