diff --git a/error-prone-contrib/pom.xml b/error-prone-contrib/pom.xml
index b16612d0..af6064c9 100644
--- a/error-prone-contrib/pom.xml
+++ b/error-prone-contrib/pom.xml
@@ -146,6 +146,10 @@
value-annotations
test
+
+ org.jooq
+ jooq
+
org.jspecify
jspecify
diff --git a/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/JooqRules.java b/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/JooqRules.java
new file mode 100644
index 00000000..72205bcf
--- /dev/null
+++ b/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/JooqRules.java
@@ -0,0 +1,29 @@
+package tech.picnic.errorprone.refasterrules;
+
+import com.google.errorprone.refaster.annotation.AfterTemplate;
+import com.google.errorprone.refaster.annotation.BeforeTemplate;
+import java.util.stream.Stream;
+import org.jooq.Record;
+import org.jooq.ResultQuery;
+import tech.picnic.errorprone.refaster.annotation.Description;
+import tech.picnic.errorprone.refaster.annotation.OnlineDocumentation;
+
+@OnlineDocumentation
+final class JooqRules {
+ private JooqRules() {}
+
+ /** Prefer eagerly fetching data over (lazy) streaming to avoid potentially leaking resources. */
+ @Description(
+ "Prefer eagerly fetching data over (lazy) streaming to avoid potentially leaking resources.")
+ static final class ResultQueryFetchStream {
+ @BeforeTemplate
+ Stream> before(ResultQuery extends Record> resultQuery) {
+ return resultQuery.stream();
+ }
+
+ @AfterTemplate
+ Stream> after(ResultQuery extends Record> resultQuery) {
+ return resultQuery.fetch().stream();
+ }
+ }
+}
diff --git a/error-prone-contrib/src/test/java/tech/picnic/errorprone/refasterrules/RefasterRulesTest.java b/error-prone-contrib/src/test/java/tech/picnic/errorprone/refasterrules/RefasterRulesTest.java
index c60bb8b2..50177d8d 100644
--- a/error-prone-contrib/src/test/java/tech/picnic/errorprone/refasterrules/RefasterRulesTest.java
+++ b/error-prone-contrib/src/test/java/tech/picnic/errorprone/refasterrules/RefasterRulesTest.java
@@ -49,6 +49,7 @@ final class RefasterRulesTest {
ImmutableSortedMultisetRules.class,
ImmutableSortedSetRules.class,
IntStreamRules.class,
+ JooqRules.class,
JUnitRules.class,
JUnitToAssertJRules.class,
LongStreamRules.class,
diff --git a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/JooqRulesTestInput.java b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/JooqRulesTestInput.java
new file mode 100644
index 00000000..d0a213a1
--- /dev/null
+++ b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/JooqRulesTestInput.java
@@ -0,0 +1,11 @@
+package tech.picnic.errorprone.refasterrules;
+
+import java.util.stream.Stream;
+import org.jooq.impl.DSL;
+import tech.picnic.errorprone.refaster.test.RefasterRuleCollectionTestCase;
+
+final class JooqRulesTest implements RefasterRuleCollectionTestCase {
+ Stream> testResultQueryFetchStream() {
+ return DSL.select().stream();
+ }
+}
diff --git a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/JooqRulesTestOutput.java b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/JooqRulesTestOutput.java
new file mode 100644
index 00000000..c5b046b4
--- /dev/null
+++ b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/JooqRulesTestOutput.java
@@ -0,0 +1,11 @@
+package tech.picnic.errorprone.refasterrules;
+
+import java.util.stream.Stream;
+import org.jooq.impl.DSL;
+import tech.picnic.errorprone.refaster.test.RefasterRuleCollectionTestCase;
+
+final class JooqRulesTest implements RefasterRuleCollectionTestCase {
+ Stream> testResultQueryFetchStream() {
+ return DSL.select().fetch().stream();
+ }
+}
diff --git a/pom.xml b/pom.xml
index 96605afd..1656542a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -368,6 +368,11 @@
value-annotations
2.9.3
+
+ org.jooq
+ jooq
+ 3.16.14
+
org.jspecify
jspecify
@@ -1178,6 +1183,8 @@
| BSD 3-clause
| BSD License 3
| Eclipse Distribution License (New BSD License)
+ | Eclipse Distribution License - v 1.0
+ | EDL 1.0
| New BSD License