diff --git a/jOOQ/src/main/java/org/jooq/impl/R2DBC.java b/jOOQ/src/main/java/org/jooq/impl/R2DBC.java index 9c1fc00da8..b38dc860e4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/R2DBC.java +++ b/jOOQ/src/main/java/org/jooq/impl/R2DBC.java @@ -429,33 +429,42 @@ final class R2DBC { @Override final void onNext0(Connection c) { try { - Rendered rendered = rendered(configuration, query); - Statement stmt = c.createStatement(sql = rendered.sql); - new DefaultBindContext(configuration, null, new R2DBCPreparedStatement(configuration, stmt)).visit(rendered.bindValues); + if (query.isExecutable()) { + Rendered rendered = rendered(configuration, query); + Statement stmt = c.createStatement(sql = rendered.sql); + new DefaultBindContext(configuration, null, new R2DBCPreparedStatement(configuration, stmt)).visit(rendered.bindValues); - // TODO: Reuse org.jooq.impl.Tools.setFetchSize(ExecuteContext ctx, int fetchSize) - AbstractResultQuery q1 = abstractResultQuery(query); - if (q1 != null) { - int f = SettingsTools.getFetchSize(q1.fetchSize(), configuration.settings()); + // TODO: Reuse org.jooq.impl.Tools.setFetchSize(ExecuteContext ctx, int fetchSize) + AbstractResultQuery q1 = abstractResultQuery(query); + if (q1 != null) { + int f = SettingsTools.getFetchSize(q1.fetchSize(), configuration.settings()); - if (f != 0) { - if (log.isDebugEnabled()) - log.debug("Setting fetch size", f); + if (f != 0) { + if (log.isDebugEnabled()) + log.debug("Setting fetch size", f); - stmt.fetchSize(f); + stmt.fetchSize(f); + } } + + AbstractDMLQuery q2 = abstractDMLQuery(query); + if (q2 != null + && !q2.returning.isEmpty() + + + + && !q2.nativeSupportReturningOrDataChangeDeltaTable(configuration.dsl())) + stmt.returnGeneratedValues(Tools.map(q2.returningResolvedAsterisks, Field::getName, String[]::new)); + + stmt.execute().subscribe(resultSubscriber.apply(query, downstream)); } + else { + if (log.isDebugEnabled()) + log.debug("Query is not executable", query); - AbstractDMLQuery q2 = abstractDMLQuery(query); - if (q2 != null - && !q2.returning.isEmpty() - - - - && !q2.nativeSupportReturningOrDataChangeDeltaTable(configuration.dsl())) - stmt.returnGeneratedValues(Tools.map(q2.returningResolvedAsterisks, Field::getName, String[]::new)); - - stmt.execute().subscribe(resultSubscriber.apply(query, downstream)); + Subscriber s = resultSubscriber.apply(query, downstream); + s.onSubscribe(new NoOpSubscription(s)); + } } // [#13343] Cancel the downstream in case of a rendering bug in jOOQ @@ -466,6 +475,18 @@ final class R2DBC { } } + static final record NoOpSubscription(Subscriber subscriber) implements Subscription { + @Override + public void request(long n) { + subscriber.onComplete(); + } + + @Override + public void cancel() { + subscriber.onComplete(); + } + } + static final class BatchMultipleSubscriber extends ConnectionSubscriber { final BatchMultiple batch; @@ -1568,7 +1589,11 @@ final class R2DBC { @Override final void request0() { try { - subscriber.onNext(query.execute()); + if (query.isExecutable()) + subscriber.onNext(query.execute()); + else if (log.isDebugEnabled()) + log.debug("Query is not executable", query); + subscriber.onComplete(); } catch (Throwable t) {