diff --git a/.editorconfig b/.editorconfig
index d7e51acbd562..5439c0bd7a59 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -20,9 +20,6 @@ ij_java_use_single_class_imports = true
max_line_length = 100
ij_any_wrap_long_lines = true
-[*.astub]
-indent_size = 2
-
[*.java]
# Doc: https://youtrack.jetbrains.com/issue/IDEA-170643#focus=streamItem-27-3708697.0-0
# $ means "static"
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index bb3d609db503..3c753192b56f 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -374,16 +374,21 @@ jobs:
./sqlsh -o headers "select count(*) commits, author from (select substring(author, 1, position(' <' in author)-1) author from git_commits) group by author order by count(*) desc, author limit 20"
errorprone-guava-latest:
- name: 'ErrorProne (JDK 11, latest Guava)'
+ # This is the only job that verifies nullness, so a nullability problem fails here alone and
+ # the test jobs keep reporting test failures
+ name: 'ErrorProne and NullAway (JDK 25, latest Guava)'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 50
- - name: 'Set up JDK 11'
+ # Gradle 8.14 does not run on JDK 25, so Gradle runs on JDK 21 and javac comes from JDK 25
+ - name: 'Set up JDK 25 for compilation and JDK 21 for Gradle'
uses: actions/setup-java@v6
with:
- java-version: 11
+ java-version: |
+ 25
+ 21
distribution: 'zulu'
- uses: burrunan/gradle-cache-action@v1
name: Test
@@ -391,49 +396,7 @@ jobs:
job-id: errprone
remote-build-cache-proxy-enabled: false
# ErrorProne checks for Beta APIs, so use the latest supported Guava version
- arguments: --scan --no-parallel --no-daemon -PjdkBuildVersion=11 -Pguava.version=${{ env.GUAVA_MAX }} -PenableErrorprone classes
- properties: |
- org.gradle.java.installations.auto-download=false
-
- linux-checkerframework:
- name: 'CheckerFramework (JDK 11)'
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v7
- with:
- fetch-depth: 50
- - name: 'Set up JDK 11'
- uses: actions/setup-java@v6
- with:
- java-version: 11
- distribution: 'zulu'
- - name: 'Run CheckerFramework'
- uses: burrunan/gradle-cache-action@v1
- with:
- job-id: checkerframework-jdk11
- remote-build-cache-proxy-enabled: false
- arguments: --scan --no-parallel --no-daemon -PjdkBuildVersion=11 -PenableCheckerframework :linq4j:classes :core:classes :server:classes
- properties: |
- org.gradle.java.installations.auto-download=false
-
- linux-checkerframework-oldest-guava:
- name: 'CheckerFramework (JDK 11, oldest Guava)'
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v7
- with:
- fetch-depth: 50
- - name: 'Set up JDK 11'
- uses: actions/setup-java@v6
- with:
- java-version: 11
- distribution: 'zulu'
- - name: 'Run CheckerFramework'
- uses: burrunan/gradle-cache-action@v1
- with:
- job-id: checkerframework-jdk11
- remote-build-cache-proxy-enabled: false
- arguments: --scan --no-parallel --no-daemon -PjdkBuildVersion=11 -Pguava.version=${{ env.GUAVA_MIN }} -PenableCheckerframework :linq4j:classes :core:classes :server:classes
+ arguments: --scan --no-parallel --no-daemon -Pguava.version=${{ env.GUAVA_MAX }} -PenableErrorprone classes jmhClasses
properties: |
org.gradle.java.installations.auto-download=false
diff --git a/src/main/config/checkerframework/aggdesigner/Table.astub b/annotations/build.gradle.kts
similarity index 85%
rename from src/main/config/checkerframework/aggdesigner/Table.astub
rename to annotations/build.gradle.kts
index f5922d500376..62818d959c1d 100644
--- a/src/main/config/checkerframework/aggdesigner/Table.astub
+++ b/annotations/build.gradle.kts
@@ -14,10 +14,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.pentaho.aggdes.model;
-
-import org.checkerframework.checker.nullness.qual.*;
-
-interface Table {
- @Nullable Table getParent();
+dependencies {
+ api("org.jspecify:jspecify")
}
diff --git a/annotations/src/main/java/org/apache/calcite/annotations/Contract.java b/annotations/src/main/java/org/apache/calcite/annotations/Contract.java
new file mode 100644
index 000000000000..3e94bfa3ee71
--- /dev/null
+++ b/annotations/src/main/java/org/apache/calcite/annotations/Contract.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.calcite.annotations;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * States how the nullness of a method's result follows from the nullness of its arguments.
+ *
+ *
The value holds one or more clauses separated by {@code ;}. A clause lists one constraint per
+ * parameter, then {@code ->}, then what the method guarantees:
+ *
+ *
+ * @Contract("!null, _ -> !null")
+ * public static @Nullable Integer plus(@Nullable Integer b0, int b1) { ... }
+ *
+ *
+ * A constraint is {@code null}, {@code !null}, {@code true}, {@code false} or {@code _} for
+ * "anything". The guarantee is one of those, or {@code fail} for a method that always throws.
+ *
+ *
This replaces the {@code @PolyNull} qualifier of the Checker Framework, which has no JSpecify
+ * equivalent. It cannot describe a receiver parameter, a varargs method, or a type argument such
+ * as {@code Enumerable<@Nullable T>}.
+ */
+@Documented
+@Retention(RetentionPolicy.CLASS)
+@Target(ElementType.METHOD)
+public @interface Contract {
+ /** Returns the contract clauses.
+ *
+ * @return contract clauses, separated by {@code ;} */
+ String value();
+}
diff --git a/src/main/config/checkerframework/guava/Iterables.astub b/annotations/src/main/java/org/apache/calcite/annotations/EnsuresNonNull.java
similarity index 51%
rename from src/main/config/checkerframework/guava/Iterables.astub
rename to annotations/src/main/java/org/apache/calcite/annotations/EnsuresNonNull.java
index db302664618d..a45b9c97edc6 100644
--- a/src/main/config/checkerframework/guava/Iterables.astub
+++ b/annotations/src/main/java/org/apache/calcite/annotations/EnsuresNonNull.java
@@ -14,17 +14,26 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.google.common.collect;
+package org.apache.calcite.annotations;
-import org.checkerframework.checker.nullness.qual.*;
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
/**
- * Guava has {@code Nullable} argument and return value by default.
- * Checkerframework cna infer nullability from the actual generic types.
+ * States which nullable fields the method has assigned by the time it returns.
*
- * @param argument type
- * @param return type
+ * Callers may read those fields without a null check afterwards. This is what an
+ * {@code init}-style method needs in order to satisfy the constructor's initialization check.
*/
-public class Iterables {
- public static T[] toArray(Iterable extends @Nullable T> iterable, Class type);
+@Documented
+@Retention(RetentionPolicy.CLASS)
+@Target(ElementType.METHOD)
+public @interface EnsuresNonNull {
+ /** Returns the fields that are non-null once the method returns.
+ *
+ * @return field names, optionally qualified with {@code this.} */
+ String[] value();
}
diff --git a/annotations/src/main/java/org/apache/calcite/annotations/EnsuresNonNullIf.java b/annotations/src/main/java/org/apache/calcite/annotations/EnsuresNonNullIf.java
new file mode 100644
index 000000000000..184c1ab3912f
--- /dev/null
+++ b/annotations/src/main/java/org/apache/calcite/annotations/EnsuresNonNullIf.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.calcite.annotations;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * States which nullable fields are non-null when the method returns a given boolean.
+ *
+ * It turns a {@code hasFoo()} predicate into something a caller can rely on:
+ *
+ *
+ * @EnsuresNonNullIf(value = "hints", result = true)
+ * public boolean hasHints() { return hints != null && !hints.isEmpty(); }
+ *
+ *
+ * The fields are guaranteed only on the branch that matches {@link #result()}.
+ */
+@Documented
+@Retention(RetentionPolicy.CLASS)
+@Target(ElementType.METHOD)
+public @interface EnsuresNonNullIf {
+ /** Returns the fields that are non-null when the method returns {@link #result()}.
+ *
+ * @return field names, optionally qualified with {@code this.} */
+ String[] value();
+
+ /** Returns the result for which the guarantee holds.
+ *
+ * @return the boolean result that makes the fields non-null */
+ boolean result();
+}
diff --git a/src/main/config/checkerframework/guava/Function.astub b/annotations/src/main/java/org/apache/calcite/annotations/MonotonicNonNull.java
similarity index 54%
rename from src/main/config/checkerframework/guava/Function.astub
rename to annotations/src/main/java/org/apache/calcite/annotations/MonotonicNonNull.java
index 76f9d0aea34d..b6d74ec7b096 100644
--- a/src/main/config/checkerframework/guava/Function.astub
+++ b/annotations/src/main/java/org/apache/calcite/annotations/MonotonicNonNull.java
@@ -14,17 +14,23 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.google.common.base;
+package org.apache.calcite.annotations;
-import org.checkerframework.checker.nullness.qual.*;
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
/**
- * Guava has {@code Nullable} argument and return value by default.
- * Checkerframework cna infer nullability from the actual generic types.
+ * States that a field starts as null and is never assigned null again once it holds a value.
*
- * @param argument type
- * @param return type
+ * The field is exempt from the constructor's initialization check, and a null check on it holds
+ * across an intervening method call. Every read still needs that check: the field is null until
+ * something assigns it.
*/
-public interface Function {
- T apply(F input);
+@Documented
+@Retention(RetentionPolicy.CLASS)
+@Target({ElementType.FIELD, ElementType.TYPE_USE})
+public @interface MonotonicNonNull {
}
diff --git a/src/main/config/checkerframework/guava/Ordering.astub b/annotations/src/main/java/org/apache/calcite/annotations/RequiresNonNull.java
similarity index 50%
rename from src/main/config/checkerframework/guava/Ordering.astub
rename to annotations/src/main/java/org/apache/calcite/annotations/RequiresNonNull.java
index 820a66856bb5..ad8e967c3544 100644
--- a/src/main/config/checkerframework/guava/Ordering.astub
+++ b/annotations/src/main/java/org/apache/calcite/annotations/RequiresNonNull.java
@@ -14,19 +14,27 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.google.common.collect;
+package org.apache.calcite.annotations;
-import org.checkerframework.checker.nullness.qual.*;
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
/**
- * Guava has {@code Nullable} argument and return value by default.
- * Checkerframework cna infer nullability from the actual generic types.
+ * States which nullable fields a caller must have checked before calling the method.
*
- * @param argument type
- * @param return type
+ * Inside the method those fields count as non-null. The caller has to establish that, so this
+ * moves the check to the one place that can do it rather than repeating it in every method that
+ * reads the field.
*/
-public abstract class Ordering {
- // The Checker Framework can infer nullness from generic itself, so we do not need
- // "always nullable" from Guava.
- public abstract int compare(T left, T right);
+@Documented
+@Retention(RetentionPolicy.CLASS)
+@Target(ElementType.METHOD)
+public @interface RequiresNonNull {
+ /** Returns the fields that must be non-null on entry.
+ *
+ * @return field names, optionally qualified with {@code this.} */
+ String[] value();
}
diff --git a/annotations/src/main/java/org/apache/calcite/annotations/package-info.java b/annotations/src/main/java/org/apache/calcite/annotations/package-info.java
new file mode 100644
index 000000000000..68a9082c2132
--- /dev/null
+++ b/annotations/src/main/java/org/apache/calcite/annotations/package-info.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Nullness annotations that JSpecify does not define.
+ *
+ * JSpecify covers {@code @Nullable}, {@code @NonNull} and {@code @NullMarked} only. The
+ * annotations here cover what Calcite additionally needs to express: a method whose result is
+ * null exactly when an argument is null, a field that starts as null and stays non-null once
+ * assigned, and pre- and postconditions on fields.
+ *
+ *
A nullness checker recognises them by the last component of their name rather than by their
+ * package, so they need no dependency on the checker itself. NullAway is the checker Calcite
+ * runs; see {@code NullabilityUtil.findAnnotation} and
+ * {@code Nullness.isMonotonicNonNullAnnotation} in NullAway for the matching rules.
+ */
+@NullMarked
+package org.apache.calcite.annotations;
+
+import org.jspecify.annotations.NullMarked;
diff --git a/arrow/build.gradle.kts b/arrow/build.gradle.kts
index c75a8b5f6751..a8780b6b6772 100644
--- a/arrow/build.gradle.kts
+++ b/arrow/build.gradle.kts
@@ -19,6 +19,7 @@ import org.gradle.internal.os.OperatingSystem
dependencies {
api(project(":core"))
+ api("org.jspecify:jspecify")
implementation("com.google.guava:guava")
implementation("org.apache.arrow:arrow-memory-netty")
diff --git a/arrow/src/main/java/org/apache/calcite/adapter/arrow/AbstractArrowEnumerator.java b/arrow/src/main/java/org/apache/calcite/adapter/arrow/AbstractArrowEnumerator.java
index 486e3f60bd8d..2b9ede090d41 100644
--- a/arrow/src/main/java/org/apache/calcite/adapter/arrow/AbstractArrowEnumerator.java
+++ b/arrow/src/main/java/org/apache/calcite/adapter/arrow/AbstractArrowEnumerator.java
@@ -28,6 +28,8 @@
import org.apache.arrow.vector.types.TimeUnit;
import org.apache.arrow.vector.types.pojo.ArrowType;
+import org.jspecify.annotations.Nullable;
+
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@@ -35,7 +37,7 @@
/**
* Enumerator that reads from a collection of Arrow value-vectors.
*/
-abstract class AbstractArrowEnumerator implements Enumerator {
+abstract class AbstractArrowEnumerator implements Enumerator<@Nullable Object> {
protected final ArrowFileReader arrowFileReader;
protected final List fields;
protected final List valueVectors;
@@ -82,11 +84,11 @@ protected boolean loadNextNonEmptyArrowBatch() {
}
}
- @Override public Object current() {
+ @Override public @Nullable Object current() {
if (fields.size() == 1) {
return getValue(this.valueVectors.get(0), currRowIndex);
}
- Object[] current = new Object[valueVectors.size()];
+ final @Nullable Object[] current = new Object[valueVectors.size()];
for (int i = 0; i < valueVectors.size(); i++) {
ValueVector vector = this.valueVectors.get(i);
current[i] = getValue(vector, currRowIndex);
@@ -99,7 +101,7 @@ protected boolean loadNextNonEmptyArrowBatch() {
* For {@link TimeStampVector}, converts the raw value to
* milliseconds since epoch, which is the representation used by
* Calcite's Enumerable runtime for TIMESTAMP types. */
- protected static Object getValue(ValueVector vector, int index) {
+ protected static @Nullable Object getValue(ValueVector vector, int index) {
if (vector instanceof TimeStampVector) {
if (vector.isNull(index)) {
return null;
diff --git a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowEnumerable.java b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowEnumerable.java
index b9c0c4171e65..fce539797c6e 100644
--- a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowEnumerable.java
+++ b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowEnumerable.java
@@ -24,12 +24,14 @@
import org.apache.arrow.vector.ipc.ArrowFileReader;
import org.apache.arrow.vector.types.pojo.Schema;
+import org.jspecify.annotations.Nullable;
+
import java.util.List;
/**
* Enumerable that reads from Arrow value-vectors.
*/
-class ArrowEnumerable extends AbstractEnumerable {
+class ArrowEnumerable extends AbstractEnumerable<@Nullable Object> {
private final ArrowFileReader arrowFileReader;
private final ImmutableIntList fields;
private final List>> conditions;
@@ -45,7 +47,7 @@ class ArrowEnumerable extends AbstractEnumerable {
this.onClose = onClose;
}
- @Override public Enumerator enumerator() {
+ @Override public Enumerator<@Nullable Object> enumerator() {
try {
if (!conditions.isEmpty()) {
return new ArrowFilterEnumerator(arrowFileReader, fields,
diff --git a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowProject.java b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowProject.java
index 8fee390d543f..959fb772f0eb 100644
--- a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowProject.java
+++ b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowProject.java
@@ -30,7 +30,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
diff --git a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowRel.java b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowRel.java
index 944c17d867dd..a06e71270749 100644
--- a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowRel.java
+++ b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowRel.java
@@ -21,7 +21,7 @@
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.util.ImmutableIntList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
diff --git a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowRules.java b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowRules.java
index 3da1527f1014..027e4a29c7d2 100644
--- a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowRules.java
+++ b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowRules.java
@@ -35,8 +35,8 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
import org.immutables.value.Value;
+import org.jspecify.annotations.Nullable;
import java.util.List;
@@ -145,7 +145,7 @@ protected ArrowProjectRule(Config config) {
@Override public @Nullable RelNode convert(RelNode rel) {
final Project project = (Project) rel;
- @Nullable List fields =
+ List fields =
ArrowProject.getProjectFields(project.getProjects());
if (fields == null) {
// Project contains expressions more complex than just field references.
diff --git a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowSchema.java b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowSchema.java
index 510adfb8428f..053080ac0b5d 100644
--- a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowSchema.java
+++ b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowSchema.java
@@ -29,7 +29,7 @@
import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableMap;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowTable.java b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowTable.java
index 2585f5d156ea..6e40f99b82ab 100644
--- a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowTable.java
+++ b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowTable.java
@@ -44,7 +44,7 @@
import org.apache.arrow.vector.types.pojo.Field;
import org.apache.arrow.vector.types.pojo.Schema;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.io.File;
import java.io.FileInputStream;
@@ -100,8 +100,8 @@ public class ArrowTable extends AbstractTable
/** Called via code generation; see uses of
* {@link org.apache.calcite.adapter.arrow.ArrowMethod#ARROW_QUERY}. */
@SuppressWarnings("unused")
- public Enumerable query(DataContext root, ImmutableIntList fields,
- List>> conditions) {
+ public Enumerable<@Nullable Object> query(@Nullable DataContext root,
+ ImmutableIntList fields, List>> conditions) {
requireNonNull(fields, "fields");
FileInputStream fis = null;
@@ -188,7 +188,7 @@ private ArrowTable getTable() {
* @return result as enumerable
*/
@SuppressWarnings("UnusedDeclaration")
- public Enumerable query(List fields,
+ public Enumerable<@Nullable Object> query(List fields,
List>> conditions) {
final ImmutableIntList fieldList = ImmutableIntList.copyOf(fields);
return getTable().query(null, fieldList, conditions);
diff --git a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowTranslator.java b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowTranslator.java
index 2b4229598153..a8e29f41350c 100644
--- a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowTranslator.java
+++ b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowTranslator.java
@@ -29,7 +29,7 @@
import org.apache.calcite.sql.type.SqlTypeName;
import org.apache.calcite.util.DateString;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@@ -172,7 +172,7 @@ private ConditionToken translateBinary(ConditionToken.Operator op,
ConditionToken.Operator rop, RexCall call) {
final RexNode left = call.operands.get(0);
final RexNode right = call.operands.get(1);
- @Nullable ConditionToken expression = translateBinary2(op, left, right);
+ ConditionToken expression = translateBinary2(op, left, right);
if (expression != null) {
return expression;
}
@@ -188,7 +188,7 @@ private ConditionToken translateBinaryNoReverse(ConditionToken.Operator op,
RexCall call) {
final RexNode left = call.operands.get(0);
final RexNode right = call.operands.get(1);
- @Nullable ConditionToken expression = translateBinary2(op, left, right);
+ ConditionToken expression = translateBinary2(op, left, right);
if (expression != null) {
return expression;
}
@@ -237,7 +237,7 @@ private ConditionToken translateOp2(ConditionToken.Operator op, String name,
/** Translates a call to a unary operator. */
private ConditionToken translateUnary(ConditionToken.Operator op, RexCall call) {
final RexNode opNode = call.operands.get(0);
- @Nullable ConditionToken expression = translateUnary2(op, opNode);
+ ConditionToken expression = translateUnary2(op, opNode);
if (expression != null) {
return expression;
diff --git a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ConditionToken.java b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ConditionToken.java
index c5b690840add..57401f73139a 100644
--- a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ConditionToken.java
+++ b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ConditionToken.java
@@ -18,7 +18,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/arrow/src/main/java/org/apache/calcite/adapter/arrow/package-info.java b/arrow/src/main/java/org/apache/calcite/adapter/arrow/package-info.java
index 51ced6b206b3..5d94b4ab9fb8 100644
--- a/arrow/src/main/java/org/apache/calcite/adapter/arrow/package-info.java
+++ b/arrow/src/main/java/org/apache/calcite/adapter/arrow/package-info.java
@@ -18,4 +18,7 @@
/**
* Query provider that reads from Arrow files.
*/
+@NullMarked
package org.apache.calcite.adapter.arrow;
+
+import org.jspecify.annotations.NullMarked;
diff --git a/babel/build.gradle.kts b/babel/build.gradle.kts
index c96f5276a252..8ba22bb187c0 100644
--- a/babel/build.gradle.kts
+++ b/babel/build.gradle.kts
@@ -25,6 +25,7 @@ plugins {
dependencies {
api(project(":core"))
api("org.apache.calcite.avatica:avatica-core")
+ api("org.jspecify:jspecify")
implementation("com.google.guava:guava")
implementation("org.slf4j:slf4j-api")
diff --git a/babel/src/main/java/org/apache/calcite/sql/babel/SqlBabelCreateTable.java b/babel/src/main/java/org/apache/calcite/sql/babel/SqlBabelCreateTable.java
index 652f0a92e372..6a9d95f2968a 100644
--- a/babel/src/main/java/org/apache/calcite/sql/babel/SqlBabelCreateTable.java
+++ b/babel/src/main/java/org/apache/calcite/sql/babel/SqlBabelCreateTable.java
@@ -28,7 +28,7 @@
import org.apache.calcite.sql.parser.SqlParserPos;
import org.apache.calcite.util.ImmutableNullableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
@@ -44,7 +44,9 @@ public class SqlBabelCreateTable extends SqlCreateTable {
(operator, functionQualifier, pos, operands) ->
new SqlBabelCreateTable(pos,
requireNonNull((SqlLiteral) operands[0]).booleanValue(),
- requireNonNull((SqlLiteral) operands[1]).symbolValue(TableCollectionType.class),
+ requireNonNull(
+ requireNonNull((SqlLiteral) operands[1])
+ .symbolValue(TableCollectionType.class)),
requireNonNull((SqlLiteral) operands[2]).booleanValue(),
requireNonNull((SqlLiteral) operands[3]).booleanValue(),
(SqlIdentifier) requireNonNull(operands[4]),
@@ -65,7 +67,7 @@ public SqlBabelCreateTable(SqlParserPos pos, boolean replace,
this.volatile_ = volatile_;
}
- @SuppressWarnings("nullness")
+ @SuppressWarnings("NullAway")
@Override public List getOperandList() {
return ImmutableNullableList.of(SqlLiteral.createBoolean(getReplace(), pos),
SqlLiteral.createSymbol(tableCollectionType, pos),
diff --git a/babel/src/main/java/org/apache/calcite/sql/babel/package-info.java b/babel/src/main/java/org/apache/calcite/sql/babel/package-info.java
index 4e83feda71be..833af52c5cd5 100644
--- a/babel/src/main/java/org/apache/calcite/sql/babel/package-info.java
+++ b/babel/src/main/java/org/apache/calcite/sql/babel/package-info.java
@@ -18,4 +18,7 @@
/**
* Parse tree for SQL extensions used by the Babel parser.
*/
+@NullMarked
package org.apache.calcite.sql.babel;
+
+import org.jspecify.annotations.NullMarked;
diff --git a/babel/src/main/java/org/apache/calcite/sql/babel/postgres/package-info.java b/babel/src/main/java/org/apache/calcite/sql/babel/postgres/package-info.java
index 5d09fea82b03..c50372c1ead0 100644
--- a/babel/src/main/java/org/apache/calcite/sql/babel/postgres/package-info.java
+++ b/babel/src/main/java/org/apache/calcite/sql/babel/postgres/package-info.java
@@ -18,4 +18,7 @@
/**
* Parse tree for PostgreSQL extensions used by the Babel parser.
*/
+@NullMarked
package org.apache.calcite.sql.babel.postgres;
+
+import org.jspecify.annotations.NullMarked;
diff --git a/babel/src/test/java/org/apache/calcite/test/BabelParserTest.java b/babel/src/test/java/org/apache/calcite/test/BabelParserTest.java
index 48172f7d7fe4..c3c79517c055 100644
--- a/babel/src/test/java/org/apache/calcite/test/BabelParserTest.java
+++ b/babel/src/test/java/org/apache/calcite/test/BabelParserTest.java
@@ -34,7 +34,7 @@
import com.google.common.base.Throwables;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
diff --git a/babel/src/test/java/org/apache/calcite/test/BabelQuidemTest.java b/babel/src/test/java/org/apache/calcite/test/BabelQuidemTest.java
index f826d01e4512..d4d6efb84f23 100644
--- a/babel/src/test/java/org/apache/calcite/test/BabelQuidemTest.java
+++ b/babel/src/test/java/org/apache/calcite/test/BabelQuidemTest.java
@@ -30,7 +30,7 @@
import net.hydromatic.quidem.CommandHandler;
import net.hydromatic.quidem.Quidem;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.BeforeEach;
import java.sql.Connection;
diff --git a/babel/src/test/java/org/apache/calcite/test/package-info.java b/babel/src/test/java/org/apache/calcite/test/package-info.java
index c06f789d71ca..ca3131428577 100644
--- a/babel/src/test/java/org/apache/calcite/test/package-info.java
+++ b/babel/src/test/java/org/apache/calcite/test/package-info.java
@@ -18,11 +18,4 @@
/**
* Tests for Calcite.
*/
-@DefaultQualifier(value = NonNull.class, locations = TypeUseLocation.FIELD)
-@DefaultQualifier(value = NonNull.class, locations = TypeUseLocation.PARAMETER)
-@DefaultQualifier(value = NonNull.class, locations = TypeUseLocation.RETURN)
package org.apache.calcite.test;
-
-import org.checkerframework.checker.nullness.qual.NonNull;
-import org.checkerframework.framework.qual.DefaultQualifier;
-import org.checkerframework.framework.qual.TypeUseLocation;
diff --git a/bom/build.gradle.kts b/bom/build.gradle.kts
index 5febf6f0b335..19e8c20c276d 100644
--- a/bom/build.gradle.kts
+++ b/bom/build.gradle.kts
@@ -71,7 +71,6 @@ dependencies {
apiv("com.yahoo.datasketches:sketches-core")
apiv("commons-codec:commons-codec")
apiv("commons-io:commons-io")
- apiv("org.checkerframework:checker-qual", "checkerframework")
apiv("org.locationtech.jts:jts-core")
apiv("org.locationtech.jts.io:jts-io-common")
apiv("org.locationtech.proj4j:proj4j")
@@ -147,6 +146,7 @@ dependencies {
apiv("org.incava:java-diff")
apiv("org.jboss:jandex")
apiv("org.jooq:joou-java-6", "joou")
+ apiv("org.jspecify:jspecify")
apiv("org.jsoup:jsoup")
apiv("org.junit:junit-bom", "junit5")
apiv("org.mockito:mockito-core", "mockito")
diff --git a/build.gradle.kts b/build.gradle.kts
index 6d5c4747a913..313f8a707e09 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -25,9 +25,24 @@ import com.github.vlsi.gradle.properties.dsl.props
import com.github.vlsi.gradle.release.RepositoryType
import de.thetaphi.forbiddenapis.gradle.CheckForbiddenApis
import de.thetaphi.forbiddenapis.gradle.CheckForbiddenApisExtension
+import java.util.zip.ZipEntry
+import java.util.zip.ZipFile
+import java.util.zip.ZipInputStream
+import java.util.zip.ZipOutputStream
import net.ltgt.gradle.errorprone.errorprone
import org.apache.calcite.buildtools.asmchecker.AsmCheckerTask
import org.apache.calcite.buildtools.buildext.dsl.ParenthesisBalancer
+import org.gradle.api.artifacts.transform.CacheableTransform
+import org.gradle.api.artifacts.transform.InputArtifact
+import org.gradle.api.artifacts.transform.TransformAction
+import org.gradle.api.artifacts.transform.TransformOutputs
+import org.gradle.api.artifacts.transform.TransformParameters
+import org.gradle.api.artifacts.type.ArtifactTypeDefinition
+import org.gradle.api.attributes.Attribute
+import org.gradle.api.file.FileSystemLocation
+import org.gradle.api.provider.Provider
+import org.gradle.api.tasks.PathSensitive
+import org.gradle.api.tasks.PathSensitivity
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
plugins {
@@ -42,7 +57,6 @@ plugins {
calcite.buildext
jacoco
id("jacoco-report-aggregation")
- id("org.checkerframework") apply false
id("com.github.autostyle")
id("org.nosphere.apache.rat")
id("com.github.spotbugs")
@@ -74,13 +88,68 @@ tasks.wrapper {
distributionType = Wrapper.DistributionType.BIN
}
+val jspecifyJava8Compatible =
+ Attribute.of("org.apache.calcite.jspecify-java8-compatible", Boolean::class.javaObjectType)
+
+/** Removes the Java 9-only MODULE target from JSpecify's @NullMarked annotation. Workaround for https://github.com/jspecify/jspecify/issues/795 */
+@CacheableTransform
+abstract class JSpecifyJava8Transform : TransformAction {
+ @get:InputArtifact
+ @get:PathSensitive(PathSensitivity.NAME_ONLY)
+ abstract val inputArtifact: Provider
+
+ override fun transform(outputs: TransformOutputs) {
+ val input = inputArtifact.get().asFile
+ if (input.length() > 64_000L ||
+ !ZipFile(input).use { it.getEntry("org/jspecify/annotations/NullMarked.class") != null }) {
+ outputs.file(input)
+ return
+ }
+ val output = outputs.file(input.name)
+ ZipInputStream(input.inputStream().buffered()).use { source ->
+ ZipOutputStream(output.outputStream().buffered()).use { destination ->
+ while (true) {
+ val entry = source.nextEntry ?: break
+ destination.putNextEntry(ZipEntry(entry.name))
+ if (!entry.isDirectory) {
+ val bytes = source.readBytes()
+ destination.write(
+ if (entry.name == "org/jspecify/annotations/NullMarked.class") {
+ bytes.replaceModuleTarget()
+ } else bytes
+ )
+ }
+ destination.closeEntry()
+ source.closeEntry()
+ }
+ }
+ }
+ }
+
+ private fun ByteArray.replaceModuleTarget(): ByteArray {
+ fun utf8Entry(value: String): ByteArray {
+ val bytes = value.toByteArray(Charsets.US_ASCII)
+ return byteArrayOf(1, 0, bytes.size.toByte()) + bytes
+ }
+
+ val module = utf8Entry("MODULE")
+ val method = "METHOD".toByteArray(Charsets.US_ASCII)
+ val signature = utf8Entry("Ljava/lang/annotation/ElementType;") + module
+ val offset = (0..(size - signature.size)).singleOrNull { index ->
+ signature.indices.all { offset -> this[index + offset] == signature[offset] }
+ } ?: return this
+ return copyOf().also {
+ method.copyInto(it, offset + signature.size - method.size)
+ }
+ }
+}
+
fun reportsForHumans() = !(System.getenv()["CI"]?.toBoolean() ?: false)
val lastEditYear by extra(lastEditYear())
// Do not enable spotbugs by default. Execute it only when -Pspotbugs is present
val enableSpotBugs = props.bool("spotbugs")
-val enableCheckerframework by props()
val enableErrorprone by props()
val enableDependencyAnalysis by props()
val enableJacoco by props()
@@ -96,6 +165,10 @@ val jdkBuildVersion = props.int("jdkBuildVersion", 25)
// Inherited from stage-vote-release-plugin: skipSign, useGpgCmd
// Inherited from gradle-extensions-plugin: slowSuiteLogThreshold=0L, slowTestLogThreshold=2000L
+// Projects whose main code NullAway verifies. The other projects are not annotated well enough
+// yet, so NullAway would only produce noise there.
+val nullawayProjects = listOf(":annotations", ":linq4j", ":core", ":server", ":druid", ":file", ":kafka", ":spark", ":babel", ":redis", ":splunk", ":mongodb", ":cassandra", ":pig", ":arrow", ":innodb", ":piglet", ":geode", ":elasticsearch", ":plus", ":example:csv", ":example:function", ":testkit", ":ubenchmark")
+
val hepLargePlanModeTestIncludes = mapOf(
":core" to listOf(
"**/org/apache/calcite/test/HepPlannerTest.class",
@@ -584,6 +657,24 @@ allprojects {
}
plugins.withType {
+ configurations.configureEach {
+ if (isCanBeResolved && !isCanBeConsumed) {
+ attributes.attribute(jspecifyJava8Compatible, true)
+ }
+ }
+ dependencies {
+ attributesSchema {
+ attribute(jspecifyJava8Compatible)
+ }
+ artifactTypes.getByName(ArtifactTypeDefinition.JAR_TYPE)
+ .attributes.attribute(jspecifyJava8Compatible, false)
+ registerTransform(JSpecifyJava8Transform::class) {
+ from.attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, ArtifactTypeDefinition.JAR_TYPE)
+ .attribute(jspecifyJava8Compatible, false)
+ to.attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, ArtifactTypeDefinition.JAR_TYPE)
+ .attribute(jspecifyJava8Compatible, true)
+ }
+ }
configure {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
@@ -643,8 +734,10 @@ allprojects {
replace("junit5: Assert.fail", "org.junit.Assert.fail", "org.junit.jupiter.api.Assertions.fail")
}
replaceRegex("side by side comments", "(\n\\s*+[*]*+/\n)(/[/*])", "\$1\n\$2")
- replaceRegex("jsr305 nullable -> checkerframework", "javax\\.annotation\\.Nullable", "org.checkerframework.checker.nullness.qual.Nullable")
- replaceRegex("jsr305 nonnull -> checkerframework", "javax\\.annotation\\.Nonnull", "org.checkerframework.checker.nullness.qual.NonNull")
+ replaceRegex("jsr305 nullable -> jspecify", "javax\\.annotation\\.Nullable", "org.jspecify.annotations.Nullable")
+ replaceRegex("jsr305 nonnull -> jspecify", "javax\\.annotation\\.Nonnull", "org.jspecify.annotations.NonNull")
+ replaceRegex("checkerframework nullable -> jspecify", "org\\.checkerframework\\.checker\\.nullness\\.qual\\.Nullable", "org.jspecify.annotations.Nullable")
+ replaceRegex("checkerframework nonnull -> jspecify", "org\\.checkerframework\\.checker\\.nullness\\.qual\\.NonNull", "org.jspecify.annotations.NonNull")
importOrder(
"org.apache.calcite.",
"org.apache.",
@@ -777,9 +870,16 @@ allprojects {
apply(plugin = "net.ltgt.errorprone")
dependencies {
"errorprone"("com.google.errorprone:error_prone_core:${"errorprone".v}")
+ "errorprone"("com.uber.nullaway:nullaway:${"nullaway".v}")
"annotationProcessor"("com.google.guava:guava-beta-checker:1.0")
}
+ val nullawayEnabled = project.path in nullawayProjects
tasks.withType().configureEach {
+ // :ubenchmark keeps its sources in the jmh source set, and they are
+ // the module's own code just as much as a main source set is
+ val mainCode = name == "compileJava" || name == "compileJmhJava"
+ // NullAway reports every error it finds, and javac hides all but the first 100
+ options.compilerArgs.addAll(listOf("-Xmaxerrs", "10000"))
options.errorprone {
disableWarningsInGeneratedCode.set(true)
errorproneArgs.add("-XepExcludedPaths:.*/javacc/.*")
@@ -798,54 +898,92 @@ allprojects {
)
// Analyze issues, and enable the check
disable(
+ "AlreadyChecked",
+ "AnnotateFormatMethod",
+ "AssignmentExpression",
"BigDecimalEquals",
+ "BooleanLiteral",
+ "ClassInitializationDeadlock",
"DoNotCallSuggester",
- "StringSplitter"
+ "DuplicateBranches",
+ "EffectivelyPrivate",
+ "EnumOrdinal",
+ "ExposedPrivateType",
+ "FloggerArgumentToString",
+ "FormatStringShouldUsePlaceholders",
+ "InlineMeInliner",
+ "InlineMeSuggester",
+ "IntLiteralCast",
+ "InvalidLink",
+ "JavaDurationGetSecondsToToSeconds",
+ "JdkObsolete",
+ "LabelledBreakTarget",
+ "LenientFormatStringValidation",
+ "ListRemoveAmbiguous",
+ "MissingSummary",
+ "NonApiType",
+ "NonCanonicalType",
+ "NotJavadoc",
+ "RedundantControlFlow",
+ "StaticAssignmentOfThrowable",
+ "StringSplitter",
+ "SuperCallToObjectMethod",
+ "UnnecessaryMethodReference",
+ "UnnecessaryStringBuilder",
+ "UnsafeReflectiveConstructionCast",
+ "UnusedMethod",
+ "UnusedVariable"
)
+ if (nullawayEnabled && mainCode) {
+ // Nullness errors must fail the build, so the annotations stay trustworthy
+ error("NullAway")
+ // OnlyNullMarked skips a package that forgets @NullMarked rather than
+ // reporting it, so require every class to say which of the two it is
+ error("RequireExplicitNullMarking")
+ // JSpecify gives no meaning to a nullness annotation on a primitive, on
+ // the root type of a local variable or a cast, and in the other locations
+ // it does not recognize, so such an annotation only misleads the reader
+ error("JSpecifyUnrecognizedAnnotationLocation")
+ // Only @NullMarked code is analyzed, so an unannotated package is skipped
+ // rather than assumed non-null
+ option("NullAway:OnlyNullMarked", "true")
+ // JSpecify semantics, including nullness of generic type arguments
+ option("NullAway:JSpecifyMode", "true")
+ // Shorthand for HandleWildcardGenerics, JSpecifyJDKModels and
+ // WarnOnGenericInferenceFailure. They are spelled out below as well so it is
+ // clear which experiments Calcite relies on
+ option("NullAway:JSpecifyExperimental", "true")
+ // https://github.com/uber/NullAway/wiki/Configuration#handle-wildcard-generics
+ option("NullAway:HandleWildcardGenerics", "true")
+ // Nullness models for the JDK, which replace the CheckerFramework stub files
+ option("NullAway:JSpecifyJDKModels", "true")
+ // Report the calls where NullAway cannot infer the type arguments instead of
+ // silently assuming they are fine
+ option("NullAway:WarnOnGenericInferenceFailure", "true")
+ // Calcite runs its tests with assertions enabled
+ option("NullAway:AssertsEnabled", "true")
+ // Validate @Contract annotations rather than trusting them
+ option("NullAway:CheckContracts", "true")
+ // Check every override, not only the ones carrying @Override
+ option("NullAway:ExhaustiveOverride", "true")
+ option(
+ "NullAway:CastToNonNullMethod",
+ "org.apache.calcite.linq4j.Nullness.castNonNull"
+ )
+ // Immutables-generated code is not annotated, and Calcite does not own it
+ option("NullAway:TreatGeneratedAsUnannotated", "true")
+ option(
+ "NullAway:CustomGeneratedCodeAnnotations",
+ "org.immutables.value.Generated"
+ )
+ } else {
+ // Nullness is verified in a dedicated CI job only, so a nullness problem
+ // fails that job alone and leaves the test jobs reporting test failures
+ disable("NullAway")
+ }
}
}
}
- if (enableCheckerframework) {
- apply(plugin = "org.checkerframework")
- dependencies {
- "checkerFramework"("org.checkerframework:checker:${"checkerframework".v}")
- // CheckerFramework annotations might be used in the code as follows:
- // dependencies {
- // "compileOnly"("org.checkerframework:checker-qual")
- // "testCompileOnly"("org.checkerframework:checker-qual")
- // }
- if (JavaVersion.current() == JavaVersion.VERSION_1_8) {
- // only needed for JDK 8
- "checkerFrameworkAnnotatedJDK"("org.checkerframework:jdk8")
- }
- }
- configure {
- skipVersionCheck = true
- // See https://checkerframework.org/manual/#introduction
- checkers.add("org.checkerframework.checker.nullness.NullnessChecker")
- // Below checkers take significant time and they do not provide much value :-/
- // checkers.add("org.checkerframework.checker.optional.OptionalChecker")
- // checkers.add("org.checkerframework.checker.regex.RegexChecker")
- // https://checkerframework.org/manual/#creating-debugging-options-progress
- // extraJavacArgs.add("-Afilenames")
- extraJavacArgs.addAll(listOf("-Xmaxerrs", "10000"))
- // Consider Java assert statements for nullness and other checks
- extraJavacArgs.add("-AassumeAssertionsAreEnabled")
- // https://checkerframework.org/manual/#stub-using
- extraJavacArgs.add("-Astubs=" +
- fileTree("$rootDir/src/main/config/checkerframework") {
- include("**/*.astub")
- }.asPath
- )
- if (project.path == ":core") {
- extraJavacArgs.add("-AskipDefs=^org\\.apache\\.calcite\\.sql\\.parser\\.impl\\.")
- }
- if (project.path == ":server") {
- extraJavacArgs.add("-AskipDefs=^org\\.apache\\.calcite\\.sql\\.parser\\.ddl\\.")
- }
- }
- }
-
tasks {
configureEach {
manifest {
@@ -888,7 +1026,7 @@ allprojects {
if (werror) {
options.compilerArgs.add("-Werror")
}
- if (enableCheckerframework) {
+ if (enableErrorprone) {
options.forkOptions.memoryMaximumSize = "2g"
}
excludeIntellijGenerated()
diff --git a/cassandra/build.gradle.kts b/cassandra/build.gradle.kts
index 925148f3e7ec..85fe8a62f1f4 100644
--- a/cassandra/build.gradle.kts
+++ b/cassandra/build.gradle.kts
@@ -27,6 +27,7 @@ dependencies {
api("org.apache.cassandra:java-driver-core")
api("com.google.guava:guava")
+ api("org.jspecify:jspecify")
api("org.slf4j:slf4j-api")
implementation("org.apache.calcite.avatica:avatica-core")
diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraEnumerator.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraEnumerator.java
index 7d5d0baa04a4..9e8a99779eb0 100644
--- a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraEnumerator.java
+++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraEnumerator.java
@@ -29,7 +29,7 @@
import com.datastax.oss.driver.api.core.data.TupleValue;
import com.datastax.oss.driver.api.core.type.codec.registry.CodecRegistry;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.nio.ByteBuffer;
import java.time.Instant;
@@ -45,7 +45,7 @@
import static java.util.Objects.requireNonNull;
/** Enumerator that reads from a Cassandra column family. */
-class CassandraEnumerator implements Enumerator {
+class CassandraEnumerator implements Enumerator<@Nullable Object> {
private final Iterator iterator;
private final List fieldTypes;
@Nullable private Row current;
@@ -68,13 +68,13 @@ class CassandraEnumerator implements Enumerator {
*
* @return A new row from the results
*/
- @Override public Object current() {
+ @Override public @Nullable Object current() {
if (fieldTypes.size() == 1) {
// If we just have one field, produce it directly
return currentRowField(0);
} else {
// Build an array with all fields in this row
- Object[] row = new Object[fieldTypes.size()];
+ final @Nullable Object[] row = new Object[fieldTypes.size()];
for (int i = 0; i < fieldTypes.size(); i++) {
row[i] = currentRowField(i);
}
@@ -126,7 +126,7 @@ class CassandraEnumerator implements Enumerator {
final TupleValue tupleValue = (TupleValue) obj;
int numComponents = tupleValue.getType().getComponentTypes().size();
return IntStream.range(0, numComponents)
- .mapToObj(i ->
+ .<@Nullable Object>mapToObj(i ->
tupleValue.get(i,
CodecRegistry.DEFAULT.codecFor(
tupleValue.getType().getComponentTypes().get(i))))
diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraFilter.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraFilter.java
index 8da8cff99186..378742e21dd8 100644
--- a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraFilter.java
+++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraFilter.java
@@ -39,7 +39,7 @@
import org.apache.calcite.util.TimestampWithTimeZoneString;
import org.apache.calcite.util.Util;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraLimit.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraLimit.java
index ee5f6aa77652..c9a92bed8133 100644
--- a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraLimit.java
+++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraLimit.java
@@ -27,7 +27,7 @@
import org.apache.calcite.rex.RexLiteral;
import org.apache.calcite.rex.RexNode;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraProject.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraProject.java
index 0ee42eec05ae..48197b014cfb 100644
--- a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraProject.java
+++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraProject.java
@@ -30,7 +30,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.LinkedHashMap;
import java.util.List;
diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRel.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRel.java
index adb20bac9b6a..e80973c81d59 100644
--- a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRel.java
+++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRel.java
@@ -20,7 +20,7 @@
import org.apache.calcite.plan.RelOptTable;
import org.apache.calcite.rel.RelNode;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.LinkedHashMap;
diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRules.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRules.java
index db5d83960d0c..08bd9d636442 100644
--- a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRules.java
+++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRules.java
@@ -40,8 +40,8 @@
import org.apache.calcite.sql.SqlKind;
import org.apache.calcite.sql.validate.SqlValidatorUtil;
-import org.checkerframework.checker.nullness.qual.Nullable;
import org.immutables.value.Value;
+import org.jspecify.annotations.Nullable;
import java.util.HashSet;
import java.util.List;
diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraSchemaFactory.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraSchemaFactory.java
index 1ad7b119ffb4..6f84accd04df 100644
--- a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraSchemaFactory.java
+++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraSchemaFactory.java
@@ -35,6 +35,7 @@
import java.util.stream.Collectors;
import static java.lang.Integer.parseInt;
+import static java.util.Objects.requireNonNull;
/**
* Factory that creates a {@link CassandraSchema}.
@@ -59,7 +60,7 @@ public CassandraSchemaFactory() {
final Map sessionMap = projectMapOverKeys(operand, SESSION_DEFINING_KEYS);
INFO_TO_SESSION.computeIfAbsent(sessionMap, m -> {
- String host = (String) m.get("host");
+ String host = requireNonNull((String) m.get("host"), "host");
String username = (String) m.get("username");
String password = (String) m.get("password");
int port = getPort(m);
diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraSort.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraSort.java
index d897cce52c00..109be8848ca3 100644
--- a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraSort.java
+++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraSort.java
@@ -28,7 +28,7 @@
import org.apache.calcite.rel.type.RelDataTypeField;
import org.apache.calcite.rex.RexNode;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraTable.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraTable.java
index de8464e25d35..acd9705df5d2 100644
--- a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraTable.java
+++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraTable.java
@@ -43,7 +43,7 @@
import com.datastax.oss.driver.api.core.cql.ResultSet;
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.Iterator;
import java.util.List;
@@ -118,7 +118,7 @@ public List getClusteringOrder() {
return clusteringOrder;
}
- public Enumerable query(final CqlSession session) {
+ public Enumerable<@Nullable Object> query(final CqlSession session) {
return query(session, ImmutableList.of(), ImmutableList.of(),
ImmutableList.of(), ImmutableList.of(), 0, -1);
}
@@ -130,7 +130,8 @@ public Enumerable query(final CqlSession session) {
* @param predicates A list of predicates which should be used in the query
* @return Enumerator of results
*/
- public Enumerable query(final CqlSession session, List> fields,
+ public Enumerable<@Nullable Object> query(final CqlSession session,
+ List> fields,
final List> selectFields, List predicates,
List order, final Integer offset, final Integer fetch) {
// Build the type of the resulting row based on the provided fields
@@ -139,7 +140,7 @@ public Enumerable query(final CqlSession session, List addField = fieldName -> {
+ Function1 addField = fieldName -> {
RelDataType relDataType =
requireNonNull(rowType.getField(fieldName, true, false)).getType();
fieldInfo.add(fieldName, relDataType).nullable(true);
@@ -227,12 +228,13 @@ public Enumerable query(final CqlSession session, List() {
- @Override public Enumerator enumerator() {
+ return new AbstractEnumerable<@Nullable Object>() {
+ @Override public Enumerator<@Nullable Object> enumerator() {
final ResultSet results = session.execute(queryBuilder.toString());
// Skip results until we get to the right offset
int skip = 0;
- Enumerator enumerator = new CassandraEnumerator(results, resultRowType);
+ Enumerator<@Nullable Object> enumerator =
+ new CassandraEnumerator(results, resultRowType);
while (skip < offset && enumerator.moveNext()) {
skip++;
}
@@ -284,7 +286,7 @@ private CqlSession getSession() {
* @see org.apache.calcite.adapter.cassandra.CassandraMethod#CASSANDRA_QUERYABLE_QUERY
*/
@SuppressWarnings("UnusedDeclaration")
- public @Nullable Enumerable query(List> fields,
+ public @Nullable Enumerable<@Nullable Object> query(List> fields,
List> selectFields, List predicates,
List order, Integer offset, Integer fetch) {
return getTable().query(getSession(), fields, selectFields, predicates,
diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraTableScan.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraTableScan.java
index 25d29792433f..8a0785dff612 100644
--- a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraTableScan.java
+++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraTableScan.java
@@ -27,7 +27,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraToEnumerableConverter.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraToEnumerableConverter.java
index f99951a7a5a4..fc0a28a610e7 100644
--- a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraToEnumerableConverter.java
+++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraToEnumerableConverter.java
@@ -41,7 +41,7 @@
import org.apache.calcite.util.Pair;
import org.apache.calcite.util.Util;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.AbstractList;
import java.util.ArrayList;
diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/package-info.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/package-info.java
index c9bc16403e90..f5614f9955e9 100644
--- a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/package-info.java
+++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/package-info.java
@@ -20,4 +20,7 @@
*
* There is one table for each Cassandra column family.
*/
+@NullMarked
package org.apache.calcite.adapter.cassandra;
+
+import org.jspecify.annotations.NullMarked;
diff --git a/core/build.gradle.kts b/core/build.gradle.kts
index 086f114480e4..517a806d931a 100644
--- a/core/build.gradle.kts
+++ b/core/build.gradle.kts
@@ -44,6 +44,7 @@ val testPostgresql by configurations.creating(integrationTestConfig)
val testMysql by configurations.creating(integrationTestConfig)
dependencies {
+ api(project(":annotations"))
api(project(":linq4j"))
api("org.locationtech.jts:jts-core")
@@ -54,7 +55,7 @@ dependencies {
api("com.google.guava:guava")
api("org.apache.calcite.avatica:avatica-core")
api("org.apiguardian:apiguardian-api")
- api("org.checkerframework:checker-qual")
+ api("org.jspecify:jspecify")
api("org.slf4j:slf4j-api")
implementation("com.fasterxml.jackson.core:jackson-core")
diff --git a/core/src/main/java/org/apache/calcite/DataContext.java b/core/src/main/java/org/apache/calcite/DataContext.java
index eeca324268e4..43a025fc2b90 100644
--- a/core/src/main/java/org/apache/calcite/DataContext.java
+++ b/core/src/main/java/org/apache/calcite/DataContext.java
@@ -26,7 +26,7 @@
import com.google.common.base.CaseFormat;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.io.InputStream;
import java.io.OutputStream;
@@ -35,6 +35,8 @@
import java.util.TimeZone;
import java.util.concurrent.atomic.AtomicBoolean;
+import static org.apache.calcite.linq4j.Nullness.castNonNull;
+
/**
* Runtime context allowing access to the tables in a database.
*
@@ -152,7 +154,7 @@ enum Variable {
/** Returns the value of this variable in a given data context. */
public T get(DataContext dataContext) {
//noinspection unchecked
- return (T) clazz.cast(dataContext.get(camelName));
+ return (T) castNonNull(clazz.cast(dataContext.get(camelName)));
}
}
}
diff --git a/core/src/main/java/org/apache/calcite/DataContexts.java b/core/src/main/java/org/apache/calcite/DataContexts.java
index b7e7f3fea2b0..f0c10c6de0ee 100644
--- a/core/src/main/java/org/apache/calcite/DataContexts.java
+++ b/core/src/main/java/org/apache/calcite/DataContexts.java
@@ -23,7 +23,7 @@
import com.google.common.collect.ImmutableMap;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.io.Serializable;
import java.util.Map;
@@ -40,7 +40,7 @@ private DataContexts() {
public static final DataContext EMPTY = new EmptyDataContext();
/** Returns an instance of {@link DataContext} with the given map. */
- public static DataContext of(Map map) {
+ public static DataContext of(Map map) {
return new MapDataContext(map);
}
@@ -85,7 +85,7 @@ private static class EmptyDataContext implements DataContext, Serializable {
private static class MapDataContext extends EmptyDataContext {
private final ImmutableMap map;
- MapDataContext(Map map) {
+ MapDataContext(Map map) {
this.map = ImmutableMap.copyOf(map);
}
diff --git a/core/src/main/java/org/apache/calcite/adapter/clone/ArrayTable.java b/core/src/main/java/org/apache/calcite/adapter/clone/ArrayTable.java
index fabbe6ea8d71..9d2a8f6b8170 100644
--- a/core/src/main/java/org/apache/calcite/adapter/clone/ArrayTable.java
+++ b/core/src/main/java/org/apache/calcite/adapter/clone/ArrayTable.java
@@ -40,7 +40,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Array;
import java.lang.reflect.Type;
@@ -225,7 +225,7 @@ public static List asList(final Representation representation,
final Object dataSet) {
// Cache size. It might be expensive to compute.
final int size = representation.size(dataSet);
- return new AbstractList() {
+ return new AbstractList<@Nullable Object>() {
@Override public @Nullable Object get(int index) {
return representation.getObject(dataSet, index);
}
@@ -280,14 +280,14 @@ public static class ObjectArray implements Representation {
@Override public Object freeze(ColumnLoader.ValueSet valueSet, int @Nullable [] sources) {
// We assume the values have been canonized.
- final List list = permuteList(valueSet.values, sources);
- return list.toArray(new Comparable[0]);
+ final List<@Nullable Comparable> list = permuteList(valueSet.values, sources);
+ return list.toArray(new @Nullable Comparable[0]);
}
@Override public Object permute(Object dataSet, int[] sources) {
- @Nullable Comparable[] list = (@Nullable Comparable[]) dataSet;
+ final @Nullable Comparable[] list = (@Nullable Comparable[]) dataSet;
final int size = list.length;
- final @Nullable Comparable[] comparables = new Comparable[size];
+ final @Nullable Comparable[] comparables = new @Nullable Comparable[size];
for (int i = 0; i < size; i++) {
comparables[i] = list[sources[i]];
}
@@ -433,18 +433,17 @@ public static class ObjectDictionary implements Representation {
valueSet.map.keySet().toArray(new Comparable[n + extra]);
// codeValues[0..n] is non-null since valueSet.map.keySet is non-null
// There might be null at the very end, however, it won't participate in Arrays.sort
- @SuppressWarnings("assignment.type.incompatible")
Comparable[] nonNullCodeValues = codeValues;
Arrays.sort(nonNullCodeValues, 0, n);
ColumnLoader.ValueSet codeValueSet =
new ColumnLoader.ValueSet(int.class);
- final List list = permuteList(valueSet.values, sources);
+ final List<@Nullable Comparable> list = permuteList(valueSet.values, sources);
for (Comparable value : list) {
int code;
if (value == null) {
code = n;
} else {
- code = Arrays.binarySearch(codeValues, value);
+ code = Arrays.binarySearch(nonNullCodeValues, value);
assert code >= 0 : code + ", " + value;
}
codeValueSet.add(code);
@@ -596,7 +595,7 @@ public static class Constant implements Representation {
}
@Override public int getInt(Object dataSet, int ordinal) {
- @Nullable Number value = (Number) getObject(dataSet, ordinal);
+ Number value = (Number) getObject(dataSet, ordinal);
return requireNonNull(value, "value").intValue();
}
@@ -798,7 +797,7 @@ public static void orLong(
}
}
- private static List permuteList(
+ private static List permuteList(
final List list, final int @Nullable [] sources) {
if (sources == null) {
return list;
diff --git a/core/src/main/java/org/apache/calcite/adapter/clone/CloneSchema.java b/core/src/main/java/org/apache/calcite/adapter/clone/CloneSchema.java
index 87cd8666ba98..fd7ced538dd4 100644
--- a/core/src/main/java/org/apache/calcite/adapter/clone/CloneSchema.java
+++ b/core/src/main/java/org/apache/calcite/adapter/clone/CloneSchema.java
@@ -39,7 +39,7 @@
import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Type;
import java.util.LinkedHashMap;
diff --git a/core/src/main/java/org/apache/calcite/adapter/clone/ColumnLoader.java b/core/src/main/java/org/apache/calcite/adapter/clone/ColumnLoader.java
index 3d78f3548ba1..c10439d9d437 100644
--- a/core/src/main/java/org/apache/calcite/adapter/clone/ColumnLoader.java
+++ b/core/src/main/java/org/apache/calcite/adapter/clone/ColumnLoader.java
@@ -17,6 +17,7 @@
package org.apache.calcite.adapter.clone;
import org.apache.calcite.adapter.java.JavaTypeFactory;
+import org.apache.calcite.annotations.Contract;
import org.apache.calcite.avatica.ColumnMetaData;
import org.apache.calcite.avatica.util.DateTimeUtils;
import org.apache.calcite.linq4j.Enumerable;
@@ -27,8 +28,7 @@
import org.apache.calcite.rel.type.RelProtoDataType;
import org.apache.calcite.util.Util;
-import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Type;
import java.sql.Date;
@@ -67,7 +67,6 @@ class ColumnLoader {
* @param sourceTable Source data
* @param protoRowType Logical row type
* @param repList Physical row types, or null if not known */
- @SuppressWarnings("method.invocation.invalid")
ColumnLoader(JavaTypeFactory typeFactory,
Enumerable sourceTable,
RelProtoDataType protoRowType,
@@ -202,7 +201,6 @@ private void load(final RelDataType elementType,
// We have discovered a the first unique key in the table.
sort[0] = pair.i;
// map.keySet().size() == list.size() above implies list contains only non-null elements
- @SuppressWarnings("assignment.type.incompatible")
final Comparable[] values =
valueSet.values.toArray(new Comparable[0]);
final Kev[] kevs = new Kev[list.size()];
@@ -251,7 +249,7 @@ private void load(final RelDataType elementType,
case JAVA_SQL_TIMESTAMP:
final List<@Nullable Long> longs =
Util.transform((List<@Nullable Timestamp>) list,
- (Timestamp t) -> t == null ? null : t.getTime());
+ t -> t == null ? null : t.getTime());
return longs;
default:
break;
@@ -263,7 +261,7 @@ private void load(final RelDataType elementType,
case JAVA_SQL_TIME:
return Util.<@Nullable Time, @Nullable Integer>transform(
(List<@Nullable Time>) list,
- (Time t) -> t == null ? null
+ t -> t == null ? null
: (int) (t.getTime() % DateTimeUtils.MILLIS_PER_DAY));
default:
break;
@@ -274,7 +272,7 @@ private void load(final RelDataType elementType,
case OBJECT:
case JAVA_SQL_DATE:
return Util.<@Nullable Date, @Nullable Integer>transform(
- (List<@Nullable Date>) list, (Date d) -> d == null
+ (List<@Nullable Date>) list, d -> d == null
? null
: (int) (d.getTime() / DateTimeUtils.MILLIS_PER_DAY));
default:
@@ -385,7 +383,7 @@ private static long toLong(Object o) {
}
}
- @EnsuresNonNullIf(result = true, expression = "#1")
+ @Contract("null -> false")
private static boolean canBeLong(@Nullable Object o) {
return o instanceof Boolean
|| o instanceof Character
diff --git a/core/src/main/java/org/apache/calcite/adapter/clone/package-info.java b/core/src/main/java/org/apache/calcite/adapter/clone/package-info.java
index d2f9429783e5..cdd1af71a2ed 100644
--- a/core/src/main/java/org/apache/calcite/adapter/clone/package-info.java
+++ b/core/src/main/java/org/apache/calcite/adapter/clone/package-info.java
@@ -18,4 +18,7 @@
/**
* Provides utility classes.
*/
+@NullMarked
package org.apache.calcite.adapter.clone;
+
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/AggAddContext.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/AggAddContext.java
index 68d1e1be47fc..00c8d2a9bd6f 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/AggAddContext.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/AggAddContext.java
@@ -19,7 +19,7 @@
import org.apache.calcite.linq4j.tree.Expression;
import org.apache.calcite.rex.RexNode;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/AggImpState.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/AggImpState.java
index a22583778871..488f44525e7a 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/AggImpState.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/AggImpState.java
@@ -16,11 +16,10 @@
*/
package org.apache.calcite.adapter.enumerable;
+import org.apache.calcite.annotations.MonotonicNonNull;
import org.apache.calcite.linq4j.tree.Expression;
import org.apache.calcite.rel.core.AggregateCall;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
-
import java.util.List;
/**
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/AggResultContext.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/AggResultContext.java
index 2c4b1b4bba4f..52e9c16d2d97 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/AggResultContext.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/AggResultContext.java
@@ -19,7 +19,7 @@
import org.apache.calcite.linq4j.tree.Expression;
import org.apache.calcite.rel.core.AggregateCall;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Information for a call to
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumUtils.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumUtils.java
index 0aaf1f64fe8e..46327867c091 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumUtils.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumUtils.java
@@ -23,7 +23,6 @@
import org.apache.calcite.linq4j.Enumerable;
import org.apache.calcite.linq4j.Enumerator;
import org.apache.calcite.linq4j.JoinType;
-import org.apache.calcite.linq4j.Nullness;
import org.apache.calcite.linq4j.Ord;
import org.apache.calcite.linq4j.function.Function1;
import org.apache.calcite.linq4j.function.Function2;
@@ -65,7 +64,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
@@ -293,9 +292,8 @@ static Expression joinSelectorCompact(JoinRelType joinType, PhysType physType,
final int fieldCount = inputPhysType.getRowType().getFieldCount();
// Delegate copying the row values to JavaRowFormat
final List copyStatements =
- Nullness.castNonNull(
- inputPhysType.getFormat().copy(parameter, Nullness.castNonNull(compactOutputVar),
- outputField, fieldCount));
+ inputPhysType.getFormat().copy(parameter, compactOutputVar,
+ outputField, fieldCount);
if (joinType.generatesNullsOn(ord.i)) {
// [CALCITE-6593] NPE when outer joining tables with many fields and unmatching rows
compactCode.add(
@@ -309,7 +307,7 @@ static Expression joinSelectorCompact(JoinRelType joinType, PhysType physType,
outputField += fieldCount;
}
- compactCode.add(Nullness.castNonNull(compactOutputVar));
+ compactCode.add(compactOutputVar);
return Expressions.lambda(
Function2.class,
compactCode.toBlock(),
@@ -1415,7 +1413,7 @@ private static PairList hopWindows(long tsMillis,
/**
* Apply tumbling per row from the enumerable input.
*/
- public static Enumerable tumbling(
+ public static Enumerable tumbling(
Enumerable inputEnumerable,
Function1 outSelector) {
return new AbstractEnumerable() {
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregate.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregate.java
index 0429168a8fd5..a59a345c129a 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregate.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregate.java
@@ -36,7 +36,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Type;
import java.util.ArrayList;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateBase.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateBase.java
index ae2f939988aa..6718af296b34 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateBase.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateBase.java
@@ -47,7 +47,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Type;
import java.util.ArrayList;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateRule.java
index 55474083886f..86a761686be9 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateRule.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateRule.java
@@ -25,7 +25,7 @@
import org.apache.calcite.rel.core.AggregateCall;
import org.apache.calcite.rel.logical.LogicalAggregate;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Rule to convert a {@link LogicalAggregate} to an {@link EnumerableAggregate}.
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAsofJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAsofJoin.java
index d7cb7b4cdb7e..d5489bcdcd0d 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAsofJoin.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAsofJoin.java
@@ -44,7 +44,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoin.java
index 11a3620c8c2e..e595126f200e 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoin.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoin.java
@@ -42,7 +42,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBindable.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBindable.java
index 666e8802d415..c2b4a28fb824 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBindable.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBindable.java
@@ -35,7 +35,7 @@
import com.google.common.collect.ImmutableMap;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalc.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalc.java
index 03cd0e419a0d..564c524dd674 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalc.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalc.java
@@ -51,7 +51,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableConditionalCorrelate.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableConditionalCorrelate.java
index 02b51a624926..bd3ec415c594 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableConditionalCorrelate.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableConditionalCorrelate.java
@@ -38,7 +38,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCorrelate.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCorrelate.java
index e5adff42d9de..2d6004057aa8 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCorrelate.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCorrelate.java
@@ -37,7 +37,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilter.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilter.java
index f4943ce8917c..46221dbf6c66 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilter.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilter.java
@@ -32,7 +32,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableHashJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableHashJoin.java
index 6fc9a9ba3d07..3ed56bfcb72c 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableHashJoin.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableHashJoin.java
@@ -42,7 +42,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Method;
import java.util.ArrayList;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableIEJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableIEJoin.java
index 197c3ab3d914..47d37b2c6e01 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableIEJoin.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableIEJoin.java
@@ -48,7 +48,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Type;
import java.util.ArrayList;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableIEJoinRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableIEJoinRule.java
index 5023fc5e5763..5b5e72b3c405 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableIEJoinRule.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableIEJoinRule.java
@@ -28,7 +28,7 @@
import org.apache.calcite.rex.RexProgram;
import org.apache.calcite.rex.RexUtil;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpretable.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpretable.java
index 7ed858b754b5..df9bd78b2ea5 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpretable.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpretable.java
@@ -47,11 +47,11 @@
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
-import org.checkerframework.checker.nullness.qual.Nullable;
import org.codehaus.commons.compiler.CompileException;
import org.codehaus.commons.compiler.CompilerFactoryFactory;
import org.codehaus.commons.compiler.ICompilerFactory;
import org.codehaus.commons.compiler.ISimpleCompiler;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpreter.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpreter.java
index ae2c88b3e93a..4262cc25c548 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpreter.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpreter.java
@@ -30,7 +30,7 @@
import org.apache.calcite.rel.metadata.RelMetadataQuery;
import org.apache.calcite.util.BuiltInMethod;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimit.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimit.java
index 96a04be1b862..90d45d051501 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimit.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimit.java
@@ -35,7 +35,7 @@
import org.apache.calcite.rex.RexNode;
import org.apache.calcite.util.BuiltInMethod;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimitSort.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimitSort.java
index 68759436d0fd..6abe360c64ed 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimitSort.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimitSort.java
@@ -28,7 +28,7 @@
import org.apache.calcite.util.BuiltInMethod;
import org.apache.calcite.util.Pair;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.math.BigDecimal;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMatch.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMatch.java
index 77d86cf5d729..0989f486a2ec 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMatch.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMatch.java
@@ -47,7 +47,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
@@ -422,7 +422,7 @@ private static Expression implementPattern(Expression patternBuilder_,
/**
* Visitor that finds out how much "history" we need in the past and future.
*/
- private static class MaxHistoryFutureVisitor extends RexVisitorImpl {
+ private static class MaxHistoryFutureVisitor extends RexVisitorImpl<@Nullable Void> {
private int history;
private int future;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java
index fe65699e0c12..e4222961fbf6 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java
@@ -54,7 +54,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Type;
import java.util.ArrayList;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoinRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoinRule.java
index f78423edbde5..5078caa7c08b 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoinRule.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoinRule.java
@@ -33,7 +33,7 @@
import org.apache.calcite.rex.RexUtil;
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableNestedLoopJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableNestedLoopJoin.java
index 545329726fb0..27f9c2925220 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableNestedLoopJoin.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableNestedLoopJoin.java
@@ -39,7 +39,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
import java.util.Set;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProject.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProject.java
index 8b4c0c5ded53..04f13314ce47 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProject.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProject.java
@@ -31,7 +31,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRel.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRel.java
index 2136b1f727ca..75ddf9ef53a8 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRel.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRel.java
@@ -22,7 +22,7 @@
import org.apache.calcite.rel.PhysicalNode;
import org.apache.calcite.util.Pair;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelFactories.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelFactories.java
index 38adfd50a118..43501a38a6cf 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelFactories.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelFactories.java
@@ -26,7 +26,7 @@
import org.apache.calcite.rex.RexUtil;
import org.apache.calcite.sql.validate.SqlValidatorUtil;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
import java.util.Set;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelImplementor.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelImplementor.java
index ae380578c42b..13e41e1a8655 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelImplementor.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelImplementor.java
@@ -89,7 +89,6 @@ public class EnumerableRelImplementor extends JavaRelImplementor {
private final Map, ParameterExpression> stashedParameters =
new LinkedHashMap<>();
- @SuppressWarnings("methodref.receiver.bound.invalid")
protected final Function1 allCorrelateVariables =
this::getCorrelVariableGetter;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRepeatUnion.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRepeatUnion.java
index 2cee0be2c46b..5d40346879e7 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRepeatUnion.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRepeatUnion.java
@@ -30,7 +30,7 @@
import org.apache.calcite.util.BuiltInMethod;
import org.apache.calcite.util.Util;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSort.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSort.java
index be23b6602e89..36ea8865298b 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSort.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSort.java
@@ -28,7 +28,7 @@
import org.apache.calcite.util.BuiltInMethod;
import org.apache.calcite.util.Pair;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/** Implementation of {@link org.apache.calcite.rel.core.Sort} in
* {@link org.apache.calcite.adapter.enumerable.EnumerableConvention enumerable calling convention}. */
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortRule.java
index 14a9c8671a01..d8179e524cf8 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortRule.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortRule.java
@@ -21,7 +21,7 @@
import org.apache.calcite.rel.convert.ConverterRule;
import org.apache.calcite.rel.core.Sort;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Rule to convert an {@link org.apache.calcite.rel.core.Sort} to an
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortedAggregate.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortedAggregate.java
index 29997dd3b720..f28cf3917039 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortedAggregate.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortedAggregate.java
@@ -42,7 +42,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Type;
import java.util.ArrayList;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortedAggregateRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortedAggregateRule.java
index ffeb646a1b68..e55b18069fea 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortedAggregateRule.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortedAggregateRule.java
@@ -25,7 +25,7 @@
import org.apache.calcite.rel.logical.LogicalAggregate;
import org.apache.calcite.util.ImmutableIntList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Rule to convert a {@link LogicalAggregate} to an {@link EnumerableSortedAggregate}.
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableFunctionScan.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableFunctionScan.java
index c9a74e8ae6cd..536b4f99b4e9 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableFunctionScan.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableFunctionScan.java
@@ -36,7 +36,7 @@
import org.apache.calcite.sql.validate.SqlConformanceEnum;
import org.apache.calcite.sql.validate.SqlUserDefinedTableFunction;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableModify.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableModify.java
index 3f60240fd994..44756f77f150 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableModify.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableModify.java
@@ -36,7 +36,7 @@
import org.apache.calcite.schema.ModifiableTable;
import org.apache.calcite.util.BuiltInMethod;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Modifier;
import java.util.ArrayDeque;
@@ -223,11 +223,12 @@ private Result implementUpdate(
*/
public static long applyUpdateOneToOne(Enumerable source, List sink,
int tableFieldCount, int[] updateColumnIndices) {
- final Map, Deque> updatesByKey = new HashMap<>();
+ final Map, Deque> updatesByKey = new HashMap<>();
try (Enumerator e = source.enumerator()) {
while (e.moveNext()) {
final Object[] sourceRow = e.current();
- final List key = Arrays.asList(Arrays.copyOf(sourceRow, tableFieldCount));
+ final List<@Nullable Object> key =
+ Arrays.asList(Arrays.copyOf(sourceRow, tableFieldCount));
final Object[] newRow = applyUpdate(sourceRow, tableFieldCount, updateColumnIndices);
updatesByKey.computeIfAbsent(key, k -> new ArrayDeque<>()).addLast(newRow);
}
@@ -483,17 +484,17 @@ public static void applyDeleteRowsByKey(Enumerable sourceKeys,
Collection sinkRows, Function1 sinkKeySelector) {
// Build a map of source keys to the number of sink rows that must be removed for each.
- final Map, Integer> pendingByKey = new HashMap<>();
+ final Map, Integer> pendingByKey = new HashMap<>();
try (Enumerator e = sourceKeys.enumerator()) {
while (e.moveNext()) {
- final List key = keyOf(e.current());
+ final List<@Nullable Object> key = keyOf(e.current());
pendingByKey.put(key, pendingByKey.getOrDefault(key, 0) + 1);
}
}
// Iterate over sink rows and remove matching rows based on key.
for (java.util.Iterator it = sinkRows.iterator(); it.hasNext();) {
- final List key = keyOf(sinkKeySelector.apply(it.next()));
+ final List<@Nullable Object> key = keyOf(sinkKeySelector.apply(it.next()));
final Integer pending = pendingByKey.get(key);
if (pending == null || pending == 0) {
continue;
@@ -515,8 +516,9 @@ public static void applyDeleteRowsByKey(Enumerable sourceKeys,
* @param rowValues row values
* @return key for row
*/
- private static List keyOf(Object[] rowValues) {
- return Arrays.asList(Arrays.copyOf(rowValues, rowValues.length));
+ private static List<@Nullable Object> keyOf(Object[] rowValues) {
+ return Arrays.<@Nullable Object>asList(
+ Arrays.copyOf(rowValues, rowValues.length));
}
}
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableModifyRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableModifyRule.java
index 4e111fe2248a..28fa65fa996a 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableModifyRule.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableModifyRule.java
@@ -24,7 +24,7 @@
import org.apache.calcite.rel.logical.LogicalTableModify;
import org.apache.calcite.schema.ModifiableTable;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/** Planner rule that converts a {@link LogicalTableModify} to an {@link EnumerableTableModify}.
* You may provide a custom config to convert other nodes that extend {@link TableModify}.
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableScan.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableScan.java
index ace76188b135..bba5984a4c14 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableScan.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableScan.java
@@ -51,7 +51,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Type;
import java.util.ArrayList;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableScanRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableScanRule.java
index c89e803c2c28..c99533da77e7 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableScanRule.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableScanRule.java
@@ -25,7 +25,7 @@
import org.apache.calcite.schema.QueryableTable;
import org.apache.calcite.schema.Table;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/** Planner rule that converts a {@link LogicalTableScan} to an {@link EnumerableTableScan}.
* You may provide a custom config to convert other nodes that extend {@link TableScan}.
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTraitsUtils.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTraitsUtils.java
index cc16ef98ed93..36072e91d25c 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTraitsUtils.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTraitsUtils.java
@@ -39,7 +39,7 @@
import com.google.common.collect.ImmutableList;
import org.apiguardian.api.API;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableValues.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableValues.java
index c732d14319dd..9ca1e64b0479 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableValues.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableValues.java
@@ -42,7 +42,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Ordering;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Type;
import java.util.ArrayList;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableWindow.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableWindow.java
index e57d3dd9e8c3..818f70a6bf86 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableWindow.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableWindow.java
@@ -57,7 +57,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
@@ -128,7 +128,7 @@ private WindowRelInputGetter(Expression row,
}
}
- @SuppressWarnings({"unused", "nullness"})
+ @SuppressWarnings({"unused", "NullAway"})
private static void sampleOfTheGeneratedWindowedAggregate() {
// Here's overview of the generated code
// For each list of rows that have the same partitioning key, evaluate
@@ -953,7 +953,7 @@ private static Expression translateBound(RexToLixTranslator translator,
if (bound.isCurrentRow()) {
return i_;
}
- RexNode node = bound.getOffset();
+ RexNode node = requireNonNull(bound.getOffset(), "offset");
Expression offs = translator.translate(node);
// Floating offset does not make sense since we refer to array index.
// Nulls do not make sense as well.
@@ -1004,7 +1004,7 @@ private static Expression translateBound(RexToLixTranslator translator,
Expression val =
translator.translate(new RexInputRef(orderKey, keyType), desiredKeyType);
if (!bound.isCurrentRow()) {
- RexNode node = bound.getOffset();
+ RexNode node = requireNonNull(bound.getOffset(), "offset");
Expression offs = translator.translate(node);
// TODO: support date + interval somehow
if (bound.isFollowing()) {
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/JavaRowFormat.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/JavaRowFormat.java
index cfbb2f7e4f0a..ea8802a003e1 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/JavaRowFormat.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/JavaRowFormat.java
@@ -32,7 +32,7 @@
import org.apache.calcite.sql.type.SqlTypeName;
import org.apache.calcite.util.BuiltInMethod;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Type;
import java.util.ArrayList;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/NestedBlockBuilderImpl.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/NestedBlockBuilderImpl.java
index 9b6bbd41614e..def812bda6b5 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/NestedBlockBuilderImpl.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/NestedBlockBuilderImpl.java
@@ -34,7 +34,6 @@ public class NestedBlockBuilderImpl implements NestedBlockBuilder {
*
* @param block root code block
*/
- @SuppressWarnings("method.invocation.invalid")
public NestedBlockBuilderImpl(BlockBuilder block) {
nestBlock(block);
}
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/PhysType.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/PhysType.java
index c50d6237dfe5..7c9e5bcca7eb 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/PhysType.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/PhysType.java
@@ -24,7 +24,7 @@
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.util.Pair;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Type;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/PhysTypeImpl.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/PhysTypeImpl.java
index f1490a02c0a1..31d9272d8013 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/PhysTypeImpl.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/PhysTypeImpl.java
@@ -40,7 +40,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImpTable.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImpTable.java
index eabb37a923f7..306af1b30966 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImpTable.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImpTable.java
@@ -87,11 +87,11 @@
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
-import org.checkerframework.checker.nullness.qual.Nullable;
import org.joou.UByte;
import org.joou.UInteger;
import org.joou.ULong;
import org.joou.UShort;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
@@ -2410,7 +2410,7 @@ static class RankImplementor extends StrictWinAggImplementor {
int curentPosition; // position in for-win-agg-loop
int startIndex; // index of start of window
Comparable @Nullable [] rows; // accessed via WinAggAddContext.compareRows
- @SuppressWarnings("nullness")
+ @SuppressWarnings("NullAway")
void sample() {
if (curentPosition > startIndex) {
if (rows[curentPosition - 1].compareTo(rows[curentPosition])
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImplementorTable.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImplementorTable.java
index 9c135bf83a09..b33e35338ce9 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImplementorTable.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImplementorTable.java
@@ -22,7 +22,7 @@
import org.apache.calcite.sql.SqlOperator;
import org.apache.calcite.sql.SqlWindowTableFunction;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Provides the implementor that generates code for calls to an operator.
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImplementorTables.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImplementorTables.java
index d5ff234a0e19..1613c04f9e9f 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImplementorTables.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImplementorTables.java
@@ -25,7 +25,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/RexToLixTranslator.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/RexToLixTranslator.java
index 90437caa75a9..9bcae7baf6bb 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/RexToLixTranslator.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/RexToLixTranslator.java
@@ -76,7 +76,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.locationtech.jts.geom.Geometry;
import java.lang.reflect.Constructor;
@@ -1246,7 +1246,7 @@ public List translateList(
RexImpTable.NullAs nullAs,
List extends @Nullable Type> storageTypes) {
final List list = new ArrayList<>();
- for (Pair e : Pair.zip(operandList, storageTypes)) {
+ for (Pair e : Pair.zip(operandList, storageTypes)) {
list.add(translate(e.left, nullAs, e.right));
}
return list;
@@ -1351,7 +1351,7 @@ public static Expression translateCondition(RexProgram program,
*/
public static Expression translateCondition(RexProgram program,
JavaTypeFactory typeFactory, BlockBuilder list, InputGetter inputGetter,
- Function1 correlates, SqlConformance conformance,
+ @Nullable Function1 correlates, SqlConformance conformance,
boolean nullable, RexImplementorTable implementorTable) {
RexLocalRef condition = program.getCondition();
if (condition == null) {
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/impl/AggResultContextImpl.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/impl/AggResultContextImpl.java
index 17a6843ef459..db65d3e1ce05 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/impl/AggResultContextImpl.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/impl/AggResultContextImpl.java
@@ -25,7 +25,7 @@
import org.apache.calcite.rel.core.AggregateCall;
import org.apache.calcite.sql.validate.SqlConformanceEnum;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/impl/package-info.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/impl/package-info.java
index 722e56d6b0fc..74249c98146a 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/impl/package-info.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/impl/package-info.java
@@ -18,4 +18,7 @@
/**
* Calcite-specific classes for implementation of regular and window aggregates.
*/
+@NullMarked
package org.apache.calcite.adapter.enumerable.impl;
+
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/package-info.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/package-info.java
index 2b626c35a850..8ed908082c81 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/package-info.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/package-info.java
@@ -18,4 +18,7 @@
/**
* Query optimizer rules for Java calling convention.
*/
+@NullMarked
package org.apache.calcite.adapter.enumerable;
+
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/org/apache/calcite/adapter/java/ReflectiveSchema.java b/core/src/main/java/org/apache/calcite/adapter/java/ReflectiveSchema.java
index 07e29b2b2233..aab2100027b6 100644
--- a/core/src/main/java/org/apache/calcite/adapter/java/ReflectiveSchema.java
+++ b/core/src/main/java/org/apache/calcite/adapter/java/ReflectiveSchema.java
@@ -18,6 +18,7 @@
import org.apache.calcite.DataContext;
import org.apache.calcite.adapter.enumerable.EnumUtils;
+import org.apache.calcite.annotations.MonotonicNonNull;
import org.apache.calcite.linq4j.Enumerable;
import org.apache.calcite.linq4j.Enumerator;
import org.apache.calcite.linq4j.Linq4j;
@@ -53,8 +54,7 @@
import com.google.common.collect.Iterables;
import com.google.common.collect.Multimap;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
diff --git a/core/src/main/java/org/apache/calcite/adapter/java/package-info.java b/core/src/main/java/org/apache/calcite/adapter/java/package-info.java
index fdd167c439fa..39044809ae7c 100644
--- a/core/src/main/java/org/apache/calcite/adapter/java/package-info.java
+++ b/core/src/main/java/org/apache/calcite/adapter/java/package-info.java
@@ -19,4 +19,7 @@
* Query provider based on Java in-memory data
* structures.
*/
+@NullMarked
package org.apache.calcite.adapter.java;
+
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcBaseSchema.java b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcBaseSchema.java
index 6c1e328d5106..cc0e97982866 100644
--- a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcBaseSchema.java
+++ b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcBaseSchema.java
@@ -27,7 +27,7 @@
import org.apache.calcite.schema.lookup.LikePattern;
import org.apache.calcite.schema.lookup.Lookup;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.Collection;
import java.util.Collections;
diff --git a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcCatalogSchema.java b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcCatalogSchema.java
index 54330d327fac..0d3c1186b065 100644
--- a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcCatalogSchema.java
+++ b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcCatalogSchema.java
@@ -36,7 +36,7 @@
import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableSet;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.sql.Connection;
import java.sql.ResultSet;
@@ -68,7 +68,7 @@ public class JdbcCatalogSchema extends JdbcBaseSchema implements Wrapper {
private final Lookup subSchemas;
/** default schema name, lazily initialized. */
- @SuppressWarnings({"method.invocation.invalid", "Convert2MethodRef"})
+ @SuppressWarnings("Convert2MethodRef")
private final Supplier> defaultSchemaName =
Suppliers.memoize(() -> Optional.ofNullable(computeDefaultSchemaName()));
@@ -170,7 +170,7 @@ public DataSource getDataSource() {
}
- @Override public @Nullable T unwrap(Class clazz) {
+ @Override public @Nullable T unwrap(Class clazz) {
if (clazz.isInstance(this)) {
return clazz.cast(this);
}
diff --git a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcCorrelationDataContext.java b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcCorrelationDataContext.java
index 802e490d83fc..8d3555e3c53a 100644
--- a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcCorrelationDataContext.java
+++ b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcCorrelationDataContext.java
@@ -21,7 +21,7 @@
import org.apache.calcite.linq4j.QueryProvider;
import org.apache.calcite.schema.SchemaPlus;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import static java.lang.Integer.parseInt;
diff --git a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcRules.java b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcRules.java
index 9a35cf7cce2d..a1b2cdf691bf 100644
--- a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcRules.java
+++ b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcRules.java
@@ -73,7 +73,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import java.util.ArrayList;
@@ -1104,7 +1104,7 @@ public static class JdbcValues extends Values implements JdbcRel {
/** Visitor that checks whether part of a projection is a user-defined
* function (UDF). */
private static class CheckingUserDefinedFunctionVisitor
- extends RexVisitorImpl {
+ extends RexVisitorImpl<@Nullable Void> {
private boolean containsUsedDefinedFunction = false;
diff --git a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcSchema.java b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcSchema.java
index 7d1cb8864afa..f88d5e1da465 100644
--- a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcSchema.java
+++ b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcSchema.java
@@ -48,7 +48,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Ordering;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -499,7 +499,7 @@ private static RelDataType parseTypeString(RelDataTypeFactory typeFactory,
}
}
- @Override public @Nullable T unwrap(Class clazz) {
+ @Override public @Nullable T unwrap(Class clazz) {
if (clazz.isInstance(this)) {
return clazz.cast(this);
}
diff --git a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcTable.java b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcTable.java
index 8d14f95e0e8b..407dcd6c035f 100644
--- a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcTable.java
+++ b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcTable.java
@@ -56,7 +56,7 @@
import com.google.common.base.Suppliers;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.sql.SQLException;
import java.util.ArrayList;
@@ -78,7 +78,6 @@
*/
public class JdbcTable extends AbstractQueryableTable
implements TranslatableTable, ScannableTable, ModifiableTable {
- @SuppressWarnings("methodref.receiver.bound.invalid")
private final Supplier protoRowTypeSupplier =
Suppliers.memoize(this::supplyProto);
public final JdbcSchema jdbcSchema;
@@ -106,7 +105,7 @@ public class JdbcTable extends AbstractQueryableTable
return jdbcTableType;
}
- @Override public @Nullable C unwrap(Class aClass) {
+ @Override public @Nullable C unwrap(Class aClass) {
if (aClass.isInstance(jdbcSchema.getDataSource())) {
return aClass.cast(jdbcSchema.getDataSource());
} else if (aClass.isInstance(jdbcSchema.dialect)) {
diff --git a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcToEnumerableConverter.java b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcToEnumerableConverter.java
index da2380077f14..d4b4dac008b4 100644
--- a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcToEnumerableConverter.java
+++ b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcToEnumerableConverter.java
@@ -50,7 +50,7 @@
import org.apache.calcite.sql.util.SqlString;
import org.apache.calcite.util.BuiltInMethod;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
diff --git a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcToEnumerableConverterRule.java b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcToEnumerableConverterRule.java
index d676f9e1550a..d60c88c79f66 100644
--- a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcToEnumerableConverterRule.java
+++ b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcToEnumerableConverterRule.java
@@ -21,7 +21,7 @@
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.convert.ConverterRule;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Rule to convert a relational expression from
diff --git a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcUtils.java b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcUtils.java
index ef48b505b51c..0d4ba2a09207 100644
--- a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcUtils.java
+++ b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcUtils.java
@@ -33,7 +33,7 @@
import com.google.common.cache.LoadingCache;
import com.google.common.primitives.Ints;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
@@ -274,7 +274,8 @@ public DataSource get(String url, @Nullable String driverClassName,
// Get data source objects from a cache, so that we don't have to sniff
// out what kind of database they are quite as often.
final List<@Nullable String> key =
- ImmutableNullableList.of(url, username, password, driverClassName);
+ ImmutableNullableList.<@Nullable String>of(url, username, password,
+ driverClassName);
return cache.getUnchecked(key);
}
}
diff --git a/core/src/main/java/org/apache/calcite/adapter/jdbc/package-info.java b/core/src/main/java/org/apache/calcite/adapter/jdbc/package-info.java
index ecabc575d463..bbd21b91d4ab 100644
--- a/core/src/main/java/org/apache/calcite/adapter/jdbc/package-info.java
+++ b/core/src/main/java/org/apache/calcite/adapter/jdbc/package-info.java
@@ -18,4 +18,7 @@
/**
* Query provider based on a JDBC data source.
*/
+@NullMarked
package org.apache.calcite.adapter.jdbc;
+
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/org/apache/calcite/adapter/package-info.java b/core/src/main/java/org/apache/calcite/adapter/package-info.java
index daf4a7d886f9..f5d6085b72c2 100644
--- a/core/src/main/java/org/apache/calcite/adapter/package-info.java
+++ b/core/src/main/java/org/apache/calcite/adapter/package-info.java
@@ -37,11 +37,7 @@
*
*
*/
-@DefaultQualifier(value = NonNull.class, locations = TypeUseLocation.FIELD)
-@DefaultQualifier(value = NonNull.class, locations = TypeUseLocation.PARAMETER)
-@DefaultQualifier(value = NonNull.class, locations = TypeUseLocation.RETURN)
+@NullMarked
package org.apache.calcite.adapter;
-import org.checkerframework.checker.nullness.qual.NonNull;
-import org.checkerframework.framework.qual.DefaultQualifier;
-import org.checkerframework.framework.qual.TypeUseLocation;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/org/apache/calcite/config/CalciteConnectionConfig.java b/core/src/main/java/org/apache/calcite/config/CalciteConnectionConfig.java
index 52c8d4cd5663..7124cd9443e3 100644
--- a/core/src/main/java/org/apache/calcite/config/CalciteConnectionConfig.java
+++ b/core/src/main/java/org/apache/calcite/config/CalciteConnectionConfig.java
@@ -22,8 +22,8 @@
import org.apache.calcite.model.JsonSchema;
import org.apache.calcite.sql.validate.SqlConformance;
-import org.checkerframework.checker.nullness.qual.Nullable;
-import org.checkerframework.checker.nullness.qual.PolyNull;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
import java.util.Properties;
@@ -61,8 +61,8 @@ public interface CalciteConnectionConfig extends ConnectionConfig {
/** Returns the value of {@link CalciteConnectionProperty#FUN},
* or a default operator table if not set. If {@code defaultOperatorTable}
* is not null, the result is never null. */
- @PolyNull T fun(Class operatorTableClass,
- @PolyNull T defaultOperatorTable);
+ T fun(Class<@NonNull T> operatorTableClass,
+ T defaultOperatorTable);
/** Returns the value of {@link CalciteConnectionProperty#MODEL}. */
@Nullable String model();
/** Returns the value of {@link CalciteConnectionProperty#LEX}. */
@@ -78,13 +78,13 @@ public interface CalciteConnectionConfig extends ConnectionConfig {
/** Returns the value of {@link CalciteConnectionProperty#PARSER_FACTORY},
* or a default parser if not set. If {@code defaultParserFactory}
* is not null, the result is never null. */
- @PolyNull T parserFactory(Class parserFactoryClass,
- @PolyNull T defaultParserFactory);
+ T parserFactory(Class<@NonNull T> parserFactoryClass,
+ T defaultParserFactory);
/** Returns the value of {@link CalciteConnectionProperty#SCHEMA_FACTORY},
* or a default schema factory if not set. If {@code defaultSchemaFactory}
* is not null, the result is never null. */
- @PolyNull T schemaFactory(Class schemaFactoryClass,
- @PolyNull T defaultSchemaFactory);
+ T schemaFactory(Class<@NonNull T> schemaFactoryClass,
+ T defaultSchemaFactory);
/** Returns the value of {@link CalciteConnectionProperty#SCHEMA_TYPE}. */
JsonSchema.Type schemaType();
/** Returns the value of {@link CalciteConnectionProperty#SPARK}. */
@@ -95,8 +95,8 @@ public interface CalciteConnectionConfig extends ConnectionConfig {
/** Returns the value of {@link CalciteConnectionProperty#TYPE_SYSTEM},
* or a default type system if not set. If {@code defaultTypeSystem}
* is not null, the result is never null. */
- @PolyNull T typeSystem(Class typeSystemClass,
- @PolyNull T defaultTypeSystem);
+ T typeSystem(Class<@NonNull T> typeSystemClass,
+ T defaultTypeSystem);
/** Returns the value of {@link CalciteConnectionProperty#CONFORMANCE}. */
SqlConformance conformance();
/** Returns the value of {@link CalciteConnectionProperty#TIME_ZONE}. */
@@ -117,12 +117,12 @@ public interface CalciteConnectionConfig extends ConnectionConfig {
/** Returns the value of {@link CalciteConnectionProperty#META_TABLE_FACTORY},
* or a default meta table factory if not set. If
* {@code defaultMetaTableFactory} is not null, the result is never null. */
- @PolyNull T metaTableFactory(Class metaTableFactoryClass,
- @PolyNull T defaultMetaTableFactory);
+ T metaTableFactory(Class<@NonNull T> metaTableFactoryClass,
+ T defaultMetaTableFactory);
/** Returns the value of {@link CalciteConnectionProperty#META_COLUMN_FACTORY},
* or a default meta column factory if not set. If
* {@code defaultMetaColumnFactory} is not null, the result is never null. */
- @PolyNull T metaColumnFactory(Class metaColumnFactoryClass,
- @PolyNull T defaultMetaColumnFactory);
+ T metaColumnFactory(Class<@NonNull T> metaColumnFactoryClass,
+ T defaultMetaColumnFactory);
}
diff --git a/core/src/main/java/org/apache/calcite/config/CalciteConnectionConfigImpl.java b/core/src/main/java/org/apache/calcite/config/CalciteConnectionConfigImpl.java
index 221259cef959..3435d8f1a248 100644
--- a/core/src/main/java/org/apache/calcite/config/CalciteConnectionConfigImpl.java
+++ b/core/src/main/java/org/apache/calcite/config/CalciteConnectionConfigImpl.java
@@ -27,8 +27,8 @@
import org.apache.calcite.sql.validate.SqlConformance;
import org.apache.calcite.sql.validate.SqlConformanceEnum;
-import org.checkerframework.checker.nullness.qual.Nullable;
-import org.checkerframework.checker.nullness.qual.PolyNull;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
import java.util.List;
import java.util.Properties;
@@ -106,8 +106,8 @@ public boolean isSet(CalciteConnectionProperty property) {
.getEnum(NullCollation.class, NullCollation.HIGH);
}
- @Override public @PolyNull T fun(Class operatorTableClass,
- @PolyNull T defaultOperatorTable) {
+ @Override public T fun(Class<@NonNull T> operatorTableClass,
+ T defaultOperatorTable) {
final String fun =
CalciteConnectionProperty.FUN.wrap(properties).getString();
if (fun == null || fun.equals("") || fun.equals("standard")) {
@@ -153,14 +153,16 @@ public boolean isSet(CalciteConnectionProperty property) {
.getBoolean(lex().caseSensitive);
}
- @Override public @PolyNull T parserFactory(Class parserFactoryClass,
- @PolyNull T defaultParserFactory) {
+ @Override public T parserFactory(
+ Class<@NonNull T> parserFactoryClass,
+ T defaultParserFactory) {
return CalciteConnectionProperty.PARSER_FACTORY.wrap(properties)
.getPlugin(parserFactoryClass, defaultParserFactory);
}
- @Override public @PolyNull T schemaFactory(Class schemaFactoryClass,
- @PolyNull T defaultSchemaFactory) {
+ @Override public T schemaFactory(
+ Class<@NonNull T> schemaFactoryClass,
+ T defaultSchemaFactory) {
return CalciteConnectionProperty.SCHEMA_FACTORY.wrap(properties)
.getPlugin(schemaFactoryClass, defaultSchemaFactory);
}
@@ -179,8 +181,8 @@ public boolean isSet(CalciteConnectionProperty property) {
.getBoolean();
}
- @Override public @PolyNull T typeSystem(Class typeSystemClass,
- @PolyNull T defaultTypeSystem) {
+ @Override public T typeSystem(Class<@NonNull T> typeSystemClass,
+ T defaultTypeSystem) {
return CalciteConnectionProperty.TYPE_SYSTEM.wrap(properties)
.getPlugin(typeSystemClass, defaultTypeSystem);
}
@@ -220,16 +222,16 @@ public boolean isSet(CalciteConnectionProperty property) {
.getBoolean();
}
- @Override public @PolyNull T metaTableFactory(
- Class metaTableFactoryClass,
- @PolyNull T defaultMetaTableFactory) {
+ @Override public T metaTableFactory(
+ Class<@NonNull T> metaTableFactoryClass,
+ T defaultMetaTableFactory) {
return CalciteConnectionProperty.META_TABLE_FACTORY.wrap(properties)
.getPlugin(metaTableFactoryClass, defaultMetaTableFactory);
}
- @Override public @PolyNull T metaColumnFactory(
- Class metaColumnFactoryClass,
- @PolyNull T defaultMetaColumnFactory) {
+ @Override public T metaColumnFactory(
+ Class<@NonNull T> metaColumnFactoryClass,
+ T defaultMetaColumnFactory) {
return CalciteConnectionProperty.META_COLUMN_FACTORY.wrap(properties)
.getPlugin(metaColumnFactoryClass, defaultMetaColumnFactory);
}
diff --git a/core/src/main/java/org/apache/calcite/config/CalciteConnectionProperty.java b/core/src/main/java/org/apache/calcite/config/CalciteConnectionProperty.java
index 32079be2cfbc..6f9a3d032981 100644
--- a/core/src/main/java/org/apache/calcite/config/CalciteConnectionProperty.java
+++ b/core/src/main/java/org/apache/calcite/config/CalciteConnectionProperty.java
@@ -22,7 +22,7 @@
import org.apache.calcite.model.JsonSchema;
import org.apache.calcite.sql.validate.SqlConformanceEnum;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.HashMap;
import java.util.Locale;
diff --git a/core/src/main/java/org/apache/calcite/config/CalciteSystemProperty.java b/core/src/main/java/org/apache/calcite/config/CalciteSystemProperty.java
index 39ba86b01150..2228bfbe309d 100644
--- a/core/src/main/java/org/apache/calcite/config/CalciteSystemProperty.java
+++ b/core/src/main/java/org/apache/calcite/config/CalciteSystemProperty.java
@@ -18,7 +18,7 @@
import com.google.common.collect.ImmutableSet;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.io.File;
import java.io.IOException;
@@ -43,7 +43,7 @@
*
* @param the type of the property value
*/
-public final class CalciteSystemProperty {
+public final class CalciteSystemProperty {
/**
* Holds all system properties related with the Calcite.
*
@@ -677,6 +677,9 @@ private static Properties loadProperties() {
private final T value;
+ // apply() returns `? extends T`, which reads as @Nullable when T has a nullable bound.
+ // https://github.com/uber/NullAway/issues/1727
+ @SuppressWarnings("NullAway")
private CalciteSystemProperty(String key,
Function super @Nullable String, ? extends T> valueParser) {
this.value = valueParser.apply(PROPERTIES.getProperty(key));
diff --git a/core/src/main/java/org/apache/calcite/config/package-info.java b/core/src/main/java/org/apache/calcite/config/package-info.java
index 7cca08157a6a..15198da0f7b4 100644
--- a/core/src/main/java/org/apache/calcite/config/package-info.java
+++ b/core/src/main/java/org/apache/calcite/config/package-info.java
@@ -18,11 +18,7 @@
/**
* Configuration.
*/
-@DefaultQualifier(value = NonNull.class, locations = TypeUseLocation.FIELD)
-@DefaultQualifier(value = NonNull.class, locations = TypeUseLocation.PARAMETER)
-@DefaultQualifier(value = NonNull.class, locations = TypeUseLocation.RETURN)
+@NullMarked
package org.apache.calcite.config;
-import org.checkerframework.checker.nullness.qual.NonNull;
-import org.checkerframework.framework.qual.DefaultQualifier;
-import org.checkerframework.framework.qual.TypeUseLocation;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/org/apache/calcite/interpreter/AbstractSingleNode.java b/core/src/main/java/org/apache/calcite/interpreter/AbstractSingleNode.java
index 9d328bb787fb..4a22c16b73bc 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/AbstractSingleNode.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/AbstractSingleNode.java
@@ -23,6 +23,7 @@
*
* @param Type of relational expression
*/
+
abstract class AbstractSingleNode implements Node {
protected final Source source;
protected final Sink sink;
diff --git a/core/src/main/java/org/apache/calcite/interpreter/AggregateNode.java b/core/src/main/java/org/apache/calcite/interpreter/AggregateNode.java
index 1e4a97040cd0..0f8a8c2d3f0b 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/AggregateNode.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/AggregateNode.java
@@ -49,7 +49,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
@@ -93,7 +93,6 @@ public AggregateNode(Compiler compiler, Aggregate rel) {
ImmutableList.Builder builder = ImmutableList.builder();
for (AggregateCall aggregateCall : rel.getAggCallList()) {
- @SuppressWarnings("method.invocation.invalid")
AccumulatorFactory accumulator =
getAccumulator(compiler, aggregateCall, false);
builder.add(accumulator);
diff --git a/core/src/main/java/org/apache/calcite/interpreter/BindableConvention.java b/core/src/main/java/org/apache/calcite/interpreter/BindableConvention.java
index eea419d82f89..f36e4839562c 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/BindableConvention.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/BindableConvention.java
@@ -24,7 +24,7 @@
import org.apache.calcite.plan.RelTraitSet;
import org.apache.calcite.rel.RelNode;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Calling convention that returns results as an
diff --git a/core/src/main/java/org/apache/calcite/interpreter/Bindables.java b/core/src/main/java/org/apache/calcite/interpreter/Bindables.java
index f3a4d22ba12e..c303cc226c02 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/Bindables.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/Bindables.java
@@ -79,8 +79,8 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
-import org.checkerframework.checker.nullness.qual.Nullable;
import org.immutables.value.Value;
+import org.jspecify.annotations.Nullable;
import java.util.List;
import java.util.Map;
diff --git a/core/src/main/java/org/apache/calcite/interpreter/CollectNode.java b/core/src/main/java/org/apache/calcite/interpreter/CollectNode.java
index a72bae3fe58b..d57346f656d1 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/CollectNode.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/CollectNode.java
@@ -20,7 +20,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/interpreter/Compiler.java b/core/src/main/java/org/apache/calcite/interpreter/Compiler.java
index 41a5d5d73766..da014955cbe1 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/Compiler.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/Compiler.java
@@ -22,7 +22,7 @@
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rex.RexNode;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/interpreter/Context.java b/core/src/main/java/org/apache/calcite/interpreter/Context.java
index 09a7efdf66f2..1901a3df21ba 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/Context.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/Context.java
@@ -17,9 +17,9 @@
package org.apache.calcite.interpreter;
import org.apache.calcite.DataContext;
+import org.apache.calcite.annotations.MonotonicNonNull;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Context for executing a scalar expression in an interpreter.
@@ -28,7 +28,7 @@ public class Context {
public final DataContext root;
/** Values of incoming columns from all inputs. */
- public @Nullable Object @MonotonicNonNull [] values;
+ @MonotonicNonNull public @Nullable Object[] values;
Context(DataContext root) {
this.root = root;
diff --git a/core/src/main/java/org/apache/calcite/interpreter/InterpretableConverter.java b/core/src/main/java/org/apache/calcite/interpreter/InterpretableConverter.java
index 26e431828a3f..e89b8c062b02 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/InterpretableConverter.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/InterpretableConverter.java
@@ -25,7 +25,7 @@
import org.apache.calcite.rel.convert.ConverterImpl;
import org.apache.calcite.runtime.ArrayBindable;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/interpreter/InterpretableRel.java b/core/src/main/java/org/apache/calcite/interpreter/InterpretableRel.java
index e0e8dd745f5a..f546456a936a 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/InterpretableRel.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/InterpretableRel.java
@@ -20,7 +20,7 @@
import org.apache.calcite.jdbc.CalcitePrepare;
import org.apache.calcite.rel.RelNode;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.HashMap;
import java.util.LinkedHashMap;
diff --git a/core/src/main/java/org/apache/calcite/interpreter/Interpreter.java b/core/src/main/java/org/apache/calcite/interpreter/Interpreter.java
index 8bc82646a7ff..e6203ab31a83 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/Interpreter.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/Interpreter.java
@@ -49,9 +49,7 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
-import org.checkerframework.checker.initialization.qual.NotOnlyInitialized;
-import org.checkerframework.checker.initialization.qual.UnknownInitialization;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayDeque;
import java.util.ArrayList;
@@ -84,7 +82,6 @@ public Interpreter(DataContext dataContext, RelNode rootRel) {
final RelNode rel = optimize(rootRel);
final CompilerImpl compiler =
new Nodes.CoreCompiler(this, rootRel.getCluster());
- @SuppressWarnings("method.invocation.invalid")
Pair> pair = compiler.visitRoot(rel);
this.rootRel = pair.left;
this.nodes = ImmutableMap.copyOf(pair.right);
@@ -299,7 +296,6 @@ static class CompilerImpl extends RelVisitor
final ScalarCompiler scalarCompiler;
private final ReflectiveVisitDispatcher dispatcher =
ReflectUtil.createDispatcher(CompilerImpl.class, RelNode.class);
- @NotOnlyInitialized
protected final Interpreter interpreter;
protected @Nullable RelNode rootRel;
protected @Nullable RelNode rel;
@@ -311,7 +307,7 @@ static class CompilerImpl extends RelVisitor
private static final String REWRITE_METHOD_NAME = "rewrite";
private static final String VISIT_METHOD_NAME = "visit";
- CompilerImpl(@UnknownInitialization Interpreter interpreter, RelOptCluster cluster) {
+ CompilerImpl(Interpreter interpreter, RelOptCluster cluster) {
this.interpreter = interpreter;
this.scalarCompiler = new JaninoRexCompiler(cluster.getRexBuilder());
}
diff --git a/core/src/main/java/org/apache/calcite/interpreter/Interpreters.java b/core/src/main/java/org/apache/calcite/interpreter/Interpreters.java
index 9bb42719d8a7..d2ef6c97fcf2 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/Interpreters.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/Interpreters.java
@@ -21,7 +21,7 @@
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.runtime.ArrayBindable;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Utilities relating to {@link org.apache.calcite.interpreter.Interpreter}
diff --git a/core/src/main/java/org/apache/calcite/interpreter/JoinNode.java b/core/src/main/java/org/apache/calcite/interpreter/JoinNode.java
index f3c5e483349d..a87f8e001ee0 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/JoinNode.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/JoinNode.java
@@ -21,7 +21,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.HashSet;
diff --git a/core/src/main/java/org/apache/calcite/interpreter/MatchNode.java b/core/src/main/java/org/apache/calcite/interpreter/MatchNode.java
index f330a86038bb..da8a9454abdf 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/MatchNode.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/MatchNode.java
@@ -22,6 +22,7 @@
* Interpreter node that implements a
* {@link Match}.
*/
+
public class MatchNode extends AbstractSingleNode {
MatchNode(Compiler compiler, Match rel) {
super(compiler, rel);
diff --git a/core/src/main/java/org/apache/calcite/interpreter/Nodes.java b/core/src/main/java/org/apache/calcite/interpreter/Nodes.java
index 511eeaadf70b..c997a57b1881 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/Nodes.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/Nodes.java
@@ -34,8 +34,6 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.initialization.qual.UnknownInitialization;
-
/**
* Helper methods for {@link Node} and implementations for core relational
* expressions.
@@ -46,7 +44,7 @@ public class Nodes {
* that knows how to handle the core logical
* {@link org.apache.calcite.rel.RelNode}s. */
public static class CoreCompiler extends Interpreter.CompilerImpl {
- CoreCompiler(@UnknownInitialization Interpreter interpreter, RelOptCluster cluster) {
+ CoreCompiler(Interpreter interpreter, RelOptCluster cluster) {
super(interpreter, cluster);
}
diff --git a/core/src/main/java/org/apache/calcite/interpreter/NoneToBindableConverterRule.java b/core/src/main/java/org/apache/calcite/interpreter/NoneToBindableConverterRule.java
index fd4198b05621..6fb1e25a5b38 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/NoneToBindableConverterRule.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/NoneToBindableConverterRule.java
@@ -21,7 +21,7 @@
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.convert.ConverterRule;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Rule to convert a relational expression from
diff --git a/core/src/main/java/org/apache/calcite/interpreter/Row.java b/core/src/main/java/org/apache/calcite/interpreter/Row.java
index 073851d3b707..25d107c3396c 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/Row.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/Row.java
@@ -16,7 +16,7 @@
*/
package org.apache.calcite.interpreter;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.Arrays;
diff --git a/core/src/main/java/org/apache/calcite/interpreter/Scalar.java b/core/src/main/java/org/apache/calcite/interpreter/Scalar.java
index a1beda01ef34..2f19cedd1e35 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/Scalar.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/Scalar.java
@@ -18,7 +18,7 @@
import org.apache.calcite.DataContext;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.function.Function;
diff --git a/core/src/main/java/org/apache/calcite/interpreter/SortNode.java b/core/src/main/java/org/apache/calcite/interpreter/SortNode.java
index 0f393a3e68d8..b8b001a0388e 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/SortNode.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/SortNode.java
@@ -28,7 +28,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Ordering;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.math.BigDecimal;
import java.math.RoundingMode;
@@ -75,7 +75,7 @@ public SortNode(Compiler compiler, Sort rel) {
@Override public void run() throws InterruptedException {
final BigDecimal offset = getOffset();
- final @Nullable BigDecimal fetch = getFetch();
+ final BigDecimal fetch = getFetch();
// In pure limit mode. No sort required.
Row row;
loop:
@@ -166,7 +166,7 @@ private BigDecimal getOffset() {
private BigDecimal getValue(RexNode node, @Nullable Scalar scalar,
@Nullable Context context, String kind) {
- final @Nullable Object value;
+ final Object value;
if (node instanceof RexLiteral) {
value = RexLiteral.bigDecimalValue(node);
} else {
diff --git a/core/src/main/java/org/apache/calcite/interpreter/Source.java b/core/src/main/java/org/apache/calcite/interpreter/Source.java
index f6c49e398e5b..b6e91fc13dac 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/Source.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/Source.java
@@ -16,7 +16,7 @@
*/
package org.apache.calcite.interpreter;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Source of rows.
diff --git a/core/src/main/java/org/apache/calcite/interpreter/TableFunctionScanNode.java b/core/src/main/java/org/apache/calcite/interpreter/TableFunctionScanNode.java
index 749040e88ca6..295fb39bd83f 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/TableFunctionScanNode.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/TableFunctionScanNode.java
@@ -30,17 +30,20 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
+
+import static org.apache.calcite.linq4j.Nullness.castNonNull;
/**
* Interpreter node that implements a
* {@link TableFunctionScan}.
*/
+
public class TableFunctionScanNode implements Node {
private final Scalar scalar;
private final Context context;
private final Sink sink;
- private final Function1, Row> mapFn;
+ private final Function1<@Nullable Object, Row> mapFn;
private TableFunctionScanNode(Compiler compiler, TableFunctionScan rel) {
final RelDataType rowType = rel.getRowType();
@@ -49,18 +52,19 @@ private TableFunctionScanNode(Compiler compiler, TableFunctionScan rel) {
this.sink = compiler.sink(rel);
if (rowType.getFieldCount() == 1
&& rel.getElementType() != Object[].class) {
- this.mapFn = (Function1) Row::of;
+ this.mapFn = Row::of;
} else {
- this.mapFn = (Function1<@Nullable Object[], Row>) Row::asCopy;
+ this.mapFn = o -> Row.asCopy(castNonNull((@Nullable Object[]) o));
}
}
@Override public void run() throws InterruptedException {
final Object o = scalar.execute(context);
if (o instanceof Enumerable) {
- for (@SuppressWarnings({"unchecked", "rawtypes"})
- final Enumerator enumerator =
- ((Enumerable) o).select(mapFn).enumerator();
+ @SuppressWarnings("unchecked") final Enumerable<@Nullable Object> enumerable =
+ (Enumerable<@Nullable Object>) o;
+ for (final Enumerator enumerator =
+ enumerable.select(mapFn).enumerator();
enumerator.moveNext();) {
sink.send(enumerator.current());
}
diff --git a/core/src/main/java/org/apache/calcite/interpreter/TableScanNode.java b/core/src/main/java/org/apache/calcite/interpreter/TableScanNode.java
index 98ece3e24f26..b2fe5e487cdc 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/TableScanNode.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/TableScanNode.java
@@ -45,7 +45,7 @@
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
diff --git a/core/src/main/java/org/apache/calcite/interpreter/package-info.java b/core/src/main/java/org/apache/calcite/interpreter/package-info.java
index a4b0f3537a19..736a93b502b5 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/package-info.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/package-info.java
@@ -22,11 +22,7 @@
* preparation time is less, and so the total prepare + execute time is
* competitive for queries over small data sets.
*/
-@DefaultQualifier(value = NonNull.class, locations = TypeUseLocation.FIELD)
-@DefaultQualifier(value = NonNull.class, locations = TypeUseLocation.PARAMETER)
-@DefaultQualifier(value = NonNull.class, locations = TypeUseLocation.RETURN)
+@NullMarked
package org.apache.calcite.interpreter;
-import org.checkerframework.checker.nullness.qual.NonNull;
-import org.checkerframework.framework.qual.DefaultQualifier;
-import org.checkerframework.framework.qual.TypeUseLocation;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/org/apache/calcite/jdbc/CachingCalciteSchema.java b/core/src/main/java/org/apache/calcite/jdbc/CachingCalciteSchema.java
index 0350934f164e..277ccd343664 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/CachingCalciteSchema.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/CachingCalciteSchema.java
@@ -32,7 +32,7 @@
import com.google.common.collect.ImmutableSortedMap;
import com.google.common.collect.ImmutableSortedSet;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.Collection;
import java.util.List;
@@ -57,7 +57,6 @@ class CachingCalciteSchema extends CalciteSchema {
this(parent, schema, name, null, null, null, null, null, null, null, null);
}
- @SuppressWarnings({"argument.type.incompatible", "return.type.incompatible"})
private CachingCalciteSchema(@Nullable CalciteSchema parent, Schema schema,
String name,
@Nullable NameMap subSchemaMap,
diff --git a/core/src/main/java/org/apache/calcite/jdbc/CalciteConnection.java b/core/src/main/java/org/apache/calcite/jdbc/CalciteConnection.java
index 285d96664174..20117b0c568f 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/CalciteConnection.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/CalciteConnection.java
@@ -22,7 +22,7 @@
import org.apache.calcite.linq4j.QueryProvider;
import org.apache.calcite.schema.SchemaPlus;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.sql.Connection;
import java.sql.SQLException;
diff --git a/core/src/main/java/org/apache/calcite/jdbc/CalciteConnectionImpl.java b/core/src/main/java/org/apache/calcite/jdbc/CalciteConnectionImpl.java
index ac2fbc127f51..244e6b1adb03 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/CalciteConnectionImpl.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/CalciteConnectionImpl.java
@@ -72,7 +72,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Type;
import java.sql.ResultSet;
@@ -438,7 +438,8 @@ static class DataContextImpl implements DataContext {
final long currentOffset = localOffset;
final long sysOffset = TimeZone.getDefault().getOffset(time);
final String user = "sa";
- final String systemUser = System.getProperty("user.name");
+ final String systemUser =
+ requireNonNull(System.getProperty("user.name"), "user.name");
final String localeName = connection.config().locale();
final Locale locale = localeName != null
? Util.parseLocale(localeName) : Locale.ROOT;
diff --git a/core/src/main/java/org/apache/calcite/jdbc/CalciteFactory.java b/core/src/main/java/org/apache/calcite/jdbc/CalciteFactory.java
index 9100da4acc09..0e4fdcb143cb 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/CalciteFactory.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/CalciteFactory.java
@@ -21,7 +21,7 @@
import org.apache.calcite.avatica.AvaticaFactory;
import org.apache.calcite.avatica.UnregisteredDriver;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.Properties;
diff --git a/core/src/main/java/org/apache/calcite/jdbc/CalciteJdbc41Factory.java b/core/src/main/java/org/apache/calcite/jdbc/CalciteJdbc41Factory.java
index a4a2ee218228..04873007907f 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/CalciteJdbc41Factory.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/CalciteJdbc41Factory.java
@@ -27,7 +27,7 @@
import org.apache.calcite.avatica.QueryState;
import org.apache.calcite.avatica.UnregisteredDriver;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.io.InputStream;
import java.io.Reader;
diff --git a/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaColumnFactory.java b/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaColumnFactory.java
index 1f9d1a487b9e..9972729049b7 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaColumnFactory.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaColumnFactory.java
@@ -19,7 +19,7 @@
import org.apache.calcite.avatica.MetaImpl.MetaColumn;
import org.apache.calcite.schema.Table;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaColumnFactoryImpl.java b/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaColumnFactoryImpl.java
index be320626cf12..877df6a7e34d 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaColumnFactoryImpl.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaColumnFactoryImpl.java
@@ -19,7 +19,7 @@
import org.apache.calcite.avatica.MetaImpl.MetaColumn;
import org.apache.calcite.schema.Table;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/** Default implementation of CalciteMetaColumnFactoryImpl. */
public class CalciteMetaColumnFactoryImpl
diff --git a/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java b/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java
index e294643fca2a..0c4d0df1c198 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java
@@ -68,7 +68,7 @@
import com.google.common.primitives.Ints;
import com.google.common.primitives.Longs;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Field;
import java.sql.Connection;
diff --git a/core/src/main/java/org/apache/calcite/jdbc/CalcitePrepare.java b/core/src/main/java/org/apache/calcite/jdbc/CalcitePrepare.java
index 26e267ab47c9..c351550001ae 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/CalcitePrepare.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/CalcitePrepare.java
@@ -51,7 +51,7 @@
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@@ -224,7 +224,7 @@ public static Context peek() {
public static void pop(Context context) {
final Deque stack = THREAD_CONTEXT_STACK.get();
- Context x = castNonNull(stack).pop();
+ Context x = stack.pop();
assert x == context;
}
diff --git a/core/src/main/java/org/apache/calcite/jdbc/CalcitePreparedStatement.java b/core/src/main/java/org/apache/calcite/jdbc/CalcitePreparedStatement.java
index 9b30ba7f8065..1c5f00e9304d 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/CalcitePreparedStatement.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/CalcitePreparedStatement.java
@@ -19,7 +19,7 @@
import org.apache.calcite.avatica.AvaticaPreparedStatement;
import org.apache.calcite.avatica.Meta;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.sql.SQLException;
diff --git a/core/src/main/java/org/apache/calcite/jdbc/CalciteSchema.java b/core/src/main/java/org/apache/calcite/jdbc/CalciteSchema.java
index 53cffca3712e..92988239b608 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/CalciteSchema.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/CalciteSchema.java
@@ -42,7 +42,7 @@
import com.google.common.collect.ImmutableSortedMap;
import com.google.common.collect.ImmutableSortedSet;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collection;
@@ -694,7 +694,7 @@ CalciteSchema calciteSchema() {
return calciteSchema.plus();
}
- @Override public T unwrap(Class clazz) {
+ @Override public T unwrap(Class clazz) {
if (clazz.isInstance(this)) {
return clazz.cast(this);
}
diff --git a/core/src/main/java/org/apache/calcite/jdbc/CalciteStatement.java b/core/src/main/java/org/apache/calcite/jdbc/CalciteStatement.java
index 9b06b7fc2a62..8267813ba1a4 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/CalciteStatement.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/CalciteStatement.java
@@ -22,7 +22,7 @@
import org.apache.calcite.linq4j.Queryable;
import org.apache.calcite.server.CalciteServerStatement;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.sql.SQLException;
diff --git a/core/src/main/java/org/apache/calcite/jdbc/Driver.java b/core/src/main/java/org/apache/calcite/jdbc/Driver.java
index 63c916013e0d..d6629f245687 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/Driver.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/Driver.java
@@ -36,7 +36,7 @@
import org.apache.calcite.util.JsonBuilder;
import org.apache.calcite.util.Util;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.io.IOException;
import java.sql.SQLException;
diff --git a/core/src/main/java/org/apache/calcite/jdbc/JavaCollation.java b/core/src/main/java/org/apache/calcite/jdbc/JavaCollation.java
index 421d6a840439..b6aaca733a67 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/JavaCollation.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/JavaCollation.java
@@ -18,8 +18,7 @@
import org.apache.calcite.sql.SqlCollation;
-import org.checkerframework.checker.initialization.qual.UnderInitialization;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.nio.charset.Charset;
import java.text.Collator;
@@ -59,7 +58,6 @@ private static String getStrengthString(int strengthValue) {
}
@Override protected String generateCollationName(
- @UnderInitialization JavaCollation this,
Charset charset) {
return super.generateCollationName(charset) + "$JAVA_COLLATOR";
}
diff --git a/core/src/main/java/org/apache/calcite/jdbc/JavaRecordType.java b/core/src/main/java/org/apache/calcite/jdbc/JavaRecordType.java
index 2183c2ac28bc..cd3d80e6ffe4 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/JavaRecordType.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/JavaRecordType.java
@@ -19,7 +19,7 @@
import org.apache.calcite.rel.type.RelDataTypeField;
import org.apache.calcite.rel.type.RelRecordType;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
import java.util.Objects;
diff --git a/core/src/main/java/org/apache/calcite/jdbc/JavaTypeFactoryImpl.java b/core/src/main/java/org/apache/calcite/jdbc/JavaTypeFactoryImpl.java
index 8162f255e47c..f917b99fd6fc 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/JavaTypeFactoryImpl.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/JavaTypeFactoryImpl.java
@@ -38,11 +38,11 @@
import org.apache.calcite.util.Util;
import org.apache.calcite.util.UuidValue;
-import org.checkerframework.checker.nullness.qual.Nullable;
import org.joou.UByte;
import org.joou.UInteger;
import org.joou.ULong;
import org.joou.UShort;
+import org.jspecify.annotations.Nullable;
import org.locationtech.jts.geom.Geometry;
import java.lang.reflect.Field;
diff --git a/core/src/main/java/org/apache/calcite/jdbc/SimpleCalciteSchema.java b/core/src/main/java/org/apache/calcite/jdbc/SimpleCalciteSchema.java
index 2d52edf60093..8885a68d1600 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/SimpleCalciteSchema.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/SimpleCalciteSchema.java
@@ -30,7 +30,7 @@
import com.google.common.collect.ImmutableSortedMap;
import com.google.common.collect.ImmutableSortedSet;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.Collection;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/jdbc/package-info.java b/core/src/main/java/org/apache/calcite/jdbc/package-info.java
index 9a8221276703..997b39288b6f 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/package-info.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/package-info.java
@@ -18,11 +18,7 @@
/**
* JDBC driver for Calcite.
*/
-@DefaultQualifier(value = NonNull.class, locations = TypeUseLocation.FIELD)
-@DefaultQualifier(value = NonNull.class, locations = TypeUseLocation.PARAMETER)
-@DefaultQualifier(value = NonNull.class, locations = TypeUseLocation.RETURN)
+@NullMarked
package org.apache.calcite.jdbc;
-import org.checkerframework.checker.nullness.qual.NonNull;
-import org.checkerframework.framework.qual.DefaultQualifier;
-import org.checkerframework.framework.qual.TypeUseLocation;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/org/apache/calcite/materialize/Lattice.java b/core/src/main/java/org/apache/calcite/materialize/Lattice.java
index 7ec17ea52f46..9eecc3d2804e 100644
--- a/core/src/main/java/org/apache/calcite/materialize/Lattice.java
+++ b/core/src/main/java/org/apache/calcite/materialize/Lattice.java
@@ -16,6 +16,8 @@
*/
package org.apache.calcite.materialize;
+import org.apache.calcite.annotations.MonotonicNonNull;
+import org.apache.calcite.annotations.RequiresNonNull;
import org.apache.calcite.avatica.AvaticaUtils;
import org.apache.calcite.config.CalciteSystemProperty;
import org.apache.calcite.jdbc.CalcitePrepare;
@@ -66,10 +68,7 @@
import com.google.common.collect.Multimap;
import com.google.common.collect.Ordering;
-import org.checkerframework.checker.initialization.qual.UnknownInitialization;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
-import org.checkerframework.checker.nullness.qual.Nullable;
-import org.checkerframework.checker.nullness.qual.RequiresNonNull;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
@@ -137,7 +136,6 @@ private Lattice(CalciteSchema rootSchema, LatticeRootNode rootNode,
}
checkArgument(rowCountEstimate > 0d);
this.rowCountEstimate = rowCountEstimate;
- @SuppressWarnings("argument.type.incompatible")
LatticeStatisticProvider statisticProvider =
requireNonNull(statisticProviderFactory.apply(this));
this.statisticProvider = statisticProvider;
@@ -150,7 +148,6 @@ public static Lattice create(CalciteSchema schema, String sql, boolean auto) {
@RequiresNonNull({"rootNode", "defaultMeasures", "columns"})
private boolean isValid(
- @UnknownInitialization Lattice this,
Litmus litmus) {
if (!rootNode.isValid(litmus)) {
return false;
@@ -853,7 +850,7 @@ public Builder(LatticeSpace space, CalciteSchema schema, String sql) {
final DirectedGraph graph =
DefaultDirectedGraph.create(Edge.FACTORY);
final List vertices = new ArrayList<>();
- for (Pair p : Pair.zip(relNodes, aliases)) {
+ for (Pair p : Pair.zip(relNodes, aliases)) {
final LatticeTable table = space.register(p.left.getTable());
final Vertex vertex = new Vertex(table, p.right);
graph.addVertex(vertex);
@@ -1161,7 +1158,7 @@ void fixUp(MutableNode node) {
SqlValidatorUtil.uniquify(name, columnAliases,
SqlValidatorUtil.ATTEMPT_SUGGESTER);
final BaseColumn column =
- new BaseColumn(c++, castNonNull(node.alias), name, alias);
+ new BaseColumn(c++, node.alias, name, alias);
columnList.add(column);
columnAliasList.put(name, column); // name before it is made unique
}
diff --git a/core/src/main/java/org/apache/calcite/materialize/LatticeNode.java b/core/src/main/java/org/apache/calcite/materialize/LatticeNode.java
index 6e8225db15fe..3a7dd2ee4ffd 100644
--- a/core/src/main/java/org/apache/calcite/materialize/LatticeNode.java
+++ b/core/src/main/java/org/apache/calcite/materialize/LatticeNode.java
@@ -21,8 +21,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.initialization.qual.Initialized;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
@@ -77,8 +76,7 @@ public abstract class LatticeNode {
if (i++ > 0) {
sb.append(' ');
}
- @SuppressWarnings({"argument.type.incompatible", "assignment.type.incompatible"})
- final @Initialized LatticeChildNode node =
+ final LatticeChildNode node =
new LatticeChildNode(space, this, mutableChild);
sb.append(node.digest);
b.add(node);
diff --git a/core/src/main/java/org/apache/calcite/materialize/LatticeRootNode.java b/core/src/main/java/org/apache/calcite/materialize/LatticeRootNode.java
index ecf244ad2903..607b882de7bb 100644
--- a/core/src/main/java/org/apache/calcite/materialize/LatticeRootNode.java
+++ b/core/src/main/java/org/apache/calcite/materialize/LatticeRootNode.java
@@ -29,7 +29,6 @@ public class LatticeRootNode extends LatticeNode {
public final ImmutableList descendants;
final ImmutableList paths;
- @SuppressWarnings("method.invocation.invalid")
LatticeRootNode(LatticeSpace space, MutableNode mutableNode) {
super(space, null, mutableNode);
diff --git a/core/src/main/java/org/apache/calcite/materialize/LatticeSpace.java b/core/src/main/java/org/apache/calcite/materialize/LatticeSpace.java
index 17c1c4d4100a..4a1b601e530e 100644
--- a/core/src/main/java/org/apache/calcite/materialize/LatticeSpace.java
+++ b/core/src/main/java/org/apache/calcite/materialize/LatticeSpace.java
@@ -25,8 +25,6 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.initialization.qual.NotOnlyInitialized;
-
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -41,8 +39,7 @@
class LatticeSpace {
final SqlStatisticProvider statisticProvider;
private final Map, LatticeTable> tableMap = new HashMap<>();
- @SuppressWarnings("assignment.type.incompatible")
- final @NotOnlyInitialized AttributedDirectedGraph g =
+ final AttributedDirectedGraph g =
new AttributedDirectedGraph<>(new Step.Factory(this));
private final Map, String> simpleTableNames = new HashMap<>();
private final Set simpleNames = new HashSet<>();
diff --git a/core/src/main/java/org/apache/calcite/materialize/LatticeSuggester.java b/core/src/main/java/org/apache/calcite/materialize/LatticeSuggester.java
index 1edb9063c51d..1b06e6cf2f79 100644
--- a/core/src/main/java/org/apache/calcite/materialize/LatticeSuggester.java
+++ b/core/src/main/java/org/apache/calcite/materialize/LatticeSuggester.java
@@ -55,7 +55,7 @@
import com.google.common.collect.LinkedListMultimap;
import com.google.common.collect.Multimap;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collection;
@@ -191,7 +191,7 @@ private void addFrame(Query q, Frame frame, List lattices) {
case 1:
final StepRef edge = edges.get(0);
final MutableNode parent = nodes.get(edge.source());
- final List key =
+ final List<@Nullable Object> key =
FlatLists.of(parent, tableRef.table, edge.step.keys);
final MutableNode existingNode = nodesByParent.get(key);
if (existingNode == null) {
@@ -467,7 +467,6 @@ private static void frames(List frames, final Query q, RelNode r) {
final ImmutableNullableList.Builder<@Nullable ColRef> columnBuilder =
ImmutableNullableList.builder();
for (Pair p : project.getNamedProjects()) {
- @SuppressWarnings("method.invocation.invalid")
ColRef colRef = toColRef(p.left, p.right);
columnBuilder.add(colRef);
}
diff --git a/core/src/main/java/org/apache/calcite/materialize/LatticeTable.java b/core/src/main/java/org/apache/calcite/materialize/LatticeTable.java
index 5e5bdaeb7deb..daa132ef7a61 100644
--- a/core/src/main/java/org/apache/calcite/materialize/LatticeTable.java
+++ b/core/src/main/java/org/apache/calcite/materialize/LatticeTable.java
@@ -20,7 +20,7 @@
import org.apache.calcite.rel.type.RelDataTypeField;
import org.apache.calcite.util.Util;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import static java.util.Objects.requireNonNull;
diff --git a/core/src/main/java/org/apache/calcite/materialize/MaterializationActor.java b/core/src/main/java/org/apache/calcite/materialize/MaterializationActor.java
index 0475fc40aa1d..8ff7dd915615 100644
--- a/core/src/main/java/org/apache/calcite/materialize/MaterializationActor.java
+++ b/core/src/main/java/org/apache/calcite/materialize/MaterializationActor.java
@@ -22,7 +22,7 @@
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.HashMap;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/materialize/MaterializationKey.java b/core/src/main/java/org/apache/calcite/materialize/MaterializationKey.java
index 3661a7f45f49..7a206eae0135 100644
--- a/core/src/main/java/org/apache/calcite/materialize/MaterializationKey.java
+++ b/core/src/main/java/org/apache/calcite/materialize/MaterializationKey.java
@@ -16,7 +16,7 @@
*/
package org.apache.calcite.materialize;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.io.Serializable;
import java.util.UUID;
diff --git a/core/src/main/java/org/apache/calcite/materialize/MaterializationService.java b/core/src/main/java/org/apache/calcite/materialize/MaterializationService.java
index 195f50fb9171..6ac184d177ee 100644
--- a/core/src/main/java/org/apache/calcite/materialize/MaterializationService.java
+++ b/core/src/main/java/org/apache/calcite/materialize/MaterializationService.java
@@ -41,7 +41,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.lang.reflect.Type;
import java.util.ArrayList;
diff --git a/core/src/main/java/org/apache/calcite/materialize/MutableNode.java b/core/src/main/java/org/apache/calcite/materialize/MutableNode.java
index 278c946966d0..52f5fc31765f 100644
--- a/core/src/main/java/org/apache/calcite/materialize/MutableNode.java
+++ b/core/src/main/java/org/apache/calcite/materialize/MutableNode.java
@@ -20,7 +20,7 @@
import com.google.common.collect.Ordering;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.Comparator;
@@ -69,7 +69,6 @@ class MutableNode {
}
/** Creates a non-root node. */
- @SuppressWarnings("argument.type.incompatible")
MutableNode(LatticeTable table, @Nullable MutableNode parent, @Nullable Step step) {
this.table = requireNonNull(table, "table");
this.parent = parent;
diff --git a/core/src/main/java/org/apache/calcite/materialize/Path.java b/core/src/main/java/org/apache/calcite/materialize/Path.java
index 68ee4f5fc053..e02187639442 100644
--- a/core/src/main/java/org/apache/calcite/materialize/Path.java
+++ b/core/src/main/java/org/apache/calcite/materialize/Path.java
@@ -18,7 +18,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/materialize/SqlLatticeStatisticProvider.java b/core/src/main/java/org/apache/calcite/materialize/SqlLatticeStatisticProvider.java
index bb42685dffa6..9a1239319ef1 100644
--- a/core/src/main/java/org/apache/calcite/materialize/SqlLatticeStatisticProvider.java
+++ b/core/src/main/java/org/apache/calcite/materialize/SqlLatticeStatisticProvider.java
@@ -25,7 +25,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/materialize/Step.java b/core/src/main/java/org/apache/calcite/materialize/Step.java
index ecbabb32e20b..9c4785896c5f 100644
--- a/core/src/main/java/org/apache/calcite/materialize/Step.java
+++ b/core/src/main/java/org/apache/calcite/materialize/Step.java
@@ -24,9 +24,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Ordering;
-import org.checkerframework.checker.initialization.qual.NotOnlyInitialized;
-import org.checkerframework.checker.initialization.qual.UnderInitialization;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
import java.util.Objects;
@@ -145,10 +143,9 @@ private static double cardinality(SqlStatisticProvider statisticProvider,
/** Creates {@link Step} instances. */
static class Factory implements AttributedDirectedGraph.AttributedEdgeFactory<
LatticeTable, Step> {
- private final @NotOnlyInitialized LatticeSpace space;
+ private final LatticeSpace space;
- @SuppressWarnings("type.argument.type.incompatible")
- Factory(@UnderInitialization LatticeSpace space) {
+ Factory(LatticeSpace space) {
this.space = requireNonNull(space, "space");
}
diff --git a/core/src/main/java/org/apache/calcite/materialize/TileKey.java b/core/src/main/java/org/apache/calcite/materialize/TileKey.java
index 6a16ecb2244c..c1425d9b33ef 100644
--- a/core/src/main/java/org/apache/calcite/materialize/TileKey.java
+++ b/core/src/main/java/org/apache/calcite/materialize/TileKey.java
@@ -20,7 +20,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.Objects;
diff --git a/core/src/main/java/org/apache/calcite/materialize/TileSuggester.java b/core/src/main/java/org/apache/calcite/materialize/TileSuggester.java
index e5c19de71987..5cad260b7b8c 100644
--- a/core/src/main/java/org/apache/calcite/materialize/TileSuggester.java
+++ b/core/src/main/java/org/apache/calcite/materialize/TileSuggester.java
@@ -21,7 +21,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.pentaho.aggdes.algorithm.Algorithm;
import org.pentaho.aggdes.algorithm.Progress;
import org.pentaho.aggdes.algorithm.Result;
diff --git a/core/src/main/java/org/apache/calcite/materialize/package-info.java b/core/src/main/java/org/apache/calcite/materialize/package-info.java
index 4939c315ce97..1554ece9caf9 100644
--- a/core/src/main/java/org/apache/calcite/materialize/package-info.java
+++ b/core/src/main/java/org/apache/calcite/materialize/package-info.java
@@ -32,11 +32,7 @@
* instantiating materializations from the intermediate results of queries, and
* recognize what materializations would be useful based on actual query load.
*/
-@DefaultQualifier(value = NonNull.class, locations = TypeUseLocation.FIELD)
-@DefaultQualifier(value = NonNull.class, locations = TypeUseLocation.PARAMETER)
-@DefaultQualifier(value = NonNull.class, locations = TypeUseLocation.RETURN)
+@NullMarked
package org.apache.calcite.materialize;
-import org.checkerframework.checker.nullness.qual.NonNull;
-import org.checkerframework.framework.qual.DefaultQualifier;
-import org.checkerframework.framework.qual.TypeUseLocation;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/org/apache/calcite/model/ClassNameFilter.java b/core/src/main/java/org/apache/calcite/model/ClassNameFilter.java
index 0c37c2c5cbea..51dbc81f42e4 100644
--- a/core/src/main/java/org/apache/calcite/model/ClassNameFilter.java
+++ b/core/src/main/java/org/apache/calcite/model/ClassNameFilter.java
@@ -21,7 +21,7 @@
import com.google.common.collect.ImmutableList;
import org.apiguardian.api.API;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
diff --git a/core/src/main/java/org/apache/calcite/model/JsonCustomSchema.java b/core/src/main/java/org/apache/calcite/model/JsonCustomSchema.java
index dee32b6ec80b..793787972764 100644
--- a/core/src/main/java/org/apache/calcite/model/JsonCustomSchema.java
+++ b/core/src/main/java/org/apache/calcite/model/JsonCustomSchema.java
@@ -19,7 +19,7 @@
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
import java.util.Map;
diff --git a/core/src/main/java/org/apache/calcite/model/JsonCustomTable.java b/core/src/main/java/org/apache/calcite/model/JsonCustomTable.java
index ef70381da75e..5ee555f28553 100644
--- a/core/src/main/java/org/apache/calcite/model/JsonCustomTable.java
+++ b/core/src/main/java/org/apache/calcite/model/JsonCustomTable.java
@@ -19,7 +19,7 @@
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.Map;
diff --git a/core/src/main/java/org/apache/calcite/model/JsonFunction.java b/core/src/main/java/org/apache/calcite/model/JsonFunction.java
index 0adf4f886961..2805e3a4ff81 100644
--- a/core/src/main/java/org/apache/calcite/model/JsonFunction.java
+++ b/core/src/main/java/org/apache/calcite/model/JsonFunction.java
@@ -19,7 +19,7 @@
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/model/JsonJdbcSchema.java b/core/src/main/java/org/apache/calcite/model/JsonJdbcSchema.java
index 99edce2b22e3..4dbe2d6b49ba 100644
--- a/core/src/main/java/org/apache/calcite/model/JsonJdbcSchema.java
+++ b/core/src/main/java/org/apache/calcite/model/JsonJdbcSchema.java
@@ -19,7 +19,7 @@
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/model/JsonLattice.java b/core/src/main/java/org/apache/calcite/model/JsonLattice.java
index 0f98143d8d20..f6666cea6ad6 100644
--- a/core/src/main/java/org/apache/calcite/model/JsonLattice.java
+++ b/core/src/main/java/org/apache/calcite/model/JsonLattice.java
@@ -20,7 +20,7 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/model/JsonMapSchema.java b/core/src/main/java/org/apache/calcite/model/JsonMapSchema.java
index 98d06754ae1b..1b967c88f593 100644
--- a/core/src/main/java/org/apache/calcite/model/JsonMapSchema.java
+++ b/core/src/main/java/org/apache/calcite/model/JsonMapSchema.java
@@ -19,7 +19,7 @@
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/model/JsonMaterialization.java b/core/src/main/java/org/apache/calcite/model/JsonMaterialization.java
index 55969be47f5a..be74e71840b1 100644
--- a/core/src/main/java/org/apache/calcite/model/JsonMaterialization.java
+++ b/core/src/main/java/org/apache/calcite/model/JsonMaterialization.java
@@ -19,7 +19,7 @@
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/model/JsonMeasure.java b/core/src/main/java/org/apache/calcite/model/JsonMeasure.java
index 8485eb35f127..4705a3069a46 100644
--- a/core/src/main/java/org/apache/calcite/model/JsonMeasure.java
+++ b/core/src/main/java/org/apache/calcite/model/JsonMeasure.java
@@ -19,7 +19,7 @@
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import static java.util.Objects.requireNonNull;
diff --git a/core/src/main/java/org/apache/calcite/model/JsonRoot.java b/core/src/main/java/org/apache/calcite/model/JsonRoot.java
index 0ca140e9cca6..9ba616a378c7 100644
--- a/core/src/main/java/org/apache/calcite/model/JsonRoot.java
+++ b/core/src/main/java/org/apache/calcite/model/JsonRoot.java
@@ -19,7 +19,7 @@
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/model/JsonSchema.java b/core/src/main/java/org/apache/calcite/model/JsonSchema.java
index bb820ebf43b7..cec7782e5e99 100644
--- a/core/src/main/java/org/apache/calcite/model/JsonSchema.java
+++ b/core/src/main/java/org/apache/calcite/model/JsonSchema.java
@@ -19,7 +19,7 @@
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/model/JsonStream.java b/core/src/main/java/org/apache/calcite/model/JsonStream.java
index 886fd9143d79..43dc42955fc2 100644
--- a/core/src/main/java/org/apache/calcite/model/JsonStream.java
+++ b/core/src/main/java/org/apache/calcite/model/JsonStream.java
@@ -19,7 +19,7 @@
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Information about whether a table allows streaming.
diff --git a/core/src/main/java/org/apache/calcite/model/JsonTable.java b/core/src/main/java/org/apache/calcite/model/JsonTable.java
index f6d977b54c0a..fb09bb75ab51 100644
--- a/core/src/main/java/org/apache/calcite/model/JsonTable.java
+++ b/core/src/main/java/org/apache/calcite/model/JsonTable.java
@@ -19,7 +19,7 @@
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/model/JsonTile.java b/core/src/main/java/org/apache/calcite/model/JsonTile.java
index 33e087096f1d..86ed32b7e50f 100644
--- a/core/src/main/java/org/apache/calcite/model/JsonTile.java
+++ b/core/src/main/java/org/apache/calcite/model/JsonTile.java
@@ -20,7 +20,7 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/model/JsonType.java b/core/src/main/java/org/apache/calcite/model/JsonType.java
index bc3f7fd30e45..3eda71fd85fc 100644
--- a/core/src/main/java/org/apache/calcite/model/JsonType.java
+++ b/core/src/main/java/org/apache/calcite/model/JsonType.java
@@ -19,7 +19,7 @@
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/model/JsonView.java b/core/src/main/java/org/apache/calcite/model/JsonView.java
index 9c84f430c0ad..87b9448fb5a2 100644
--- a/core/src/main/java/org/apache/calcite/model/JsonView.java
+++ b/core/src/main/java/org/apache/calcite/model/JsonView.java
@@ -19,7 +19,7 @@
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/model/ModelHandler.java b/core/src/main/java/org/apache/calcite/model/ModelHandler.java
index d9b064392af1..31792064afb0 100644
--- a/core/src/main/java/org/apache/calcite/model/ModelHandler.java
+++ b/core/src/main/java/org/apache/calcite/model/ModelHandler.java
@@ -53,7 +53,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -106,7 +106,6 @@ public ModelHandler(SchemaPlus rootSchema, String uri) throws IOException {
* by reflection from the model against {@code classNameFilter}. Use
* this to apply a stricter (or more permissive) filter than the
* standard one. */
- @SuppressWarnings("method.invocation.invalid")
public ModelHandler(SchemaPlus rootSchema, String uri,
ClassNameFilter classNameFilter) throws IOException {
super();
diff --git a/core/src/main/java/org/apache/calcite/model/package-info.java b/core/src/main/java/org/apache/calcite/model/package-info.java
index fdedb4c3ab8a..13ae91f4b968 100644
--- a/core/src/main/java/org/apache/calcite/model/package-info.java
+++ b/core/src/main/java/org/apache/calcite/model/package-info.java
@@ -33,11 +33,7 @@
* There are several examples of schemas in the
* tutorial .
*/
-@DefaultQualifier(value = NonNull.class, locations = TypeUseLocation.FIELD)
-@DefaultQualifier(value = NonNull.class, locations = TypeUseLocation.PARAMETER)
-@DefaultQualifier(value = NonNull.class, locations = TypeUseLocation.RETURN)
+@NullMarked
package org.apache.calcite.model;
-import org.checkerframework.checker.nullness.qual.NonNull;
-import org.checkerframework.framework.qual.DefaultQualifier;
-import org.checkerframework.framework.qual.TypeUseLocation;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/org/apache/calcite/package-info.java b/core/src/main/java/org/apache/calcite/package-info.java
index add98daeb3e8..a5ba6cd989d8 100644
--- a/core/src/main/java/org/apache/calcite/package-info.java
+++ b/core/src/main/java/org/apache/calcite/package-info.java
@@ -19,4 +19,7 @@
* Main package for Calcite, the dynamic data management platform.
*/
@CalciteImmutable
+@NullMarked
package org.apache.calcite;
+
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java b/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java
index 654f25689395..c3fa899b63ab 100644
--- a/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java
+++ b/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java
@@ -16,6 +16,7 @@
*/
package org.apache.calcite.plan;
+import org.apache.calcite.annotations.MonotonicNonNull;
import org.apache.calcite.plan.volcano.RelSubset;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.metadata.RelMetadataProvider;
@@ -30,10 +31,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
-import org.checkerframework.checker.initialization.qual.UnknownInitialization;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
-import org.checkerframework.checker.nullness.qual.Nullable;
-import org.checkerframework.dataflow.qual.Pure;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import java.text.NumberFormat;
@@ -104,9 +102,10 @@ protected AbstractRelOptPlanner(RelOptCostFactory costFactory,
this.context = context;
this.cancelFlag =
- context.maybeUnwrap(CancelFlag.class)
- .map(flag -> flag.atomicBoolean)
- .orElseGet(AtomicBoolean::new);
+ requireNonNull(
+ context.maybeUnwrap(CancelFlag.class)
+ .map(flag -> flag.atomicBoolean)
+ .orElseGet(AtomicBoolean::new));
// Add abstract RelNode classes. No RelNodes will ever be registered with
// these types, but some operands may use them.
@@ -275,7 +274,6 @@ protected void onNewClass(RelNode node) {
}
@Override public void addListener(
- @UnknownInitialization AbstractRelOptPlanner this,
RelOptListener newListener) {
if (listener == null) {
listener = new MulticastRelOptListener();
@@ -467,7 +465,6 @@ protected void notifyDiscard(RelNode rel) {
}
}
- @Pure
public @Nullable RelOptListener getListener() {
return listener;
}
diff --git a/core/src/main/java/org/apache/calcite/plan/Contexts.java b/core/src/main/java/org/apache/calcite/plan/Contexts.java
index 9ffc22c63ccb..1e37d5570edf 100644
--- a/core/src/main/java/org/apache/calcite/plan/Contexts.java
+++ b/core/src/main/java/org/apache/calcite/plan/Contexts.java
@@ -20,7 +20,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
@@ -121,7 +121,7 @@ private static class WrapContext implements Context {
this.target = requireNonNull(target, "target");
}
- @Override public @Nullable T unwrap(Class clazz) {
+ @Override public @Nullable T unwrap(Class clazz) {
if (clazz.isInstance(target)) {
return clazz.cast(target);
}
@@ -131,7 +131,7 @@ private static class WrapContext implements Context {
/** Empty context. */
static class EmptyContext implements Context {
- @Override public @Nullable T unwrap(Class clazz) {
+ @Override public @Nullable T unwrap(Class clazz) {
return null;
}
}
@@ -147,7 +147,7 @@ private static final class ChainContext implements Context {
}
}
- @Override public @Nullable T unwrap(Class clazz) {
+ @Override public @Nullable T unwrap(Class clazz) {
for (Context context : contexts) {
final T t = context.unwrap(clazz);
if (t != null) {
diff --git a/core/src/main/java/org/apache/calcite/plan/Convention.java b/core/src/main/java/org/apache/calcite/plan/Convention.java
index 47bfe99e39b6..dec4d88d20f6 100644
--- a/core/src/main/java/org/apache/calcite/plan/Convention.java
+++ b/core/src/main/java/org/apache/calcite/plan/Convention.java
@@ -19,7 +19,7 @@
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.core.RelFactories;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Calling convention trait.
diff --git a/core/src/main/java/org/apache/calcite/plan/ConventionTraitDef.java b/core/src/main/java/org/apache/calcite/plan/ConventionTraitDef.java
index a68f5a22bc19..3f011ef4e7f5 100644
--- a/core/src/main/java/org/apache/calcite/plan/ConventionTraitDef.java
+++ b/core/src/main/java/org/apache/calcite/plan/ConventionTraitDef.java
@@ -16,6 +16,7 @@
*/
package org.apache.calcite.plan;
+import org.apache.calcite.annotations.MonotonicNonNull;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.convert.ConverterRule;
import org.apache.calcite.rel.metadata.RelMetadataQuery;
@@ -31,8 +32,7 @@
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
@@ -227,7 +227,7 @@ private static final class ConversionData {
final Multimap, ConverterRule> mapArcToConverterRule =
HashMultimap.create();
- private Graphs.@MonotonicNonNull FrozenGraph pathMap;
+ @MonotonicNonNull private Graphs.FrozenGraph pathMap;
public List> getPaths(
Convention fromConvention,
diff --git a/core/src/main/java/org/apache/calcite/plan/RelCompositeTrait.java b/core/src/main/java/org/apache/calcite/plan/RelCompositeTrait.java
index 1a0f840af0ce..a347867f6089 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelCompositeTrait.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelCompositeTrait.java
@@ -19,7 +19,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Ordering;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.Arrays;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptAbstractTable.java b/core/src/main/java/org/apache/calcite/plan/RelOptAbstractTable.java
index efd9aec68ef0..962f3ad886e4 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptAbstractTable.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptAbstractTable.java
@@ -31,7 +31,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.Collections;
import java.util.List;
@@ -88,7 +88,7 @@ public String getName() {
return RelDistributions.BROADCAST_DISTRIBUTED;
}
- @Override public @Nullable T unwrap(Class clazz) {
+ @Override public @Nullable T unwrap(Class clazz) {
return clazz.isInstance(this)
? clazz.cast(this)
: null;
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptCluster.java b/core/src/main/java/org/apache/calcite/plan/RelOptCluster.java
index a5c9d3395ef2..35ac779ed9ec 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptCluster.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptCluster.java
@@ -16,6 +16,7 @@
*/
package org.apache.calcite.plan;
+import org.apache.calcite.annotations.EnsuresNonNull;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.core.CorrelationId;
import org.apache.calcite.rel.hint.HintStrategyTable;
@@ -29,17 +30,13 @@
import org.apache.calcite.rex.RexBuilder;
import org.apache.calcite.rex.RexNode;
-import org.checkerframework.checker.initialization.qual.UnknownInitialization;
-import org.checkerframework.checker.nullness.qual.EnsuresNonNull;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Supplier;
-import static org.apache.calcite.linq4j.Nullness.castNonNull;
-
import static java.util.Objects.requireNonNull;
/**
@@ -112,7 +109,7 @@ public static RelOptCluster create(RelOptPlanner planner,
@Deprecated // to be removed before 2.0
public RelOptQuery getQuery() {
- return new RelOptQuery(castNonNull(planner), nextCorrel, mapCorrelToRel);
+ return new RelOptQuery(planner, nextCorrel, mapCorrelToRel);
}
@Deprecated // to be removed before 2.0
@@ -149,7 +146,6 @@ public RexBuilder getRexBuilder() {
@EnsuresNonNull({"this.metadataProvider", "this.metadataFactory"})
@SuppressWarnings("deprecation")
public void setMetadataProvider(
- @UnknownInitialization RelOptCluster this,
RelMetadataProvider metadataProvider) {
this.metadataProvider = metadataProvider;
this.metadataFactory =
@@ -182,7 +178,6 @@ public MetadataFactory getMetadataFactory() {
*/
@EnsuresNonNull("this.mqSupplier")
public void setMetadataQuerySupplier(
- @UnknownInitialization RelOptCluster this,
Supplier mqSupplier) {
this.mqSupplier = mqSupplier;
}
@@ -196,7 +191,7 @@ public void setMetadataQuerySupplier(
* method, then use {@link RelOptRuleCall#getMetadataQuery()} instead. */
public RelMetadataQuery getMetadataQuery() {
if (mq == null) {
- mq = castNonNull(mqSupplier).get();
+ mq = mqSupplier.get();
}
return mq;
}
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptCostImpl.java b/core/src/main/java/org/apache/calcite/plan/RelOptCostImpl.java
index 66a1080ca0a7..102417f6e6ca 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptCostImpl.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptCostImpl.java
@@ -16,7 +16,7 @@
*/
package org.apache.calcite.plan;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* RelOptCostImpl provides a default implementation for the {@link RelOptCost}
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptLattice.java b/core/src/main/java/org/apache/calcite/plan/RelOptLattice.java
index e5d4988643f1..568093986ffe 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptLattice.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptLattice.java
@@ -25,7 +25,7 @@
import org.apache.calcite.util.ImmutableBitSet;
import org.apache.calcite.util.Pair;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptListener.java b/core/src/main/java/org/apache/calcite/plan/RelOptListener.java
index 92c5e6226c7d..1ded48a840f0 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptListener.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptListener.java
@@ -18,7 +18,7 @@
import org.apache.calcite.rel.RelNode;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.EventListener;
import java.util.EventObject;
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptMaterialization.java b/core/src/main/java/org/apache/calcite/plan/RelOptMaterialization.java
index 6cc5569bc731..d2f7de83221a 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptMaterialization.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptMaterialization.java
@@ -38,7 +38,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptPlanner.java b/core/src/main/java/org/apache/calcite/plan/RelOptPlanner.java
index 5341819ce9dd..ed795c8e7d32 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptPlanner.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptPlanner.java
@@ -25,7 +25,7 @@
import org.apache.calcite.util.CancelFlag;
import org.apache.calcite.util.trace.CalciteTrace;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptPredicateList.java b/core/src/main/java/org/apache/calcite/plan/RelOptPredicateList.java
index 30caf49e59aa..18455a5579e1 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptPredicateList.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptPredicateList.java
@@ -27,7 +27,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.Collection;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptQuery.java b/core/src/main/java/org/apache/calcite/plan/RelOptQuery.java
index c617e3fb0cab..8778211a95c3 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptQuery.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptQuery.java
@@ -21,7 +21,7 @@
import org.apache.calcite.rel.type.RelDataTypeFactory;
import org.apache.calcite.rex.RexBuilder;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.HashMap;
import java.util.Map;
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptRule.java b/core/src/main/java/org/apache/calcite/plan/RelOptRule.java
index 8a6a002fb44b..d63a8ced5cf0 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptRule.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptRule.java
@@ -26,8 +26,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
-import org.checkerframework.checker.initialization.qual.UnderInitialization;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
@@ -379,7 +378,6 @@ public static RelOptRuleOperandChildren any() {
* @return Flattened list of operands
*/
private List flattenOperands(
- @UnderInitialization RelOptRule this,
RelOptRuleOperand rootOperand) {
final List operandList = new ArrayList<>();
@@ -400,7 +398,6 @@ private List flattenOperands(
* @param parentOperand Parent of this operand
*/
private void flattenRecurse(
- @UnderInitialization RelOptRule this,
List operandList,
RelOptRuleOperand parentOperand) {
int k = 0;
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptRuleCall.java b/core/src/main/java/org/apache/calcite/plan/RelOptRuleCall.java
index b39aad73e230..6d14ea9ded4a 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptRuleCall.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptRuleCall.java
@@ -26,7 +26,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import java.util.HashMap;
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptRuleOperand.java b/core/src/main/java/org/apache/calcite/plan/RelOptRuleOperand.java
index bfdd51abcfcb..a36813a1c295 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptRuleOperand.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptRuleOperand.java
@@ -16,14 +16,12 @@
*/
package org.apache.calcite.plan;
+import org.apache.calcite.annotations.MonotonicNonNull;
import org.apache.calcite.rel.RelNode;
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.initialization.qual.NotOnlyInitialized;
-import org.checkerframework.checker.initialization.qual.UnknownInitialization;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
import java.util.Objects;
@@ -48,12 +46,12 @@ public class RelOptRuleOperand {
//~ Instance fields --------------------------------------------------------
private @Nullable RelOptRuleOperand parent;
- private @NotOnlyInitialized RelOptRule rule;
+ private RelOptRule rule;
private final Predicate predicate;
// REVIEW jvs 29-Aug-2004: some of these are Volcano-specific and should be
// factored out
- public int @MonotonicNonNull [] solveOrder;
+ @MonotonicNonNull public int[] solveOrder;
public int ordinalInParent;
public int ordinalInRule;
public final @Nullable RelTrait trait;
@@ -106,8 +104,7 @@ protected RelOptRuleOperand(
* and add constructor parameters for them. See
* [CALCITE-1166]
* Disallow sub-classes of RelOptRuleOperand . */
- @SuppressWarnings({"initialization.fields.uninitialized",
- "initialization.invalid.field.write.initialized", "unchecked"})
+ @SuppressWarnings({"NullAway", "unchecked"})
RelOptRuleOperand(
Class clazz,
@Nullable RelTrait trait,
@@ -171,8 +168,7 @@ public RelOptRule getRule() {
*
* @param rule containing rule
*/
- @SuppressWarnings("initialization.invalid.field.write.initialized")
- public void setRule(@UnknownInitialization RelOptRule rule) {
+ public void setRule(RelOptRule rule) {
this.rule = rule;
}
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptSchema.java b/core/src/main/java/org/apache/calcite/plan/RelOptSchema.java
index 75ff4dbd3b9c..6a1d18b95126 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptSchema.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptSchema.java
@@ -18,7 +18,7 @@
import org.apache.calcite.rel.type.RelDataTypeFactory;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptSchemaWithSampling.java b/core/src/main/java/org/apache/calcite/plan/RelOptSchemaWithSampling.java
index a4cc4e29b3b2..2b817142b6ec 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptSchemaWithSampling.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptSchemaWithSampling.java
@@ -16,7 +16,7 @@
*/
package org.apache.calcite.plan;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptTable.java b/core/src/main/java/org/apache/calcite/plan/RelOptTable.java
index 7fb90677c85a..9e1ee6bd4f3a 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptTable.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptTable.java
@@ -30,7 +30,7 @@
import org.apache.calcite.schema.Wrapper;
import org.apache.calcite.util.ImmutableBitSet;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.List;
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java b/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java
index d92a43659526..2acda081d8b2 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java
@@ -17,6 +17,7 @@
package org.apache.calcite.plan;
import org.apache.calcite.adapter.enumerable.EnumerableRules;
+import org.apache.calcite.annotations.Contract;
import org.apache.calcite.avatica.AvaticaConnection;
import org.apache.calcite.config.CalciteSystemProperty;
import org.apache.calcite.interpreter.Bindables;
@@ -114,10 +115,7 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
-import org.checkerframework.checker.initialization.qual.NotOnlyInitialized;
-import org.checkerframework.checker.initialization.qual.UnknownInitialization;
-import org.checkerframework.checker.nullness.qual.Nullable;
-import org.checkerframework.checker.nullness.qual.PolyNull;
+import org.jspecify.annotations.Nullable;
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -2482,8 +2480,9 @@ public static String toString(
* returns null if and only if {@code rel} is null,
* returns expanded detail info for {@code rel} if {@code expand} is true.
*/
- public static @PolyNull String toString(
- final @PolyNull RelNode rel,
+ @Contract("!null, _, _ -> !null")
+ public static @Nullable String toString(
+ final @Nullable RelNode rel,
SqlExplainLevel detailLevel,
boolean expand) {
if (rel == null) {
@@ -3585,7 +3584,7 @@ class JoinCounter extends RelVisitor {
int joinCount;
@Override public void visit(RelNode node, int ordinal,
- @org.checkerframework.checker.nullness.qual.Nullable RelNode parent) {
+ @org.jspecify.annotations.Nullable RelNode parent) {
if (node instanceof Join) {
++joinCount;
}
@@ -4058,7 +4057,7 @@ private static RelNode pushDownJoinConditions(Join originalJoin,
private static boolean containsGet(RexNode node) {
try {
node.accept(
- new RexVisitorImpl(true) {
+ new RexVisitorImpl<@Nullable Void>(true) {
@Override public Void visitCall(RexCall call) {
if (call.getOperator() == RexBuilder.GET_OPERATOR) {
throw Util.FoundOne.NULL;
@@ -4542,7 +4541,7 @@ private static class VariableSetVisitor extends RelVisitor {
@Override public void visit(
RelNode p,
int ordinal,
- @org.checkerframework.checker.nullness.qual.Nullable RelNode parent) {
+ @org.jspecify.annotations.Nullable RelNode parent) {
super.visit(p, ordinal, parent);
p.collectVariablesUsed(variables);
@@ -4557,10 +4556,9 @@ public static class VariableUsedVisitor extends RexShuttle {
public final Set variables = new LinkedHashSet<>();
public final Multimap variableFields =
LinkedHashMultimap.create();
- @NotOnlyInitialized
private final @Nullable RelShuttle relShuttle;
- public VariableUsedVisitor(@UnknownInitialization @Nullable RelShuttle relShuttle) {
+ public VariableUsedVisitor(@Nullable RelShuttle relShuttle) {
this.relShuttle = relShuttle;
}
@@ -4707,7 +4705,7 @@ public RexCorrelVariableMapShuttle(final CorrelationId correlationId,
/**
* Visitor which builds a bitmap of the inputs used by an expression.
*/
- public static class InputFinder extends RexVisitorImpl {
+ public static class InputFinder extends RexVisitorImpl<@Nullable Void> {
private final ImmutableBitSet.Builder bitBuilder;
private final @Nullable Set extraFields;
/** Correlation ids whose binder is the current scope. When non-null,
@@ -4989,7 +4987,6 @@ public boolean opposite(Side side) {
* expression, including those that are inside
* {@link RexSubQuery sub-queries}. */
private static class CorrelationCollector extends RelHomogeneousShuttle {
- @SuppressWarnings("assignment.type.incompatible")
private final VariableUsedVisitor vuv = new VariableUsedVisitor(this);
@Override public RelNode visit(RelNode other) {
diff --git a/core/src/main/java/org/apache/calcite/plan/RelRule.java b/core/src/main/java/org/apache/calcite/plan/RelRule.java
index 4e7f655d3746..4c0aa11372b5 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelRule.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelRule.java
@@ -22,7 +22,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.immutables.value.Value;
import java.util.ArrayList;
@@ -133,7 +133,7 @@ public interface Config {
RelOptRule toRule();
/** Casts this configuration to another type, usually a sub-class. */
- default T as(Class class_) {
+ default T as(Class class_) {
if (class_.isAssignableFrom(this.getClass())) {
return class_.cast(this);
} else {
diff --git a/core/src/main/java/org/apache/calcite/plan/RelTrait.java b/core/src/main/java/org/apache/calcite/plan/RelTrait.java
index c0e29793e309..cee0661a901d 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelTrait.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelTrait.java
@@ -20,7 +20,7 @@
import org.apache.calcite.rel.core.Project;
import org.apache.calcite.util.mapping.Mappings;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* RelTrait represents the manifestation of a relational expression trait within
diff --git a/core/src/main/java/org/apache/calcite/plan/RelTraitDef.java b/core/src/main/java/org/apache/calcite/plan/RelTraitDef.java
index a413787fb0e2..f722569aa939 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelTraitDef.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelTraitDef.java
@@ -22,7 +22,7 @@
import com.google.common.collect.Interner;
import com.google.common.collect.Interners;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* RelTraitDef represents a class of {@link RelTrait}s. Implementations of
diff --git a/core/src/main/java/org/apache/calcite/plan/RelTraitPropagationVisitor.java b/core/src/main/java/org/apache/calcite/plan/RelTraitPropagationVisitor.java
index c2280ae85c30..3c8ea3a6e3c6 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelTraitPropagationVisitor.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelTraitPropagationVisitor.java
@@ -20,7 +20,7 @@
import org.apache.calcite.rel.RelVisitor;
import org.apache.calcite.util.Util;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* RelTraitPropagationVisitor traverses a RelNode and its unregistered
diff --git a/core/src/main/java/org/apache/calcite/plan/RelTraitSet.java b/core/src/main/java/org/apache/calcite/plan/RelTraitSet.java
index fff7eea4f93b..e6c0a374afa7 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelTraitSet.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelTraitSet.java
@@ -24,7 +24,7 @@
import com.google.common.collect.ImmutableList;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import java.util.AbstractList;
import java.util.Arrays;
@@ -397,7 +397,7 @@ public RelTraitSet getDefaultSansConvention() {
*/
@SuppressWarnings("unchecked")
public @Nullable T getDistribution() {
- return (@Nullable T) getTrait(RelDistributionTraitDef.INSTANCE);
+ return (T) getTrait(RelDistributionTraitDef.INSTANCE);
}
/**
@@ -430,7 +430,7 @@ public List getDistributions() {
*/
@SuppressWarnings("unchecked")
public @Nullable T getCollation() {
- return (@Nullable T) getTrait(RelCollationTraitDef.INSTANCE);
+ return (T) getTrait(RelCollationTraitDef.INSTANCE);
}
/**
@@ -470,8 +470,7 @@ public List getCollations() {
*/
public T canonize(T trait) {
if (trait == null) {
- // Return "trait" makes the input type to be the same as the output type,
- // so checkerframework is happy
+ // Returning "trait" keeps the output type identical to the input type
return trait;
}
diff --git a/core/src/main/java/org/apache/calcite/plan/RexImplicationChecker.java b/core/src/main/java/org/apache/calcite/plan/RexImplicationChecker.java
index c52d42e2880d..2ea14197974d 100644
--- a/core/src/main/java/org/apache/calcite/plan/RexImplicationChecker.java
+++ b/core/src/main/java/org/apache/calcite/plan/RexImplicationChecker.java
@@ -37,7 +37,7 @@
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import org.jspecify.annotations.Nullable;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
@@ -343,9 +343,8 @@ private static boolean checkSupport(InputUsageFinder firstUsageFinder,
final SqlKind sKind2 =
secondLen == 2 ? secondUsageList.get(1).getKey().getKind() : null;
- // Note: arguments to isEquivalentOp are never null, however checker-framework's
- // dataflow is not strong enough, so the first parameter is marked as nullable
- //noinspection ConstantConditions
+ // The first parameter of isEquivalentOp is declared @Nullable, so that a caller can
+ // pass a kind that was not found; here both kinds are known to be present
if (firstLen == 2 && secondLen == 2
&& fKind2 != null && sKind2 != null
&& !(isEquivalentOp(fKind, sKind) && isEquivalentOp(fKind2, sKind2))
@@ -442,7 +441,7 @@ private static boolean validate(RexNode first, RexNode second) {
* key: y value: {(>, 20), usageCount = 1}
*
*/
- private static class InputUsageFinder extends RexVisitorImpl {
+ private static class InputUsageFinder extends RexVisitorImpl<@Nullable Void> {
final Map> usageMap =
new HashMap<>();
final RexBuilder builder;
@@ -542,7 +541,7 @@ private void updateUsage(SqlOperator op, RexInputRef inputRef,
*
* @param left type
* @param