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 df77ec38eefb..de8ef5f4b8db 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -343,16 +343,19 @@ jobs: errorprone-guava-latest: if: github.event.action != 'labeled' - 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 21, latest Guava)' runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 with: fetch-depth: 50 - - name: 'Set up JDK 11' + # Error Prone 2.43 and later require JDK 21, and NullAway requires JDK 17 + - name: 'Set up JDK 21' uses: actions/setup-java@v5 with: - java-version: 11 + java-version: 21 distribution: 'zulu' - uses: burrunan/gradle-cache-action@v1 name: Test @@ -362,44 +365,6 @@ jobs: # ErrorProne checks for Beta APIs, so use the latest supported Guava version arguments: --scan --no-parallel --no-daemon -Pguava.version=${{ env.GUAVA_MAX }} -PenableErrorprone classes - linux-checkerframework: - name: 'CheckerFramework (JDK 11)' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v5 - with: - fetch-depth: 50 - - name: 'Set up JDK 11' - uses: actions/setup-java@v5 - 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 -PenableCheckerframework :linq4j:classes :core:classes :server:classes - - linux-checkerframework-oldest-guava: - name: 'CheckerFramework (JDK 11, oldest Guava)' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v5 - with: - fetch-depth: 50 - - name: 'Set up JDK 11' - uses: actions/setup-java@v5 - 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 -Pguava.version=${{ env.GUAVA_MIN }} -PenableCheckerframework :linq4j:classes :core:classes :server:classes - linux-slow: # Run slow tests when the commit is on main or it is requested explicitly by adding an # appropriate label in the PR diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 2f26af79ee0b..ed4157c5bc70 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -22,6 +22,6 @@ - + - + \ No newline at end of file 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..00d3cf25a9ba 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; 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..961becda7aab 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; @@ -52,8 +52,6 @@ import java.lang.reflect.Type; import java.util.List; -import static java.util.Objects.requireNonNull; - /** * Table backed by an Apache Arrow file. * @@ -100,9 +98,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) { - requireNonNull(fields, "fields"); + public Enumerable<@Nullable Object> query(@Nullable DataContext root, + ImmutableIntList fields, List>> conditions) { FileInputStream fis = null; try { @@ -188,7 +185,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..25debb0ebf16 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; 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/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 64cb532afdc3..e8d363581e68 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") @@ -148,6 +147,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 4a4561672034..d7d4f9fe5173 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -42,7 +42,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") @@ -80,7 +79,6 @@ 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() @@ -94,6 +92,10 @@ val werror by props(true) // treat javac warnings as errors // 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(":linq4j", ":core", ":server", ":druid", ":file", ":kafka", ":spark", ":babel", ":redis", ":splunk", ":mongodb", ":cassandra", ":pig", ":arrow", ":innodb", ":piglet", ":geode", ":elasticsearch", ":plus") + val hepLargePlanModeTestIncludes = mapOf( ":core" to listOf( "**/org/apache/calcite/test/HepPlannerTest.class", @@ -641,8 +643,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.", @@ -775,9 +779,14 @@ 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 { + val mainCode = name == "compileJava" + // 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/.*") @@ -796,54 +805,90 @@ allprojects { ) // Analyze issues, and enable the check disable( + "AlreadyChecked", + "AnnotateFormatMethod", + "AssignmentExpression", "BigDecimalEquals", + "BooleanLiteral", + "ClassInitializationDeadlock", + "DoNotCall", "DoNotCallSuggester", - "StringSplitter" + "DuplicateBranches", + "EffectivelyPrivate", + "EnumOrdinal", + "ExposedPrivateType", + "FloggerArgumentToString", + "FormatStringShouldUsePlaceholders", + "InlineMeInliner", + "InlineMeSuggester", + "IntLiteralCast", + "InvalidLink", + "JavaDurationGetSecondsToToSeconds", + "JdkObsolete", + "LabelledBreakTarget", + "LenientFormatStringValidation", + "ListRemoveAmbiguous", + "MissingSummary", + "NonApiType", + "NonCanonicalType", + "NotJavadoc", + "RedundantControlFlow", + "ReturnValueIgnored", + "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") + // 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 { @@ -882,7 +927,7 @@ allprojects { if (werror) { options.compilerArgs.add("-Werror") } - if (enableCheckerframework) { + if (enableErrorprone) { options.forkOptions.memoryMaximumSize = "2g" } excludeIntellijGenerated() diff --git a/buildSrc/.kotlin/errors/errors-1787562541775.log b/buildSrc/.kotlin/errors/errors-1787562541775.log new file mode 100644 index 000000000000..1219b509f098 --- /dev/null +++ b/buildSrc/.kotlin/errors/errors-1787562541775.log @@ -0,0 +1,4 @@ +kotlin version: 2.0.21 +error message: The daemon has terminated unexpectedly on startup attempt #1 with error code: 0. The daemon process output: + 1. Kotlin compile daemon is ready + diff --git a/buildSrc/.kotlin/errors/errors-1787563062651.log b/buildSrc/.kotlin/errors/errors-1787563062651.log new file mode 100644 index 000000000000..1219b509f098 --- /dev/null +++ b/buildSrc/.kotlin/errors/errors-1787563062651.log @@ -0,0 +1,4 @@ +kotlin version: 2.0.21 +error message: The daemon has terminated unexpectedly on startup attempt #1 with error code: 0. The daemon process output: + 1. Kotlin compile daemon is ready + 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 c28ada76e964..9ee4c533b881 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 @@ -42,7 +42,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; @@ -117,7 +117,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); } @@ -129,7 +129,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 @@ -138,7 +139,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); @@ -218,18 +219,37 @@ public Enumerable query(final CqlSession session, List() { - @Override public Enumerator 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); - while (skip < offset && enumerator.moveNext()) { - skip++; - } - return enumerator; + return new CassandraEnumerable(session, queryBuilder.toString(), resultRowType, + offset); + } + + /** Enumerable over the rows a CQL query returns. */ + private static class CassandraEnumerable + extends AbstractEnumerable<@Nullable Object> { + private final CqlSession session; + private final String query; + private final RelProtoDataType resultRowType; + private final Integer offset; + + CassandraEnumerable(CqlSession session, String query, + RelProtoDataType resultRowType, Integer offset) { + this.session = session; + this.query = query; + this.resultRowType = resultRowType; + this.offset = offset; + } + + @Override public Enumerator<@Nullable Object> enumerator() { + final ResultSet results = session.execute(query); + // Skip results until we get to the right offset + int skip = 0; + Enumerator<@Nullable Object> enumerator = + new CassandraEnumerator(results, resultRowType); + while (skip < offset && enumerator.moveNext()) { + skip++; } - }; + return enumerator; + } } @Override public Queryable asQueryable(QueryProvider queryProvider, @@ -275,7 +295,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..6681afc24c45 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -54,7 +54,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") @@ -76,6 +76,8 @@ dependencies { implementation("org.codehaus.janino:commons-compiler") implementation("org.codehaus.janino:janino") annotationProcessor("org.immutables:value") + // The annotations are not retained at run time and the artifact never ships with Calcite, + // so its Java 11 bytecode is fine even though Calcite itself targets Java 8 compileOnly("org.immutables:value-annotations") compileOnly("com.google.code.findbugs:jsr305") testAnnotationProcessor("org.immutables:value") 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..a7f1e0f6337c 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; @@ -85,6 +85,10 @@ private static class EmptyDataContext implements DataContext, Serializable { private static class MapDataContext extends EmptyDataContext { private final ImmutableMap map; + // The unbounded wildcard of ImmutableMap.copyOf is read from the bytecode signature, + // where it rejects the capture of this one. + // https://github.com/uber/NullAway/issues/1732 + @SuppressWarnings("NullAway") 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..712f3231edb0 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,18 @@ 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]); } + // Both arrays hold the column's values, nulls included, but an array creation keeps a + // non-null component type whatever it is assigned to. + @SuppressWarnings("NullAway") @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 = + (@Nullable Comparable[]) new Comparable[size]; for (int i = 0; i < size; i++) { comparables[i] = list[sources[i]]; } @@ -433,12 +437,12 @@ 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") + @SuppressWarnings("NullAway") 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) { @@ -798,7 +802,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..181b78d6990a 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 @@ -21,14 +21,14 @@ import org.apache.calcite.avatica.util.DateTimeUtils; import org.apache.calcite.linq4j.Enumerable; import org.apache.calcite.linq4j.Ord; +import org.apache.calcite.linq4j.annotations.Contract; import org.apache.calcite.linq4j.tree.Primitive; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeField; 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,7 @@ 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") + @SuppressWarnings("NullAway") ColumnLoader(JavaTypeFactory typeFactory, Enumerable sourceTable, RelProtoDataType protoRowType, @@ -202,7 +202,7 @@ 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") + @SuppressWarnings("NullAway") final Comparable[] values = valueSet.values.toArray(new Comparable[0]); final Kev[] kevs = new Kev[list.size()]; @@ -251,7 +251,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 +263,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 +274,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 +385,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..a4c983712231 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.linq4j.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 fd60a29ae750..0e94d780dd1c 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(), @@ -1412,7 +1410,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..4b67f66f5512 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; @@ -252,11 +252,11 @@ private Result implementHashMarkJoin(EnumerableRelImplementor implementor, Prefe final PhysType nullSafeKeyPhysType = leftResult.physType.project(leftNullSafeKeys, JavaRowFormat.LIST); final Expression nullSafeKeyComparator = - Util.first(nullSafeKeyPhysType.comparer(), Expressions.constant(null)); + Util.firstNonNull(nullSafeKeyPhysType.comparer(), Expressions.constant(null)); final PhysType keyPhysType = leftResult.physType.project(joinInfo.leftKeys, JavaRowFormat.LIST); final Expression keyComparator = - Util.first(keyPhysType.comparer(), Expressions.constant(null)); + Util.firstNonNull(keyPhysType.comparer(), Expressions.constant(null)); return implementor.result(physType, builder.append( @@ -322,7 +322,7 @@ private Result implementHashSemiJoin(EnumerableRelImplementor implementor, Prefe joinInfo.leftKeys, joinInfo.nullExclusionFlags), rightResult.physType.generateNullAwareAccessor( joinInfo.rightKeys, joinInfo.nullExclusionFlags), - Util.first(keyPhysType.comparer(), + Util.firstNonNull(keyPhysType.comparer(), Expressions.constant(null)), predicate))) .toBlock()); @@ -375,7 +375,7 @@ private Result implementHashJoin(EnumerableRelImplementor implementor, Prefer pr ImmutableList.of( leftResult.physType, rightResult.physType))) .append( - Util.first(keyPhysType.comparer(), + Util.firstNonNull(keyPhysType.comparer(), Expressions.constant(null))) .append( Expressions.constant(joinType.generatesNullsOnLeft())) 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..022cd369e2bd 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; @@ -545,7 +545,7 @@ public static EnumerableMergeJoin create(RelNode left, RelNode right, leftResult.physType, rightResult.physType)), Expressions.constant(EnumUtils.toLinq4jJoinType(joinType)), comparator, - Util.first( + Util.firstNonNull( leftKeyPhysType.comparer(), Expressions.constant(null))))).toBlock()); } 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/EnumerableMergeUnion.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeUnion.java index 09d5a9e221e8..c945ac2a0bc5 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeUnion.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeUnion.java @@ -113,7 +113,7 @@ public static EnumerableMergeUnion create(RelCollation collation, final Expression sortComparator = pair.right; final Expression equalityComparator = - Util.first(physType.comparer(), + Util.firstNonNull(physType.comparer(), Expressions.call(BuiltInMethod.IDENTITY_COMPARER.method)); final Expression unionExp = 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..3c764b42b5ef 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,7 @@ public class EnumerableRelImplementor extends JavaRelImplementor { private final Map, ParameterExpression> stashedParameters = new LinkedHashMap<>(); - @SuppressWarnings("methodref.receiver.bound.invalid") + @SuppressWarnings("NullAway") 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..071f8200caf7 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; @@ -113,7 +113,7 @@ public class EnumerableRepeatUnion extends RepeatUnion implements EnumerableRel iterativeExp, Expressions.constant(iterationLimit, int.class), Expressions.constant(all, boolean.class), - Util.first(physType.comparer(), + Util.firstNonNull(physType.comparer(), Expressions.call(BuiltInMethod.IDENTITY_COMPARER.method)), cleanUpFunctionExp); builder.add(unionExp); 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 30f76e28def9..cbc851d4b4b5 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..d5cdbecc594e 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,7 @@ public class NestedBlockBuilderImpl implements NestedBlockBuilder { * * @param block root code block */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") 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 2efbb25d22bb..bcf4b6e078c9 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 6ef0182b301c..d38b72f45a4e 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; @@ -2406,7 +2406,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 35373aca3e39..614b6ae42239 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; @@ -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..e551aa473e80 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 @@ -23,6 +23,7 @@ import org.apache.calcite.linq4j.Linq4j; import org.apache.calcite.linq4j.QueryProvider; import org.apache.calcite.linq4j.Queryable; +import org.apache.calcite.linq4j.annotations.MonotonicNonNull; import org.apache.calcite.linq4j.function.Function1; import org.apache.calcite.linq4j.tree.Expression; import org.apache.calcite.linq4j.tree.Expressions; @@ -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..64797f41f20a 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({"NullAway", "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..13fffac750c0 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,7 @@ */ public class JdbcTable extends AbstractQueryableTable implements TranslatableTable, ScannableTable, ModifiableTable { - @SuppressWarnings("methodref.receiver.bound.invalid") + @SuppressWarnings("NullAway") private final Supplier protoRowTypeSupplier = Suppliers.memoize(this::supplyProto); public final JdbcSchema jdbcSchema; @@ -106,7 +106,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..15612b57a2cd 100644 --- a/core/src/main/java/org/apache/calcite/config/CalciteConnectionConfig.java +++ b/core/src/main/java/org/apache/calcite/config/CalciteConnectionConfig.java @@ -19,11 +19,11 @@ import org.apache.calcite.avatica.ConnectionConfig; import org.apache.calcite.avatica.util.Casing; import org.apache.calcite.avatica.util.Quoting; +import org.apache.calcite.linq4j.annotations.Contract; 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.Nullable; import java.util.Properties; @@ -61,8 +61,9 @@ 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); + @Contract("_, !null -> !null") + @Nullable T fun(Class operatorTableClass, + @Nullable T defaultOperatorTable); /** Returns the value of {@link CalciteConnectionProperty#MODEL}. */ @Nullable String model(); /** Returns the value of {@link CalciteConnectionProperty#LEX}. */ @@ -78,13 +79,15 @@ 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); + @Contract("_, !null -> !null") + @Nullable T parserFactory(Class parserFactoryClass, + @Nullable 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); + @Contract("_, !null -> !null") + @Nullable T schemaFactory(Class schemaFactoryClass, + @Nullable T defaultSchemaFactory); /** Returns the value of {@link CalciteConnectionProperty#SCHEMA_TYPE}. */ JsonSchema.Type schemaType(); /** Returns the value of {@link CalciteConnectionProperty#SPARK}. */ @@ -95,8 +98,9 @@ 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); + @Contract("_, !null -> !null") + @Nullable T typeSystem(Class typeSystemClass, + @Nullable T defaultTypeSystem); /** Returns the value of {@link CalciteConnectionProperty#CONFORMANCE}. */ SqlConformance conformance(); /** Returns the value of {@link CalciteConnectionProperty#TIME_ZONE}. */ @@ -117,12 +121,14 @@ 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); + @Contract("_, !null -> !null") + @Nullable T metaTableFactory(Class metaTableFactoryClass, + @Nullable 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); + @Contract("_, !null -> !null") + @Nullable T metaColumnFactory(Class metaColumnFactoryClass, + @Nullable 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..baf46bce2da2 100644 --- a/core/src/main/java/org/apache/calcite/config/CalciteConnectionConfigImpl.java +++ b/core/src/main/java/org/apache/calcite/config/CalciteConnectionConfigImpl.java @@ -19,6 +19,7 @@ import org.apache.calcite.avatica.ConnectionConfigImpl; import org.apache.calcite.avatica.util.Casing; import org.apache.calcite.avatica.util.Quoting; +import org.apache.calcite.linq4j.annotations.Contract; import org.apache.calcite.model.JsonSchema; import org.apache.calcite.runtime.ConsList; import org.apache.calcite.sql.SqlOperatorTable; @@ -27,8 +28,7 @@ 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.Nullable; import java.util.List; import java.util.Properties; @@ -106,8 +106,12 @@ public boolean isSet(CalciteConnectionProperty property) { .getEnum(NullCollation.class, NullCollation.HIGH); } - @Override public @PolyNull T fun(Class operatorTableClass, - @PolyNull T defaultOperatorTable) { + @Contract("_, !null -> !null") + // getPlugin comes from Avatica, which is not annotated, so NullAway cannot infer a T + // that suits both the Class argument and a nullable default. + @SuppressWarnings("NullAway") + @Override public @Nullable T fun(Class operatorTableClass, + @Nullable T defaultOperatorTable) { final String fun = CalciteConnectionProperty.FUN.wrap(properties).getString(); if (fun == null || fun.equals("") || fun.equals("standard")) { @@ -153,14 +157,22 @@ public boolean isSet(CalciteConnectionProperty property) { .getBoolean(lex().caseSensitive); } - @Override public @PolyNull T parserFactory(Class parserFactoryClass, - @PolyNull T defaultParserFactory) { + @Contract("_, !null -> !null") + // getPlugin comes from Avatica, which is not annotated, so NullAway cannot infer a T + // that suits both the Class argument and a nullable default. + @SuppressWarnings("NullAway") + @Override public @Nullable T parserFactory(Class parserFactoryClass, + @Nullable T defaultParserFactory) { return CalciteConnectionProperty.PARSER_FACTORY.wrap(properties) .getPlugin(parserFactoryClass, defaultParserFactory); } - @Override public @PolyNull T schemaFactory(Class schemaFactoryClass, - @PolyNull T defaultSchemaFactory) { + @Contract("_, !null -> !null") + // getPlugin comes from Avatica, which is not annotated, so NullAway cannot infer a T + // that suits both the Class argument and a nullable default. + @SuppressWarnings("NullAway") + @Override public @Nullable T schemaFactory(Class schemaFactoryClass, + @Nullable T defaultSchemaFactory) { return CalciteConnectionProperty.SCHEMA_FACTORY.wrap(properties) .getPlugin(schemaFactoryClass, defaultSchemaFactory); } @@ -179,8 +191,12 @@ public boolean isSet(CalciteConnectionProperty property) { .getBoolean(); } - @Override public @PolyNull T typeSystem(Class typeSystemClass, - @PolyNull T defaultTypeSystem) { + @Contract("_, !null -> !null") + // getPlugin comes from Avatica, which is not annotated, so NullAway cannot infer a T + // that suits both the Class argument and a nullable default. + @SuppressWarnings("NullAway") + @Override public @Nullable T typeSystem(Class typeSystemClass, + @Nullable T defaultTypeSystem) { return CalciteConnectionProperty.TYPE_SYSTEM.wrap(properties) .getPlugin(typeSystemClass, defaultTypeSystem); } @@ -220,16 +236,24 @@ public boolean isSet(CalciteConnectionProperty property) { .getBoolean(); } - @Override public @PolyNull T metaTableFactory( + @Contract("_, !null -> !null") + // getPlugin comes from Avatica, which is not annotated, so NullAway cannot infer a T + // that suits both the Class argument and a nullable default. + @SuppressWarnings("NullAway") + @Override public @Nullable T metaTableFactory( Class metaTableFactoryClass, - @PolyNull T defaultMetaTableFactory) { + @Nullable T defaultMetaTableFactory) { return CalciteConnectionProperty.META_TABLE_FACTORY.wrap(properties) .getPlugin(metaTableFactoryClass, defaultMetaTableFactory); } - @Override public @PolyNull T metaColumnFactory( + @Contract("_, !null -> !null") + // getPlugin comes from Avatica, which is not annotated, so NullAway cannot infer a T + // that suits both the Class argument and a nullable default. + @SuppressWarnings("NullAway") + @Override public @Nullable T metaColumnFactory( Class metaColumnFactoryClass, - @PolyNull T defaultMetaColumnFactory) { + @Nullable 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 0d14fed45b84..1c24a11d9045 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. * @@ -601,6 +601,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 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 684baad8d493..a856d93e97d2 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,7 @@ public AggregateNode(Compiler compiler, Aggregate rel) { ImmutableList.Builder builder = ImmutableList.builder(); for (AggregateCall aggregateCall : rel.getAggCallList()) { - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") 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..1411e282d540 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.linq4j.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..9ae4c26a6400 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,7 @@ public Interpreter(DataContext dataContext, RelNode rootRel) { final RelNode rel = optimize(rootRel); final CompilerImpl compiler = new Nodes.CoreCompiler(this, rootRel.getCluster()); - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") Pair> pair = compiler.visitRoot(rel); this.rootRel = pair.left; this.nodes = ImmutableMap.copyOf(pair.right); @@ -299,7 +297,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 +308,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()); } @@ -353,7 +350,7 @@ Pair> visitRoot(RelNode p) { // rewrite children first (from left to right) final List inputs = relInputs.get(p); RelNode finalP = p; - Ord.forEach(Util.first(inputs, p.getInputs()), + Ord.forEach(Util.firstNonNull(inputs, p.getInputs()), (r, i) -> outEdges.put(r, new Edge(finalP, i))); if (inputs != null) { for (int i = 0; i < inputs.size(); i++) { 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..5d94880c50bb 100644 --- a/core/src/main/java/org/apache/calcite/interpreter/MatchNode.java +++ b/core/src/main/java/org/apache/calcite/interpreter/MatchNode.java @@ -18,17 +18,20 @@ import org.apache.calcite.rel.core.Match; +import org.jspecify.annotations.Nullable; + /** * Interpreter node that implements a * {@link Match}. */ + public class MatchNode extends AbstractSingleNode { MatchNode(Compiler compiler, Match rel) { super(compiler, rel); } @Override public void run() throws InterruptedException { - Row row; + @Nullable Row row; while ((row = source.receive()) != null) { sink.send(row); } 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..a49f9435cd41 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; 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 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..a53051d66a6e 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,7 @@ class CachingCalciteSchema extends CalciteSchema { this(parent, schema, name, null, null, null, null, null, null, null, null); } - @SuppressWarnings({"argument.type.incompatible", "return.type.incompatible"}) + @SuppressWarnings("NullAway") 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..5b847dea34c6 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; @@ -413,7 +413,7 @@ Enumerable schemas(final String catalog, final LikePattern pattern) return new CalciteMetaSchema(schema, catalog, schema.getName()); }) .orderBy((Function1) metaSchema -> - (Comparable) FlatLists.of(Util.first(metaSchema.tableCatalog, ""), + (Comparable) FlatLists.of(Util.firstNonNull(metaSchema.tableCatalog, ""), metaSchema.tableSchem)); } 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 ec37fd4c7a39..b8f406379a7b 100644 --- a/core/src/main/java/org/apache/calcite/jdbc/CalcitePrepare.java +++ b/core/src/main/java/org/apache/calcite/jdbc/CalcitePrepare.java @@ -50,7 +50,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; @@ -214,7 +214,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 5db1f15864f3..ce0a7b8434b1 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 32aed69e3d6e..55d90c6b1b6f 100644 --- a/core/src/main/java/org/apache/calcite/jdbc/JavaTypeFactoryImpl.java +++ b/core/src/main/java/org/apache/calcite/jdbc/JavaTypeFactoryImpl.java @@ -37,11 +37,11 @@ import org.apache.calcite.util.Pair; import org.apache.calcite.util.Util; -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 720407315002..904412e6e3b2 100644 --- a/core/src/main/java/org/apache/calcite/materialize/Lattice.java +++ b/core/src/main/java/org/apache/calcite/materialize/Lattice.java @@ -21,6 +21,8 @@ import org.apache.calcite.jdbc.CalcitePrepare; import org.apache.calcite.jdbc.CalciteSchema; import org.apache.calcite.linq4j.Ord; +import org.apache.calcite.linq4j.annotations.MonotonicNonNull; +import org.apache.calcite.linq4j.annotations.RequiresNonNull; import org.apache.calcite.linq4j.tree.Primitive; import org.apache.calcite.plan.RelOptUtil; import org.apache.calcite.rel.RelNode; @@ -65,10 +67,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; @@ -135,7 +134,7 @@ private Lattice(CalciteSchema rootSchema, LatticeRootNode rootNode, } checkArgument(rowCountEstimate > 0d); this.rowCountEstimate = rowCountEstimate; - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") LatticeStatisticProvider statisticProvider = requireNonNull(statisticProviderFactory.apply(this)); this.statisticProvider = statisticProvider; @@ -148,7 +147,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; @@ -1108,7 +1106,7 @@ public Column expression(RexNode e, String alias, final int derivedOrdinal = derivedColumnsByName.size(); final int ordinal = baseColumns.size() + derivedOrdinal; return new DerivedColumn(ordinal, - Util.first(alias, "e$" + derivedOrdinal), e, tableAliases); + Util.firstNonNull(alias, "e$" + derivedOrdinal), e, tableAliases); }); } @@ -1150,7 +1148,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..b47d33856aa2 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,8 @@ public abstract class LatticeNode { if (i++ > 0) { sb.append(' '); } - @SuppressWarnings({"argument.type.incompatible", "assignment.type.incompatible"}) - final @Initialized LatticeChildNode node = + @SuppressWarnings("NullAway") + 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..f9dc05ff783a 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,7 @@ public class LatticeRootNode extends LatticeNode { public final ImmutableList descendants; final ImmutableList paths; - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") 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..138e769af27b 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,8 @@ class LatticeSpace { final SqlStatisticProvider statisticProvider; private final Map, LatticeTable> tableMap = new HashMap<>(); - @SuppressWarnings("assignment.type.incompatible") - final @NotOnlyInitialized AttributedDirectedGraph g = + @SuppressWarnings("NullAway") + 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..db07bbb85004 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,7 @@ 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") + @SuppressWarnings("NullAway") 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..0a3b59230b38 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; @@ -142,7 +142,7 @@ private MaterializationService() { if (tableEntry == null) { Table table = tableFactory.createTable(schema, viewSql, viewSchemaPath); final String tableName = - Schemas.uniqueTableName(schema, Util.first(suggestedTableName, "m")); + Schemas.uniqueTableName(schema, Util.firstNonNull(suggestedTableName, "m")); tableEntry = schema.add(tableName, table, ImmutableList.of(viewSql)); Hook.CREATE_MATERIALIZATION.run(tableName); rowType = table.getRowType(connection.getTypeFactory()); 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..ff91779e6beb 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,7 @@ class MutableNode { } /** Creates a non-root node. */ - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") 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..fcbab3477e88 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,10 @@ 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) { + @SuppressWarnings("NullAway") + 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 46661065cc28..0f433161017d 100644 --- a/core/src/main/java/org/apache/calcite/model/ModelHandler.java +++ b/core/src/main/java/org/apache/calcite/model/ModelHandler.java @@ -52,7 +52,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.io.File; import java.io.IOException; @@ -96,7 +96,7 @@ 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") + @SuppressWarnings("NullAway") public ModelHandler(SchemaPlus rootSchema, String uri, ClassNameFilter classNameFilter) throws IOException { super(); @@ -192,7 +192,7 @@ public static void addFunctions(ClassNameFilter filter, SchemaPlus schema, final TableFunction tableFunction = TableFunctionImpl.create(clazz, methodNameOrDefault); if (tableFunction != null) { - schema.add(Util.first(functionName, methodNameOrDefault), + schema.add(Util.firstNonNull(functionName, methodNameOrDefault), tableFunction); return; } 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..4c8680e0a085 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.linq4j.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; @@ -275,7 +273,6 @@ protected void onNewClass(RelNode node) { } @Override public void addListener( - @UnknownInitialization AbstractRelOptPlanner this, RelOptListener newListener) { if (listener == null) { listener = new MulticastRelOptListener(); @@ -467,7 +464,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..048fb3ce501c 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.linq4j.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..c4141bceb1cf 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.linq4j.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..c665f78cb3f5 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.linq4j.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,8 @@ public RelOptRule getRule() { * * @param rule containing rule */ - @SuppressWarnings("initialization.invalid.field.write.initialized") - public void setRule(@UnknownInitialization RelOptRule rule) { + @SuppressWarnings("NullAway") + 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 42e86b5c4be5..baec2a0c88c3 100644 --- a/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java +++ b/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java @@ -21,6 +21,7 @@ import org.apache.calcite.config.CalciteSystemProperty; import org.apache.calcite.interpreter.Bindables; import org.apache.calcite.linq4j.Ord; +import org.apache.calcite.linq4j.annotations.Contract; import org.apache.calcite.linq4j.function.Experimental; import org.apache.calcite.rel.RelCollations; import org.apache.calcite.rel.RelHomogeneousShuttle; @@ -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) { @@ -3584,7 +3583,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; } @@ -4057,7 +4056,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; @@ -4541,7 +4540,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); @@ -4556,10 +4555,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; } @@ -4706,7 +4704,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, @@ -4988,7 +4986,7 @@ 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") + @SuppressWarnings("NullAway") 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..dfd170915c8e 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; @@ -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 1b0788062324..08ca75dfe503 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<>(); @@ -524,7 +523,7 @@ private void updateUsage(SqlOperator op, RexInputRef inputRef, * * @param left type * @param right type */ - private static class InputRefUsage { + private static class InputRefUsage { private final PairList usageList = PairList.of(); private int usageCount = 0; } diff --git a/core/src/main/java/org/apache/calcite/plan/SpoolRelOptTable.java b/core/src/main/java/org/apache/calcite/plan/SpoolRelOptTable.java index 0909b951c456..ae9ed7e950af 100644 --- a/core/src/main/java/org/apache/calcite/plan/SpoolRelOptTable.java +++ b/core/src/main/java/org/apache/calcite/plan/SpoolRelOptTable.java @@ -33,7 +33,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; diff --git a/core/src/main/java/org/apache/calcite/plan/Strong.java b/core/src/main/java/org/apache/calcite/plan/Strong.java index b6aa9678ed8d..ea9d7d718b91 100644 --- a/core/src/main/java/org/apache/calcite/plan/Strong.java +++ b/core/src/main/java/org/apache/calcite/plan/Strong.java @@ -35,6 +35,8 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; +import org.jspecify.annotations.Nullable; + import java.util.ArrayList; import java.util.EnumMap; import java.util.List; @@ -151,7 +153,7 @@ public static Policy policy(SqlOperator operator) { public static boolean isStrong(RexNode e) { final ImmutableBitSet.Builder nullColumns = ImmutableBitSet.builder(); e.accept( - new RexVisitorImpl(true) { + new RexVisitorImpl<@Nullable Void>(true) { @Override public Void visitInputRef(RexInputRef inputRef) { nullColumns.set(inputRef.getIndex()); return super.visitInputRef(inputRef); diff --git a/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java b/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java index 5a76cb99b3e7..b82f73b12f5b 100644 --- a/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java +++ b/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java @@ -74,7 +74,7 @@ import com.google.common.collect.Multimap; import com.google.common.collect.Sets; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Arrays; @@ -186,6 +186,22 @@ public class SubstitutionVisitor { protected final MutableRel[] slots = new MutableRel[2]; /** Creates a SubstitutionVisitor with the default rule set. */ + /** Removes from {@code nodes} every node that is a parent of another. + * + *

    The unbounded wildcard of {@code removeAll(Collection)} is read from the + * bytecode signature, where it behaves as {@code ? extends Object} and rejects the + * nullable element type of {@code parents}, of which the root's is null. + * See NullAway#1732. + * + * @param nodes all nodes in the tree + * @param parents the parents, of which the root's is null + */ + @SuppressWarnings("NullAway") + private static void removeParents(List nodes, + Set<@Nullable MutableRel> parents) { + nodes.removeAll(parents); + } + public SubstitutionVisitor(RelNode target_, RelNode query_) { this(target_, query_, DEFAULT_RULES, RelFactories.LOGICAL_BUILDER); } @@ -224,13 +240,15 @@ public SubstitutionVisitor(RelNode target_, RelNode query_, // Populate the list of leaves in the tree under "target". // Leaves are all nodes that are not parents. // For determinism, it is important that the list is in scan order. - allNodes.removeAll(parents); + // The root's parent is null; see removeParents. + removeParents(allNodes, parents); targetLeaves = ImmutableList.copyOf(allNodes); allNodes.clear(); parents.clear(); visitor.go(query); - allNodes.removeAll(parents); + // The root's parent is null; see removeParents. + removeParents(allNodes, parents); queryLeaves = ImmutableList.copyOf(allNodes); } @@ -1017,7 +1035,7 @@ assert equalType("query", call.query, "result", result, /** Abstract base class for implementing {@link UnifyRule}. */ public abstract static class AbstractUnifyRule extends UnifyRule { - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") protected AbstractUnifyRule(Operand queryOperand, Operand targetOperand, int slotCount) { super(slotCount, queryOperand, targetOperand); @@ -1483,7 +1501,7 @@ private AggregateOnCalcToAggregateUnifyRule() { try { // Fail the matching when filtering condition references // non-grouping columns in target. - qInputCond.accept(new RexVisitorImpl(true) { + qInputCond.accept(new RexVisitorImpl<@Nullable Void>(true) { @Override public Void visitInputRef(RexInputRef inputRef) { if (!target.groupSets.stream() .allMatch(groupSet -> groupSet.get(inputRef.getIndex()))) { @@ -1839,7 +1857,7 @@ private static boolean referenceByMapping( } try { - RexVisitor rexVisitor = new RexVisitorImpl(true) { + RexVisitor rexVisitor = new RexVisitorImpl<@Nullable Void>(true) { @Override public Void visitInputRef(RexInputRef inputRef) { if (!(projects.get(inputRef.getIndex()) instanceof RexInputRef)) { throw Util.FoundOne.NULL; diff --git a/core/src/main/java/org/apache/calcite/plan/TableAccessMap.java b/core/src/main/java/org/apache/calcite/plan/TableAccessMap.java index 59dc10c9257c..f29a7dc97ca3 100644 --- a/core/src/main/java/org/apache/calcite/plan/TableAccessMap.java +++ b/core/src/main/java/org/apache/calcite/plan/TableAccessMap.java @@ -20,7 +20,7 @@ import org.apache.calcite.rel.RelVisitor; import org.apache.calcite.rel.core.TableModify; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Collections; import java.util.HashMap; @@ -113,7 +113,7 @@ public TableAccessMap(List table, Mode mode) { /** * Returns a set of qualified names for all tables accessed. */ - @SuppressWarnings("return.type.incompatible") + @SuppressWarnings("NullAway") public Set> getTablesAccessed() { return accessMap.keySet(); } diff --git a/core/src/main/java/org/apache/calcite/plan/ViewExpanders.java b/core/src/main/java/org/apache/calcite/plan/ViewExpanders.java index b3d96cd07fe5..a358ad892119 100644 --- a/core/src/main/java/org/apache/calcite/plan/ViewExpanders.java +++ b/core/src/main/java/org/apache/calcite/plan/ViewExpanders.java @@ -22,7 +22,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/plan/VisitorDataContext.java b/core/src/main/java/org/apache/calcite/plan/VisitorDataContext.java index 388a0748837b..cb04e1519e4c 100644 --- a/core/src/main/java/org/apache/calcite/plan/VisitorDataContext.java +++ b/core/src/main/java/org/apache/calcite/plan/VisitorDataContext.java @@ -35,7 +35,7 @@ import org.apache.calcite.util.TimestampString; import org.apache.calcite.util.trace.CalciteLogger; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.LoggerFactory; import java.math.BigDecimal; @@ -239,7 +239,7 @@ public VisitorDataContext(@Nullable Object[] values) { if (value instanceof NlsString) { return Pair.of(index, ((NlsString) value).getValue()); } else { - return Pair.of(index, value); + return Pair.of(index, value); } } } diff --git a/core/src/main/java/org/apache/calcite/plan/hep/HepInstruction.java b/core/src/main/java/org/apache/calcite/plan/hep/HepInstruction.java index 9d8edeb2dcc3..f2e8d46e3318 100644 --- a/core/src/main/java/org/apache/calcite/plan/hep/HepInstruction.java +++ b/core/src/main/java/org/apache/calcite/plan/hep/HepInstruction.java @@ -16,12 +16,12 @@ */ package org.apache.calcite.plan.hep; +import org.apache.calcite.linq4j.annotations.MonotonicNonNull; import org.apache.calcite.plan.RelOptRule; import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.MonotonicNonNull; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Collection; import java.util.HashSet; diff --git a/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java b/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java index d2a39d4a43c9..030fb508b4f5 100644 --- a/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java +++ b/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java @@ -58,7 +58,7 @@ import com.google.common.collect.Multimap; import com.google.common.collect.Sets; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayDeque; import java.util.ArrayList; @@ -116,7 +116,7 @@ public class HepPlanner extends AbstractRelOptPlanner { private final DirectedGraph graph = DefaultDirectedGraph.create(); - private final Function2 onCopyHook; + private final Function2 onCopyHook; private final List materializations = new ArrayList<>(); @@ -185,11 +185,13 @@ public HepPlanner( HepProgram program, @Nullable Context context, boolean noDag, - @Nullable Function2 onCopyHook, + @Nullable Function2 onCopyHook, RelOptCostFactory costFactory) { super(costFactory, context); this.mainProgram = requireNonNull(program, "program"); - this.onCopyHook = Util.first(onCopyHook, Functions.ignore2()); + this.onCopyHook = + Util.firstNonNull(onCopyHook, + Functions.ignore2()); this.noDag = noDag; this.largePlanMode = CalciteSystemProperty.HEP_PLANNER_LARGE_PLAN_MODE.value(); } diff --git a/core/src/main/java/org/apache/calcite/plan/hep/HepProgram.java b/core/src/main/java/org/apache/calcite/plan/hep/HepProgram.java index 9b57abddcb7d..8972f36e2703 100644 --- a/core/src/main/java/org/apache/calcite/plan/hep/HepProgram.java +++ b/core/src/main/java/org/apache/calcite/plan/hep/HepProgram.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.ArrayList; import java.util.HashMap; diff --git a/core/src/main/java/org/apache/calcite/plan/hep/HepRelMetadataProvider.java b/core/src/main/java/org/apache/calcite/plan/hep/HepRelMetadataProvider.java index 423d298906e8..67dd201631ab 100644 --- a/core/src/main/java/org/apache/calcite/plan/hep/HepRelMetadataProvider.java +++ b/core/src/main/java/org/apache/calcite/plan/hep/HepRelMetadataProvider.java @@ -27,7 +27,7 @@ import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Multimap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Method; import java.util.List; @@ -51,7 +51,7 @@ class HepRelMetadataProvider implements RelMetadataProvider { } @Deprecated // to be removed before 2.0 - @Override public <@Nullable M extends @Nullable Metadata> UnboundMetadata apply( + @Override public UnboundMetadata apply( Class relClass, final Class metadataClass) { return (rel, mq) -> { diff --git a/core/src/main/java/org/apache/calcite/plan/hep/HepRelVertex.java b/core/src/main/java/org/apache/calcite/plan/hep/HepRelVertex.java index 887a507dd775..2155568ff5aa 100644 --- a/core/src/main/java/org/apache/calcite/plan/hep/HepRelVertex.java +++ b/core/src/main/java/org/apache/calcite/plan/hep/HepRelVertex.java @@ -26,7 +26,7 @@ import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.calcite.rel.type.RelDataType; -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/hep/HepRuleCall.java b/core/src/main/java/org/apache/calcite/plan/hep/HepRuleCall.java index bc2e3db8a806..2779fcb296ff 100644 --- a/core/src/main/java/org/apache/calcite/plan/hep/HepRuleCall.java +++ b/core/src/main/java/org/apache/calcite/plan/hep/HepRuleCall.java @@ -23,7 +23,7 @@ import org.apache.calcite.plan.RelOptUtil; 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.List; diff --git a/core/src/main/java/org/apache/calcite/plan/hep/package-info.java b/core/src/main/java/org/apache/calcite/plan/hep/package-info.java index c388091ef224..840a71c588b5 100644 --- a/core/src/main/java/org/apache/calcite/plan/hep/package-info.java +++ b/core/src/main/java/org/apache/calcite/plan/hep/package-info.java @@ -19,4 +19,7 @@ * Provides a heuristic planner implementation for the interfaces in * {@link org.apache.calcite.plan}. */ +@NullMarked package org.apache.calcite.plan.hep; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/plan/package-info.java b/core/src/main/java/org/apache/calcite/plan/package-info.java index 5cd8a60aeba2..3515618763a8 100644 --- a/core/src/main/java/org/apache/calcite/plan/package-info.java +++ b/core/src/main/java/org/apache/calcite/plan/package-info.java @@ -19,11 +19,7 @@ * Defines interfaces for constructing rule-based optimizers of * relational expressions. */ -@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.plan; -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/plan/visualizer/InputExcludedRelWriter.java b/core/src/main/java/org/apache/calcite/plan/visualizer/InputExcludedRelWriter.java index c3a0f894abd5..ba7c5c695d7a 100644 --- a/core/src/main/java/org/apache/calcite/plan/visualizer/InputExcludedRelWriter.java +++ b/core/src/main/java/org/apache/calcite/plan/visualizer/InputExcludedRelWriter.java @@ -21,7 +21,7 @@ import org.apache.calcite.sql.SqlExplainLevel; import org.apache.calcite.util.Pair; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.LinkedHashMap; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/plan/visualizer/NodeUpdateHelper.java b/core/src/main/java/org/apache/calcite/plan/visualizer/NodeUpdateHelper.java index 4b4e56d784ca..47991482f707 100644 --- a/core/src/main/java/org/apache/calcite/plan/visualizer/NodeUpdateHelper.java +++ b/core/src/main/java/org/apache/calcite/plan/visualizer/NodeUpdateHelper.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.Collections; import java.util.LinkedHashMap; diff --git a/core/src/main/java/org/apache/calcite/plan/visualizer/RuleMatchVisualizer.java b/core/src/main/java/org/apache/calcite/plan/visualizer/RuleMatchVisualizer.java index 57bf1a990683..61f04b9ff1bb 100644 --- a/core/src/main/java/org/apache/calcite/plan/visualizer/RuleMatchVisualizer.java +++ b/core/src/main/java/org/apache/calcite/plan/visualizer/RuleMatchVisualizer.java @@ -32,7 +32,7 @@ import com.fasterxml.jackson.core.util.Separators; import com.fasterxml.jackson.databind.ObjectMapper; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.IOException; import java.io.InputStream; diff --git a/core/src/main/java/org/apache/calcite/plan/visualizer/package-info.java b/core/src/main/java/org/apache/calcite/plan/visualizer/package-info.java index 4f23efbcfc5a..f41225b70b49 100644 --- a/core/src/main/java/org/apache/calcite/plan/visualizer/package-info.java +++ b/core/src/main/java/org/apache/calcite/plan/visualizer/package-info.java @@ -20,4 +20,7 @@ * * @see org.apache.calcite.plan.visualizer.RuleMatchVisualizer */ +@NullMarked package org.apache.calcite.plan.visualizer; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/AbstractConverter.java b/core/src/main/java/org/apache/calcite/plan/volcano/AbstractConverter.java index 23f85c888ec9..b4e2e774a7f0 100644 --- a/core/src/main/java/org/apache/calcite/plan/volcano/AbstractConverter.java +++ b/core/src/main/java/org/apache/calcite/plan/volcano/AbstractConverter.java @@ -30,8 +30,8 @@ import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.calcite.tools.RelBuilderFactory; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/Dumpers.java b/core/src/main/java/org/apache/calcite/plan/volcano/Dumpers.java index 44560dde7ec8..386c5b11f9e9 100644 --- a/core/src/main/java/org/apache/calcite/plan/volcano/Dumpers.java +++ b/core/src/main/java/org/apache/calcite/plan/volcano/Dumpers.java @@ -26,7 +26,7 @@ import com.google.common.collect.Ordering; import org.apiguardian.api.API; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.PrintWriter; import java.io.StringWriter; diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/IterativeRuleQueue.java b/core/src/main/java/org/apache/calcite/plan/volcano/IterativeRuleQueue.java index 711f92e31931..9b07c64f7b17 100644 --- a/core/src/main/java/org/apache/calcite/plan/volcano/IterativeRuleQueue.java +++ b/core/src/main/java/org/apache/calcite/plan/volcano/IterativeRuleQueue.java @@ -23,7 +23,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 org.slf4j.Logger; import java.io.PrintWriter; diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/RelSet.java b/core/src/main/java/org/apache/calcite/plan/volcano/RelSet.java index d715f37d27d4..e2b2440b8841 100644 --- a/core/src/main/java/org/apache/calcite/plan/volcano/RelSet.java +++ b/core/src/main/java/org/apache/calcite/plan/volcano/RelSet.java @@ -16,6 +16,7 @@ */ package org.apache.calcite.plan.volcano; +import org.apache.calcite.linq4j.annotations.MonotonicNonNull; import org.apache.calcite.plan.Convention; import org.apache.calcite.plan.RelOptCluster; import org.apache.calcite.plan.RelOptListener; @@ -32,8 +33,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.MonotonicNonNull; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/RelSubset.java b/core/src/main/java/org/apache/calcite/plan/volcano/RelSubset.java index 8fa18de241c1..60b6855cff40 100644 --- a/core/src/main/java/org/apache/calcite/plan/volcano/RelSubset.java +++ b/core/src/main/java/org/apache/calcite/plan/volcano/RelSubset.java @@ -17,6 +17,7 @@ package org.apache.calcite.plan.volcano; import org.apache.calcite.linq4j.Linq4j; +import org.apache.calcite.linq4j.annotations.EnsuresNonNull; import org.apache.calcite.plan.RelOptCluster; import org.apache.calcite.plan.RelOptCost; import org.apache.calcite.plan.RelOptListener; @@ -41,9 +42,7 @@ import com.google.common.collect.Sets; import org.apiguardian.api.API; -import org.checkerframework.checker.initialization.qual.UnderInitialization; -import org.checkerframework.checker.nullness.qual.EnsuresNonNull; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import java.io.PrintWriter; @@ -171,12 +170,11 @@ public class RelSubset extends AbstractRelNode { */ @EnsuresNonNull("bestCost") private void computeBestCost( - @UnderInitialization RelSubset this, RelOptCluster cluster, RelOptPlanner planner) { bestCost = planner.getCostFactory().makeInfiniteCost(); final RelMetadataQuery mq = cluster.getMetadataQuery(); - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") Iterable rels = getRels(); for (RelNode rel : rels) { final RelOptCost cost = planner.getCost(rel, mq); @@ -661,7 +659,7 @@ public RelNode visit( finder.deadEnds.stream() .filter(deadSubset -> deadSubset.getOriginal() != null) .map(x -> { - RelNode original = castNonNull(x.getOriginal()); + RelNode original = x.getOriginal(); return original.getClass().getSimpleName() + traitDiff(original.getTraitSet(), x.getTraitSet()); }) diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/TopDownRuleDriver.java b/core/src/main/java/org/apache/calcite/plan/volcano/TopDownRuleDriver.java index 6940b0b1ae50..e4be6d4a2f5b 100644 --- a/core/src/main/java/org/apache/calcite/plan/volcano/TopDownRuleDriver.java +++ b/core/src/main/java/org/apache/calcite/plan/volcano/TopDownRuleDriver.java @@ -25,7 +25,7 @@ import org.apache.calcite.util.Pair; 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.ArrayDeque; diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/TopDownRuleQueue.java b/core/src/main/java/org/apache/calcite/plan/volcano/TopDownRuleQueue.java index 4b92b381aebf..0f696cda14e4 100644 --- a/core/src/main/java/org/apache/calcite/plan/volcano/TopDownRuleQueue.java +++ b/core/src/main/java/org/apache/calcite/plan/volcano/TopDownRuleQueue.java @@ -19,7 +19,7 @@ import org.apache.calcite.rel.RelNode; import org.apache.calcite.util.Pair; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayDeque; import java.util.Deque; diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoCost.java b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoCost.java index dd4f0023528b..da98dc2526ca 100644 --- a/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoCost.java +++ b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoCost.java @@ -20,7 +20,7 @@ import org.apache.calcite.plan.RelOptCostFactory; import org.apache.calcite.plan.RelOptUtil; -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/plan/volcano/VolcanoPlanner.java b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java index 8f4cf379b41e..8c2c3c37c446 100644 --- a/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java +++ b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java @@ -18,6 +18,10 @@ import org.apache.calcite.config.CalciteConnectionConfig; import org.apache.calcite.config.CalciteSystemProperty; +import org.apache.calcite.linq4j.annotations.Contract; +import org.apache.calcite.linq4j.annotations.EnsuresNonNull; +import org.apache.calcite.linq4j.annotations.MonotonicNonNull; +import org.apache.calcite.linq4j.annotations.RequiresNonNull; import org.apache.calcite.plan.AbstractRelOptPlanner; import org.apache.calcite.plan.Context; import org.apache.calcite.plan.Convention; @@ -61,12 +65,7 @@ import com.google.common.collect.Multimap; import org.apiguardian.api.API; -import org.checkerframework.checker.nullness.qual.EnsuresNonNull; -import org.checkerframework.checker.nullness.qual.MonotonicNonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.PolyNull; -import org.checkerframework.checker.nullness.qual.RequiresNonNull; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.Nullable; import java.io.PrintWriter; import java.io.StringWriter; @@ -228,7 +227,7 @@ public VolcanoPlanner(Context externalContext) { /** * Creates a {@code VolcanoPlanner} with a given cost factory. */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") public VolcanoPlanner(@Nullable RelOptCostFactory costFactory, @Nullable Context externalContext) { super(costFactory == null ? VolcanoCost.FACTORY : costFactory, @@ -282,7 +281,6 @@ public void setTopDownOpt(boolean value) { ensureRootConverters(); } - @Pure @Override public @Nullable RelNode getRoot() { return root; } @@ -1503,7 +1501,8 @@ private RelSubset registerSubset( * @param plan Plan * @return Normalized plan */ - public static @PolyNull String normalizePlan(@PolyNull String plan) { + @Contract("!null -> !null") + public static @Nullable String normalizePlan(@Nullable String plan) { if (plan == null) { return null; } @@ -1514,7 +1513,8 @@ private RelSubset registerSubset( if (!matcher.find()) { return plan; } - final String token = matcher.group(); // e.g. "Subset#23." + // e.g. "Subset#23."; find() above has succeeded + final String token = requireNonNull(matcher.group(), "matcher.group()"); plan = plan.replace(token, "Subset#{" + i++ + "}."); } } diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoRelMetadataProvider.java b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoRelMetadataProvider.java index 266aec0a1442..359a06c7553f 100644 --- a/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoRelMetadataProvider.java +++ b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoRelMetadataProvider.java @@ -27,7 +27,7 @@ import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Multimap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Method; import java.util.List; @@ -51,7 +51,7 @@ public class VolcanoRelMetadataProvider implements RelMetadataProvider { } @Deprecated // to be removed before 2.0 - @Override public <@Nullable M extends @Nullable Metadata> @Nullable UnboundMetadata apply( + @Override public @Nullable UnboundMetadata apply( Class relClass, final Class metadataClass) { if (relClass != RelSubset.class) { diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoRuleCall.java b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoRuleCall.java index a4b84907126a..4c0f5b9c3a99 100644 --- a/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoRuleCall.java +++ b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoRuleCall.java @@ -30,7 +30,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; -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/plan/volcano/VolcanoRuleMatch.java b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoRuleMatch.java index 8a24ecd9c139..c5a77a825094 100644 --- a/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoRuleMatch.java +++ b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoRuleMatch.java @@ -42,7 +42,7 @@ class VolcanoRuleMatch extends VolcanoRuleCall { * can modify it later * @param nodeInputs Map from relational expressions to their inputs */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") VolcanoRuleMatch(VolcanoPlanner volcanoPlanner, RelOptRuleOperand operand0, RelNode[] rels, Map> nodeInputs) { super(volcanoPlanner, operand0, rels.clone(), nodeInputs); diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/package-info.java b/core/src/main/java/org/apache/calcite/plan/volcano/package-info.java index 8605f1def88a..45b0d704b504 100644 --- a/core/src/main/java/org/apache/calcite/plan/volcano/package-info.java +++ b/core/src/main/java/org/apache/calcite/plan/volcano/package-info.java @@ -270,4 +270,7 @@ * McKenna * (1993). */ +@NullMarked package org.apache.calcite.plan.volcano; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/prepare/CalciteCatalogReader.java b/core/src/main/java/org/apache/calcite/prepare/CalciteCatalogReader.java index df5e7ade813d..238a6acf579a 100644 --- a/core/src/main/java/org/apache/calcite/prepare/CalciteCatalogReader.java +++ b/core/src/main/java/org/apache/calcite/prepare/CalciteCatalogReader.java @@ -68,7 +68,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.Collection; @@ -364,7 +364,7 @@ private static SqlOperator toOp(SqlIdentifier name, typeFactory -> argTypesFactory.apply(typeFactory) .stream() .map(type -> - Util.first(type.getSqlTypeName().getFamily(), + Util.firstNonNull(type.getSqlTypeName().getFamily(), SqlTypeFamily.ANY)) .collect(toImmutableList()); final Function> paramTypesFactory = @@ -515,7 +515,7 @@ private static RelDataType toSql(RelDataTypeFactory typeFactory, return nameMatcher; } - @Override public @Nullable C unwrap(Class aClass) { + @Override public @Nullable C unwrap(Class aClass) { if (aClass.isInstance(this)) { return aClass.cast(this); } diff --git a/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java b/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java index 06e27e361cff..8df45081ab5d 100644 --- a/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java +++ b/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java @@ -121,7 +121,7 @@ import com.google.common.collect.ImmutableMap; 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.math.BigDecimal; @@ -845,7 +845,7 @@ private static ColumnMetaData.AvaticaType avaticaType(JavaTypeFactory typeFactor // fall through default: final Type clazz = - typeFactory.getJavaClass(Util.first(fieldType, type)); + typeFactory.getJavaClass(Util.firstNonNull(fieldType, type)); final ColumnMetaData.Rep rep = requireNonNull(ColumnMetaData.Rep.of(clazz)); return ColumnMetaData.scalar(typeOrdinal, typeName, rep); diff --git a/core/src/main/java/org/apache/calcite/prepare/PlannerImpl.java b/core/src/main/java/org/apache/calcite/prepare/PlannerImpl.java index 5fece8fa9770..38b233da1ccf 100644 --- a/core/src/main/java/org/apache/calcite/prepare/PlannerImpl.java +++ b/core/src/main/java/org/apache/calcite/prepare/PlannerImpl.java @@ -23,6 +23,7 @@ import org.apache.calcite.config.CalciteSystemProperty; import org.apache.calcite.jdbc.CalciteSchema; import org.apache.calcite.jdbc.JavaTypeFactoryImpl; +import org.apache.calcite.linq4j.annotations.EnsuresNonNull; import org.apache.calcite.plan.Context; import org.apache.calcite.plan.ConventionTraitDef; import org.apache.calcite.plan.RelOptCluster; @@ -61,8 +62,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.EnsuresNonNull; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.Reader; import java.util.List; @@ -104,7 +104,7 @@ public class PlannerImpl implements Planner, ViewExpander { /** Creates a planner. Not a public API; call * {@link org.apache.calcite.tools.Frameworks#getPlanner} instead. */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") public PlannerImpl(FrameworkConfig config) { this.costFactory = config.getCostFactory(); this.defaultSchema = config.getDefaultSchema(); diff --git a/core/src/main/java/org/apache/calcite/prepare/Prepare.java b/core/src/main/java/org/apache/calcite/prepare/Prepare.java index eac4fa6dd347..0e6be4cfe01f 100644 --- a/core/src/main/java/org/apache/calcite/prepare/Prepare.java +++ b/core/src/main/java/org/apache/calcite/prepare/Prepare.java @@ -22,6 +22,7 @@ import org.apache.calcite.jdbc.CalcitePrepare; import org.apache.calcite.jdbc.CalciteSchema; import org.apache.calcite.jdbc.CalciteSchema.LatticeEntry; +import org.apache.calcite.linq4j.annotations.MonotonicNonNull; import org.apache.calcite.plan.Convention; import org.apache.calcite.plan.RelOptLattice; import org.apache.calcite.plan.RelOptMaterialization; @@ -69,8 +70,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.MonotonicNonNull; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import java.lang.reflect.Type; @@ -116,7 +116,7 @@ public abstract class Prepare { // temporary. for testing. public static final TryThreadLocal<@Nullable Integer> THREAD_INSUBQUERY_THRESHOLD = - TryThreadLocal.of(DEFAULT_IN_SUB_QUERY_THRESHOLD); + TryThreadLocal.<@Nullable Integer>of(DEFAULT_IN_SUB_QUERY_THRESHOLD); protected Prepare(CalcitePrepare.Context context, CatalogReader catalogReader, Convention resultConvention) { diff --git a/core/src/main/java/org/apache/calcite/prepare/QueryableRelBuilder.java b/core/src/main/java/org/apache/calcite/prepare/QueryableRelBuilder.java index 1835555c7156..99d24d98a873 100644 --- a/core/src/main/java/org/apache/calcite/prepare/QueryableRelBuilder.java +++ b/core/src/main/java/org/apache/calcite/prepare/QueryableRelBuilder.java @@ -51,8 +51,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.PolyNull; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.Comparator; @@ -254,8 +253,8 @@ private void setRel(RelNode rel) { throw new UnsupportedOperationException(); } - @Override public Queryable<@PolyNull T> defaultIfEmpty(Queryable source, - @PolyNull T value) { + @Override public Queryable<@Nullable T> defaultIfEmpty(Queryable source, + @Nullable T value) { throw new UnsupportedOperationException(); } @@ -502,7 +501,7 @@ private void setRel(RelNode rel) { throw new UnsupportedOperationException(); } - @Override public Queryable ofType( + @Override public Queryable ofType( Queryable source, Class clazz) { throw new UnsupportedOperationException(); } @@ -544,7 +543,7 @@ private void setRel(RelNode rel) { throw new UnsupportedOperationException(); } - @Override public Queryable select( + @Override public Queryable select( Queryable source, FunctionExpression> selector) { RelNode child = toRel(source); @@ -555,19 +554,19 @@ private void setRel(RelNode rel) { return castNonNull(null); } - @Override public Queryable selectN( + @Override public Queryable selectN( Queryable source, FunctionExpression> selector) { throw new UnsupportedOperationException(); } - @Override public Queryable selectMany( + @Override public Queryable selectMany( Queryable source, FunctionExpression>> selector) { throw new UnsupportedOperationException(); } - @Override public Queryable selectManyN( + @Override public Queryable selectManyN( Queryable source, FunctionExpression>> selector) { throw new UnsupportedOperationException(); diff --git a/core/src/main/java/org/apache/calcite/prepare/RelOptTableImpl.java b/core/src/main/java/org/apache/calcite/prepare/RelOptTableImpl.java index 8f1dc3e5f513..62bb5482e957 100644 --- a/core/src/main/java/org/apache/calcite/prepare/RelOptTableImpl.java +++ b/core/src/main/java/org/apache/calcite/prepare/RelOptTableImpl.java @@ -61,7 +61,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.Collection; @@ -187,7 +187,7 @@ public static RelOptTableImpl create(@Nullable RelOptSchema schema, return new RelOptTableImpl(schema, rowType, names, table, null, null); } - @Override public @Nullable T unwrap(Class clazz) { + @Override public @Nullable T unwrap(Class clazz) { if (clazz.isInstance(this)) { return clazz.cast(this); } @@ -273,7 +273,7 @@ public static RelOptTableImpl create(@Nullable RelOptSchema schema, final RelOptTable relOptTable = new RelOptTableImpl(this.schema, b.build(), this.names, this.table, this.tableExpressionFactory, this.rowCount) { - @Override public @Nullable T unwrap(Class clazz) { + @Override public @Nullable T unwrap(Class clazz) { if (clazz.isAssignableFrom(InitializerExpressionFactory.class)) { return clazz.cast(NullInitializerExpressionFactory.INSTANCE); } @@ -493,7 +493,7 @@ public static MySchemaPlus create(Path path) { return schema.isMutable(); } - @Override public @Nullable T unwrap(Class clazz) { + @Override public @Nullable T unwrap(Class clazz) { return null; } diff --git a/core/src/main/java/org/apache/calcite/prepare/package-info.java b/core/src/main/java/org/apache/calcite/prepare/package-info.java index 29062836cafd..c339d51517da 100644 --- a/core/src/main/java/org/apache/calcite/prepare/package-info.java +++ b/core/src/main/java/org/apache/calcite/prepare/package-info.java @@ -18,11 +18,7 @@ /** * Preparation of queries (parsing, planning and implementation). */ -@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.prepare; -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/profile/Profiler.java b/core/src/main/java/org/apache/calcite/profile/Profiler.java index 32f9f6b9b4e2..26d8e98f2f1a 100644 --- a/core/src/main/java/org/apache/calcite/profile/Profiler.java +++ b/core/src/main/java/org/apache/calcite/profile/Profiler.java @@ -25,7 +25,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSortedSet; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.math.MathContext; diff --git a/core/src/main/java/org/apache/calcite/profile/ProfilerImpl.java b/core/src/main/java/org/apache/calcite/profile/ProfilerImpl.java index b37a30680002..dd137cbd09a4 100644 --- a/core/src/main/java/org/apache/calcite/profile/ProfilerImpl.java +++ b/core/src/main/java/org/apache/calcite/profile/ProfilerImpl.java @@ -33,7 +33,7 @@ import com.google.common.collect.Ordering; import com.yahoo.sketches.hll.HllSketch; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; @@ -166,7 +166,8 @@ class Run { } } this.singletonSpaces = - new ArrayList<>(Collections.nCopies(columns.size(), (Space) null)); + new ArrayList<>( + Collections.<@Nullable Space>nCopies(columns.size(), null)); if (combinationsPerPass > Math.pow(2D, columns.size())) { // There are not many columns. We can compute all combinations in the // first pass. @@ -538,7 +539,7 @@ abstract static class Collector { this.space = space; } - abstract void add(List row); + abstract void add(List row); abstract void finish(); /** Creates an initial collector of the appropriate kind. */ @@ -567,8 +568,8 @@ static class SingletonCollector extends Collector { this.sketchThreshold = sketchThreshold; } - @Override public void add(List row) { - final Comparable v = row.get(columnOrdinal); + @Override public void add(List row) { + final Comparable v = castNonNull(row.get(columnOrdinal)); if (v == NullSentinel.INSTANCE) { nullCount++; } else { @@ -607,13 +608,13 @@ static class CompositeCollector extends Collector { this.sketchThreshold = sketchThreshold; } - @Override public void add(List row) { + @Override public void add(List row) { if (space.columnOrdinals.equals(OF)) { Util.discard(0); } int nullCountThisRow = 0; for (int i = 0, length = columnOrdinals.length; i < length; i++) { - final Comparable value = row.get(columnOrdinals[i]); + final Comparable value = castNonNull(row.get(columnOrdinals[i])); if (value == NullSentinel.INSTANCE) { if (nullCountThisRow++ == 0) { nullCount++; @@ -627,11 +628,10 @@ static class CompositeCollector extends Collector { // Too many values. Switch to a sketch collector. final HllCompositeCollector collector = new HllCompositeCollector(space, columnOrdinals); - final List list = + final List<@Nullable Comparable> list = new ArrayList<>( - Collections.nCopies(columnOrdinals[columnOrdinals.length - 1] - + 1, - null)); + Collections.<@Nullable Comparable>nCopies( + columnOrdinals[columnOrdinals.length - 1] + 1, null)); for (FlatLists.ComparableList value : this.values) { for (int i = 0; i < value.size(); i++) { Comparable c = (Comparable) value.get(i); @@ -700,8 +700,8 @@ static class HllSingletonCollector extends HllCollector { this.columnOrdinal = columnOrdinal; } - @Override public void add(List row) { - final Comparable value = row.get(columnOrdinal); + @Override public void add(List row) { + final Comparable value = castNonNull(row.get(columnOrdinal)); if (value == NullSentinel.INSTANCE) { nullCount++; sketch.update(NULL_BITS); @@ -722,14 +722,14 @@ static class HllCompositeCollector extends HllCollector { this.columnOrdinals = columnOrdinals; } - @Override public void add(List row) { + @Override public void add(List row) { if (space.columnOrdinals.equals(OF)) { Util.discard(0); } int nullCountThisRow = 0; buf.clear(); for (int columnOrdinal : columnOrdinals) { - final Comparable value = row.get(columnOrdinal); + final Comparable value = castNonNull(row.get(columnOrdinal)); if (value == NullSentinel.INSTANCE) { if (nullCountThisRow++ == 0) { nullCount++; diff --git a/core/src/main/java/org/apache/calcite/profile/SimpleProfiler.java b/core/src/main/java/org/apache/calcite/profile/SimpleProfiler.java index 2b4c413c5e31..92baaca63233 100644 --- a/core/src/main/java/org/apache/calcite/profile/SimpleProfiler.java +++ b/core/src/main/java/org/apache/calcite/profile/SimpleProfiler.java @@ -27,9 +27,7 @@ import com.google.common.collect.ImmutableSortedSet; import com.google.common.collect.Iterables; -import org.checkerframework.checker.initialization.qual.UnknownInitialization; -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.BitSet; @@ -292,10 +290,7 @@ private boolean hasNull(ImmutableBitSet columnOrdinals) { } return false; } - - @RequiresNonNull("columns") private ImmutableSortedSet toColumns( - @UnknownInitialization Run this, Iterable ordinals) { //noinspection Convert2MethodRef return ImmutableSortedSet.copyOf( diff --git a/core/src/main/java/org/apache/calcite/profile/package-info.java b/core/src/main/java/org/apache/calcite/profile/package-info.java index 8a708b7db24a..7a2ccabf515d 100644 --- a/core/src/main/java/org/apache/calcite/profile/package-info.java +++ b/core/src/main/java/org/apache/calcite/profile/package-info.java @@ -18,11 +18,7 @@ /** * Utilities to analyze 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.profile; -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/rel/AbstractRelNode.java b/core/src/main/java/org/apache/calcite/rel/AbstractRelNode.java index 0786798474d8..d248e01e1f9d 100644 --- a/core/src/main/java/org/apache/calcite/rel/AbstractRelNode.java +++ b/core/src/main/java/org/apache/calcite/rel/AbstractRelNode.java @@ -16,6 +16,7 @@ */ package org.apache.calcite.rel; +import org.apache.calcite.linq4j.annotations.MonotonicNonNull; import org.apache.calcite.plan.Convention; import org.apache.calcite.plan.ConventionTraitDef; import org.apache.calcite.plan.RelDigest; @@ -42,10 +43,7 @@ import com.google.common.collect.ImmutableSet; import org.apiguardian.api.API; -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 java.util.ArrayList; import java.util.Collections; @@ -127,9 +125,7 @@ protected static T sole(List collection) { return cluster; } - @Pure - @Override public final @Nullable Convention getConvention( - @UnknownInitialization AbstractRelNode this) { + @Override public final @Nullable Convention getConvention() { return traitSet == null ? null : traitSet.getTrait(ConventionTraitDef.INSTANCE); } @@ -235,7 +231,7 @@ protected RelDataType deriveRowType() { } @Deprecated // to be removed before 2.0 - @Override public final <@Nullable M extends @Nullable Metadata> M metadata(Class metadataClass, + @Override public final M metadata(Class metadataClass, RelMetadataQuery mq) { final MetadataFactory factory = cluster.getMetadataFactory(); final M metadata = factory.query(this, mq, metadataClass); diff --git a/core/src/main/java/org/apache/calcite/rel/PhysicalNode.java b/core/src/main/java/org/apache/calcite/rel/PhysicalNode.java index 50da278f27f5..4070a66bff43 100644 --- a/core/src/main/java/org/apache/calcite/rel/PhysicalNode.java +++ b/core/src/main/java/org/apache/calcite/rel/PhysicalNode.java @@ -23,7 +23,7 @@ import org.apache.calcite.rel.core.Sort; import org.apache.calcite.util.Pair; -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/rel/RelCollationImpl.java b/core/src/main/java/org/apache/calcite/rel/RelCollationImpl.java index 19219f741a10..73abb7bce971 100644 --- a/core/src/main/java/org/apache/calcite/rel/RelCollationImpl.java +++ b/core/src/main/java/org/apache/calcite/rel/RelCollationImpl.java @@ -29,7 +29,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.UnmodifiableIterator; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Iterator; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/rel/RelCollationTraitDef.java b/core/src/main/java/org/apache/calcite/rel/RelCollationTraitDef.java index d60864362bc2..c27c9896eaa5 100644 --- a/core/src/main/java/org/apache/calcite/rel/RelCollationTraitDef.java +++ b/core/src/main/java/org/apache/calcite/rel/RelCollationTraitDef.java @@ -22,7 +22,7 @@ import org.apache.calcite.rel.core.Sort; import org.apache.calcite.rel.logical.LogicalSort; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Definition of the ordering trait. diff --git a/core/src/main/java/org/apache/calcite/rel/RelCommonExpressionBasicSuggester.java b/core/src/main/java/org/apache/calcite/rel/RelCommonExpressionBasicSuggester.java index 4c74237aeedc..67d311b473ba 100644 --- a/core/src/main/java/org/apache/calcite/rel/RelCommonExpressionBasicSuggester.java +++ b/core/src/main/java/org/apache/calcite/rel/RelCommonExpressionBasicSuggester.java @@ -25,7 +25,7 @@ import org.apache.calcite.rel.rules.CommonRelSubExprRegisterRule; import org.apiguardian.api.API; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Collection; import java.util.stream.Collectors; diff --git a/core/src/main/java/org/apache/calcite/rel/RelCommonExpressionSuggester.java b/core/src/main/java/org/apache/calcite/rel/RelCommonExpressionSuggester.java index 872a9554091e..f58b4adc7b12 100644 --- a/core/src/main/java/org/apache/calcite/rel/RelCommonExpressionSuggester.java +++ b/core/src/main/java/org/apache/calcite/rel/RelCommonExpressionSuggester.java @@ -19,7 +19,7 @@ import org.apache.calcite.plan.Context; import org.apiguardian.api.API; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Collection; diff --git a/core/src/main/java/org/apache/calcite/rel/RelDistributionTraitDef.java b/core/src/main/java/org/apache/calcite/rel/RelDistributionTraitDef.java index 5fc2ed5bf576..cb657eeead53 100644 --- a/core/src/main/java/org/apache/calcite/rel/RelDistributionTraitDef.java +++ b/core/src/main/java/org/apache/calcite/rel/RelDistributionTraitDef.java @@ -22,7 +22,7 @@ import org.apache.calcite.rel.core.Exchange; import org.apache.calcite.rel.logical.LogicalExchange; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Definition of the distribution trait. diff --git a/core/src/main/java/org/apache/calcite/rel/RelDistributions.java b/core/src/main/java/org/apache/calcite/rel/RelDistributions.java index 7917c9f58f6d..3a4c72b5550a 100644 --- a/core/src/main/java/org/apache/calcite/rel/RelDistributions.java +++ b/core/src/main/java/org/apache/calcite/rel/RelDistributions.java @@ -26,7 +26,7 @@ import com.google.common.collect.Ordering; -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/rel/RelFieldCollation.java b/core/src/main/java/org/apache/calcite/rel/RelFieldCollation.java index 985ae902caca..193601e791b7 100644 --- a/core/src/main/java/org/apache/calcite/rel/RelFieldCollation.java +++ b/core/src/main/java/org/apache/calcite/rel/RelFieldCollation.java @@ -18,7 +18,7 @@ import org.apache.calcite.sql.validate.SqlMonotonicity; -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/rel/RelInput.java b/core/src/main/java/org/apache/calcite/rel/RelInput.java index c3d8e41b570c..bcfebc8ca9a2 100644 --- a/core/src/main/java/org/apache/calcite/rel/RelInput.java +++ b/core/src/main/java/org/apache/calcite/rel/RelInput.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.math.BigDecimal; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/rel/RelNode.java b/core/src/main/java/org/apache/calcite/rel/RelNode.java index 5eeece98223f..000f4dd446eb 100644 --- a/core/src/main/java/org/apache/calcite/rel/RelNode.java +++ b/core/src/main/java/org/apache/calcite/rel/RelNode.java @@ -33,9 +33,7 @@ import org.apache.calcite.util.Litmus; import org.apiguardian.api.API; -import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Set; @@ -90,7 +88,6 @@ public interface RelNode extends RelOptNode, Cloneable { * * @return this RelNode's CallingConvention */ - @Pure @Nullable Convention getConvention(); /** @@ -213,7 +210,7 @@ public interface RelNode extends RelOptNode, Cloneable { * return null from all methods) */ @Deprecated // to be removed before 2.0 - <@Nullable M extends @Nullable Metadata> M metadata(Class metadataClass, RelMetadataQuery mq); + M metadata(Class metadataClass, RelMetadataQuery mq); /** * Describes the inputs and attributes of this relational expression. @@ -297,7 +294,6 @@ default String explain() { * @return Whether the 2 RelNodes are equivalent or have the same digest. * @see #deepHashCode() */ - @EnsuresNonNullIf(expression = "#1", result = true) boolean deepEquals(@Nullable Object obj); /** diff --git a/core/src/main/java/org/apache/calcite/rel/RelNodes.java b/core/src/main/java/org/apache/calcite/rel/RelNodes.java index 0565fa0292a4..865091140135 100644 --- a/core/src/main/java/org/apache/calcite/rel/RelNodes.java +++ b/core/src/main/java/org/apache/calcite/rel/RelNodes.java @@ -27,7 +27,7 @@ import com.google.common.collect.Ordering; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Comparator; import java.util.function.BiConsumer; diff --git a/core/src/main/java/org/apache/calcite/rel/RelValidityChecker.java b/core/src/main/java/org/apache/calcite/rel/RelValidityChecker.java index f30fa3238d43..9be60346865b 100644 --- a/core/src/main/java/org/apache/calcite/rel/RelValidityChecker.java +++ b/core/src/main/java/org/apache/calcite/rel/RelValidityChecker.java @@ -21,7 +21,7 @@ import com.google.common.collect.ImmutableSet; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayDeque; import java.util.Deque; diff --git a/core/src/main/java/org/apache/calcite/rel/RelVisitor.java b/core/src/main/java/org/apache/calcite/rel/RelVisitor.java index c355eba747c8..4cfef79808f8 100644 --- a/core/src/main/java/org/apache/calcite/rel/RelVisitor.java +++ b/core/src/main/java/org/apache/calcite/rel/RelVisitor.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.rel; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * A RelVisitor is a Visitor role in the diff --git a/core/src/main/java/org/apache/calcite/rel/RelWriter.java b/core/src/main/java/org/apache/calcite/rel/RelWriter.java index 6af6e1117875..c382aeaebff8 100644 --- a/core/src/main/java/org/apache/calcite/rel/RelWriter.java +++ b/core/src/main/java/org/apache/calcite/rel/RelWriter.java @@ -19,7 +19,7 @@ import org.apache.calcite.sql.SqlExplainLevel; 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/rel/convert/Converter.java b/core/src/main/java/org/apache/calcite/rel/convert/Converter.java index cc0eaa8ee72d..d412459f6716 100644 --- a/core/src/main/java/org/apache/calcite/rel/convert/Converter.java +++ b/core/src/main/java/org/apache/calcite/rel/convert/Converter.java @@ -20,7 +20,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; /** * A relational expression implements the interface Converter to diff --git a/core/src/main/java/org/apache/calcite/rel/convert/ConverterImpl.java b/core/src/main/java/org/apache/calcite/rel/convert/ConverterImpl.java index 623e1acc92ff..e7574a607ab1 100644 --- a/core/src/main/java/org/apache/calcite/rel/convert/ConverterImpl.java +++ b/core/src/main/java/org/apache/calcite/rel/convert/ConverterImpl.java @@ -25,7 +25,7 @@ import org.apache.calcite.rel.SingleRel; import org.apache.calcite.rel.metadata.RelMetadataQuery; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Abstract implementation of {@link Converter}. diff --git a/core/src/main/java/org/apache/calcite/rel/convert/ConverterRule.java b/core/src/main/java/org/apache/calcite/rel/convert/ConverterRule.java index 10e11d2b71ae..b948bccee9cf 100644 --- a/core/src/main/java/org/apache/calcite/rel/convert/ConverterRule.java +++ b/core/src/main/java/org/apache/calcite/rel/convert/ConverterRule.java @@ -25,8 +25,8 @@ import org.apache.calcite.rel.RelNode; import org.apache.calcite.tools.RelBuilderFactory; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.Locale; import java.util.Objects; diff --git a/core/src/main/java/org/apache/calcite/rel/convert/TraitMatchingRule.java b/core/src/main/java/org/apache/calcite/rel/convert/TraitMatchingRule.java index abd05a935e11..23c2ac3115f6 100644 --- a/core/src/main/java/org/apache/calcite/rel/convert/TraitMatchingRule.java +++ b/core/src/main/java/org/apache/calcite/rel/convert/TraitMatchingRule.java @@ -25,8 +25,8 @@ import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.tools.RelBuilderFactory; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; /** * TraitMatchingRule adapts a converter rule, restricting it to fire only when diff --git a/core/src/main/java/org/apache/calcite/rel/convert/package-info.java b/core/src/main/java/org/apache/calcite/rel/convert/package-info.java index 7b2fe7fd68f4..e38719c3f5df 100644 --- a/core/src/main/java/org/apache/calcite/rel/convert/package-info.java +++ b/core/src/main/java/org/apache/calcite/rel/convert/package-info.java @@ -19,4 +19,7 @@ * Defines relational expressions and rules for converting between calling * conventions. */ +@NullMarked package org.apache.calcite.rel.convert; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/rel/core/Aggregate.java b/core/src/main/java/org/apache/calcite/rel/core/Aggregate.java index c019d53e9909..d79b522260b3 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/Aggregate.java +++ b/core/src/main/java/org/apache/calcite/rel/core/Aggregate.java @@ -49,7 +49,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.math.IntMath; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; @@ -150,7 +150,7 @@ public static void checkIndicator(boolean indicator) { * @param groupSets List of all grouping sets; null for just {@code groupSet} * @param aggCalls Collection of calls to aggregate functions */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") protected Aggregate( RelOptCluster cluster, RelTraitSet traitSet, @@ -340,7 +340,7 @@ public ImmutableList getGroupSets() { .itemIf("aggs", aggCalls, pw.nest()); if (!pw.nest()) { for (Ord ord : Ord.zip(aggCalls)) { - pw.item(Util.first(ord.e.name, "agg#" + ord.i), ord.e); + pw.item(Util.firstNonNull(ord.e.name, "agg#" + ord.i), ord.e); } } return pw; diff --git a/core/src/main/java/org/apache/calcite/rel/core/AggregateCall.java b/core/src/main/java/org/apache/calcite/rel/core/AggregateCall.java index 47164f94def9..b222cfc4f557 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/AggregateCall.java +++ b/core/src/main/java/org/apache/calcite/rel/core/AggregateCall.java @@ -35,7 +35,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.Objects; diff --git a/core/src/main/java/org/apache/calcite/rel/core/Calc.java b/core/src/main/java/org/apache/calcite/rel/core/Calc.java index 0e1e2e61965c..6610c14e500c 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/Calc.java +++ b/core/src/main/java/org/apache/calcite/rel/core/Calc.java @@ -43,7 +43,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -68,7 +68,7 @@ public abstract class Calc extends SingleRel implements Hintable { * @param child Input relation * @param program Calc program */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") protected Calc( RelOptCluster cluster, RelTraitSet traits, diff --git a/core/src/main/java/org/apache/calcite/rel/core/Collect.java b/core/src/main/java/org/apache/calcite/rel/core/Collect.java index d2f89eeec3ba..01a0c89761ff 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/Collect.java +++ b/core/src/main/java/org/apache/calcite/rel/core/Collect.java @@ -33,7 +33,7 @@ import com.google.common.collect.Iterables; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -171,8 +171,8 @@ public static Collect create(RelNode input, } /** Returns the row type, guaranteed not null. - * (The row type is never null after initialization, but - * CheckerFramework can't deduce that references are safe.) */ + * (The field is nullable because it is populated lazily, but it is set by the time any + * caller can reach this method.) */ protected final RelDataType rowType() { return requireNonNull(rowType, "rowType"); } diff --git a/core/src/main/java/org/apache/calcite/rel/core/Correlate.java b/core/src/main/java/org/apache/calcite/rel/core/Correlate.java index c6a994e922eb..06736eee2d12 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/Correlate.java +++ b/core/src/main/java/org/apache/calcite/rel/core/Correlate.java @@ -37,7 +37,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; import java.util.Set; @@ -91,7 +91,7 @@ public abstract class Correlate extends BiRel implements Hintable { * @param requiredColumns Set of columns that are used by correlation * @param joinType Join type */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") protected Correlate( RelOptCluster cluster, RelTraitSet traitSet, diff --git a/core/src/main/java/org/apache/calcite/rel/core/CorrelationId.java b/core/src/main/java/org/apache/calcite/rel/core/CorrelationId.java index 8deaa947b69a..8faa343e07b1 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/CorrelationId.java +++ b/core/src/main/java/org/apache/calcite/rel/core/CorrelationId.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.util.Set; diff --git a/core/src/main/java/org/apache/calcite/rel/core/Exchange.java b/core/src/main/java/org/apache/calcite/rel/core/Exchange.java index b6a59f9e29d4..d0ef389de77e 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/Exchange.java +++ b/core/src/main/java/org/apache/calcite/rel/core/Exchange.java @@ -30,7 +30,7 @@ import org.apache.calcite.rel.metadata.RelMetadataQuery; 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/rel/core/Filter.java b/core/src/main/java/org/apache/calcite/rel/core/Filter.java index 27aafd375285..b9440033dd13 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/Filter.java +++ b/core/src/main/java/org/apache/calcite/rel/core/Filter.java @@ -41,8 +41,7 @@ import com.google.common.collect.ImmutableList; import org.apiguardian.api.API; -import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Objects; @@ -78,7 +77,7 @@ public abstract class Filter extends SingleRel implements Hintable { * @param condition boolean expression which determines whether a row is * allowed to pass */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") protected Filter( RelOptCluster cluster, RelTraitSet traits, @@ -199,7 +198,6 @@ public static double estimateFilteredRows(RelNode child, RexNode condition) { } @API(since = "1.24", status = API.Status.INTERNAL) - @EnsuresNonNullIf(expression = "#1", result = true) protected boolean deepEquals0(@Nullable Object obj) { if (this == obj) { return true; diff --git a/core/src/main/java/org/apache/calcite/rel/core/Join.java b/core/src/main/java/org/apache/calcite/rel/core/Join.java index 999c4639f9c7..f0b2d1d68cf9 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/Join.java +++ b/core/src/main/java/org/apache/calcite/rel/core/Join.java @@ -42,8 +42,7 @@ import com.google.common.collect.ImmutableSet; import org.apiguardian.api.API; -import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Collections; import java.util.List; @@ -241,7 +240,6 @@ public static double estimateJoinedRows( } @API(since = "1.24", status = API.Status.INTERNAL) - @EnsuresNonNullIf(expression = "#1", result = true) protected boolean deepEquals0(@Nullable Object obj) { if (this == obj) { return true; diff --git a/core/src/main/java/org/apache/calcite/rel/core/Match.java b/core/src/main/java/org/apache/calcite/rel/core/Match.java index a0d106b2096b..27a6295eb9d7 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/Match.java +++ b/core/src/main/java/org/apache/calcite/rel/core/Match.java @@ -39,7 +39,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.HashSet; import java.util.List; @@ -214,7 +214,7 @@ public RelCollation getOrderKeys() { /** * Find aggregate functions in operands. */ - private static class AggregateFinder extends RexVisitorImpl { + private static class AggregateFinder extends RexVisitorImpl<@Nullable Void> { final NavigableSet aggregateCalls = new TreeSet<>(); final Map> aggregateCallsPerVar = new TreeMap<>(); @@ -291,7 +291,7 @@ public void go(RexCall call) { * Visits the operands of an aggregate call to retrieve relevant pattern * variables. */ - private static class PatternVarFinder extends RexVisitorImpl { + private static class PatternVarFinder extends RexVisitorImpl<@Nullable Void> { final Set patternVars = new HashSet<>(); PatternVarFinder() { diff --git a/core/src/main/java/org/apache/calcite/rel/core/Project.java b/core/src/main/java/org/apache/calcite/rel/core/Project.java index 1de67c9228f0..567f07359f5e 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/Project.java +++ b/core/src/main/java/org/apache/calcite/rel/core/Project.java @@ -49,8 +49,7 @@ import com.google.common.collect.ImmutableSet; import org.apiguardian.api.API; -import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.HashSet; import java.util.List; @@ -89,7 +88,7 @@ public abstract class Project extends SingleRel implements Hintable { * @param variableSet Correlation variables set by this relational expression * to be used by nested expressions */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") protected Project( RelOptCluster cluster, RelTraitSet traits, @@ -344,7 +343,6 @@ private static int countTrivial(List refs) { } @API(since = "1.24", status = API.Status.INTERNAL) - @EnsuresNonNullIf(expression = "#1", result = true) protected boolean deepEquals0(@Nullable Object obj) { if (this == obj) { return true; diff --git a/core/src/main/java/org/apache/calcite/rel/core/RelFactories.java b/core/src/main/java/org/apache/calcite/rel/core/RelFactories.java index e2a096762f77..b351cdbeab4b 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/RelFactories.java +++ b/core/src/main/java/org/apache/calcite/rel/core/RelFactories.java @@ -64,7 +64,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.List; diff --git a/core/src/main/java/org/apache/calcite/rel/core/RepeatUnion.java b/core/src/main/java/org/apache/calcite/rel/core/RepeatUnion.java index 5c31b4f189a8..62e881af2ec3 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/RepeatUnion.java +++ b/core/src/main/java/org/apache/calcite/rel/core/RepeatUnion.java @@ -28,7 +28,7 @@ import org.apache.calcite.schema.TransientTable; 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/rel/core/Snapshot.java b/core/src/main/java/org/apache/calcite/rel/core/Snapshot.java index a7c387c66375..962b05a570d7 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/Snapshot.java +++ b/core/src/main/java/org/apache/calcite/rel/core/Snapshot.java @@ -33,7 +33,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -80,7 +80,7 @@ public Snapshot(RelInput input) { * @param period Timestamp expression which as the table was at the given * time in the past */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") protected Snapshot(RelOptCluster cluster, RelTraitSet traitSet, List hints, RelNode input, RexNode period) { super(cluster, traitSet, input); @@ -98,7 +98,7 @@ protected Snapshot(RelOptCluster cluster, RelTraitSet traitSet, List hi * @param period Timestamp expression which as the table was at the given * time in the past */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") protected Snapshot( RelOptCluster cluster, RelTraitSet traitSet, RelNode input, RexNode period) { this(cluster, traitSet, ImmutableList.of(), input, period); diff --git a/core/src/main/java/org/apache/calcite/rel/core/Sort.java b/core/src/main/java/org/apache/calcite/rel/core/Sort.java index 9271a6210718..a4d70b52fc99 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/Sort.java +++ b/core/src/main/java/org/apache/calcite/rel/core/Sort.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.Collections; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/rel/core/TableFunctionScan.java b/core/src/main/java/org/apache/calcite/rel/core/TableFunctionScan.java index 4e1ad50b7343..140fcf40863a 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/TableFunctionScan.java +++ b/core/src/main/java/org/apache/calcite/rel/core/TableFunctionScan.java @@ -35,7 +35,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/rel/core/TableModify.java b/core/src/main/java/org/apache/calcite/rel/core/TableModify.java index 83dd8106476e..1c2ddae2e2f6 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/TableModify.java +++ b/core/src/main/java/org/apache/calcite/rel/core/TableModify.java @@ -16,6 +16,7 @@ */ package org.apache.calcite.rel.core; +import org.apache.calcite.linq4j.annotations.MonotonicNonNull; import org.apache.calcite.plan.RelOptCluster; import org.apache.calcite.plan.RelOptCost; import org.apache.calcite.plan.RelOptPlanner; @@ -38,8 +39,7 @@ import org.apache.calcite.sql.SqlKind; import org.apache.calcite.sql.type.SqlTypeUtil; -import org.checkerframework.checker.nullness.qual.MonotonicNonNull; -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/rel/core/TableScan.java b/core/src/main/java/org/apache/calcite/rel/core/TableScan.java index 0d6c4a9cdd04..5a7ab319c739 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/TableScan.java +++ b/core/src/main/java/org/apache/calcite/rel/core/TableScan.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.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/rel/core/Uncollect.java b/core/src/main/java/org/apache/calcite/rel/core/Uncollect.java index 039a17efbfcf..69125d76b16a 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/Uncollect.java +++ b/core/src/main/java/org/apache/calcite/rel/core/Uncollect.java @@ -115,7 +115,7 @@ public Uncollect(RelOptCluster cluster, RelTraitSet traitSet, RelNode input, * @param isOuter If true, an empty or NULL collection yields one row of * NULLs (LEFT JOIN); if false, it yields no rows (INNER) */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") public Uncollect(RelOptCluster cluster, RelTraitSet traitSet, RelNode input, boolean withOrdinality, List itemAliases, boolean expandStructFields, boolean isOuter) { diff --git a/core/src/main/java/org/apache/calcite/rel/core/Values.java b/core/src/main/java/org/apache/calcite/rel/core/Values.java index e45648933892..bbceb03d6ed3 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/Values.java +++ b/core/src/main/java/org/apache/calcite/rel/core/Values.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.util.Collections; import java.util.List; @@ -84,7 +84,7 @@ public abstract class Values extends AbstractRelNode implements Hintable { * list contains tuples; each inner list is one tuple; all * tuples must be of same length, conforming to rowType */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") protected Values( RelOptCluster cluster, List hints, @@ -111,7 +111,7 @@ protected Values( * list contains tuples; each inner list is one tuple; all * tuples must be of same length, conforming to rowType */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") protected Values( RelOptCluster cluster, RelDataType rowType, diff --git a/core/src/main/java/org/apache/calcite/rel/core/Window.java b/core/src/main/java/org/apache/calcite/rel/core/Window.java index 705e349b8465..c17b03441f81 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/Window.java +++ b/core/src/main/java/org/apache/calcite/rel/core/Window.java @@ -17,6 +17,7 @@ package org.apache.calcite.rel.core; import org.apache.calcite.linq4j.Ord; +import org.apache.calcite.linq4j.annotations.RequiresNonNull; import org.apache.calcite.plan.RelOptCluster; import org.apache.calcite.plan.RelOptCost; import org.apache.calcite.plan.RelOptPlanner; @@ -51,9 +52,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.initialization.qual.UnderInitialization; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.RequiresNonNull; +import org.jspecify.annotations.Nullable; import java.util.AbstractList; import java.util.Collections; @@ -295,7 +294,7 @@ public Group( } @RequiresNonNull({"keys", "orderKeys", "lowerBound", "upperBound", "aggCalls"}) - private String computeString(@UnderInitialization Group this) { + private String computeString() { final StringBuilder buf = new StringBuilder("window("); final int i = buf.length(); if (!keys.isEmpty()) { diff --git a/core/src/main/java/org/apache/calcite/rel/core/package-info.java b/core/src/main/java/org/apache/calcite/rel/core/package-info.java index db717abc9baa..fe9122c45baa 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/package-info.java +++ b/core/src/main/java/org/apache/calcite/rel/core/package-info.java @@ -31,4 +31,7 @@ * * */ +@NullMarked package org.apache.calcite.rel.core; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/rel/externalize/RelDotWriter.java b/core/src/main/java/org/apache/calcite/rel/externalize/RelDotWriter.java index f354bda24637..bf0ef3c4a5cf 100644 --- a/core/src/main/java/org/apache/calcite/rel/externalize/RelDotWriter.java +++ b/core/src/main/java/org/apache/calcite/rel/externalize/RelDotWriter.java @@ -26,8 +26,8 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.io.PrintWriter; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/rel/externalize/RelEnumTypes.java b/core/src/main/java/org/apache/calcite/rel/externalize/RelEnumTypes.java index b4ad2d1b900a..80ebdce17a57 100644 --- a/core/src/main/java/org/apache/calcite/rel/externalize/RelEnumTypes.java +++ b/core/src/main/java/org/apache/calcite/rel/externalize/RelEnumTypes.java @@ -34,8 +34,8 @@ import com.google.common.collect.ImmutableMap; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import static org.apache.calcite.linq4j.Nullness.castNonNull; diff --git a/core/src/main/java/org/apache/calcite/rel/externalize/RelJson.java b/core/src/main/java/org/apache/calcite/rel/externalize/RelJson.java index 8fa5abd149d8..1e6aae9c43bb 100644 --- a/core/src/main/java/org/apache/calcite/rel/externalize/RelJson.java +++ b/core/src/main/java/org/apache/calcite/rel/externalize/RelJson.java @@ -19,6 +19,7 @@ import org.apache.calcite.avatica.AvaticaUtils; import org.apache.calcite.avatica.util.ByteString; import org.apache.calcite.avatica.util.TimeUnit; +import org.apache.calcite.linq4j.annotations.Contract; import org.apache.calcite.plan.RelOptCluster; import org.apache.calcite.plan.RelOptTable; import org.apache.calcite.plan.RelTraitSet; @@ -87,9 +88,8 @@ import com.google.common.collect.Range; import com.google.common.collect.RangeSet; -import org.checkerframework.checker.nullness.qual.NonNull; -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.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; @@ -195,7 +195,7 @@ private JsonBuilder jsonBuilder() { } @SuppressWarnings("unchecked") - private static T get(Map map, + private static T get(Map map, String key) { return (T) requireNonNull(map.get(key), () -> "entry for key " + key); } @@ -757,7 +757,8 @@ public RexNode toRex(RelOptCluster cluster, Object o) { } @SuppressWarnings({"rawtypes", "unchecked"}) - @PolyNull RexNode toRex(RelInput relInput, @PolyNull Object o) { + @Contract("_, !null -> !null") + @Nullable RexNode toRex(RelInput relInput, @Nullable Object o) { final RelOptCluster cluster = relInput.getCluster(); final RexBuilder rexBuilder = cluster.getRexBuilder(); if (o == null) { diff --git a/core/src/main/java/org/apache/calcite/rel/externalize/RelJsonReader.java b/core/src/main/java/org/apache/calcite/rel/externalize/RelJsonReader.java index 2cdd785fe835..e5334d940136 100644 --- a/core/src/main/java/org/apache/calcite/rel/externalize/RelJsonReader.java +++ b/core/src/main/java/org/apache/calcite/rel/externalize/RelJsonReader.java @@ -43,7 +43,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.IOException; import java.lang.reflect.Constructor; diff --git a/core/src/main/java/org/apache/calcite/rel/externalize/RelJsonWriter.java b/core/src/main/java/org/apache/calcite/rel/externalize/RelJsonWriter.java index 85d275f79d6c..26f1db978973 100644 --- a/core/src/main/java/org/apache/calcite/rel/externalize/RelJsonWriter.java +++ b/core/src/main/java/org/apache/calcite/rel/externalize/RelJsonWriter.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.ArrayList; import java.util.IdentityHashMap; diff --git a/core/src/main/java/org/apache/calcite/rel/externalize/RelWriterImpl.java b/core/src/main/java/org/apache/calcite/rel/externalize/RelWriterImpl.java index 25af2ed3af35..f8cd466292b7 100644 --- a/core/src/main/java/org/apache/calcite/rel/externalize/RelWriterImpl.java +++ b/core/src/main/java/org/apache/calcite/rel/externalize/RelWriterImpl.java @@ -28,7 +28,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.PrintWriter; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/rel/externalize/RelXmlWriter.java b/core/src/main/java/org/apache/calcite/rel/externalize/RelXmlWriter.java index b11098240e40..fef5fbf0eaa5 100644 --- a/core/src/main/java/org/apache/calcite/rel/externalize/RelXmlWriter.java +++ b/core/src/main/java/org/apache/calcite/rel/externalize/RelXmlWriter.java @@ -21,7 +21,7 @@ import org.apache.calcite.util.Pair; import org.apache.calcite.util.XmlOutput; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.PrintWriter; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/rel/externalize/package-info.java b/core/src/main/java/org/apache/calcite/rel/externalize/package-info.java index f7f78eaa4ad1..514f911687f2 100644 --- a/core/src/main/java/org/apache/calcite/rel/externalize/package-info.java +++ b/core/src/main/java/org/apache/calcite/rel/externalize/package-info.java @@ -19,4 +19,7 @@ * Facilities to externalize {@link org.apache.calcite.rel.RelNode}s to and from * XML and JSON format. */ +@NullMarked package org.apache.calcite.rel.externalize; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/rel/hint/HintStrategy.java b/core/src/main/java/org/apache/calcite/rel/hint/HintStrategy.java index 4f28fd5a9405..1841654158e6 100644 --- a/core/src/main/java/org/apache/calcite/rel/hint/HintStrategy.java +++ b/core/src/main/java/org/apache/calcite/rel/hint/HintStrategy.java @@ -21,7 +21,7 @@ import com.google.common.collect.ImmutableSet; -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/rel/hint/HintStrategyTable.java b/core/src/main/java/org/apache/calcite/rel/hint/HintStrategyTable.java index a8de62f186ea..ddeff7b6d2fc 100644 --- a/core/src/main/java/org/apache/calcite/rel/hint/HintStrategyTable.java +++ b/core/src/main/java/org/apache/calcite/rel/hint/HintStrategyTable.java @@ -24,7 +24,7 @@ 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/rel/hint/RelHint.java b/core/src/main/java/org/apache/calcite/rel/hint/RelHint.java index 73ac9d146d7b..fcbb4716000b 100644 --- a/core/src/main/java/org/apache/calcite/rel/hint/RelHint.java +++ b/core/src/main/java/org/apache/calcite/rel/hint/RelHint.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 java.util.ArrayList; import java.util.Arrays; diff --git a/core/src/main/java/org/apache/calcite/rel/hint/package-info.java b/core/src/main/java/org/apache/calcite/rel/hint/package-info.java index 2c38fb5535bd..0aa5ee78288d 100644 --- a/core/src/main/java/org/apache/calcite/rel/hint/package-info.java +++ b/core/src/main/java/org/apache/calcite/rel/hint/package-info.java @@ -84,4 +84,7 @@ *

    Design Doc

    * Calcite SQL and Planner Hints Design. */ +@NullMarked package org.apache.calcite.rel.hint; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/rel/logical/LogicalAggregate.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalAggregate.java index d60cd228bcdb..96f648389f70 100644 --- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalAggregate.java +++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalAggregate.java @@ -29,7 +29,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/rel/logical/LogicalAsofJoin.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalAsofJoin.java index f6c31282fdb0..e00f442ec78f 100644 --- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalAsofJoin.java +++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalAsofJoin.java @@ -32,7 +32,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; @@ -125,7 +125,8 @@ public LogicalAsofJoin copy( return true; } return deepEquals0(obj) - && matchCondition.equals(((LogicalAsofJoin) obj).matchCondition) + && matchCondition.equals( + ((LogicalAsofJoin) requireNonNull(obj, "obj")).matchCondition) && systemFieldList.equals(((LogicalAsofJoin) obj).systemFieldList); } diff --git a/core/src/main/java/org/apache/calcite/rel/logical/LogicalFilter.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalFilter.java index ca67a1d0e174..7ac196f951ab 100644 --- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalFilter.java +++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalFilter.java @@ -36,7 +36,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; import java.util.Objects; @@ -165,7 +165,7 @@ public static LogicalFilter create(final RelNode input, RexNode condition, @Override public boolean deepEquals(@Nullable Object obj) { return deepEquals0(obj) - && variablesSet.equals(((LogicalFilter) obj).variablesSet); + && variablesSet.equals(((LogicalFilter) requireNonNull(obj, "obj")).variablesSet); } @Override public int deepHashCode() { diff --git a/core/src/main/java/org/apache/calcite/rel/logical/LogicalJoin.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalJoin.java index 9504f01e5534..361de3353f4b 100644 --- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalJoin.java +++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalJoin.java @@ -33,7 +33,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; import java.util.Objects; @@ -197,7 +197,7 @@ public static LogicalJoin create(RelNode left, RelNode right, List hint return true; } return deepEquals0(obj) - && semiJoinDone == ((LogicalJoin) obj).semiJoinDone + && semiJoinDone == ((LogicalJoin) requireNonNull(obj, "obj")).semiJoinDone && systemFieldList.equals(((LogicalJoin) obj).systemFieldList); } diff --git a/core/src/main/java/org/apache/calcite/rel/logical/LogicalMatch.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalMatch.java index 800a7bdee772..3dde4007f7cc 100644 --- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalMatch.java +++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalMatch.java @@ -27,7 +27,7 @@ import org.apache.calcite.rex.RexNode; import org.apache.calcite.util.ImmutableBitSet; -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/rel/logical/LogicalProject.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalProject.java index c1db7f223b81..9195bf9a924b 100644 --- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalProject.java +++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalProject.java @@ -38,7 +38,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; import java.util.Set; diff --git a/core/src/main/java/org/apache/calcite/rel/logical/LogicalRepeatUnion.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalRepeatUnion.java index 9b5e099290fc..7c6d20f85419 100644 --- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalRepeatUnion.java +++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalRepeatUnion.java @@ -25,7 +25,7 @@ import org.apache.calcite.rel.RelShuttle; import org.apache.calcite.rel.core.RepeatUnion; -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/rel/logical/LogicalSort.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalSort.java index 31b8b4b006d8..1396a0cf4e52 100644 --- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalSort.java +++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalSort.java @@ -28,7 +28,7 @@ import org.apache.calcite.rel.hint.RelHint; import org.apache.calcite.rex.RexNode; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Collections; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/rel/logical/LogicalTableFunctionScan.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalTableFunctionScan.java index 07765eb6bf40..7672154f9de9 100644 --- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalTableFunctionScan.java +++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalTableFunctionScan.java @@ -30,7 +30,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.lang.reflect.Type; import java.util.Collections; diff --git a/core/src/main/java/org/apache/calcite/rel/logical/LogicalTableModify.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalTableModify.java index 042547529dca..08230adc9225 100644 --- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalTableModify.java +++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalTableModify.java @@ -27,7 +27,7 @@ import org.apache.calcite.rel.core.TableModify; 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/rel/logical/LogicalWindow.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalWindow.java index 16b247974b3d..a2f63da0dac7 100644 --- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalWindow.java +++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalWindow.java @@ -45,7 +45,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Multimap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.AbstractList; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/rel/logical/package-info.java b/core/src/main/java/org/apache/calcite/rel/logical/package-info.java index 26797ece0064..c5baf3bada6f 100644 --- a/core/src/main/java/org/apache/calcite/rel/logical/package-info.java +++ b/core/src/main/java/org/apache/calcite/rel/logical/package-info.java @@ -31,4 +31,7 @@ * * */ +@NullMarked package org.apache.calcite.rel.logical; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/BuiltInMetadata.java b/core/src/main/java/org/apache/calcite/rel/metadata/BuiltInMetadata.java index 9c571dfddcd3..e896751f2216 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/BuiltInMetadata.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/BuiltInMetadata.java @@ -37,7 +37,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Multimap; -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/rel/metadata/CachingRelMetadataProvider.java b/core/src/main/java/org/apache/calcite/rel/metadata/CachingRelMetadataProvider.java index 399c4b67aba5..37241cedc2de 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/CachingRelMetadataProvider.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/CachingRelMetadataProvider.java @@ -22,7 +22,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Multimap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; @@ -61,7 +61,7 @@ public CachingRelMetadataProvider( //~ Methods ---------------------------------------------------------------- @Deprecated // to be removed before 2.0 - @Override public <@Nullable M extends @Nullable Metadata> @Nullable UnboundMetadata apply( + @Override public @Nullable UnboundMetadata apply( Class relClass, final Class metadataClass) { final UnboundMetadata function = @@ -118,8 +118,8 @@ private class CachingInvocationHandler implements InvocationHandler { this.metadata = requireNonNull(metadata, "metadata"); } - @Override public @Nullable Object invoke(Object proxy, Method method, @Nullable Object[] args) - throws Throwable { + @Override public @Nullable Object invoke(Object proxy, Method method, + @Nullable Object @Nullable [] args) throws Throwable { // Compute hash key. final ImmutableList.Builder builder = ImmutableList.builder(); builder.add(method); diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/ChainedRelMetadataProvider.java b/core/src/main/java/org/apache/calcite/rel/metadata/ChainedRelMetadataProvider.java index acfc83bda18a..87e4b110a4c6 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/ChainedRelMetadataProvider.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/ChainedRelMetadataProvider.java @@ -23,7 +23,7 @@ import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Multimap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; @@ -51,7 +51,7 @@ public class ChainedRelMetadataProvider implements RelMetadataProvider { /** * Creates a chain. */ - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") protected ChainedRelMetadataProvider( ImmutableList providers) { this.providers = providers; @@ -71,7 +71,7 @@ protected ChainedRelMetadataProvider( } @Deprecated // to be removed before 2.0 - @Override public <@Nullable M extends @Nullable Metadata> @Nullable UnboundMetadata apply( + @Override public @Nullable UnboundMetadata apply( Class relClass, final Class metadataClass) { final List> functions = new ArrayList<>(); @@ -140,8 +140,8 @@ private static class ChainedInvocationHandler implements InvocationHandler { this.metadataList = ImmutableList.copyOf(metadataList); } - @Override public @Nullable Object invoke(Object proxy, Method method, @Nullable Object[] args) - throws Throwable { + @Override public @Nullable Object invoke(Object proxy, Method method, + @Nullable Object @Nullable [] args) throws Throwable { for (Metadata metadata : metadataList) { try { final Object o = method.invoke(metadata, args); diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/JaninoRelMetadataProvider.java b/core/src/main/java/org/apache/calcite/rel/metadata/JaninoRelMetadataProvider.java index 135b11e11083..661779fcb8a9 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/JaninoRelMetadataProvider.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/JaninoRelMetadataProvider.java @@ -30,11 +30,11 @@ import com.google.common.util.concurrent.UncheckedExecutionException; import org.apiguardian.api.API; -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.Constructor; import java.lang.reflect.InvocationTargetException; @@ -106,7 +106,7 @@ private static CacheBuilder maxSize(CacheBuilder builder, } @Deprecated // to be removed before 2.0 - @Override public <@Nullable M extends @Nullable Metadata> UnboundMetadata apply( + @Override public UnboundMetadata apply( Class relClass, Class metadataClass) { throw new UnsupportedOperationException(); } @@ -238,7 +238,8 @@ private Key(Class> handlerClass, return handlerClass.cast( Proxy.newProxyInstance(RelMetadataQuery.class.getClassLoader(), new Class[] {handlerClass}, (proxy, method, args) -> { - final RelNode r = requireNonNull((RelNode) args[0], "(RelNode) args[0]"); + final RelNode r = + requireNonNull((RelNode) requireNonNull(args, "args")[0], "args[0]"); throw new NoHandler(r.getClass()); })); } diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/MetadataFactory.java b/core/src/main/java/org/apache/calcite/rel/metadata/MetadataFactory.java index 157d6a3e7566..32f5f4ba9c74 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/MetadataFactory.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/MetadataFactory.java @@ -18,7 +18,7 @@ import org.apache.calcite.rel.RelNode; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Source of metadata about relational expressions. @@ -42,6 +42,6 @@ public interface MetadataFactory { * @param metadataClazz Metadata class * @return Metadata bound to {@code rel} and {@code query} */ - <@Nullable M extends @Nullable Metadata> M query(RelNode rel, RelMetadataQuery mq, + M query(RelNode rel, RelMetadataQuery mq, Class metadataClazz); } diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/MetadataFactoryImpl.java b/core/src/main/java/org/apache/calcite/rel/metadata/MetadataFactoryImpl.java index c0f725af29be..e74d71f9e438 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/MetadataFactoryImpl.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/MetadataFactoryImpl.java @@ -25,10 +25,12 @@ import com.google.common.cache.LoadingCache; import com.google.common.util.concurrent.UncheckedExecutionException; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.concurrent.ExecutionException; +import static org.apache.calcite.linq4j.Nullness.castNonNull; + /** * Implementation of {@link MetadataFactory} that gets providers from a * {@link RelMetadataProvider} and stores them in a cache. @@ -64,7 +66,7 @@ public MetadataFactoryImpl(RelMetadataProvider provider) { }); } - @Override public <@Nullable M extends @Nullable Metadata> M query( + @Override public M query( RelNode rel, RelMetadataQuery mq, Class metadataClazz) { try { @@ -72,7 +74,7 @@ public MetadataFactoryImpl(RelMetadataProvider provider) { final Pair, Class> key = Pair.of((Class) rel.getClass(), (Class) metadataClazz); final Metadata apply = cache.get(key).bind(rel, mq); - return metadataClazz.cast(apply); + return castNonNull(metadataClazz.cast(apply)); } catch (UncheckedExecutionException | ExecutionException e) { throw Util.throwAsRuntime(Util.causeOrSelf(e)); } diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/NullSentinel.java b/core/src/main/java/org/apache/calcite/rel/metadata/NullSentinel.java index c559ef8a7c3a..df6412e1a714 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/NullSentinel.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/NullSentinel.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.rel.metadata; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** Placeholder for null values. */ public enum NullSentinel { diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/ProxyingMetadataHandlerProvider.java b/core/src/main/java/org/apache/calcite/rel/metadata/ProxyingMetadataHandlerProvider.java index 92490cdd6de9..af3d2cee18f0 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/ProxyingMetadataHandlerProvider.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/ProxyingMetadataHandlerProvider.java @@ -82,7 +82,7 @@ public ProxyingMetadataHandlerProvider(RelMetadataProvider provider) { Method metadataMethod = requireNonNull(methodMap.get(method.getName()), () -> "Not supported: " + method); - RelNode rel = requireNonNull((RelNode) args[0], "rel must be non null"); + RelNode rel = requireNonNull((RelNode) requireNonNull(args, "args")[0], "args[0]"); RelMetadataQuery mq = requireNonNull((RelMetadataQuery) args[1], "mq must be non null"); diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/ReflectiveRelMetadataProvider.java b/core/src/main/java/org/apache/calcite/rel/metadata/ReflectiveRelMetadataProvider.java index 31caa39ed24a..439be4e6c33f 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/ReflectiveRelMetadataProvider.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/ReflectiveRelMetadataProvider.java @@ -29,7 +29,7 @@ import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Multimap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -267,7 +267,7 @@ private static boolean couldImplement(Method handlerMethod, Method method) { //~ Methods ---------------------------------------------------------------- @Deprecated // to be removed before 2.0 - @Override public <@Nullable M extends @Nullable Metadata> @Nullable UnboundMetadata apply( + @Override public @Nullable UnboundMetadata apply( Class relClass, Class metadataClass) { if (metadataClass == metadataClass0) { return apply(relClass); @@ -278,7 +278,7 @@ private static boolean couldImplement(Method handlerMethod, Method method) { @SuppressWarnings({ "unchecked", "SuspiciousMethodCalls" }) @Deprecated // to be removed before 2.0 - public <@Nullable M extends @Nullable Metadata> @Nullable UnboundMetadata apply( + public @Nullable UnboundMetadata apply( Class relClass) { List> newSources = new ArrayList<>(); for (;;) { diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelColumnOrigin.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelColumnOrigin.java index 974501b50bdd..85bbe6b858e5 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelColumnOrigin.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelColumnOrigin.java @@ -18,7 +18,7 @@ import org.apache.calcite.plan.RelOptTable; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * RelColumnOrigin is a data structure describing one of the origins of an diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdAllPredicates.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdAllPredicates.java index d86a61fad8d4..d86e98f179db 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdAllPredicates.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdAllPredicates.java @@ -49,7 +49,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Multimap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Collection; import java.util.HashMap; diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdCollation.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdCollation.java index e6ae979b1ab3..2a867a78a5a2 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdCollation.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdCollation.java @@ -62,7 +62,7 @@ import com.google.common.collect.Multimap; 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.Collection; diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnOrigins.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnOrigins.java index a5e6da109af2..6eda2bf7f742 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnOrigins.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnOrigins.java @@ -16,6 +16,7 @@ */ package org.apache.calcite.rel.metadata; +import org.apache.calcite.linq4j.annotations.Contract; import org.apache.calcite.plan.RelOptTable; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.core.Aggregate; @@ -42,8 +43,7 @@ import org.apache.calcite.rex.RexVisitorImpl; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.PolyNull; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.HashSet; @@ -277,8 +277,9 @@ private RelMdColumnOrigins() {} return set; } - private static @PolyNull Set createDerivedColumnOrigins( - @PolyNull Set inputSet) { + @Contract("!null -> !null") + private static @Nullable Set createDerivedColumnOrigins( + @Nullable Set inputSet) { if (inputSet == null) { return null; } @@ -297,8 +298,8 @@ private RelMdColumnOrigins() {} private static @Nullable Set getMultipleColumns(RexNode rexNode, RelNode input, final RelMetadataQuery mq) { final Set set = new HashSet<>(); - final RexVisitor visitor = - new RexVisitorImpl(true) { + final RexVisitor<@Nullable Void> visitor = + new RexVisitorImpl<@Nullable Void>(true) { @Override public Void visitInputRef(RexInputRef inputRef) { Set inputSet = mq.getColumnOrigins(input, inputRef.getIndex()); diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnUniqueness.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnUniqueness.java index e69da277451c..9fd69e13eadc 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnUniqueness.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnUniqueness.java @@ -46,7 +46,6 @@ import org.apache.calcite.rex.RexLiteral; import org.apache.calcite.rex.RexNode; import org.apache.calcite.rex.RexProgram; -import org.apache.calcite.rex.RexSlot; import org.apache.calcite.rex.RexSubQuery; import org.apache.calcite.rex.RexUtil; import org.apache.calcite.sql.SqlKind; @@ -58,7 +57,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.HashSet; @@ -537,8 +536,7 @@ static ImmutableBitSet getConstantColumnSet(RelOptPredicateList relOptPredicateL relOptPredicateList.constantMap.keySet() .stream() .filter(RexInputRef.class::isInstance) - .map(RexInputRef.class::cast) - .map(RexSlot::getIndex) + .map(ref -> ((RexInputRef) ref).getIndex()) .forEach(builder::set); relOptPredicateList.pulledUpPredicates.forEach(rex -> { diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistinctRowCount.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistinctRowCount.java index 7058dcbb4dac..f33f977993e2 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistinctRowCount.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistinctRowCount.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.ArrayList; import java.util.HashSet; diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistribution.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistribution.java index 6bbae1b78d4e..32018b79c87b 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistribution.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistribution.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; diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdExplainVisibility.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdExplainVisibility.java index a06b2842a139..66d3764dc53a 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdExplainVisibility.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdExplainVisibility.java @@ -20,7 +20,7 @@ import org.apache.calcite.rel.core.TableScan; import org.apache.calcite.sql.SqlExplainLevel; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * RelMdExplainVisibility supplies a default implementation of diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdExpressionLineage.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdExpressionLineage.java index 3025ee1d4a53..ba2f43940df1 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdExpressionLineage.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdExpressionLineage.java @@ -51,8 +51,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Multimap; -import org.checkerframework.checker.nullness.qual.KeyFor; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; @@ -501,7 +500,7 @@ protected RelMdExpressionLineage() {} private static Set createAllPossibleExpressions(RexBuilder rexBuilder, RexNode expr, ImmutableBitSet predFieldsUsed, Map> mapping, Map singleMapping) { - final @KeyFor("mapping") RexInputRef inputRef = mapping.keySet().iterator().next(); + final RexInputRef inputRef = mapping.keySet().iterator().next(); final Set replacements = requireNonNull(mapping.remove(inputRef), () -> "mapping.remove(inputRef) is null for " + inputRef); diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdFunctionalDependency.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdFunctionalDependency.java index 15679c63c701..469bd412a529 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdFunctionalDependency.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdFunctionalDependency.java @@ -39,7 +39,7 @@ import org.apache.calcite.util.ImmutableBitSet; import org.apache.calcite.util.mapping.Mappings; -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/rel/metadata/RelMdLowerBoundCost.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdLowerBoundCost.java index b54f2d0708cf..5678e245b441 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdLowerBoundCost.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdLowerBoundCost.java @@ -22,7 +22,7 @@ import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.metadata.BuiltInMetadata.LowerBoundCost; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Default implementations of the diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMaxRowCount.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMaxRowCount.java index 869f1ad50e78..a52e234da3a8 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMaxRowCount.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMaxRowCount.java @@ -39,7 +39,7 @@ import org.apache.calcite.util.Bug; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static org.apache.calcite.rel.metadata.RelMdUtil.literalValueApproximatedByDouble; diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMeasure.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMeasure.java index ce27b879cb49..7e8a7c9dc355 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMeasure.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMeasure.java @@ -34,7 +34,7 @@ import org.apache.calcite.sql.type.SqlTypeUtil; import org.apache.calcite.tools.RelBuilder; -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/rel/metadata/RelMdMemory.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMemory.java index b8333fc4c0f7..4d316d192330 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMemory.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMemory.java @@ -18,7 +18,7 @@ import org.apache.calcite.rel.RelNode; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Default implementations of the diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMinRowCount.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMinRowCount.java index 298e77f2d8e4..fcc082ac1116 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMinRowCount.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMinRowCount.java @@ -37,7 +37,7 @@ import org.apache.calcite.util.Bug; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static org.apache.calcite.rel.metadata.RelMdUtil.literalValueApproximatedByDouble; diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdNodeTypes.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdNodeTypes.java index 60aa05f9f247..c22836d9dade 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdNodeTypes.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdNodeTypes.java @@ -40,7 +40,7 @@ import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * RelMdNodeTypeCount supplies a default implementation of diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPercentageOriginalRows.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPercentageOriginalRows.java index e2ec6d94b8bb..d76bf8daa20d 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPercentageOriginalRows.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPercentageOriginalRows.java @@ -17,6 +17,7 @@ package org.apache.calcite.rel.metadata; import org.apache.calcite.adapter.enumerable.EnumerableInterpreter; +import org.apache.calcite.linq4j.annotations.Contract; import org.apache.calcite.plan.RelOptCost; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.core.Aggregate; @@ -27,8 +28,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.PolyNull; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -235,10 +235,17 @@ public Double getPercentageOriginalRows(Union rel, RelMetadataQuery mq) { return rel.computeSelfCost(rel.getCluster().getPlanner(), mq); } - private static @PolyNull Double quotientForPercentage( - @PolyNull Double numerator, - @PolyNull Double denominator) { - if ((numerator == null) || (denominator == null)) { + @Contract("!null, !null -> !null") + private static @Nullable Double quotientForPercentage( + @Nullable Double numerator, + @Nullable Double denominator) { + // One if per argument, so that no control-flow merge precedes the return: the + // contract check treats a return reached by a merge as reachable even when every + // incoming edge is not. https://github.com/uber/NullAway/issues/1731 + if (numerator == null) { + return null; + } + if (denominator == null) { return null; } diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPopulationSize.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPopulationSize.java index bbd4c0fa8298..e800c4e5c5fe 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPopulationSize.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPopulationSize.java @@ -31,7 +31,7 @@ import org.apache.calcite.rex.RexUtil; 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/rel/metadata/RelMdPredicates.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPredicates.java index e04e2098ff78..d7bf38498647 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPredicates.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPredicates.java @@ -71,7 +71,7 @@ import com.google.common.collect.RangeSet; import com.google.common.collect.TreeRangeSet; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Arrays; @@ -648,7 +648,7 @@ public RelOptPredicateList getPredicates(RelSubset r, list = list == null ? list2 : list.union(rexBuilder, list2); } } - return Util.first(list, RelOptPredicateList.EMPTY); + return Util.firstNonNull(list, RelOptPredicateList.EMPTY); } /** @@ -971,7 +971,7 @@ private void markAsEquivalent(int p1, int p2) { /** * Find expressions of the form 'col_x = col_y'. */ - class EquivalenceFinder extends RexVisitorImpl { + class EquivalenceFinder extends RexVisitorImpl<@Nullable Void> { protected EquivalenceFinder() { super(true); } diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdRowCount.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdRowCount.java index 3e7824e1aac6..9cd8400a20ba 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdRowCount.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdRowCount.java @@ -41,7 +41,7 @@ import org.apache.calcite.util.NumberUtil; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static org.apache.calcite.rel.metadata.RelMdUtil.literalValueApproximatedByDouble; diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSelectivity.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSelectivity.java index 5faaeaa85d3d..4397fba1d7b0 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSelectivity.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSelectivity.java @@ -35,7 +35,7 @@ import org.apache.calcite.sql.fun.SqlStdOperatorTable; import org.apache.calcite.util.ImmutableBitSet; -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/rel/metadata/RelMdSize.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSize.java index 675aa1e3639e..33a540ba736c 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSize.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSize.java @@ -48,7 +48,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; -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/rel/metadata/RelMdTableReferences.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdTableReferences.java index ebcbdc187ddb..1c17541fd80c 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdTableReferences.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdTableReferences.java @@ -37,7 +37,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Multimap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Collection; import java.util.HashMap; diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUniqueKeys.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUniqueKeys.java index c42fc812317d..da0c6086e0fb 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUniqueKeys.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUniqueKeys.java @@ -49,7 +49,7 @@ import com.google.common.collect.Multimap; import com.google.common.collect.Sets; -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/rel/metadata/RelMdUtil.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUtil.java index ab7dab016b4b..96da5a18b3db 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUtil.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUtil.java @@ -16,6 +16,7 @@ */ package org.apache.calcite.rel.metadata; +import org.apache.calcite.linq4j.annotations.Contract; import org.apache.calcite.plan.RelOptUtil; import org.apache.calcite.rel.RelCollation; import org.apache.calcite.rel.RelNode; @@ -49,8 +50,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.PolyNull; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.ArrayList; @@ -315,9 +315,10 @@ public static void setLeftRightBitmaps( * @return the expected number of distinct values, or null if either argument * is null */ - public static @PolyNull Double numDistinctVals( - @PolyNull Double domainSize, - @PolyNull Double numSelected) { + @Contract("!null, !null -> !null") + public static @Nullable Double numDistinctVals( + @Nullable Double domainSize, + @Nullable Double numSelected) { if ((domainSize == null) || (numSelected == null)) { return domainSize; } @@ -911,7 +912,7 @@ public static double estimateFilteredRows(RelNode child, RexProgram program, public static double estimateFilteredRows(RelNode child, @Nullable RexNode condition, RelMetadataQuery mq) { - @SuppressWarnings("unboxing.of.nullable") + @SuppressWarnings("NullAway") double result = multiply(mq.getRowCount(child), mq.getSelectivity(child, condition)); return result; @@ -1081,7 +1082,8 @@ private static boolean alreadySmaller(RelMetadataQuery mq, RelNode input, *

    Throws if {@code result} is not null, not in range 0 to 1, * and assertions are enabled. */ - public static @PolyNull Double validatePercentage(@PolyNull Double result) { + @Contract("!null -> !null") + public static @Nullable Double validatePercentage(@Nullable Double result) { assert isPercentage(result, true); return result; } @@ -1117,7 +1119,8 @@ private static boolean isPercentage(@Nullable Double result, boolean fail) { * @return the corrected value from the {@code result} * @throws AssertionError if the {@code result} is negative */ - public static @PolyNull Double validateResult(@PolyNull Double result) { + @Contract("!null -> !null") + public static @Nullable Double validateResult(@Nullable Double result) { if (result == null) { return null; } diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataProvider.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataProvider.java index 26a92709e18a..a49b1f9c39cd 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataProvider.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataProvider.java @@ -20,7 +20,7 @@ import com.google.common.collect.Multimap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Method; import java.util.List; @@ -68,7 +68,7 @@ public interface RelMetadataProvider { * provider cannot supply metadata of this type */ @Deprecated // to be removed before 2.0 - <@Nullable M extends @Nullable Metadata> @Nullable UnboundMetadata apply( + @Nullable UnboundMetadata apply( Class relClass, Class metadataClass); @Deprecated // to be removed before 2.0 diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataQuery.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataQuery.java index aeeefa9763a3..0f2adec9e408 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataQuery.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataQuery.java @@ -35,7 +35,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Multimap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Collections; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataQueryBase.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataQueryBase.java index 37a2e5a127f4..f45e90b31fc8 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataQueryBase.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataQueryBase.java @@ -21,14 +21,12 @@ import com.google.common.collect.HashBasedTable; import com.google.common.collect.Table; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Proxy; import java.util.Map; import java.util.function.Supplier; -import static org.apache.calcite.linq4j.Nullness.castNonNull; - import static java.util.Objects.requireNonNull; /** @@ -97,7 +95,8 @@ protected static H initialHandler(Class handlerClass) { return handlerClass.cast( Proxy.newProxyInstance(RelMetadataQuery.class.getClassLoader(), new Class[] {handlerClass}, (proxy, method, args) -> { - final RelNode r = requireNonNull((RelNode) args[0], "(RelNode) args[0]"); + final RelNode r = + requireNonNull((RelNode) requireNonNull(args, "args")[0], "args[0]"); throw new JaninoRelMetadataProvider.NoHandler(r.getClass()); })); } @@ -120,7 +119,7 @@ protected > H revise(Class def) { private MetadataHandlerProvider getMetadataHandlerProvider() { requireNonNull(metadataHandlerProvider, "metadataHandlerProvider"); - return castNonNull(metadataHandlerProvider); + return metadataHandlerProvider; } /** diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/UnboundMetadata.java b/core/src/main/java/org/apache/calcite/rel/metadata/UnboundMetadata.java index 0f3131668644..7bd6a81c6ae1 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/UnboundMetadata.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/UnboundMetadata.java @@ -18,7 +18,7 @@ import org.apache.calcite.rel.RelNode; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Metadata that needs to be bound to a {@link RelNode} and @@ -28,5 +28,5 @@ */ @FunctionalInterface public interface UnboundMetadata { - M bind(RelNode rel, RelMetadataQuery mq); + @Nullable M bind(RelNode rel, RelMetadataQuery mq); } diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/janino/CacheUtil.java b/core/src/main/java/org/apache/calcite/rel/metadata/janino/CacheUtil.java index 06aa79752afb..c474249904d8 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/janino/CacheUtil.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/janino/CacheUtil.java @@ -17,6 +17,7 @@ package org.apache.calcite.rel.metadata.janino; import org.apiguardian.api.API; +import org.jspecify.annotations.Nullable; import java.util.stream.IntStream; @@ -30,7 +31,7 @@ private CacheUtil() { } @API(status = API.Status.INTERNAL) - public static Object[] generateRange(String description, int min, int max) { + public static @Nullable Object[] generateRange(String description, int min, int max) { return IntStream.range(min, max) .mapToObj(i -> description + "(" + i + ")") .map(org.apache.calcite.rel.metadata.janino.DescriptiveCacheKey::new) @@ -38,7 +39,8 @@ public static Object[] generateRange(String description, int min, int max) { } @API(status = API.Status.INTERNAL) - public static > Object[] generateEnum(String description, E[] values) { + public static > @Nullable Object[] generateEnum(String description, + E[] values) { return java.util.Arrays.stream(values) .map(e -> description + "(" + e + ")") .map(org.apache.calcite.rel.metadata.janino.DescriptiveCacheKey::new) diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/janino/DispatchGenerator.java b/core/src/main/java/org/apache/calcite/rel/metadata/janino/DispatchGenerator.java index 4c661f476ad5..7c8f83e46efd 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/janino/DispatchGenerator.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/janino/DispatchGenerator.java @@ -22,7 +22,7 @@ import com.google.common.collect.ImmutableSet; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Method; import java.util.ArrayDeque; diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/janino/RelMetadataHandlerGeneratorUtil.java b/core/src/main/java/org/apache/calcite/rel/metadata/janino/RelMetadataHandlerGeneratorUtil.java index 0fd6103cfd0f..9c0350967ac8 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/janino/RelMetadataHandlerGeneratorUtil.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/janino/RelMetadataHandlerGeneratorUtil.java @@ -20,8 +20,8 @@ import org.apache.calcite.rel.metadata.MetadataDef; import org.apache.calcite.rel.metadata.MetadataHandler; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Method; import java.util.LinkedHashMap; diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/janino/package-info.java b/core/src/main/java/org/apache/calcite/rel/metadata/janino/package-info.java index 2d5274195c21..eef8695fb46b 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/janino/package-info.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/janino/package-info.java @@ -15,12 +15,10 @@ * limitations under the License. */ -/** - * Defines metadata interfaces and utilities for relational - * expressions. - */ - /** * Code for generating metadata handlers. */ +@NullMarked package org.apache.calcite.rel.metadata.janino; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/package-info.java b/core/src/main/java/org/apache/calcite/rel/metadata/package-info.java index d61c78209c68..2267ce00ac64 100644 --- a/core/src/main/java/org/apache/calcite/rel/metadata/package-info.java +++ b/core/src/main/java/org/apache/calcite/rel/metadata/package-info.java @@ -19,4 +19,7 @@ * Defines metadata interfaces and utilities for relational * expressions. */ +@NullMarked package org.apache.calcite.rel.metadata; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/rel/mutable/MutableAggregate.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableAggregate.java index 92593be2f11e..b77c046b6b5d 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableAggregate.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableAggregate.java @@ -23,7 +23,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.Objects; diff --git a/core/src/main/java/org/apache/calcite/rel/mutable/MutableBiRel.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableBiRel.java index 30c6ff02188f..b807ff8430fd 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableBiRel.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableBiRel.java @@ -28,7 +28,7 @@ abstract class MutableBiRel extends MutableRel { protected MutableRel left; protected MutableRel right; - @SuppressWarnings("initialization.invalid.field.write.initialized") + @SuppressWarnings("NullAway") protected MutableBiRel(MutableRelType type, RelOptCluster cluster, RelDataType rowType, MutableRel left, MutableRel right) { super(cluster, rowType, type); diff --git a/core/src/main/java/org/apache/calcite/rel/mutable/MutableCalc.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableCalc.java index 1d172c5f2cb5..f82285d5b778 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableCalc.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableCalc.java @@ -18,7 +18,7 @@ import org.apache.calcite.rex.RexProgram; -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/rel/mutable/MutableCollect.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableCollect.java index 0782d2f89fa1..da3576bfddce 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableCollect.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableCollect.java @@ -18,7 +18,7 @@ import org.apache.calcite.rel.type.RelDataType; -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/rel/mutable/MutableCorrelate.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableCorrelate.java index cba7890c8d45..25bbdf0302b7 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableCorrelate.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableCorrelate.java @@ -21,7 +21,7 @@ import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.util.ImmutableBitSet; -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/rel/mutable/MutableExchange.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableExchange.java index 72669a1cdbf7..e9bdad320e2b 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableExchange.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableExchange.java @@ -18,7 +18,7 @@ import org.apache.calcite.rel.RelDistribution; -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/rel/mutable/MutableFilter.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableFilter.java index 783e8d9301f5..b5fe93290843 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableFilter.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableFilter.java @@ -18,7 +18,7 @@ import org.apache.calcite.rex.RexNode; -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/rel/mutable/MutableJoin.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableJoin.java index ccc6a093fbec..d1a462487f24 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableJoin.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableJoin.java @@ -21,7 +21,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.Objects; import java.util.Set; diff --git a/core/src/main/java/org/apache/calcite/rel/mutable/MutableMatch.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableMatch.java index a55b2a71cb94..21bd863358c0 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableMatch.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableMatch.java @@ -21,7 +21,7 @@ import org.apache.calcite.rex.RexNode; import org.apache.calcite.util.ImmutableBitSet; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Map; import java.util.Objects; diff --git a/core/src/main/java/org/apache/calcite/rel/mutable/MutableMultiRel.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableMultiRel.java index 7921f192549c..2d366c26f838 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableMultiRel.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableMultiRel.java @@ -28,7 +28,7 @@ abstract class MutableMultiRel extends MutableRel { protected final List inputs; - @SuppressWarnings("initialization.invalid.field.write.initialized") + @SuppressWarnings("NullAway") protected MutableMultiRel(RelOptCluster cluster, RelDataType rowType, MutableRelType type, List inputs) { super(cluster, rowType, type); diff --git a/core/src/main/java/org/apache/calcite/rel/mutable/MutableProject.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableProject.java index 9254ce096d96..f9f7068fb5e7 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableProject.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableProject.java @@ -25,7 +25,7 @@ import org.apache.calcite.util.Pair; import org.apache.calcite.util.mapping.Mappings; -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/rel/mutable/MutableRel.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableRel.java index 71f6790d6404..1609ab194abe 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableRel.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableRel.java @@ -24,7 +24,7 @@ import com.google.common.base.Equivalence; import com.google.common.collect.Lists; -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/rel/mutable/MutableRelVisitor.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableRelVisitor.java index 9fe5020ae969..9c5d80ee06cf 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableRelVisitor.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableRelVisitor.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.rel.mutable; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** Visitor over {@link MutableRel}. */ public class MutableRelVisitor { diff --git a/core/src/main/java/org/apache/calcite/rel/mutable/MutableRels.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableRels.java index 092d45c8fe9a..4b18bafafa02 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableRels.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableRels.java @@ -61,7 +61,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.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/rel/mutable/MutableSample.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableSample.java index 7345fdbf9b80..8b623bb544d9 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableSample.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableSample.java @@ -18,7 +18,7 @@ import org.apache.calcite.plan.RelOptSamplingParameters; -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/rel/mutable/MutableScan.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableScan.java index e2450e725835..3da4075692a1 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableScan.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableScan.java @@ -19,7 +19,7 @@ import org.apache.calcite.plan.RelOptTable; import org.apache.calcite.rel.core.TableScan; -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/rel/mutable/MutableSetOp.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableSetOp.java index 500a56bcfbb5..37a4b3dc704a 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableSetOp.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableSetOp.java @@ -19,7 +19,7 @@ import org.apache.calcite.plan.RelOptCluster; import org.apache.calcite.rel.type.RelDataType; -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/rel/mutable/MutableSingleRel.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableSingleRel.java index 995dc889c26e..5cb19c95b6f2 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableSingleRel.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableSingleRel.java @@ -26,7 +26,7 @@ abstract class MutableSingleRel extends MutableRel { protected MutableRel input; - @SuppressWarnings("initialization.invalid.field.write.initialized") + @SuppressWarnings("NullAway") protected MutableSingleRel(MutableRelType type, RelDataType rowType, MutableRel input) { super(input.cluster, rowType, type); diff --git a/core/src/main/java/org/apache/calcite/rel/mutable/MutableSort.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableSort.java index 904c6ce64bb0..23f1a29471a1 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableSort.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableSort.java @@ -19,7 +19,7 @@ import org.apache.calcite.rel.RelCollation; import org.apache.calcite.rex.RexNode; -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/rel/mutable/MutableTableFunctionScan.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableTableFunctionScan.java index 7135c962a23a..c7adaf356bd0 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableTableFunctionScan.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableTableFunctionScan.java @@ -21,7 +21,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.lang.reflect.Type; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/rel/mutable/MutableTableModify.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableTableModify.java index d84047356b05..b46829660655 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableTableModify.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableTableModify.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; import java.util.Objects; diff --git a/core/src/main/java/org/apache/calcite/rel/mutable/MutableUncollect.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableUncollect.java index 0dc09b2a001e..484bec868028 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableUncollect.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableUncollect.java @@ -18,7 +18,7 @@ import org.apache.calcite.rel.type.RelDataType; -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/rel/mutable/MutableValues.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableValues.java index 2f921bc1b696..150e3cd3f812 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableValues.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableValues.java @@ -18,7 +18,7 @@ import org.apache.calcite.rel.core.Values; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** Mutable equivalent of {@link org.apache.calcite.rel.core.Values}. */ public class MutableValues extends MutableLeafRel { diff --git a/core/src/main/java/org/apache/calcite/rel/mutable/MutableWindow.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableWindow.java index 013d9534764d..aaff45b5be43 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableWindow.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableWindow.java @@ -20,7 +20,7 @@ import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rex.RexLiteral; -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/rel/mutable/package-info.java b/core/src/main/java/org/apache/calcite/rel/mutable/package-info.java index 1d62994efa1c..5fccfe9aa9fb 100644 --- a/core/src/main/java/org/apache/calcite/rel/mutable/package-info.java +++ b/core/src/main/java/org/apache/calcite/rel/mutable/package-info.java @@ -31,4 +31,7 @@ * * */ +@NullMarked package org.apache.calcite.rel.mutable; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/rel/package-info.java b/core/src/main/java/org/apache/calcite/rel/package-info.java index d4cd83282028..7c5a52cc04c9 100644 --- a/core/src/main/java/org/apache/calcite/rel/package-info.java +++ b/core/src/main/java/org/apache/calcite/rel/package-info.java @@ -35,11 +35,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.rel; -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/rel/rel2sql/RelToSqlConverter.java b/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java index 7806ab5e75ef..af1e03a4e1a3 100644 --- a/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java +++ b/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java @@ -105,7 +105,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Ordering; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayDeque; import java.util.ArrayList; @@ -146,7 +146,7 @@ public RelToSqlConverter(SqlDialect dialect) { /** Creates a RelToSqlConverter; if {@code preserveLiteralTypes}, literals * whose type is not implied by their SQL text are wrapped in CASTs; * see {@link SqlImplementor#toSql(RexProgram, RexLiteral, SqlDialect)}. */ - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") public RelToSqlConverter(SqlDialect dialect, boolean preserveLiteralTypes) { super(dialect, preserveLiteralTypes); dispatcher = @@ -1078,7 +1078,7 @@ public Result visit(TableScan e) { SqlNodeList.of(pos, hints.stream() .map(h -> RelToSqlConverter.toSqlHint(h, pos)) - .collect(Collectors.toList()))); + .collect(Collectors.<@Nullable SqlNode>toList()))); } else { node = identifier; } @@ -1092,13 +1092,13 @@ private static SqlHint toSqlHint(RelHint hint, SqlParserPos pos) { .flatMap( e -> Stream.of(new SqlIdentifier(e.getKey(), pos), SqlLiteral.createCharString(e.getValue(), pos))) - .collect(Collectors.toList())), + .collect(Collectors.<@Nullable SqlNode>toList())), SqlHint.HintOptionFormat.KV_LIST); } else if (hint.listOptions != null) { return new SqlHint(pos, new SqlIdentifier(hint.hintName, pos), SqlNodeList.of(pos, hint.listOptions.stream() .map(e -> SqlLiteral.createCharString(e, pos)) - .collect(Collectors.toList())), + .collect(Collectors.<@Nullable SqlNode>toList())), SqlHint.HintOptionFormat.LITERAL_LIST); } return new SqlHint(pos, new SqlIdentifier(hint.hintName, pos), diff --git a/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java b/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java index a7a52579112c..3d1b0a6c888d 100644 --- a/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java +++ b/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java @@ -124,8 +124,7 @@ import com.google.common.collect.Range; import com.google.common.collect.RangeSet; -import org.checkerframework.checker.initialization.qual.UnknownInitialization; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.AbstractList; @@ -537,7 +536,7 @@ private static RelDataType adjustedRowType(RelNode rel, SqlNode node) { rowType.getFieldList(), (selectItem, field) -> builder.add( - Util.first(SqlValidatorUtil.alias(selectItem), + Util.firstNonNull(SqlValidatorUtil.alias(selectItem), field.getName()), field.getType())); return builder.build(); @@ -1316,7 +1315,8 @@ private SqlNode createSqlWindowBound(RexWindowBound rexWindowBound) { if (rexWindowBound.isUnbounded()) { return SqlWindow.createUnboundedPreceding(POS); } else { - SqlNode literal = toSql(null, rexWindowBound.getOffset()); + SqlNode literal = + toSql(null, requireNonNull(rexWindowBound.getOffset(), "offset")); return SqlWindow.createPreceding(literal, POS); } } @@ -1324,7 +1324,8 @@ private SqlNode createSqlWindowBound(RexWindowBound rexWindowBound) { if (rexWindowBound.isUnbounded()) { return SqlWindow.createUnboundedFollowing(POS); } else { - SqlNode literal = toSql(null, rexWindowBound.getOffset()); + SqlNode literal = + toSql(null, requireNonNull(rexWindowBound.getOffset(), "offset")); return SqlWindow.createFollowing(literal, POS); } } @@ -1736,7 +1737,7 @@ public static SqlNode toSql(RexLiteral literal) { if (!defaultCharset.equals(charsetName)) { // Set the charset only if it is not the same as the default charset return SqlLiteral.createCharString( - castNonNull(value).getValue(), charsetName, POS); + value.getValue(), charsetName, POS); } } // Create a string without specifying a charset @@ -2305,7 +2306,6 @@ private void restoreOutputFieldNames(RelNode rel, SqlSelect select, /** Returns whether a new sub-query is required. */ private boolean needNewSubQuery( - @UnknownInitialization Result this, RelNode rel, List clauses, Set expectedClauses) { if (clauses.isEmpty()) { @@ -2415,8 +2415,7 @@ && hasGroupByLiteral(agg)) { * Returns whether any grouping key of {@code aggregate} is represented by * a literal expression in this result's {@code SELECT} list. */ - private boolean hasGroupByLiteral( - @UnknownInitialization Result this, Aggregate aggregate) { + private boolean hasGroupByLiteral(Aggregate aggregate) { if (!(node instanceof SqlSelect)) { return false; } @@ -2445,7 +2444,7 @@ private boolean hasGroupByLiteral( * * @param sqlNode SqlNode to check */ - private boolean hasSortByOrdinal(@UnknownInitialization Result this, + private boolean hasSortByOrdinal( @Nullable SqlNode sqlNode) { if (sqlNode == null) { return false; @@ -2473,14 +2472,14 @@ private boolean hasSortByOrdinal(@UnknownInitialization Result this, return false; } - private boolean containsOver(@UnknownInitialization Result this, + private boolean containsOver( @Nullable SqlNode node) { if (node == null) { return false; } final boolean[] result = {false}; - node.accept(new SqlBasicVisitor() { - @Override public Void visit(SqlCall call) { + node.accept(new SqlBasicVisitor<@Nullable Void>() { + @Override public @Nullable Void visit(SqlCall call) { if (result[0]) { return null; } @@ -2506,7 +2505,6 @@ private boolean containsOver(@UnknownInitialization Result this, * @param operandPredicate Predicate for the nested operands * @return whether any nested operands matches the predicate */ private boolean hasNested( - @UnknownInitialization Result this, Aggregate aggregate, Predicate operandPredicate) { final boolean[] result = {false}; diff --git a/core/src/main/java/org/apache/calcite/rel/rel2sql/package-info.java b/core/src/main/java/org/apache/calcite/rel/rel2sql/package-info.java index 573f4076a93e..8074fe54338c 100644 --- a/core/src/main/java/org/apache/calcite/rel/rel2sql/package-info.java +++ b/core/src/main/java/org/apache/calcite/rel/rel2sql/package-info.java @@ -18,4 +18,7 @@ /** * Translates a relational expression to SQL parse tree. */ +@NullMarked package org.apache.calcite.rel.rel2sql; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AggregateCaseToFilterRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AggregateCaseToFilterRule.java index 7ac593adad6f..1bfd733ca068 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateCaseToFilterRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateCaseToFilterRule.java @@ -39,8 +39,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.math.BigDecimal; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AggregateExpandDistinctAggregatesRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AggregateExpandDistinctAggregatesRule.java index afb4edbf8e4a..6fc0915bdb29 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateExpandDistinctAggregatesRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateExpandDistinctAggregatesRule.java @@ -48,8 +48,8 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; @@ -279,7 +279,7 @@ public AggregateExpandDistinctAggregatesRule( doRewrite(relBuilder, aggregate, n++, argList.left, argList.right, refs); } // It is assumed doRewrite above replaces nulls in refs - @SuppressWarnings("assignment.type.incompatible") + @SuppressWarnings("NullAway") List nonNullRefs = refs; relBuilder.project(nonNullRefs, fieldNames); call.transformTo(relBuilder.build()); diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AggregateExpandWithinDistinctRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AggregateExpandWithinDistinctRule.java index 111cf0c6b6f6..46f4e5994e2b 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateExpandWithinDistinctRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateExpandWithinDistinctRule.java @@ -36,8 +36,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Multimap; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.HashMap; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AggregateJoinTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AggregateJoinTransposeRule.java index c56f61ba1388..08334d1db4c2 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateJoinTransposeRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateJoinTransposeRule.java @@ -47,8 +47,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.ArrayList; import java.util.BitSet; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AggregateProjectMergeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AggregateProjectMergeRule.java index 2068b0e40c83..205938d082fb 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateProjectMergeRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateProjectMergeRule.java @@ -34,8 +34,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.ArrayList; import java.util.HashMap; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AggregateReduceFunctionsOnGroupKeysRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AggregateReduceFunctionsOnGroupKeysRule.java index c31e731c0773..1fefb100e4d0 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateReduceFunctionsOnGroupKeysRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateReduceFunctionsOnGroupKeysRule.java @@ -36,8 +36,8 @@ import org.apache.calcite.sql.fun.SqlStdOperatorTable; import org.apache.calcite.tools.RelBuilder; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AggregateReduceFunctionsRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AggregateReduceFunctionsRule.java index 498d6e70470f..efbcbf657965 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateReduceFunctionsRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateReduceFunctionsRule.java @@ -45,8 +45,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.math.BigDecimal; import java.util.ArrayList; @@ -260,9 +260,9 @@ private void reduceAggs( inputExprs.size() - relBuilder.peek().getRowType().getFieldCount(); if (extraArgCount > 0) { relBuilder.project(inputExprs, - CompositeList.of( + CompositeList.<@Nullable String>of( relBuilder.peek().getRowType().getFieldNames(), - Collections.nCopies(extraArgCount, null))); + Collections.<@Nullable String>nCopies(extraArgCount, null))); } newAggregateRel(relBuilder, oldAggRel, newCalls); newCalcRel(relBuilder, oldAggRel.getRowType(), projList); diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AggregateRemoveRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AggregateRemoveRule.java index c4d406af2195..4eef37a0e65a 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateRemoveRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateRemoveRule.java @@ -34,8 +34,8 @@ import org.apache.calcite.tools.RelBuilder; import org.apache.calcite.tools.RelBuilderFactory; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AggregateStarTableRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AggregateStarTableRule.java index 962fa5f64f44..0aae7872fa71 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateStarTableRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateStarTableRule.java @@ -46,8 +46,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.ArrayList; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/CalcRelSplitter.java b/core/src/main/java/org/apache/calcite/rel/rules/CalcRelSplitter.java index 17e6333dc223..cfd843e0c530 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/CalcRelSplitter.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/CalcRelSplitter.java @@ -48,7 +48,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.primitives.Ints; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import java.io.PrintWriter; @@ -467,7 +467,7 @@ private static List computeTopologicalOrdering( targets = cohort; } expr.accept( - new RexVisitorImpl(true) { + new RexVisitorImpl<@Nullable Void>(true) { @Override public Void visitLocalRef(RexLocalRef localRef) { for (Integer target : targets) { graph.addEdge(localRef.getIndex(), target); @@ -899,7 +899,7 @@ public boolean canImplement(RexProgram program) { * Visitor which returns whether an expression can be implemented in a given * type of relational expression. */ - private static class ImplementTester extends RexVisitorImpl { + private static class ImplementTester extends RexVisitorImpl<@Nullable Void> { private final RelType relType; ImplementTester(RelType relType) { @@ -1005,7 +1005,7 @@ private static class InputToCommonExprConverter extends RexShuttle { /** * Finds the highest level used by any of the inputs of a given expression. */ - private static class MaxInputFinder extends RexVisitorImpl { + private static class MaxInputFinder extends RexVisitorImpl<@Nullable Void> { int level; private final int[] exprLevels; @@ -1034,7 +1034,7 @@ public int maxInputFor(RexNode expr) { * Builds an array of the highest level which contains an expression which * uses each expression as an input. */ - private static class HighestUsageFinder extends RexVisitorImpl { + private static class HighestUsageFinder extends RexVisitorImpl<@Nullable Void> { private final int[] maxUsingLevelOrdinals; private int currentLevel; @@ -1051,7 +1051,7 @@ private static class HighestUsageFinder extends RexVisitorImpl { continue; } currentLevel = exprLevels[i]; - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") final Void unused = exprs[i].accept(this); } } diff --git a/core/src/main/java/org/apache/calcite/rel/rules/CoerceInputsRule.java b/core/src/main/java/org/apache/calcite/rel/rules/CoerceInputsRule.java index c6c211cb1e4d..aa51529ad0ae 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/CoerceInputsRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/CoerceInputsRule.java @@ -24,8 +24,8 @@ import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.tools.RelBuilderFactory; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/DateRangeRules.java b/core/src/main/java/org/apache/calcite/rel/rules/DateRangeRules.java index ae0d62e0fcd8..4ce72c42756f 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/DateRangeRules.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/DateRangeRules.java @@ -52,8 +52,8 @@ import com.google.common.collect.RangeSet; import com.google.common.collect.TreeRangeSet; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.ArrayDeque; import java.util.ArrayList; @@ -234,7 +234,7 @@ public interface FilterDateRangeRuleConfig extends RelRule.Config { /** Visitor that searches for calls to {@code EXTRACT}, {@code FLOOR} or * {@code CEIL}, building a list of distinct time units. */ - private static class ExtractFinder extends RexVisitorImpl + private static class ExtractFinder extends RexVisitorImpl<@Nullable Void> implements AutoCloseable { private final Set timeUnits = EnumSet.noneOf(TimeUnitRange.class); diff --git a/core/src/main/java/org/apache/calcite/rel/rules/DpHyp.java b/core/src/main/java/org/apache/calcite/rel/rules/DpHyp.java index 10402db68efb..7dfa72f463d1 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/DpHyp.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/DpHyp.java @@ -30,7 +30,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ExpandDisjunctionForTableRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ExpandDisjunctionForTableRule.java index a48495efc275..ceaddff6afb5 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/ExpandDisjunctionForTableRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/ExpandDisjunctionForTableRule.java @@ -33,8 +33,8 @@ import com.google.common.collect.Lists; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.HashMap; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/FilterJoinRule.java b/core/src/main/java/org/apache/calcite/rel/rules/FilterJoinRule.java index d4e1473ccbfc..73e3c25daede 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/FilterJoinRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/FilterJoinRule.java @@ -39,8 +39,8 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Iterator; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/FilterMultiJoinMergeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/FilterMultiJoinMergeRule.java index b3d70b0eca0a..62d00f854cb6 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/FilterMultiJoinMergeRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/FilterMultiJoinMergeRule.java @@ -24,8 +24,8 @@ import org.apache.calcite.rex.RexUtil; import org.apache.calcite.tools.RelBuilderFactory; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.Arrays; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/FilterProjectTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/FilterProjectTransposeRule.java index 3c365222cd66..2efca881295d 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/FilterProjectTransposeRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/FilterProjectTransposeRule.java @@ -22,6 +22,7 @@ import org.apache.calcite.plan.RelRule; import org.apache.calcite.plan.RelTraitSet; import org.apache.calcite.rel.RelCollationTraitDef; +import org.apache.calcite.rel.RelDistribution; import org.apache.calcite.rel.RelDistributionTraitDef; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.core.Filter; @@ -34,6 +35,7 @@ import org.apache.calcite.tools.RelBuilderFactory; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.Collections; import java.util.List; @@ -186,8 +188,12 @@ protected FilterProjectTransposeRule( .replaceIfs(RelCollationTraitDef.INSTANCE, () -> input.getTraitSet().getTraits(RelCollationTraitDef.INSTANCE)) .replaceIfs(RelDistributionTraitDef.INSTANCE, - () -> Collections.singletonList( - input.getTraitSet().getTrait(RelDistributionTraitDef.INSTANCE))); + () -> { + final @Nullable RelDistribution distribution = + input.getTraitSet().getTrait(RelDistributionTraitDef.INSTANCE); + return distribution == null ? null + : Collections.singletonList(distribution); + }); newCondition = RexUtil.removeNullabilityCast(relBuilder.getTypeFactory(), newCondition); newFilterRel = filter.copy(traitSet, input, newCondition); } else { diff --git a/core/src/main/java/org/apache/calcite/rel/rules/HyperGraph.java b/core/src/main/java/org/apache/calcite/rel/rules/HyperGraph.java index 3e785a19bdfe..a94e59b189c8 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/HyperGraph.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/HyperGraph.java @@ -36,7 +36,7 @@ import com.google.common.collect.Lists; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.BitSet; @@ -200,9 +200,25 @@ public long getNotProjectInputs() { return notProjectInputs; } + /** Returns the edges recorded for a vertex set, or an empty set. + * + *

    Reads the map through {@link Map#get} rather than {@code getOrDefault}: the fields are + * declared {@link HashMap}, which overrides {@code getOrDefault}, and NullAway does not carry + * the model of the interface method over to the override. + * See NullAway#1729. + * + * @param map one of the edge maps + * @param key vertex set + * @return the edges, or an empty set + */ + private static BitSet edgesOf(Map map, long key) { + final BitSet edges = map.get(key); + return edges == null ? new BitSet() : edges; + } + public long getNeighborBitmap(long csg, long forbidden) { long neighbors = 0L; - List simpleEdges = simpleEdgesMap.getOrDefault(csg, new BitSet()).stream() + List simpleEdges = edgesOf(simpleEdgesMap, csg).stream() .mapToObj(edges::get) .collect(Collectors.toList()); for (HyperEdge edge : simpleEdges) { @@ -213,7 +229,7 @@ public long getNeighborBitmap(long csg, long forbidden) { neighbors = neighbors & ~forbidden; forbidden = forbidden | neighbors; - List complexEdges = complexEdgesMap.getOrDefault(csg, new BitSet()).stream() + List complexEdges = edgesOf(complexEdgesMap, csg).stream() .mapToObj(edges::get) .collect(Collectors.toList()); for (HyperEdge edge : complexEdges) { @@ -237,12 +253,12 @@ public List connectCsgCmp(long csg, long cmp) { checkArgument(simpleEdgesMap.containsKey(cmp)); List connectedEdges = new ArrayList<>(); BitSet connectedEdgesBitmap = new BitSet(); - connectedEdgesBitmap.or(simpleEdgesMap.getOrDefault(csg, new BitSet())); - connectedEdgesBitmap.or(complexEdgesMap.getOrDefault(csg, new BitSet())); + connectedEdgesBitmap.or(edgesOf(simpleEdgesMap, csg)); + connectedEdgesBitmap.or(edgesOf(complexEdgesMap, csg)); BitSet cmpEdgesBitmap = new BitSet(); - cmpEdgesBitmap.or(simpleEdgesMap.getOrDefault(cmp, new BitSet())); - cmpEdgesBitmap.or(complexEdgesMap.getOrDefault(cmp, new BitSet())); + cmpEdgesBitmap.or(edgesOf(simpleEdgesMap, cmp)); + cmpEdgesBitmap.or(edgesOf(complexEdgesMap, cmp)); connectedEdgesBitmap.and(cmpEdgesBitmap); // only consider the records related to csg and cmp in the simpleEdgesMap/complexEdgesMap, @@ -250,8 +266,8 @@ public List connectCsgCmp(long csg, long cmp) { // csg = {t1, t3}, cmp = {t2}, will omit the edge (t1, t2)——(t3) BitSet mayMissedEdges = new BitSet(); mayMissedEdges.or(complexEdgesBitmap.toBitSet()); - mayMissedEdges.andNot(ccpUsedEdgesMap.getOrDefault(csg, new BitSet())); - mayMissedEdges.andNot(ccpUsedEdgesMap.getOrDefault(cmp, new BitSet())); + mayMissedEdges.andNot(edgesOf(ccpUsedEdgesMap, csg)); + mayMissedEdges.andNot(edgesOf(ccpUsedEdgesMap, cmp)); mayMissedEdges.andNot(connectedEdgesBitmap); mayMissedEdges.stream() .forEach(index -> { @@ -264,8 +280,8 @@ public List connectCsgCmp(long csg, long cmp) { // record hyper edges are used by current csg ∪ cmp BitSet curUsedEdges = new BitSet(); curUsedEdges.or(connectedEdgesBitmap); - curUsedEdges.or(ccpUsedEdgesMap.getOrDefault(csg, new BitSet())); - curUsedEdges.or(ccpUsedEdgesMap.getOrDefault(cmp, new BitSet())); + curUsedEdges.or(edgesOf(ccpUsedEdgesMap, csg)); + curUsedEdges.or(edgesOf(ccpUsedEdgesMap, cmp)); if (ccpUsedEdgesMap.containsKey(csg | cmp)) { checkArgument( curUsedEdges.equals(ccpUsedEdgesMap.get(csg | cmp))); @@ -311,16 +327,16 @@ public void updateEdgesForUnion(long subset1, long subset2) { } BitSet unionSimpleBitSet = new BitSet(); - unionSimpleBitSet.or(simpleEdgesMap.getOrDefault(subset1, new BitSet())); - unionSimpleBitSet.or(simpleEdgesMap.getOrDefault(subset2, new BitSet())); + unionSimpleBitSet.or(edgesOf(simpleEdgesMap, subset1)); + unionSimpleBitSet.or(edgesOf(simpleEdgesMap, subset2)); BitSet unionComplexBitSet = new BitSet(); - unionComplexBitSet.or(complexEdgesMap.getOrDefault(subset1, new BitSet())); - unionComplexBitSet.or(complexEdgesMap.getOrDefault(subset2, new BitSet())); + unionComplexBitSet.or(edgesOf(complexEdgesMap, subset1)); + unionComplexBitSet.or(edgesOf(complexEdgesMap, subset2)); BitSet unionOverlapBitSet = new BitSet(); - unionOverlapBitSet.or(overlapEdgesMap.getOrDefault(subset1, new BitSet())); - unionOverlapBitSet.or(overlapEdgesMap.getOrDefault(subset2, new BitSet())); + unionOverlapBitSet.or(edgesOf(overlapEdgesMap, subset1)); + unionOverlapBitSet.or(edgesOf(overlapEdgesMap, subset2)); // the overlaps edge that belongs to subset1/subset2 // may be complex edge for subset1 union subset2 diff --git a/core/src/main/java/org/apache/calcite/rel/rules/JoinCommuteRule.java b/core/src/main/java/org/apache/calcite/rel/rules/JoinCommuteRule.java index 012a00eb838b..4fd5a0e0429e 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/JoinCommuteRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/JoinCommuteRule.java @@ -35,8 +35,8 @@ import org.apache.calcite.tools.RelBuilder; import org.apache.calcite.tools.RelBuilderFactory; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/JoinExpandOrToUnionRule.java b/core/src/main/java/org/apache/calcite/rel/rules/JoinExpandOrToUnionRule.java index 67e061d5f7cb..3c3a5abda656 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/JoinExpandOrToUnionRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/JoinExpandOrToUnionRule.java @@ -33,6 +33,7 @@ import org.apache.calcite.tools.RelBuilder; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -207,7 +208,7 @@ private static boolean doesNotReferToBothInputs(RexNode rex, int leftFieldCount) /** * Counts the number of InputRefs in a RexNode expression. */ - private static class RexInputRefCounter extends RexVisitorImpl { + private static class RexInputRefCounter extends RexVisitorImpl<@Nullable Void> { private final int leftFieldCount; private int leftInputRefCount = 0; private int rightInputRefCount = 0; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/JoinProjectTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/JoinProjectTransposeRule.java index e82f57e96b0f..f4313507ceec 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/JoinProjectTransposeRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/JoinProjectTransposeRule.java @@ -41,8 +41,8 @@ import org.apache.calcite.tools.RelBuilderFactory; import org.apache.calcite.util.Pair; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/JoinToMultiJoinRule.java b/core/src/main/java/org/apache/calcite/rel/rules/JoinToMultiJoinRule.java index 8de5032bbe01..826a924207d9 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/JoinToMultiJoinRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/JoinToMultiJoinRule.java @@ -36,8 +36,8 @@ import com.google.common.collect.ImmutableMap; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Arrays; @@ -560,7 +560,7 @@ private static ImmutableMap addOnJoinFieldRefCounts( /** * Visitor that keeps a reference count of the inputs used by an expression. */ - private static class InputReferenceCounter extends RexVisitorImpl { + private static class InputReferenceCounter extends RexVisitorImpl<@Nullable Void> { private final int[] refCounts; InputReferenceCounter(int[] refCounts) { diff --git a/core/src/main/java/org/apache/calcite/rel/rules/LoptJoinTree.java b/core/src/main/java/org/apache/calcite/rel/rules/LoptJoinTree.java index dc991a8c6fc3..7229f534a857 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/LoptJoinTree.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/LoptJoinTree.java @@ -19,9 +19,6 @@ import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.core.Join; -import org.checkerframework.checker.initialization.qual.NotOnlyInitialized; -import org.checkerframework.checker.initialization.qual.UnderInitialization; - import java.util.ArrayList; import java.util.List; @@ -40,7 +37,6 @@ public class LoptJoinTree { //~ Instance fields -------------------------------------------------------- - @NotOnlyInitialized private final BinaryTree factorTree; private final RelNode joinTree; private final boolean removableSelfJoin; @@ -53,7 +49,7 @@ public class LoptJoinTree { * @param joinTree RelNode corresponding to the single node * @param factorId factor id of the node */ - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") public LoptJoinTree(RelNode joinTree, int factorId) { this.joinTree = joinTree; this.factorTree = new Leaf(factorId, this); @@ -159,10 +155,9 @@ public boolean isRemovableSelfJoin() { * track of the parent LoptJoinTree object associated with the binary tree. */ protected abstract static class BinaryTree { - @NotOnlyInitialized private final LoptJoinTree parent; - protected BinaryTree(@UnderInitialization LoptJoinTree parent) { + protected BinaryTree(LoptJoinTree parent) { this.parent = parent; } @@ -177,7 +172,7 @@ public LoptJoinTree getParent() { protected static class Leaf extends BinaryTree { private final int id; - public Leaf(int rootId, @UnderInitialization LoptJoinTree parent) { + public Leaf(int rootId, LoptJoinTree parent) { super(parent); this.id = rootId; } @@ -197,7 +192,7 @@ protected static class Node extends BinaryTree { private final BinaryTree left; private final BinaryTree right; - public Node(BinaryTree left, BinaryTree right, @UnderInitialization LoptJoinTree parent) { + public Node(BinaryTree left, BinaryTree right, LoptJoinTree parent) { super(parent); this.left = requireNonNull(left, "left"); this.right = requireNonNull(right, "right"); diff --git a/core/src/main/java/org/apache/calcite/rel/rules/LoptMultiJoin.java b/core/src/main/java/org/apache/calcite/rel/rules/LoptMultiJoin.java index f76f74e75e5a..a526d19f2588 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/LoptMultiJoin.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/LoptMultiJoin.java @@ -16,6 +16,8 @@ */ package org.apache.calcite.rel.rules; +import org.apache.calcite.linq4j.annotations.MonotonicNonNull; +import org.apache.calcite.linq4j.annotations.RequiresNonNull; import org.apache.calcite.plan.RelOptUtil; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.core.JoinRelType; @@ -35,11 +37,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; -import org.checkerframework.checker.initialization.qual.UnderInitialization; -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.BitSet; @@ -139,12 +137,12 @@ public class LoptMultiJoin { * Bitmap indicating which factors each factor references in join filters * that correspond to comparisons. */ - ImmutableBitSet @MonotonicNonNull [] factorsRefByFactor; + @MonotonicNonNull ImmutableBitSet[] factorsRefByFactor; /** * Weights of each factor combination. */ - int @MonotonicNonNull [][] factorWeights; + @MonotonicNonNull int[][] factorWeights; /** * Type factory. @@ -446,9 +444,7 @@ public void setJoinRemovalSemiJoin(int dimIdx, LogicalJoin semiJoin) { * * @return the bitmap containing the factor references */ - @RequiresNonNull({"joinStart", "nFieldsInJoinFactor"}) ImmutableBitSet getJoinFilterFactorBitmap( - @UnderInitialization LoptMultiJoin this, RexNode joinFilter, boolean setFields) { ImmutableBitSet fieldRefBitmap = fieldBitmap(joinFilter); @@ -469,9 +465,7 @@ private static ImmutableBitSet fieldBitmap(RexNode joinFilter) { * Sets bitmaps indicating which factors and fields each join filter * references. */ - @RequiresNonNull({"allJoinFilters", "joinStart", "nFieldsInJoinFactor"}) - private void setJoinFilterRefs( - @UnderInitialization LoptMultiJoin this) { + private void setJoinFilterRefs() { ListIterator filterIter = allJoinFilters.listIterator(); while (filterIter.hasNext()) { RexNode joinFilter = filterIter.next(); @@ -495,9 +489,7 @@ private void setJoinFilterRefs( * @return bitmap representing factors referenced that will * be set by this method */ - @RequiresNonNull({"joinStart", "nFieldsInJoinFactor"}) private ImmutableBitSet factorBitmap( - @UnknownInitialization LoptMultiJoin this, ImmutableBitSet fieldRefBitmap) { ImmutableBitSet.Builder factorRefBitmap = ImmutableBitSet.builder(); for (int field : fieldRefBitmap) { @@ -514,9 +506,7 @@ private ImmutableBitSet factorBitmap( * * @return index corresponding to join factor */ - @RequiresNonNull({"joinStart", "nFieldsInJoinFactor"}) public int findRef( - @UnknownInitialization LoptMultiJoin this, int rexInputRef) { for (int i = 0; i < nJoinFactors; i++) { if ((rexInputRef >= joinStart[i]) diff --git a/core/src/main/java/org/apache/calcite/rel/rules/LoptOptimizeJoinRule.java b/core/src/main/java/org/apache/calcite/rel/rules/LoptOptimizeJoinRule.java index 16cb367ac2fe..19ae6f7bc0eb 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/LoptOptimizeJoinRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/LoptOptimizeJoinRule.java @@ -47,9 +47,8 @@ import org.apache.calcite.util.Pair; import org.apache.calcite.util.mapping.IntPair; -import org.checkerframework.checker.nullness.qual.KeyFor; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.BitSet; @@ -308,19 +307,23 @@ private static void findRemovableSelfJoins(RelMetadataQuery mq, LoptMultiJoin mu // self-join. final List repeatedTables = new ArrayList<>(); final Map selfJoinPairs = new HashMap<>(); - @KeyFor("simpleFactors") Integer [] factors = + Integer [] factors = new TreeSet<>(simpleFactors.keySet()).toArray(new Integer[0]); for (int i = 0; i < factors.length; i++) { if (repeatedTables.contains(simpleFactors.get(factors[i]))) { continue; } for (int j = i + 1; j < factors.length; j++) { - @KeyFor("simpleFactors") int leftFactor = factors[i]; - @KeyFor("simpleFactors") int rightFactor = factors[j]; - if (simpleFactors.get(leftFactor).getQualifiedName().equals( - simpleFactors.get(rightFactor).getQualifiedName())) { + int leftFactor = factors[i]; + int rightFactor = factors[j]; + final RelOptTable leftTable = + requireNonNull(simpleFactors.get(leftFactor), "leftFactor"); + final RelOptTable rightTable = + requireNonNull(simpleFactors.get(rightFactor), "rightFactor"); + if (leftTable.getQualifiedName().equals( + rightTable.getQualifiedName())) { selfJoinPairs.put(leftFactor, rightFactor); - repeatedTables.add(simpleFactors.get(leftFactor)); + repeatedTables.add(leftTable); break; } } diff --git a/core/src/main/java/org/apache/calcite/rel/rules/LoptSemiJoinOptimizer.java b/core/src/main/java/org/apache/calcite/rel/rules/LoptSemiJoinOptimizer.java index 724884641dec..fb5914183773 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/LoptSemiJoinOptimizer.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/LoptSemiJoinOptimizer.java @@ -42,7 +42,7 @@ import com.google.common.collect.Lists; 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; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/MultiJoin.java b/core/src/main/java/org/apache/calcite/rel/rules/MultiJoin.java index 49000fe2fb65..1a74c810bcd2 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/MultiJoin.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/MultiJoin.java @@ -35,7 +35,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.HashMap; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinOptimizeBushyRule.java b/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinOptimizeBushyRule.java index 6336b997e742..f6e8abd03700 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinOptimizeBushyRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinOptimizeBushyRule.java @@ -38,8 +38,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.io.PrintWriter; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/OuterJoinToAntiJoinRule.java b/core/src/main/java/org/apache/calcite/rel/rules/OuterJoinToAntiJoinRule.java index 2b005633704d..93f09393254d 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/OuterJoinToAntiJoinRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/OuterJoinToAntiJoinRule.java @@ -35,8 +35,8 @@ import org.apache.calcite.tools.RelBuilder; import org.apache.calcite.util.ImmutableBitSet; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectAggregateMergeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectAggregateMergeRule.java index 815f275d1265..d2a7fe7326cc 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectAggregateMergeRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectAggregateMergeRule.java @@ -39,6 +39,7 @@ import org.apache.calcite.util.mapping.Mappings; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.ArrayList; @@ -182,7 +183,7 @@ private static int findSum0(RelDataTypeFactory typeFactory, AggregateCall sum, private static int kindCount(Iterable nodes, final SqlKind kind) { final AtomicInteger kindCount = new AtomicInteger(0); - new RexVisitorImpl(true) { + new RexVisitorImpl<@Nullable Void>(true) { @Override public Void visitCall(RexCall call) { if (call.getKind() == kind) { kindCount.incrementAndGet(); diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectFilterTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectFilterTransposeRule.java index ad8a58d8fe59..c449e9126efc 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectFilterTransposeRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectFilterTransposeRule.java @@ -36,8 +36,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.LinkedHashSet; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectTableScanRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectTableScanRule.java index 770860cc4a63..0f7d5063de0d 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectTableScanRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectTableScanRule.java @@ -36,6 +36,7 @@ import com.google.common.collect.ImmutableList; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -107,7 +108,7 @@ protected void apply(RelOptRuleCall call, Project project, TableScan scan) { requireNonNull(table.unwrap(ProjectableFilterableTable.class)); final List selectedColumns = new ArrayList<>(); - final RexVisitorImpl visitor = new RexVisitorImpl(true) { + final RexVisitorImpl<@Nullable Void> visitor = new RexVisitorImpl<@Nullable Void>(true) { @Override public Void visitInputRef(RexInputRef inputRef) { if (!selectedColumns.contains(inputRef.getIndex())) { selectedColumns.add(inputRef.getIndex()); diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectToWindowRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectToWindowRule.java index 14a333aace48..e1cb82703023 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectToWindowRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectToWindowRule.java @@ -51,6 +51,7 @@ import com.google.common.collect.ImmutableList; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.ArrayDeque; import java.util.ArrayList; @@ -381,7 +382,7 @@ private static DirectedGraph createGraphFromExpression( graph.addVertex(i); } - new RexBiVisitorImpl(true) { + new RexBiVisitorImpl<@Nullable Void, Integer>(true) { @Override public Void visitLocalRef(RexLocalRef localRef, Integer i) { graph.addEdge(localRef.getIndex(), i); return null; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/PushProjector.java b/core/src/main/java/org/apache/calcite/rel/rules/PushProjector.java index 9dc5172896cb..004429836435 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/PushProjector.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/PushProjector.java @@ -44,7 +44,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.BitSet; @@ -688,7 +688,7 @@ public RelNode createNewProject(RelNode projChild, int[] adjustments) { * Visitor which builds a bitmap of the inputs used by an expressions, as * well as locating expressions corresponding to special operators. */ - private static class InputSpecialOpFinder extends RexVisitorImpl { + private static class InputSpecialOpFinder extends RexVisitorImpl<@Nullable Void> { private final BitSet rexRefs; private final ImmutableBitSet leftFields; private final @Nullable ImmutableBitSet rightFields; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ReduceDecimalsRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ReduceDecimalsRule.java index 8918bf55f9e8..07b69426be36 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/ReduceDecimalsRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/ReduceDecimalsRule.java @@ -17,6 +17,7 @@ package org.apache.calcite.rel.rules; import org.apache.calcite.linq4j.Ord; +import org.apache.calcite.linq4j.annotations.MonotonicNonNull; import org.apache.calcite.plan.Convention; import org.apache.calcite.plan.RelOptRuleCall; import org.apache.calcite.plan.RelRule; @@ -43,9 +44,8 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.MonotonicNonNull; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.math.BigInteger; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ReduceExpressionsRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ReduceExpressionsRule.java index db93802118b6..444295e3128e 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/ReduceExpressionsRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/ReduceExpressionsRule.java @@ -75,8 +75,8 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.ArrayDeque; import java.util.ArrayList; @@ -982,7 +982,7 @@ protected static class RexReplacer extends RexShuttle { * Helper class used to locate expressions that either can be reduced to * literals or contain redundant casts. */ - protected static class ReducibleExprLocator extends RexVisitorImpl { + protected static class ReducibleExprLocator extends RexVisitorImpl<@Nullable Void> { /** Whether an expression is constant, and if so, whether it can be * reduced to a simpler constant. */ enum Constancy { diff --git a/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinRule.java b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinRule.java index 8b011ed08bf1..d78c367d12a4 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinRule.java @@ -34,8 +34,8 @@ import org.apache.calcite.util.ImmutableBitSet; import org.apache.calcite.util.ImmutableIntList; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/SetOpToFilterRule.java b/core/src/main/java/org/apache/calcite/rel/rules/SetOpToFilterRule.java index 848cc6c797fa..7f4ca4e25165 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/SetOpToFilterRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/SetOpToFilterRule.java @@ -30,8 +30,8 @@ import org.apache.calcite.tools.RelBuilder; import org.apache.calcite.util.Pair; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.LinkedHashMap; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/SingleValuesOptimizationRules.java b/core/src/main/java/org/apache/calcite/rel/rules/SingleValuesOptimizationRules.java index d0e53be44d12..554dc37153b8 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/SingleValuesOptimizationRules.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/SingleValuesOptimizationRules.java @@ -36,8 +36,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.ArrayList; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/SortJoinTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/SortJoinTransposeRule.java index dfb2d8401d7c..0a7493f63739 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/SortJoinTransposeRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/SortJoinTransposeRule.java @@ -34,8 +34,8 @@ import org.apache.calcite.rex.RexNode; import org.apache.calcite.tools.RelBuilderFactory; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/SpatialRules.java b/core/src/main/java/org/apache/calcite/rel/rules/SpatialRules.java index 1b003de36b47..ef943c04b502 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/SpatialRules.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/SpatialRules.java @@ -37,8 +37,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 org.locationtech.jts.geom.Envelope; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Point; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ValuesReduceRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ValuesReduceRule.java index acd80a81d977..514c39c8508b 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/ValuesReduceRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/ValuesReduceRule.java @@ -38,8 +38,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 org.slf4j.Logger; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/materialize/MaterializedViewAggregateRule.java b/core/src/main/java/org/apache/calcite/rel/rules/materialize/MaterializedViewAggregateRule.java index 538723661d60..15f3618728a3 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/materialize/MaterializedViewAggregateRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/materialize/MaterializedViewAggregateRule.java @@ -66,8 +66,8 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Multimap; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/materialize/MaterializedViewJoinRule.java b/core/src/main/java/org/apache/calcite/rel/rules/materialize/MaterializedViewJoinRule.java index 818b784c4a34..e84ffddc6a92 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/materialize/MaterializedViewJoinRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/materialize/MaterializedViewJoinRule.java @@ -39,7 +39,7 @@ import com.google.common.collect.ImmutableList; 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; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/materialize/MaterializedViewRule.java b/core/src/main/java/org/apache/calcite/rel/rules/materialize/MaterializedViewRule.java index 0ce1de86da65..28da23359439 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/materialize/MaterializedViewRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/materialize/MaterializedViewRule.java @@ -64,7 +64,7 @@ import com.google.common.collect.Multimap; import com.google.common.collect.Sets; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; @@ -765,7 +765,7 @@ protected boolean compensatePartial( RexTableInputRef.of(parentTRef, pair.target, uniqueKeyColumnType); if (!foreignKeyColumnType.isNullable() && sourceEC.getEquivalenceClassesMap().containsKey(uniqueKeyColumnRef) - && castNonNull(sourceEC.getEquivalenceClassesMap().get(uniqueKeyColumnRef)) + && sourceEC.getEquivalenceClassesMap().get(uniqueKeyColumnRef) .contains(foreignKeyColumnRef)) { equiColumns.put(foreignKeyColumnRef, uniqueKeyColumnRef); } else { diff --git a/core/src/main/java/org/apache/calcite/rel/rules/materialize/package-info.java b/core/src/main/java/org/apache/calcite/rel/rules/materialize/package-info.java index 5432e29b2ae0..f6bc7572600d 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/materialize/package-info.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/materialize/package-info.java @@ -18,4 +18,7 @@ /** * Provides a materialized rewriting algorithm encapsulated within a planner rule. */ +@NullMarked package org.apache.calcite.rel.rules.materialize; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/rel/rules/package-info.java b/core/src/main/java/org/apache/calcite/rel/rules/package-info.java index df52edb2a45a..363f757692c7 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/package-info.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/package-info.java @@ -47,4 +47,7 @@ * provides an optimizer interface. * */ +@NullMarked package org.apache.calcite.rel.rules; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/rel/stream/package-info.java b/core/src/main/java/org/apache/calcite/rel/stream/package-info.java index abc9584fce51..2c438b1e68ba 100644 --- a/core/src/main/java/org/apache/calcite/rel/stream/package-info.java +++ b/core/src/main/java/org/apache/calcite/rel/stream/package-info.java @@ -27,4 +27,7 @@ * * */ +@NullMarked package org.apache.calcite.rel.stream; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/rel/type/DelegatingTypeSystem.java b/core/src/main/java/org/apache/calcite/rel/type/DelegatingTypeSystem.java index ec220e8ef7e8..fff71064b979 100644 --- a/core/src/main/java/org/apache/calcite/rel/type/DelegatingTypeSystem.java +++ b/core/src/main/java/org/apache/calcite/rel/type/DelegatingTypeSystem.java @@ -18,7 +18,7 @@ import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.RoundingMode; diff --git a/core/src/main/java/org/apache/calcite/rel/type/DynamicRecordTypeImpl.java b/core/src/main/java/org/apache/calcite/rel/type/DynamicRecordTypeImpl.java index 22084195b4ac..2d35b8021618 100644 --- a/core/src/main/java/org/apache/calcite/rel/type/DynamicRecordTypeImpl.java +++ b/core/src/main/java/org/apache/calcite/rel/type/DynamicRecordTypeImpl.java @@ -23,7 +23,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -39,7 +39,7 @@ public class DynamicRecordTypeImpl extends DynamicRecordType { private final RelDataTypeHolder holder; /** Creates a DynamicRecordTypeImpl. */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") public DynamicRecordTypeImpl(RelDataTypeFactory typeFactory) { this.holder = new RelDataTypeHolder(typeFactory); computeDigest(); diff --git a/core/src/main/java/org/apache/calcite/rel/type/RelCrossType.java b/core/src/main/java/org/apache/calcite/rel/type/RelCrossType.java index 5423676b6492..f6b3cb67fefa 100644 --- a/core/src/main/java/org/apache/calcite/rel/type/RelCrossType.java +++ b/core/src/main/java/org/apache/calcite/rel/type/RelCrossType.java @@ -39,7 +39,7 @@ public class RelCrossType extends RelDataTypeImpl { * Creates a cartesian product type. This should only be called from a * factory method. */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") public RelCrossType( List types, List fields) { diff --git a/core/src/main/java/org/apache/calcite/rel/type/RelDataType.java b/core/src/main/java/org/apache/calcite/rel/type/RelDataType.java index 071a1152a108..0f3190a0233f 100644 --- a/core/src/main/java/org/apache/calcite/rel/type/RelDataType.java +++ b/core/src/main/java/org/apache/calcite/rel/type/RelDataType.java @@ -24,8 +24,7 @@ import org.apache.calcite.sql.type.SqlTypeUtil; import org.apiguardian.api.API; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.Nullable; import java.nio.charset.Charset; import java.util.List; @@ -50,7 +49,6 @@ public interface RelDataType { * @return whether this type has fields; examples include rows and * user-defined structured types in SQL, and classes in Java */ - @Pure boolean isStruct(); // NOTE jvs 17-Dec-2004: once we move to Java generics, getFieldList() @@ -116,7 +114,6 @@ public interface RelDataType { * * @return whether type allows null values */ - @Pure boolean isNullable(); /** @@ -124,7 +121,6 @@ public interface RelDataType { * * @return canonical type descriptor for components */ - @Pure @Nullable RelDataType getComponentType(); /** @@ -156,7 +152,6 @@ public interface RelDataType { * * @return charset of type */ - @Pure @Nullable Charset getCharset(); /** @@ -165,7 +160,6 @@ public interface RelDataType { * * @return collation of type */ - @Pure @Nullable SqlCollation getCollation(); /** @@ -174,7 +168,6 @@ public interface RelDataType { * * @return interval qualifier */ - @Pure @Nullable SqlIntervalQualifier getIntervalQualifier(); /** @@ -218,7 +211,6 @@ public interface RelDataType { * * @return SqlIdentifier, or null if this is not an SQL type */ - @Pure @Nullable SqlIdentifier getSqlIdentifier(); /** diff --git a/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeFactory.java b/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeFactory.java index 5912f78ac7cf..5d97590edc21 100644 --- a/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeFactory.java +++ b/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeFactory.java @@ -25,7 +25,7 @@ import org.apache.calcite.sql.type.SqlTypeName; import org.apache.calcite.sql.validate.SqlValidatorUtil; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.nio.charset.Charset; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeFactoryImpl.java b/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeFactoryImpl.java index c0d90578fa7a..4b873b1ecaaf 100644 --- a/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeFactoryImpl.java +++ b/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeFactoryImpl.java @@ -38,7 +38,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; import java.lang.reflect.Field; import java.nio.charset.Charset; @@ -656,7 +656,7 @@ public JavaType( this(clazz, nullable, null, null); } - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") public JavaType( Class clazz, boolean nullable, diff --git a/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeField.java b/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeField.java index da4e079a7aef..9683769786ad 100644 --- a/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeField.java +++ b/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeField.java @@ -36,7 +36,7 @@ public interface RelDataTypeField extends Map.Entry { * @deprecated Use {@code RelDataTypeField::getIndex} */ @Deprecated // to be removed before 2.0 - @SuppressWarnings("nullability") + @SuppressWarnings("NullAway") class ToFieldIndex implements com.google.common.base.Function { @Override public Integer apply(RelDataTypeField o) { @@ -51,7 +51,7 @@ class ToFieldIndex * @deprecated Use {@code RelDataTypeField::getName} */ @Deprecated // to be removed before 2.0 - @SuppressWarnings("nullability") + @SuppressWarnings("NullAway") class ToFieldName implements com.google.common.base.Function { @Override public String apply(RelDataTypeField o) { diff --git a/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeFieldImpl.java b/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeFieldImpl.java index f11f9ec24c98..759451086d98 100644 --- a/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeFieldImpl.java +++ b/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeFieldImpl.java @@ -18,7 +18,7 @@ import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.Serializable; import java.util.Objects; diff --git a/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeImpl.java b/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeImpl.java index d896ece7e9bd..52ef5f4d55d2 100644 --- a/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeImpl.java +++ b/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeImpl.java @@ -29,8 +29,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; -import org.checkerframework.checker.initialization.qual.UnknownInitialization; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.Serializable; import java.nio.charset.Charset; @@ -353,8 +352,8 @@ protected abstract void generateTypeString( * This should be called in every non-abstract subclass * constructor once the type is fully defined. */ - @SuppressWarnings("method.invocation.invalid") - protected void computeDigest(@UnknownInitialization RelDataTypeImpl this) { + @SuppressWarnings("NullAway") + protected void computeDigest() { digest = null; innerDigest = new InnerRelDataTypeDigest(); if (!CalciteSystemProperty.DISABLE_GENERATE_REL_DATA_TYPE_DIGEST_STRING.value()) { diff --git a/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeSystem.java b/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeSystem.java index c9d6186747be..54a6d454865a 100644 --- a/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeSystem.java +++ b/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeSystem.java @@ -20,7 +20,7 @@ import org.apache.calcite.sql.type.SqlTypeUtil; import org.apache.calcite.util.Glossary; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.RoundingMode; diff --git a/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeSystemImpl.java b/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeSystemImpl.java index 9bd698d8303a..f790135ac512 100644 --- a/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeSystemImpl.java +++ b/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeSystemImpl.java @@ -22,7 +22,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.RoundingMode; diff --git a/core/src/main/java/org/apache/calcite/rel/type/RelRecordType.java b/core/src/main/java/org/apache/calcite/rel/type/RelRecordType.java index a63b107ca0cb..5af790d01af1 100644 --- a/core/src/main/java/org/apache/calcite/rel/type/RelRecordType.java +++ b/core/src/main/java/org/apache/calcite/rel/type/RelRecordType.java @@ -21,7 +21,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.HashMap; diff --git a/core/src/main/java/org/apache/calcite/rel/type/SingleColumnAliasRelDataType.java b/core/src/main/java/org/apache/calcite/rel/type/SingleColumnAliasRelDataType.java index 28e0406f6717..8839ce1ab4f3 100644 --- a/core/src/main/java/org/apache/calcite/rel/type/SingleColumnAliasRelDataType.java +++ b/core/src/main/java/org/apache/calcite/rel/type/SingleColumnAliasRelDataType.java @@ -21,7 +21,7 @@ import org.apache.calcite.sql.SqlIntervalQualifier; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.nio.charset.Charset; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/rel/type/TimeFrame.java b/core/src/main/java/org/apache/calcite/rel/type/TimeFrame.java index 1ea43217d76a..8274632f37cd 100644 --- a/core/src/main/java/org/apache/calcite/rel/type/TimeFrame.java +++ b/core/src/main/java/org/apache/calcite/rel/type/TimeFrame.java @@ -20,7 +20,7 @@ import org.apache.commons.math3.fraction.BigFraction; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** Time frame. * diff --git a/core/src/main/java/org/apache/calcite/rel/type/TimeFrameSet.java b/core/src/main/java/org/apache/calcite/rel/type/TimeFrameSet.java index 07869b8504a5..e9c5fb27b64c 100644 --- a/core/src/main/java/org/apache/calcite/rel/type/TimeFrameSet.java +++ b/core/src/main/java/org/apache/calcite/rel/type/TimeFrameSet.java @@ -29,7 +29,7 @@ import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Iterables; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigInteger; import java.util.NavigableMap; diff --git a/core/src/main/java/org/apache/calcite/rel/type/TimeFrames.java b/core/src/main/java/org/apache/calcite/rel/type/TimeFrames.java index f69e66f3c6e4..762dc5ca3194 100644 --- a/core/src/main/java/org/apache/calcite/rel/type/TimeFrames.java +++ b/core/src/main/java/org/apache/calcite/rel/type/TimeFrames.java @@ -31,7 +31,7 @@ import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Iterables; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigInteger; import java.util.Calendar; diff --git a/core/src/main/java/org/apache/calcite/rel/type/package-info.java b/core/src/main/java/org/apache/calcite/rel/type/package-info.java index 6da568d4edc9..8b85c98f7399 100644 --- a/core/src/main/java/org/apache/calcite/rel/type/package-info.java +++ b/core/src/main/java/org/apache/calcite/rel/type/package-info.java @@ -18,4 +18,7 @@ /** * Defines a type system for relational expressions. */ +@NullMarked package org.apache.calcite.rel.type; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/rex/LogicVisitor.java b/core/src/main/java/org/apache/calcite/rex/LogicVisitor.java index b18613b104aa..8467a6a3ed87 100644 --- a/core/src/main/java/org/apache/calcite/rex/LogicVisitor.java +++ b/core/src/main/java/org/apache/calcite/rex/LogicVisitor.java @@ -20,7 +20,7 @@ import com.google.common.collect.Iterables; -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/rex/RexAnalyzer.java b/core/src/main/java/org/apache/calcite/rex/RexAnalyzer.java index 5ca25da26555..ce426e511b49 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexAnalyzer.java +++ b/core/src/main/java/org/apache/calcite/rex/RexAnalyzer.java @@ -27,6 +27,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import org.jspecify.annotations.Nullable; + import java.math.BigDecimal; import java.util.LinkedHashSet; import java.util.List; @@ -114,7 +116,7 @@ private static List getComparables(RexNode variable) { /** Collects the variables (or other bindable sites) in an expression, and * counts features (such as CAST) that {@link RexInterpreter} cannot * handle. */ - private static class VariableCollector extends RexVisitorImpl { + private static class VariableCollector extends RexVisitorImpl<@Nullable Void> { private final Set builder = new LinkedHashSet<>(); private int unsupportedCount = 0; diff --git a/core/src/main/java/org/apache/calcite/rex/RexBiVisitor.java b/core/src/main/java/org/apache/calcite/rex/RexBiVisitor.java index 995b2e97271f..2babccb7b337 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexBiVisitor.java +++ b/core/src/main/java/org/apache/calcite/rex/RexBiVisitor.java @@ -18,6 +18,8 @@ import com.google.common.collect.ImmutableList; +import org.jspecify.annotations.Nullable; + import java.util.ArrayList; import java.util.List; @@ -30,7 +32,7 @@ * @param Return type * @param

    Payload type */ -public interface RexBiVisitor { +public interface RexBiVisitor { //~ Methods ---------------------------------------------------------------- R visitInputRef(RexInputRef inputRef, P arg); diff --git a/core/src/main/java/org/apache/calcite/rex/RexBiVisitorImpl.java b/core/src/main/java/org/apache/calcite/rex/RexBiVisitorImpl.java index 0c8f220bff29..fe03069548f6 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexBiVisitorImpl.java +++ b/core/src/main/java/org/apache/calcite/rex/RexBiVisitorImpl.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.rex; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Default implementation of {@link RexBiVisitor}, which visits each node but @@ -25,7 +25,13 @@ * @param Return type from each {@code visitXxx} method * @param

    Payload type */ -public class RexBiVisitorImpl<@Nullable R, P> implements RexBiVisitor { + +// Every visitXxx returns null: this is the do-nothing traversal that subclasses override +// where they care. It is meaningful only when R is instantiated nullable, and JSpecify +// tracks upper bounds, so it cannot require that. +@SuppressWarnings("NullAway") +public class RexBiVisitorImpl + implements RexBiVisitor { //~ Instance fields -------------------------------------------------------- protected final boolean deep; diff --git a/core/src/main/java/org/apache/calcite/rex/RexBuilder.java b/core/src/main/java/org/apache/calcite/rex/RexBuilder.java index efcb80f20367..6a5108706519 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexBuilder.java +++ b/core/src/main/java/org/apache/calcite/rex/RexBuilder.java @@ -20,6 +20,7 @@ import org.apache.calcite.avatica.util.DateTimeUtils; import org.apache.calcite.avatica.util.Spaces; import org.apache.calcite.avatica.util.TimeUnit; +import org.apache.calcite.linq4j.annotations.Contract; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.core.AggregateCall; import org.apache.calcite.rel.core.CorrelationId; @@ -67,8 +68,7 @@ import com.google.common.collect.RangeSet; import com.google.common.collect.TreeRangeSet; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.PolyNull; +import org.jspecify.annotations.Nullable; import org.locationtech.jts.geom.Geometry; import java.math.BigDecimal; @@ -138,7 +138,7 @@ public class RexBuilder { * * @param typeFactory Type factory */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") public RexBuilder(RelDataTypeFactory typeFactory) { this.typeFactory = typeFactory; this.booleanTrue = @@ -2396,7 +2396,8 @@ public RexNode makeLambdaCall(RexNode expr, List parameters) { * {@link org.apache.calcite.rex.RexLiteral#valueMatchesType}. * *

    Returns null if and only if {@code o} is null. */ - private @PolyNull Object clean(@PolyNull Object o, RelDataType type) { + @Contract("!null, _ -> !null") + private @Nullable Object clean(@Nullable Object o, RelDataType type) { if (o == null) { return o; } diff --git a/core/src/main/java/org/apache/calcite/rex/RexCall.java b/core/src/main/java/org/apache/calcite/rex/RexCall.java index 27d93189c527..f2c17fc9df1a 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexCall.java +++ b/core/src/main/java/org/apache/calcite/rex/RexCall.java @@ -30,7 +30,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; @@ -138,12 +138,12 @@ protected final void appendOperands(StringBuilder sb) { if (SqlKind.SIMPLE_BINARY_OPS.contains(getKind())) { RexNode otherArg = operands.get(1 - i); if ((!(otherArg instanceof RexLiteral) - || digestSkipsType((RexLiteral) otherArg)) + || ((RexLiteral) otherArg).digestIncludesType() == RexDigestIncludeType.NO_TYPE) && SqlTypeUtil.equalSansNullability(operand.getType(), otherArg.getType())) { includeType = RexDigestIncludeType.NO_TYPE; } } - operandDigests.add(computeDigest((RexLiteral) operand, includeType)); + operandDigests.add(((RexLiteral) operand).computeDigest(includeType)); } int totalLength = (operandDigests.size() - 1) * 2; // commas for (String s : operandDigests) { @@ -159,18 +159,6 @@ protected final void appendOperands(StringBuilder sb) { } } - private static boolean digestSkipsType(RexLiteral literal) { - // This seems trivial, however, this method - // workarounds https://github.com/typetools/checker-framework/issues/3631 - return literal.digestIncludesType() == RexDigestIncludeType.NO_TYPE; - } - - private static String computeDigest(RexLiteral literal, RexDigestIncludeType includeType) { - // This seems trivial, however, this method - // workarounds https://github.com/typetools/checker-framework/issues/3631 - return literal.computeDigest(includeType); - } - protected String computeDigest(boolean withType) { final StringBuilder sb = new StringBuilder(op.getName()); if (operands.isEmpty() @@ -204,11 +192,12 @@ private boolean digestWithType() { return isA(SqlKind.CAST) || isA(SqlKind.NEW_SPECIFICATION); } - @Override public R accept(RexVisitor visitor) { + @Override public R accept(RexVisitor visitor) { return visitor.visitCall(this); } - @Override public R accept(RexBiVisitor visitor, P arg) { + @Override public R accept( + RexBiVisitor visitor, P arg) { return visitor.visitCall(this, arg); } diff --git a/core/src/main/java/org/apache/calcite/rex/RexCallBinding.java b/core/src/main/java/org/apache/calcite/rex/RexCallBinding.java index 66df15f55f65..4b9280a2acd2 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexCallBinding.java +++ b/core/src/main/java/org/apache/calcite/rex/RexCallBinding.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.List; diff --git a/core/src/main/java/org/apache/calcite/rex/RexChecker.java b/core/src/main/java/org/apache/calcite/rex/RexChecker.java index 467910218984..590058ebdda1 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexChecker.java +++ b/core/src/main/java/org/apache/calcite/rex/RexChecker.java @@ -22,7 +22,7 @@ import org.apache.calcite.rel.type.RelDataTypeField; import org.apache.calcite.util.Litmus; -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/rex/RexCorrelVariable.java b/core/src/main/java/org/apache/calcite/rex/RexCorrelVariable.java index c0ea81a48542..2148e85e9852 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexCorrelVariable.java +++ b/core/src/main/java/org/apache/calcite/rex/RexCorrelVariable.java @@ -20,7 +20,7 @@ import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.sql.SqlKind; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Objects; @@ -47,11 +47,12 @@ public class RexCorrelVariable extends RexVariable { //~ Methods ---------------------------------------------------------------- - @Override public R accept(RexVisitor visitor) { + @Override public R accept(RexVisitor visitor) { return visitor.visitCorrelVariable(this); } - @Override public R accept(RexBiVisitor visitor, P arg) { + @Override public R accept( + RexBiVisitor visitor, P arg) { return visitor.visitCorrelVariable(this, arg); } diff --git a/core/src/main/java/org/apache/calcite/rex/RexDynamicParam.java b/core/src/main/java/org/apache/calcite/rex/RexDynamicParam.java index 105b65324cfc..629fc4a9d89d 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexDynamicParam.java +++ b/core/src/main/java/org/apache/calcite/rex/RexDynamicParam.java @@ -19,7 +19,7 @@ import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.sql.SqlKind; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Objects; @@ -56,11 +56,12 @@ public int getIndex() { return index; } - @Override public R accept(RexVisitor visitor) { + @Override public R accept(RexVisitor visitor) { return visitor.visitDynamicParam(this); } - @Override public R accept(RexBiVisitor visitor, P arg) { + @Override public R accept( + RexBiVisitor visitor, P arg) { return visitor.visitDynamicParam(this, arg); } diff --git a/core/src/main/java/org/apache/calcite/rex/RexExecutable.java b/core/src/main/java/org/apache/calcite/rex/RexExecutable.java index 8828654c24fe..ae2a80521450 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexExecutable.java +++ b/core/src/main/java/org/apache/calcite/rex/RexExecutable.java @@ -22,10 +22,10 @@ import org.apache.calcite.runtime.Utilities; import org.apache.calcite.util.Pair; -import org.checkerframework.checker.nullness.qual.Nullable; import org.codehaus.commons.compiler.CompileException; import org.codehaus.janino.ClassBodyEvaluator; import org.codehaus.janino.Scanner; +import org.jspecify.annotations.Nullable; import java.io.IOException; import java.io.Serializable; diff --git a/core/src/main/java/org/apache/calcite/rex/RexExecutorImpl.java b/core/src/main/java/org/apache/calcite/rex/RexExecutorImpl.java index 7f06abf58c2f..12c82cfc1ace 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexExecutorImpl.java +++ b/core/src/main/java/org/apache/calcite/rex/RexExecutorImpl.java @@ -41,7 +41,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/rex/RexFieldAccess.java b/core/src/main/java/org/apache/calcite/rex/RexFieldAccess.java index dbc61ca152a7..6182cec013db 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexFieldAccess.java +++ b/core/src/main/java/org/apache/calcite/rex/RexFieldAccess.java @@ -20,7 +20,7 @@ import org.apache.calcite.rel.type.RelDataTypeField; import org.apache.calcite.sql.SqlKind; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static com.google.common.base.Preconditions.checkArgument; @@ -99,11 +99,12 @@ public RelDataTypeField getField() { return SqlKind.FIELD_ACCESS; } - @Override public R accept(RexVisitor visitor) { + @Override public R accept(RexVisitor visitor) { return visitor.visitFieldAccess(this); } - @Override public R accept(RexBiVisitor visitor, P arg) { + @Override public R accept( + RexBiVisitor visitor, P arg) { return visitor.visitFieldAccess(this, arg); } diff --git a/core/src/main/java/org/apache/calcite/rex/RexInputRef.java b/core/src/main/java/org/apache/calcite/rex/RexInputRef.java index 606ac807ccdb..a86a3a4e3737 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexInputRef.java +++ b/core/src/main/java/org/apache/calcite/rex/RexInputRef.java @@ -22,7 +22,7 @@ import org.apache.calcite.sql.SqlKind; import org.apache.calcite.util.Pair; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -121,11 +121,12 @@ public static void add2(PairList list, return SqlKind.INPUT_REF; } - @Override public R accept(RexVisitor visitor) { + @Override public R accept(RexVisitor visitor) { return visitor.visitInputRef(this); } - @Override public R accept(RexBiVisitor visitor, P arg) { + @Override public R accept( + RexBiVisitor visitor, P arg) { return visitor.visitInputRef(this, arg); } diff --git a/core/src/main/java/org/apache/calcite/rex/RexInterpreter.java b/core/src/main/java/org/apache/calcite/rex/RexInterpreter.java index 549efa5387f6..53a9378db2e4 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexInterpreter.java +++ b/core/src/main/java/org/apache/calcite/rex/RexInterpreter.java @@ -34,7 +34,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.RangeSet; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.math.BigInteger; diff --git a/core/src/main/java/org/apache/calcite/rex/RexLambda.java b/core/src/main/java/org/apache/calcite/rex/RexLambda.java index 2803b84b782d..3c59bb76725c 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexLambda.java +++ b/core/src/main/java/org/apache/calcite/rex/RexLambda.java @@ -22,7 +22,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.Objects; @@ -55,11 +55,12 @@ public class RexLambda extends RexNode { return SqlKind.LAMBDA; } - @Override public R accept(RexVisitor visitor) { + @Override public R accept(RexVisitor visitor) { return visitor.visitLambda(this); } - @Override public R accept(RexBiVisitor visitor, P arg) { + @Override public R accept( + RexBiVisitor visitor, P arg) { return visitor.visitLambda(this, arg); } diff --git a/core/src/main/java/org/apache/calcite/rex/RexLambdaRef.java b/core/src/main/java/org/apache/calcite/rex/RexLambdaRef.java index 8a8784609476..e68ee4ab329e 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexLambdaRef.java +++ b/core/src/main/java/org/apache/calcite/rex/RexLambdaRef.java @@ -19,10 +19,12 @@ import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.sql.SqlKind; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Objects; +import static org.apache.calcite.linq4j.Nullness.castNonNull; + /** * Variable that references a field of a lambda expression. */ @@ -36,12 +38,14 @@ public RexLambdaRef(int index, String name, RelDataType type) { return SqlKind.LAMBDA_REF; } - @Override public R accept(RexVisitor visitor) { + @Override public R accept(RexVisitor visitor) { return visitor.visitLambdaRef(this); } - @Override public R accept(RexBiVisitor visitor, P arg) { - return (R) null; + @Override public R accept( + RexBiVisitor visitor, P arg) { + // a lambda reference has no payload to hand a bi-visitor + return castNonNull(null); } @Override public boolean equals(final @Nullable Object obj) { diff --git a/core/src/main/java/org/apache/calcite/rex/RexLiteral.java b/core/src/main/java/org/apache/calcite/rex/RexLiteral.java index 545e81995d0d..95054884323b 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexLiteral.java +++ b/core/src/main/java/org/apache/calcite/rex/RexLiteral.java @@ -20,6 +20,7 @@ import org.apache.calcite.avatica.util.DateTimeUtils; import org.apache.calcite.avatica.util.TimeUnit; import org.apache.calcite.config.CalciteSystemProperty; +import org.apache.calcite.linq4j.annotations.Contract; import org.apache.calcite.linq4j.function.Functions; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.type.RelDataType; @@ -47,11 +48,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.initialization.qual.UnknownInitialization; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.PolyNull; -import org.checkerframework.checker.nullness.qual.RequiresNonNull; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.Nullable; import org.locationtech.jts.geom.Geometry; import java.io.PrintWriter; @@ -278,9 +275,7 @@ public class RexLiteral extends RexNode { * @param includeType whether the digest should include type or not * @return digest */ - @RequiresNonNull({"typeName", "type"}) public final String computeDigest( - @UnknownInitialization RexLiteral this, RexDigestIncludeType includeType) { if (includeType == RexDigestIncludeType.OPTIONAL) { if (digest != null) { @@ -306,9 +301,7 @@ public final String computeDigest( * @see RexCall#computeDigest(boolean) * @return whether {@link RexDigestIncludeType} digest would include data type */ - @RequiresNonNull("type") - RexDigestIncludeType digestIncludesType( - @UnknownInitialization RexLiteral this) { + RexDigestIncludeType digestIncludesType() { return shouldIncludeType(value, type); } @@ -759,7 +752,7 @@ private static void appendAsJava(@Nullable Comparable value, StringBuilder sb, case ARRAY: assert value instanceof List : "value must implement List: " + value; @SuppressWarnings("unchecked") final List list = - (List) castNonNull(value); + (List) value; Util.asStringBuilder(sb, sb2 -> Util.printList(sb, list.size(), (sb3, i) -> sb3.append(list.get(i).computeDigest(includeType)))); @@ -825,10 +818,11 @@ private static RexLiteral toLiteral(RelDataType type, Comparable value) { * by the Jdbc call to return a column as a string * @return a typed RexLiteral, or null */ - public static @PolyNull RexLiteral fromJdbcString( + @Contract("_, _, !null -> !null") + public static @Nullable RexLiteral fromJdbcString( RelDataType type, SqlTypeName typeName, - @PolyNull String literal) { + @Nullable String literal) { if (literal == null) { return null; } @@ -967,7 +961,6 @@ public boolean isNull() { *

    For backwards compatibility, returns DATE. TIME and TIMESTAMP as a * {@link Calendar} value in UTC time zone. */ - @Pure public @Nullable Comparable getValue() { assert valueMatchesType(value, typeName, true) : value; if (value == null) { @@ -1341,11 +1334,12 @@ public static boolean isNullLiteral(RexNode node) { && (((RexLiteral) node).value == null); } - @Override public R accept(RexVisitor visitor) { + @Override public R accept(RexVisitor visitor) { return visitor.visitLiteral(this); } - @Override public R accept(RexBiVisitor visitor, P arg) { + @Override public R accept( + RexBiVisitor visitor, P arg) { return visitor.visitLiteral(this, arg); } } diff --git a/core/src/main/java/org/apache/calcite/rex/RexLocalRef.java b/core/src/main/java/org/apache/calcite/rex/RexLocalRef.java index 81092bcd630e..d9d3a9b07af6 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexLocalRef.java +++ b/core/src/main/java/org/apache/calcite/rex/RexLocalRef.java @@ -19,7 +19,7 @@ import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.sql.SqlKind; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Objects; @@ -74,11 +74,12 @@ public RexLocalRef(int index, RelDataType type) { return Objects.hash(type, index); } - @Override public R accept(RexVisitor visitor) { + @Override public R accept(RexVisitor visitor) { return visitor.visitLocalRef(this); } - @Override public R accept(RexBiVisitor visitor, P arg) { + @Override public R accept( + RexBiVisitor visitor, P arg) { return visitor.visitLocalRef(this, arg); } diff --git a/core/src/main/java/org/apache/calcite/rex/RexMultisetUtil.java b/core/src/main/java/org/apache/calcite/rex/RexMultisetUtil.java index 2534ed4d8a84..c6d399fb6888 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexMultisetUtil.java +++ b/core/src/main/java/org/apache/calcite/rex/RexMultisetUtil.java @@ -22,7 +22,7 @@ import com.google.common.collect.ImmutableSet; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Set; @@ -177,7 +177,7 @@ public static boolean isMultisetCast(RexCall call) { *

    totalCount ≥ multisetCount always holds true. */ private static class RexCallMultisetOperatorCounter - extends RexVisitorImpl { + extends RexVisitorImpl<@Nullable Void> { int totalCount = 0; int multisetCount = 0; diff --git a/core/src/main/java/org/apache/calcite/rex/RexNode.java b/core/src/main/java/org/apache/calcite/rex/RexNode.java index 9db8c867a598..11f5eb9f1c6c 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexNode.java +++ b/core/src/main/java/org/apache/calcite/rex/RexNode.java @@ -16,11 +16,11 @@ */ package org.apache.calcite.rex; +import org.apache.calcite.linq4j.annotations.MonotonicNonNull; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.sql.SqlKind; -import org.checkerframework.checker.nullness.qual.MonotonicNonNull; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Collection; @@ -107,13 +107,14 @@ public int nodeCount() { *

    Also see {@link RexUtil#apply(RexVisitor, java.util.List, RexNode)}, * which applies a visitor to several expressions simultaneously. */ - public abstract R accept(RexVisitor visitor); + public abstract R accept(RexVisitor visitor); /** * Accepts a visitor with a payload, dispatching to the right overloaded * {@link RexBiVisitor#visitInputRef(RexInputRef, Object)} visitXxx} method. */ - public abstract R accept(RexBiVisitor visitor, P arg); + public abstract R accept( + RexBiVisitor visitor, P arg); /** {@inheritDoc} * diff --git a/core/src/main/java/org/apache/calcite/rex/RexNodeAndFieldIndex.java b/core/src/main/java/org/apache/calcite/rex/RexNodeAndFieldIndex.java index b6b5e6c72d28..fc2cf355cda2 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexNodeAndFieldIndex.java +++ b/core/src/main/java/org/apache/calcite/rex/RexNodeAndFieldIndex.java @@ -18,7 +18,7 @@ import org.apache.calcite.rel.type.RelDataType; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Objects; @@ -74,11 +74,12 @@ public int getFieldIndex() { return fieldIndex; } - @Override public R accept(RexVisitor visitor) { + @Override public R accept(RexVisitor visitor) { return visitor.visitNodeAndFieldIndex(this); } - @Override public R accept(RexBiVisitor visitor, P arg) { + @Override public R accept( + RexBiVisitor visitor, P arg) { return visitor.visitNodeAndFieldIndex(this, arg); } diff --git a/core/src/main/java/org/apache/calcite/rex/RexOver.java b/core/src/main/java/org/apache/calcite/rex/RexOver.java index 0b01838b385a..4336ae9e42d3 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexOver.java +++ b/core/src/main/java/org/apache/calcite/rex/RexOver.java @@ -23,7 +23,7 @@ import org.apache.calcite.util.ControlFlowException; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Objects; @@ -152,11 +152,12 @@ public boolean ignoreNulls() { return sb.toString(); } - @Override public R accept(RexVisitor visitor) { + @Override public R accept(RexVisitor visitor) { return visitor.visitOver(this); } - @Override public R accept(RexBiVisitor visitor, P arg) { + @Override public R accept( + RexBiVisitor visitor, P arg) { return visitor.visitOver(this, arg); } @@ -222,7 +223,7 @@ private static class OverFound extends ControlFlowException { *

    It is re-entrant (two threads can use an instance at the same time) * and it can be re-used for multiple visits. */ - private static class Finder extends RexVisitorImpl { + private static class Finder extends RexVisitorImpl<@Nullable Void> { Finder() { super(true); } diff --git a/core/src/main/java/org/apache/calcite/rex/RexPatternFieldRef.java b/core/src/main/java/org/apache/calcite/rex/RexPatternFieldRef.java index 560f88f19e3e..a991a6894fb4 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexPatternFieldRef.java +++ b/core/src/main/java/org/apache/calcite/rex/RexPatternFieldRef.java @@ -19,6 +19,8 @@ import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.sql.SqlKind; +import org.jspecify.annotations.Nullable; + /** * Variable that references a field of an input relational expression. */ @@ -43,11 +45,12 @@ public static RexPatternFieldRef of(String alpha, RexInputRef ref) { return new RexPatternFieldRef(alpha, ref.getIndex(), ref.getType()); } - @Override public R accept(RexVisitor visitor) { + @Override public R accept(RexVisitor visitor) { return visitor.visitPatternFieldRef(this); } - @Override public R accept(RexBiVisitor visitor, P arg) { + @Override public R accept( + RexBiVisitor visitor, P arg) { return visitor.visitPatternFieldRef(this, arg); } diff --git a/core/src/main/java/org/apache/calcite/rex/RexPermuteInputsShuttle.java b/core/src/main/java/org/apache/calcite/rex/RexPermuteInputsShuttle.java index 0906a6610da7..4f019a2dc51a 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexPermuteInputsShuttle.java +++ b/core/src/main/java/org/apache/calcite/rex/RexPermuteInputsShuttle.java @@ -22,7 +22,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/rex/RexProgram.java b/core/src/main/java/org/apache/calcite/rex/RexProgram.java index 9c391cd7f898..0f952a1bcb8d 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexProgram.java +++ b/core/src/main/java/org/apache/calcite/rex/RexProgram.java @@ -17,6 +17,7 @@ package org.apache.calcite.rex; import org.apache.calcite.linq4j.Ord; +import org.apache.calcite.linq4j.annotations.MonotonicNonNull; import org.apache.calcite.plan.RelOptPredicateList; import org.apache.calcite.plan.RelOptUtil; import org.apache.calcite.rel.RelCollation; @@ -41,10 +42,7 @@ import com.google.common.collect.Ordering; import com.google.errorprone.annotations.CheckReturnValue; -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 java.io.PrintWriter; import java.io.StringWriter; @@ -100,7 +98,7 @@ public class RexProgram { /** * Reference counts for each expression, computed on demand. */ - private int @MonotonicNonNull[] refCounts; + @MonotonicNonNull private int[] refCounts; //~ Constructors ----------------------------------------------------------- @@ -178,7 +176,6 @@ public List> getNamedProjects() { * Returns the field reference of this program's filter condition, or null * if there is no condition. */ - @Pure public @Nullable RexLocalRef getCondition() { return condition; } @@ -443,7 +440,6 @@ public RelDataType getOutputRowType() { * @return Whether the program is valid */ public boolean isValid( - @UnknownInitialization RexProgram this, Litmus litmus, RelNode.@Nullable Context context) { if (inputRowType == null) { return litmus.fail(null); @@ -774,7 +770,7 @@ public boolean isPermutation() { public Set getCorrelVariableNames() { final Set paramIdSet = new HashSet<>(); RexUtil.apply( - new RexVisitorImpl(true) { + new RexVisitorImpl<@Nullable Void>(true) { @Override public Void visitCorrelVariable( RexCorrelVariable correlVariable) { paramIdSet.add(correlVariable.getName()); @@ -999,7 +995,7 @@ private class Marshaller extends RexVisitorImpl<@Nullable RexNode> { /** * Visitor which marks which expressions are used. */ - private static class ReferenceCounter extends RexVisitorImpl { + private static class ReferenceCounter extends RexVisitorImpl<@Nullable Void> { private final int[] refCounts; ReferenceCounter(int[] refCounts) { diff --git a/core/src/main/java/org/apache/calcite/rex/RexProgramBuilder.java b/core/src/main/java/org/apache/calcite/rex/RexProgramBuilder.java index ebeb12aa609e..98ce0d41cbfd 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexProgramBuilder.java +++ b/core/src/main/java/org/apache/calcite/rex/RexProgramBuilder.java @@ -24,7 +24,7 @@ import org.apache.calcite.util.Litmus; import org.apache.calcite.util.Pair; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.HashMap; @@ -66,7 +66,7 @@ public RexProgramBuilder(RelDataType inputRowType, RexBuilder rexBuilder) { /** * Creates a program-builder. */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") private RexProgramBuilder(RelDataType inputRowType, RexBuilder rexBuilder, @Nullable RexSimplify unusedSimplify) { this.inputRowType = requireNonNull(inputRowType, "inputRowType"); @@ -94,7 +94,7 @@ private RexProgramBuilder(RelDataType inputRowType, RexBuilder rexBuilder, * @param normalize Whether to normalize * @param simplify Simplifier, or null to not simplify */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") private RexProgramBuilder( RexBuilder rexBuilder, final RelDataType inputRowType, @@ -166,8 +166,8 @@ private static boolean assertionsAreEnabled() { } private void validate(final RexNode expr, final int fieldOrdinal) { - final RexVisitor validator = - new RexVisitorImpl(true) { + final RexVisitor<@Nullable Void> validator = + new RexVisitorImpl<@Nullable Void>(true) { @Override public Void visitInputRef(RexInputRef input) { final int index = input.getIndex(); final List fields = diff --git a/core/src/main/java/org/apache/calcite/rex/RexRangeRef.java b/core/src/main/java/org/apache/calcite/rex/RexRangeRef.java index 1abac5d19aee..c1a117774500 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexRangeRef.java +++ b/core/src/main/java/org/apache/calcite/rex/RexRangeRef.java @@ -18,7 +18,7 @@ import org.apache.calcite.rel.type.RelDataType; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Objects; @@ -71,11 +71,12 @@ public int getOffset() { return offset; } - @Override public R accept(RexVisitor visitor) { + @Override public R accept(RexVisitor visitor) { return visitor.visitRangeRef(this); } - @Override public R accept(RexBiVisitor visitor, P arg) { + @Override public R accept( + RexBiVisitor visitor, P arg) { return visitor.visitRangeRef(this, arg); } diff --git a/core/src/main/java/org/apache/calcite/rex/RexShuttle.java b/core/src/main/java/org/apache/calcite/rex/RexShuttle.java index d99ae12630fa..7e013e27bbd9 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexShuttle.java +++ b/core/src/main/java/org/apache/calcite/rex/RexShuttle.java @@ -16,12 +16,12 @@ */ package org.apache.calcite.rex; +import org.apache.calcite.linq4j.annotations.Contract; import org.apache.calcite.sql.SqlAggFunction; import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.PolyNull; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -277,7 +277,8 @@ protected List visitFieldCollations( * *

    Returns null if and only if {@code exprList} is null. */ - public final @PolyNull List apply(@PolyNull List exprList) { + @Contract("!null -> !null") + public final @Nullable List apply(@Nullable List exprList) { if (exprList == null) { return exprList; } @@ -293,7 +294,8 @@ protected List visitFieldCollations( * Applies this shuttle to an expression, or returns null if the expression * is null. */ - public final @PolyNull RexNode apply(@PolyNull RexNode expr) { + @Contract("!null -> !null") + public final @Nullable RexNode apply(@Nullable RexNode expr) { return (expr == null) ? expr : expr.accept(this); } } diff --git a/core/src/main/java/org/apache/calcite/rex/RexSimplify.java b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java index fe9f7b5ca06e..a0902d1577cf 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexSimplify.java +++ b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java @@ -53,7 +53,7 @@ import com.google.common.collect.Sets; import com.google.common.collect.TreeRangeSet; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.ArrayList; @@ -2430,7 +2430,8 @@ private static void absorb(List terms, SqlKind compositeKind) { } } - private Pair evaluate(RexNode e, Map map) { + private Pair<@Nullable Comparable, @Nullable RuntimeException> evaluate(RexNode e, + Map map) { Comparable c = null; RuntimeException ex = null; try { @@ -2474,8 +2475,10 @@ private void verify(RexNode before, RexNode simplified, RexUnknownAs unknownAs) continue assignment_loop; } } - Pair p0 = evaluate(foo0.e, map); - Pair p1 = evaluate(foo1.e, map); + Pair<@Nullable Comparable, @Nullable RuntimeException> p0 = + evaluate(foo0.e, map); + Pair<@Nullable Comparable, @Nullable RuntimeException> p1 = + evaluate(foo1.e, map); if (p0.right != null || p1.right != null) { if (p0.right == null || p1.right == null) { throw Util.first(p0.right, p1.right); @@ -3130,7 +3133,7 @@ default boolean allowedInOr(RelOptPredicateList predicates) { /** * Visitor which finds all inputs used by an expressions. */ - private static class VariableCollector extends RexVisitorImpl { + private static class VariableCollector extends RexVisitorImpl<@Nullable Void> { private final Set refs = new HashSet<>(); VariableCollector() { @@ -3376,7 +3379,7 @@ private static boolean isLowerBound(final RexNode e) { *

    Returns whether the value was found. */ private static boolean replaceLast(List list, E oldVal, E newVal) { - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") final int index = list.lastIndexOf(oldVal); if (index < 0) { return false; @@ -3685,11 +3688,12 @@ > Sarg build(boolean negate) { () -> "Can't find leastRestrictive type among " + distinctTypes); } - @Override public R accept(RexVisitor visitor) { + @Override public R accept(RexVisitor visitor) { throw new UnsupportedOperationException(); } - @Override public R accept(RexBiVisitor visitor, P arg) { + @Override public R accept( + RexBiVisitor visitor, P arg) { throw new UnsupportedOperationException(); } diff --git a/core/src/main/java/org/apache/calcite/rex/RexSqlConvertlet.java b/core/src/main/java/org/apache/calcite/rex/RexSqlConvertlet.java index 8db99b3a2cc1..809c7ffcd9a1 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexSqlConvertlet.java +++ b/core/src/main/java/org/apache/calcite/rex/RexSqlConvertlet.java @@ -18,7 +18,7 @@ import org.apache.calcite.sql.SqlNode; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Converts a {@link RexNode} expression into a {@link SqlNode} expression. diff --git a/core/src/main/java/org/apache/calcite/rex/RexSqlConvertletTable.java b/core/src/main/java/org/apache/calcite/rex/RexSqlConvertletTable.java index 05ed1c6c567a..f51287bfb5ee 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexSqlConvertletTable.java +++ b/core/src/main/java/org/apache/calcite/rex/RexSqlConvertletTable.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.rex; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Collection of {@link RexSqlConvertlet}s. diff --git a/core/src/main/java/org/apache/calcite/rex/RexSqlReflectiveConvertletTable.java b/core/src/main/java/org/apache/calcite/rex/RexSqlReflectiveConvertletTable.java index fdaf3eb83dce..7c7cea2d2e53 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexSqlReflectiveConvertletTable.java +++ b/core/src/main/java/org/apache/calcite/rex/RexSqlReflectiveConvertletTable.java @@ -18,7 +18,7 @@ import org.apache.calcite.sql.SqlOperator; -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/rex/RexSqlStandardConvertletTable.java b/core/src/main/java/org/apache/calcite/rex/RexSqlStandardConvertletTable.java index 18b3c9de68a0..b6fa31adcde1 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexSqlStandardConvertletTable.java +++ b/core/src/main/java/org/apache/calcite/rex/RexSqlStandardConvertletTable.java @@ -28,7 +28,7 @@ import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.sql.type.SqlTypeUtil; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -40,7 +40,7 @@ public class RexSqlStandardConvertletTable extends RexSqlReflectiveConvertletTable { //~ Constructors ----------------------------------------------------------- - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") public RexSqlStandardConvertletTable() { super(); diff --git a/core/src/main/java/org/apache/calcite/rex/RexSubQuery.java b/core/src/main/java/org/apache/calcite/rex/RexSubQuery.java index 5a9cad2a970b..b2cbf9c0985c 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexSubQuery.java +++ b/core/src/main/java/org/apache/calcite/rex/RexSubQuery.java @@ -30,7 +30,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.Objects; @@ -160,11 +160,12 @@ public static RexSubQuery map(RelNode rel) { ImmutableList.of(), rel); } - @Override public R accept(RexVisitor visitor) { + @Override public R accept(RexVisitor visitor) { return visitor.visitSubQuery(this); } - @Override public R accept(RexBiVisitor visitor, P arg) { + @Override public R accept( + RexBiVisitor visitor, P arg) { return visitor.visitSubQuery(this, arg); } diff --git a/core/src/main/java/org/apache/calcite/rex/RexTableInputRef.java b/core/src/main/java/org/apache/calcite/rex/RexTableInputRef.java index a27c73273cbe..7a62ce7fdffa 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexTableInputRef.java +++ b/core/src/main/java/org/apache/calcite/rex/RexTableInputRef.java @@ -20,7 +20,7 @@ import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.sql.SqlKind; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Objects; @@ -85,11 +85,12 @@ public static RexTableInputRef of(RelTableRef tableRef, RexInputRef ref) { return new RexTableInputRef(tableRef, ref.getIndex(), ref.getType()); } - @Override public R accept(RexVisitor visitor) { + @Override public R accept(RexVisitor visitor) { return visitor.visitTableInputRef(this); } - @Override public R accept(RexBiVisitor visitor, P arg) { + @Override public R accept( + RexBiVisitor visitor, P arg) { return visitor.visitTableInputRef(this, arg); } diff --git a/core/src/main/java/org/apache/calcite/rex/RexToSqlNodeConverter.java b/core/src/main/java/org/apache/calcite/rex/RexToSqlNodeConverter.java index f5d6b3c078a1..0b470ffb5754 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexToSqlNodeConverter.java +++ b/core/src/main/java/org/apache/calcite/rex/RexToSqlNodeConverter.java @@ -20,7 +20,7 @@ import org.apache.calcite.sql.SqlLiteral; import org.apache.calcite.sql.SqlNode; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Converts expressions from {@link RexNode} to {@link SqlNode}. diff --git a/core/src/main/java/org/apache/calcite/rex/RexToSqlNodeConverterImpl.java b/core/src/main/java/org/apache/calcite/rex/RexToSqlNodeConverterImpl.java index d18d7745ae24..2f0f1eadd67d 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexToSqlNodeConverterImpl.java +++ b/core/src/main/java/org/apache/calcite/rex/RexToSqlNodeConverterImpl.java @@ -25,7 +25,7 @@ import org.apache.calcite.util.TimeString; import org.apache.calcite.util.TimestampString; -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/rex/RexUnaryBiVisitor.java b/core/src/main/java/org/apache/calcite/rex/RexUnaryBiVisitor.java index e59e3b06d921..7dce6e97bc01 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexUnaryBiVisitor.java +++ b/core/src/main/java/org/apache/calcite/rex/RexUnaryBiVisitor.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.rex; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Default implementation of a {@link RexBiVisitor} whose payload and return @@ -24,7 +24,7 @@ * * @param Return type from each {@code visitXxx} method */ -public class RexUnaryBiVisitor<@Nullable R> extends RexBiVisitorImpl { +public class RexUnaryBiVisitor extends RexBiVisitorImpl { /** Creates a RexUnaryBiVisitor. */ protected RexUnaryBiVisitor(boolean deep) { super(deep); diff --git a/core/src/main/java/org/apache/calcite/rex/RexUtil.java b/core/src/main/java/org/apache/calcite/rex/RexUtil.java index 99045f0a3cb6..ed6ba5ef9c5f 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexUtil.java +++ b/core/src/main/java/org/apache/calcite/rex/RexUtil.java @@ -63,7 +63,7 @@ import com.google.common.collect.Range; import org.apiguardian.api.API; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.math.RoundingMode; @@ -828,8 +828,8 @@ public static boolean isConstant(RexNode node) { */ public static boolean isDeterministic(RexNode e) { try { - RexVisitor visitor = - new RexVisitorImpl(true) { + RexVisitor<@Nullable Void> visitor = + new RexVisitorImpl<@Nullable Void>(true) { @Override public Void visitCall(RexCall call) { if (!call.getOperator().isDeterministic()) { throw Util.FoundOne.NULL; @@ -849,7 +849,7 @@ public static boolean isDeterministic(RexNode e) { public static boolean containsDynamicFunction(RexNode e) { try { e.accept( - new RexVisitorImpl(true) { + new RexVisitorImpl<@Nullable Void>(true) { @Override public Void visitCall(RexCall call) { if (call.getOperator().isDynamicFunction()) { throw Util.FoundOne.NULL; @@ -868,7 +868,7 @@ public static boolean containsDynamicFunction(RexNode e) { public static boolean containsDynamicParam(RexNode e) { try { e.accept( - new RexVisitorImpl(true) { + new RexVisitorImpl<@Nullable Void>(true) { @Override public Void visitDynamicParam(RexDynamicParam dynamicParam) { throw Util.FoundOne.NULL; } @@ -989,8 +989,8 @@ public static List retainDeterministic(List list) { final SqlOperator operator, RexNode node) { try { - RexVisitor visitor = - new RexVisitorImpl(true) { + RexVisitor<@Nullable Void> visitor = + new RexVisitorImpl<@Nullable Void>(true) { @Override public Void visitCall(RexCall call) { if (call.getOperator().equals(operator)) { throw new Util.FoundOne(call); @@ -1014,8 +1014,8 @@ public static List retainDeterministic(List list) { public static boolean containsInputRef( RexNode node) { try { - RexVisitor visitor = - new RexVisitorImpl(true) { + RexVisitor<@Nullable Void> visitor = + new RexVisitorImpl<@Nullable Void>(true) { @Override public Void visitInputRef(RexInputRef inputRef) { throw new Util.FoundOne(inputRef); } @@ -1036,8 +1036,8 @@ public static boolean containsInputRef( */ public static boolean containsFieldAccess(RexNode node) { try { - RexVisitor visitor = - new RexVisitorImpl(true) { + RexVisitor<@Nullable Void> visitor = + new RexVisitorImpl<@Nullable Void>(true) { @Override public Void visitFieldAccess(RexFieldAccess fieldAccess) { throw new Util.FoundOne(fieldAccess); } @@ -1286,8 +1286,8 @@ public static boolean containsTableInputRef(List nodes) { */ public static @Nullable RexTableInputRef containsTableInputRef(RexNode node) { try { - RexVisitor visitor = - new RexVisitorImpl(true) { + RexVisitor<@Nullable Void> visitor = + new RexVisitorImpl<@Nullable Void>(true) { @Override public Void visitTableInputRef(RexTableInputRef inputRef) { throw new Util.FoundOne(inputRef); } @@ -1744,7 +1744,7 @@ public static T[] apply( * @param expr Single expression, may be null */ public static void apply( - RexVisitor visitor, + RexVisitor<@Nullable Void> visitor, RexNode[] exprs, @Nullable RexNode expr) { for (RexNode e : exprs) { @@ -1764,7 +1764,7 @@ public static void apply( * @param expr Single expression, may be null */ public static void apply( - RexVisitor visitor, + RexVisitor<@Nullable Void> visitor, List exprs, @Nullable RexNode expr) { for (RexNode e : exprs) { @@ -2673,7 +2673,7 @@ public static RexNode swapColumnTableReferences(final RexBuilder rexBuilder, */ public static Set gatherTableReferences(final List nodes) { final Set occurrences = new HashSet<>(); - new RexVisitorImpl(true) { + new RexVisitorImpl<@Nullable Void>(true) { @Override public Void visitTableInputRef(RexTableInputRef ref) { occurrences.add(ref.getTableRef()); return super.visitTableInputRef(ref); @@ -2802,7 +2802,7 @@ private static class SubExprExistsException extends ControlFlowException { * input row type, or a {@link RexLocalRef} with ordinal greater than that set * using {@link #setLimit(int)}. */ - private static class ForwardRefFinder extends RexVisitorImpl { + private static class ForwardRefFinder extends RexVisitorImpl<@Nullable Void> { private int limit = -1; private final RelDataType inputRowType; @@ -2840,7 +2840,7 @@ static class IllegalForwardRefException extends ControlFlowException { /** * Visitor which builds a bitmap of the inputs used by an expression. */ - public static class FieldAccessFinder extends RexVisitorImpl { + public static class FieldAccessFinder extends RexVisitorImpl<@Nullable Void> { private final List fieldAccessList; public FieldAccessFinder() { @@ -3281,7 +3281,7 @@ private static class RexShiftShuttle extends RexShuttle { /** Visitor that throws {@link org.apache.calcite.util.Util.FoundOne} if * applied to an expression that contains a {@link RexCorrelVariable}. */ - private static class CorrelationFinder extends RexVisitorImpl { + private static class CorrelationFinder extends RexVisitorImpl<@Nullable Void> { static final CorrelationFinder INSTANCE = new CorrelationFinder(null); /** Optional filter: when non-null, only correlation ids in this set @@ -3360,7 +3360,7 @@ public FixNullabilityShuttle(RexBuilder rexBuilder, /** Visitor that collects all the top level SubQueries {@link RexSubQuery} * in a projection list of a given {@link Project}.*/ - public static class SubQueryCollector extends RexVisitorImpl { + public static class SubQueryCollector extends RexVisitorImpl<@Nullable Void> { private final List subQueries; private SubQueryCollector() { super(true); @@ -3383,7 +3383,7 @@ public static List collect(Project project) { /** Visitor that throws {@link org.apache.calcite.util.Util.FoundOne} if * applied to an expression that contains a {@link RexSubQuery}. */ - public static class SubQueryFinder extends RexVisitorImpl { + public static class SubQueryFinder extends RexVisitorImpl<@Nullable Void> { public static final SubQueryFinder INSTANCE = new SubQueryFinder(); private final @Nullable SqlKind kind; @@ -3543,7 +3543,7 @@ public ExprSimplifier(RexSimplify simplify, RexUnknownAs unknownAs, /** Visitor that tells whether a node matching a particular description exists * in a tree. */ - public abstract static class RexFinder extends RexVisitorImpl { + public abstract static class RexFinder extends RexVisitorImpl<@Nullable Void> { RexFinder() { super(true); } diff --git a/core/src/main/java/org/apache/calcite/rex/RexVisitor.java b/core/src/main/java/org/apache/calcite/rex/RexVisitor.java index 01a3ff920fd4..041662884aa3 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexVisitor.java +++ b/core/src/main/java/org/apache/calcite/rex/RexVisitor.java @@ -18,6 +18,8 @@ import com.google.common.collect.ImmutableList; +import org.jspecify.annotations.Nullable; + import java.util.ArrayList; import java.util.List; @@ -30,7 +32,7 @@ * * @param Return type */ -public interface RexVisitor { +public interface RexVisitor { //~ Methods ---------------------------------------------------------------- R visitInputRef(RexInputRef inputRef); diff --git a/core/src/main/java/org/apache/calcite/rex/RexVisitorImpl.java b/core/src/main/java/org/apache/calcite/rex/RexVisitorImpl.java index d6d5931d9768..003b816c05a0 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexVisitorImpl.java +++ b/core/src/main/java/org/apache/calcite/rex/RexVisitorImpl.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.rex; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -26,7 +26,12 @@ * * @param Return type from each {@code visitXxx} method. */ -public class RexVisitorImpl<@Nullable R> implements RexVisitor { + +// Every visitXxx returns null: this is the do-nothing traversal that subclasses override +// where they care. It is meaningful only when R is instantiated nullable, and JSpecify +// tracks upper bounds, so it cannot require that. +@SuppressWarnings("NullAway") +public class RexVisitorImpl implements RexVisitor { //~ Instance fields -------------------------------------------------------- protected final boolean deep; diff --git a/core/src/main/java/org/apache/calcite/rex/RexWindow.java b/core/src/main/java/org/apache/calcite/rex/RexWindow.java index 3c39f4706443..1a74d7f5788b 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexWindow.java +++ b/core/src/main/java/org/apache/calcite/rex/RexWindow.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.List; @@ -72,7 +72,7 @@ public class RexWindow { * "ROWS BETWEEN 5 PRECEDING AND CURRENT ROW" is printed as * "ROWS 5 PRECEDING". */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") RexWindow( List partitionKeys, List orderKeys, diff --git a/core/src/main/java/org/apache/calcite/rex/RexWindowBound.java b/core/src/main/java/org/apache/calcite/rex/RexWindowBound.java index 0072db9c1a53..3b922c87b629 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexWindowBound.java +++ b/core/src/main/java/org/apache/calcite/rex/RexWindowBound.java @@ -18,9 +18,7 @@ import org.apache.calcite.sql.SqlNode; -import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.Nullable; /** * Abstracts "XX PRECEDING/FOLLOWING" and "CURRENT ROW" bounds for windowed @@ -41,9 +39,7 @@ public static RexWindowBound create(SqlNode node, RexNode rexNode) { * * @return if the bound is unbounded */ - @Pure - @EnsuresNonNullIf(expression = "getOffset()", result = false) - @SuppressWarnings("contracts.conditional.postcondition.not.satisfied") + @SuppressWarnings("NullAway") public boolean isUnbounded() { return false; } @@ -81,9 +77,7 @@ public boolean isFollowing() { * * @return if the bound is CURRENT ROW */ - @Pure - @EnsuresNonNullIf(expression = "getOffset()", result = false) - @SuppressWarnings("contracts.conditional.postcondition.not.satisfied") + @SuppressWarnings("NullAway") public boolean isCurrentRow() { return false; } @@ -93,7 +87,6 @@ public boolean isCurrentRow() { * * @return offset from XX PRECEDING/FOLLOWING */ - @Pure public @Nullable RexNode getOffset() { return null; } @@ -115,7 +108,7 @@ public int getOrderKey() { * @param return type of the visitor * @return transformed bound */ - public RexWindowBound accept(RexVisitor visitor) { + public RexWindowBound accept(RexVisitor visitor) { return this; } diff --git a/core/src/main/java/org/apache/calcite/rex/RexWindowBounds.java b/core/src/main/java/org/apache/calcite/rex/RexWindowBounds.java index 37c209e1abd7..b2e1155ccff0 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexWindowBounds.java +++ b/core/src/main/java/org/apache/calcite/rex/RexWindowBounds.java @@ -22,7 +22,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Objects; @@ -178,7 +178,7 @@ private RexBoundedWindowBound(SqlKind sqlKind, RexNode offset) { return super.nodeCount() + offset.nodeCount(); } - @Override public RexWindowBound accept(RexVisitor visitor) { + @Override public RexWindowBound accept(RexVisitor visitor) { R r = offset.accept(visitor); if (r instanceof RexNode && r != offset) { return new RexBoundedWindowBound(sqlKind, (RexNode) r); diff --git a/core/src/main/java/org/apache/calcite/rex/package-info.java b/core/src/main/java/org/apache/calcite/rex/package-info.java index 4467d8c65ca7..9b2257bd905a 100644 --- a/core/src/main/java/org/apache/calcite/rex/package-info.java +++ b/core/src/main/java/org/apache/calcite/rex/package-info.java @@ -78,11 +78,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.rex; -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/runtime/AbstractImmutableList.java b/core/src/main/java/org/apache/calcite/runtime/AbstractImmutableList.java index 54e2092d1575..d438a025b288 100644 --- a/core/src/main/java/org/apache/calcite/runtime/AbstractImmutableList.java +++ b/core/src/main/java/org/apache/calcite/runtime/AbstractImmutableList.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.runtime; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Collection; import java.util.Iterator; diff --git a/core/src/main/java/org/apache/calcite/runtime/ArrayBindable.java b/core/src/main/java/org/apache/calcite/runtime/ArrayBindable.java index 52815518a27e..48173e1a048d 100644 --- a/core/src/main/java/org/apache/calcite/runtime/ArrayBindable.java +++ b/core/src/main/java/org/apache/calcite/runtime/ArrayBindable.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.runtime; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Extension to {@link Bindable} that returns rows that are arrays of objects. diff --git a/core/src/main/java/org/apache/calcite/runtime/ArrayEnumeratorCursor.java b/core/src/main/java/org/apache/calcite/runtime/ArrayEnumeratorCursor.java index 219df429ffcf..d30967b04a38 100644 --- a/core/src/main/java/org/apache/calcite/runtime/ArrayEnumeratorCursor.java +++ b/core/src/main/java/org/apache/calcite/runtime/ArrayEnumeratorCursor.java @@ -18,7 +18,7 @@ import org.apache.calcite.linq4j.Enumerator; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Implementation of {@link org.apache.calcite.avatica.util.Cursor} on top of an diff --git a/core/src/main/java/org/apache/calcite/runtime/Automaton.java b/core/src/main/java/org/apache/calcite/runtime/Automaton.java index 86832cfc4000..abc58d70a8f3 100644 --- a/core/src/main/java/org/apache/calcite/runtime/Automaton.java +++ b/core/src/main/java/org/apache/calcite/runtime/Automaton.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.Objects; diff --git a/core/src/main/java/org/apache/calcite/runtime/AutomatonBuilder.java b/core/src/main/java/org/apache/calcite/runtime/AutomatonBuilder.java index 683d50078cc6..049c230c375f 100644 --- a/core/src/main/java/org/apache/calcite/runtime/AutomatonBuilder.java +++ b/core/src/main/java/org/apache/calcite/runtime/AutomatonBuilder.java @@ -39,9 +39,9 @@ public class AutomatonBuilder { private final Map symbolIds = new HashMap<>(); private final List stateList = new ArrayList<>(); private final List transitionList = new ArrayList<>(); - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") private final State startState = createState(); - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") private final State endState = createState(); /** Adds a pattern as a start-to-end transition. */ diff --git a/core/src/main/java/org/apache/calcite/runtime/CalciteContextException.java b/core/src/main/java/org/apache/calcite/runtime/CalciteContextException.java index 3c00f8c633b1..32e1093730bd 100644 --- a/core/src/main/java/org/apache/calcite/runtime/CalciteContextException.java +++ b/core/src/main/java/org/apache/calcite/runtime/CalciteContextException.java @@ -20,8 +20,7 @@ // resource generation can use reflection. That means it must have no // dependencies on other Calcite code. -import org.checkerframework.checker.initialization.qual.UnknownInitialization; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static java.util.Objects.requireNonNull; @@ -125,7 +124,6 @@ public void setPosition(int posLine, int posColumn) { * @param endPosColumn 1-based end column number */ public void setPosition( - @UnknownInitialization CalciteContextException this, int posLine, int posColumn, int endPosLine, diff --git a/core/src/main/java/org/apache/calcite/runtime/CalciteException.java b/core/src/main/java/org/apache/calcite/runtime/CalciteException.java index fb491b9f0c2a..ad2132abe9a7 100644 --- a/core/src/main/java/org/apache/calcite/runtime/CalciteException.java +++ b/core/src/main/java/org/apache/calcite/runtime/CalciteException.java @@ -18,7 +18,7 @@ import org.apache.calcite.config.CalciteSystemProperty; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,7 +53,7 @@ public class CalciteException extends RuntimeException { * @param message error message * @param cause underlying cause */ - @SuppressWarnings({"argument.type.incompatible", "method.invocation.invalid"}) + @SuppressWarnings("NullAway") public CalciteException( String message, @Nullable Throwable cause) { diff --git a/core/src/main/java/org/apache/calcite/runtime/CalciteResource.java b/core/src/main/java/org/apache/calcite/runtime/CalciteResource.java index cc27cb5c2005..2a0a0cac8a5d 100644 --- a/core/src/main/java/org/apache/calcite/runtime/CalciteResource.java +++ b/core/src/main/java/org/apache/calcite/runtime/CalciteResource.java @@ -18,7 +18,7 @@ import org.apache.calcite.sql.validate.SqlValidatorException; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static org.apache.calcite.runtime.Resources.BaseMessage; import static org.apache.calcite.runtime.Resources.ExInst; diff --git a/core/src/main/java/org/apache/calcite/runtime/CompressionFunctions.java b/core/src/main/java/org/apache/calcite/runtime/CompressionFunctions.java index 59bac5d5fd6c..2dbedea77330 100644 --- a/core/src/main/java/org/apache/calcite/runtime/CompressionFunctions.java +++ b/core/src/main/java/org/apache/calcite/runtime/CompressionFunctions.java @@ -18,7 +18,7 @@ import org.apache.calcite.avatica.util.ByteString; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.ByteArrayOutputStream; import java.io.IOException; diff --git a/core/src/main/java/org/apache/calcite/runtime/ConsList.java b/core/src/main/java/org/apache/calcite/runtime/ConsList.java index f564a606f346..5bb699a4339d 100644 --- a/core/src/main/java/org/apache/calcite/runtime/ConsList.java +++ b/core/src/main/java/org/apache/calcite/runtime/ConsList.java @@ -18,8 +18,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.PolyNull; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Arrays; @@ -28,13 +27,14 @@ import java.util.ListIterator; import static org.apache.calcite.linq4j.Nullness.castNonNull; +import static org.apache.calcite.linq4j.Nullness.castNonNullArray; /** * List that consists of a head element and an immutable non-empty list. * * @param Element type */ -public class ConsList extends AbstractImmutableList { +public class ConsList extends AbstractImmutableList { private final E first; private final List rest; @@ -115,13 +115,15 @@ private ConsList(E first, List rest) { return toList().listIterator(index); } - @Override public @PolyNull Object[] toArray(ConsList<@PolyNull E> this) { - return toList().toArray(); + @Override public Object[] toArray() { + // toArray() yields @Nullable Object[] from the JDK model, and the override check + // accepts only Object[]. https://github.com/uber/NullAway/issues/1728 + return castNonNullArray(toList().toArray()); } - @Override public @Nullable T[] toArray(T @Nullable [] a) { + @Override public T[] toArray(T[] a) { final int s = size(); - if (s > castNonNull(a).length) { + if (s > a.length) { a = (T[]) Arrays.copyOf(a, s, a.getClass()); } else if (s < a.length) { a[s] = castNonNull(null); @@ -131,7 +133,9 @@ private ConsList(E first, List rest) { //noinspection unchecked a[i++] = (T) c.first; if (!(c.rest instanceof ConsList)) { - Object[] a2 = c.rest.toArray(); + // toArray() yields @Nullable Object[] from the JDK model. + // https://github.com/uber/NullAway/issues/1728 + @Nullable Object[] a2 = c.rest.toArray(); //noinspection SuspiciousSystemArraycopy System.arraycopy(a2, 0, a, i, a2.length); return a; diff --git a/core/src/main/java/org/apache/calcite/runtime/DeterministicAutomaton.java b/core/src/main/java/org/apache/calcite/runtime/DeterministicAutomaton.java index 6bdaefb7821d..67acd8bd7118 100644 --- a/core/src/main/java/org/apache/calcite/runtime/DeterministicAutomaton.java +++ b/core/src/main/java/org/apache/calcite/runtime/DeterministicAutomaton.java @@ -19,7 +19,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.HashSet; import java.util.Objects; @@ -42,7 +42,7 @@ public class DeterministicAutomaton { private final ImmutableList transitions; /** Constructs the DFA from an epsilon-NFA. */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") DeterministicAutomaton(Automaton automaton) { this.automaton = requireNonNull(automaton, "automaton"); // Calculate eps closure of start state diff --git a/core/src/main/java/org/apache/calcite/runtime/Enumerables.java b/core/src/main/java/org/apache/calcite/runtime/Enumerables.java index 1f2c537ce10a..efa4f0331174 100644 --- a/core/src/main/java/org/apache/calcite/runtime/Enumerables.java +++ b/core/src/main/java/org/apache/calcite/runtime/Enumerables.java @@ -22,7 +22,7 @@ import org.apache.calcite.linq4j.Enumerator; import org.apache.calcite.linq4j.function.Function1; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayDeque; import java.util.Deque; diff --git a/core/src/main/java/org/apache/calcite/runtime/FlatLists.java b/core/src/main/java/org/apache/calcite/runtime/FlatLists.java index 872bc76a49a6..3887f649e9b1 100644 --- a/core/src/main/java/org/apache/calcite/runtime/FlatLists.java +++ b/core/src/main/java/org/apache/calcite/runtime/FlatLists.java @@ -21,9 +21,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.PolyNull; +import org.jspecify.annotations.Nullable; import java.util.AbstractList; import java.util.ArrayList; @@ -35,7 +33,7 @@ import java.util.Objects; import java.util.RandomAccess; -import static org.apache.calcite.linq4j.Nullness.castNonNull; +import static org.apache.calcite.linq4j.Nullness.castNonNullArray; /** * Space-efficient, comparable, immutable lists. @@ -67,7 +65,7 @@ public static List of(T t0) { * @param Element type * @return List containing the given members */ - public static List ofSingle(T t0) { + public static List ofSingle(T t0) { return new Flat1List<>(t0); } @@ -77,7 +75,7 @@ public static List of(T t0, T t1) { } /** Creates a flat list with 3 elements. */ - public static List of(T t0, T t1, T t2) { + public static List of(T t0, T t1, T t2) { return new Flat3List<>(t0, t1, t2); } @@ -226,7 +224,7 @@ private static List flatListNotComparable(T[] t) { * @param Element type * @return List containing the given members */ - public static List of(List t) { + public static List of(List t) { return of_(t); } @@ -258,12 +256,14 @@ private static ComparableList of_(List t) { // write our own implementation and reduce creation overhead a // bit. //noinspection unchecked - return new ComparableListImpl(Arrays.asList(t.toArray())); + // toArray() yields @Nullable Object[] from the JDK model, and these elements are + // Comparable. https://github.com/uber/NullAway/issues/1728 + return new ComparableListImpl(Arrays.asList(castNonNullArray(t.toArray()))); } } /** Returns a list that consists of a given list plus an element. */ - public static List append(List list, E e) { + public static List append(List list, E e) { if (list instanceof AbstractFlatList) { //noinspection unchecked return ((AbstractFlatList) list).append(e); @@ -275,13 +275,13 @@ public static List append(List list, E e) { /** Returns a list that consists of a given list plus an element, guaranteed * to be an {@link ImmutableList}. */ - public static ImmutableList append(ImmutableList list, E e) { + public static ImmutableList append(ImmutableList list, E e) { return ImmutableList.builder().addAll(list).add(e).build(); } /** Returns a map that consists of a given map plus an (key, value), * guaranteed to be an {@link ImmutableMap}. */ - public static ImmutableMap append( + public static ImmutableMap append( Map map, K k, V v) { final ImmutableMap.Builder builder = ImmutableMap.builder(); builder.put(k, v); @@ -322,7 +322,7 @@ public abstract static class AbstractFlatList * * @param Element type */ - protected static class Flat1List + protected static class Flat1List extends AbstractFlatList implements ComparableList { private final T t0; @@ -398,8 +398,8 @@ protected static class Flat1List } @SuppressWarnings({"unchecked" }) - @Override public @Nullable T2[] toArray(T2 @Nullable [] a) { - if (castNonNull(a).length < 1) { + @Override public T2[] toArray(T2[] a) { + if (a.length < 1) { // Make a new array of a's runtime type, but my contents: return (T2[]) Arrays.copyOf(toArray(), 1, a.getClass()); } @@ -407,8 +407,8 @@ protected static class Flat1List return a; } - @Override public @PolyNull Object[] toArray(Flat1List<@PolyNull T> this) { - return new Object[] {castNonNull(t0)}; + @Override public Object[] toArray() { + return new Object[] {t0}; } @Override public int compareTo(List o) { @@ -434,7 +434,7 @@ protected static class Flat1List * * @param Element type */ - protected static class Flat2List + protected static class Flat2List extends AbstractFlatList implements ComparableList { private final T t0; @@ -530,8 +530,8 @@ protected static class Flat2List } @SuppressWarnings({"unchecked" }) - @Override public @Nullable T2[] toArray(T2 @Nullable [] a) { - if (castNonNull(a).length < 2) { + @Override public T2[] toArray(T2[] a) { + if (a.length < 2) { // Make a new array of a's runtime type, but my contents: return (T2[]) Arrays.copyOf(toArray(), 2, a.getClass()); } @@ -540,8 +540,8 @@ protected static class Flat2List return a; } - @Override public @PolyNull Object[] toArray(Flat2List<@PolyNull T> this) { - return new Object[] {castNonNull(t0), castNonNull(t1)}; + @Override public Object[] toArray() { + return new Object[] {t0, t1}; } @Override public int compareTo(List o) { @@ -567,7 +567,7 @@ protected static class Flat2List * * @param Element type */ - protected static class Flat3List + protected static class Flat3List extends AbstractFlatList implements ComparableList { private final T t0; @@ -679,8 +679,8 @@ protected static class Flat3List } @SuppressWarnings({"unchecked" }) - @Override public @Nullable T2[] toArray(T2 @Nullable [] a) { - if (castNonNull(a).length < 3) { + @Override public T2[] toArray(T2[] a) { + if (a.length < 3) { // Make a new array of a's runtime type, but my contents: return (T2[]) Arrays.copyOf(toArray(), 3, a.getClass()); } @@ -690,8 +690,8 @@ protected static class Flat3List return a; } - @Override public @PolyNull Object[] toArray(Flat3List<@PolyNull T> this) { - return new Object[] {castNonNull(t0), castNonNull(t1), castNonNull(t2)}; + @Override public Object[] toArray() { + return new Object[] {t0, t1, t2}; } @Override public int compareTo(List o) { @@ -717,7 +717,7 @@ protected static class Flat3List * * @param Element type */ - protected static class Flat4List + protected static class Flat4List extends AbstractFlatList implements ComparableList { private final T t0; @@ -847,8 +847,8 @@ protected static class Flat4List } @SuppressWarnings({"unchecked" }) - @Override public @Nullable T2[] toArray(T2 @Nullable [] a) { - if (castNonNull(a).length < 4) { + @Override public T2[] toArray(T2[] a) { + if (a.length < 4) { // Make a new array of a's runtime type, but my contents: return (T2[]) Arrays.copyOf(toArray(), 4, a.getClass()); } @@ -859,9 +859,9 @@ protected static class Flat4List return a; } - @Override public @PolyNull Object[] toArray(Flat4List<@PolyNull T> this) { - return new Object[] {castNonNull(t0), castNonNull(t1), castNonNull(t2), - castNonNull(t3)}; + @Override public Object[] toArray() { + return new Object[] {t0, t1, t2, + t3}; } @Override public int compareTo(List o) { @@ -887,7 +887,7 @@ protected static class Flat4List * * @param Element type */ - protected static class Flat5List + protected static class Flat5List extends AbstractFlatList implements ComparableList { private final T t0; @@ -1035,8 +1035,8 @@ protected static class Flat5List } @SuppressWarnings({"unchecked" }) - @Override public @Nullable T2[] toArray(T2 @Nullable [] a) { - if (castNonNull(a).length < 5) { + @Override public T2[] toArray(T2[] a) { + if (a.length < 5) { // Make a new array of a's runtime type, but my contents: return (T2[]) Arrays.copyOf(toArray(), 5, a.getClass()); } @@ -1048,9 +1048,9 @@ protected static class Flat5List return a; } - @Override public @PolyNull Object[] toArray(Flat5List<@PolyNull T> this) { - return new Object[] {castNonNull(t0), castNonNull(t1), castNonNull(t2), - castNonNull(t3), castNonNull(t4)}; + @Override public Object[] toArray() { + return new Object[] {t0, t1, t2, + t3, t4}; } @Override public int compareTo(List o) { @@ -1076,7 +1076,7 @@ protected static class Flat5List * * @param Element type */ - protected static class Flat6List + protected static class Flat6List extends AbstractFlatList implements ComparableList { private final T t0; @@ -1243,8 +1243,8 @@ protected static class Flat6List } @SuppressWarnings({"unchecked" }) - @Override public @Nullable T2[] toArray(T2 @Nullable [] a) { - if (castNonNull(a).length < 6) { + @Override public T2[] toArray(T2[] a) { + if (a.length < 6) { // Make a new array of a's runtime type, but my contents: return (T2[]) Arrays.copyOf(toArray(), 6, a.getClass()); } @@ -1257,9 +1257,9 @@ protected static class Flat6List return a; } - @Override public @PolyNull Object[] toArray(Flat6List<@PolyNull T> this) { - return new Object[] {castNonNull(t0), castNonNull(t1), castNonNull(t2), - castNonNull(t3), castNonNull(t4), castNonNull(t5)}; + @Override public Object[] toArray() { + return new Object[] {t0, t1, t2, + t3, t4, t5}; } @Override public int compareTo(List o) { @@ -1337,8 +1337,11 @@ protected ComparableListImpl(List list) { return list.size(); } - @Override @NonNull public Object[] toArray(@NonNull ComparableListImpl this) { - return this.list.toArray(); + @Override public Object[] toArray() { + // Object[] is the only return type the override check accepts, and the delegated + // call produces @Nullable Object[]. + // https://github.com/uber/NullAway/issues/1728 + return castNonNullArray(this.list.toArray()); } @Override public int compareTo(List o) { diff --git a/core/src/main/java/org/apache/calcite/runtime/FunctionContexts.java b/core/src/main/java/org/apache/calcite/runtime/FunctionContexts.java index e975b69680f9..457d57f75bc0 100644 --- a/core/src/main/java/org/apache/calcite/runtime/FunctionContexts.java +++ b/core/src/main/java/org/apache/calcite/runtime/FunctionContexts.java @@ -21,7 +21,7 @@ import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.schema.FunctionContext; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Runtime support for {@link org.apache.calcite.schema.FunctionContext}. diff --git a/core/src/main/java/org/apache/calcite/runtime/Hook.java b/core/src/main/java/org/apache/calcite/runtime/Hook.java index eced70ba2c56..3dbc8fe4038a 100644 --- a/core/src/main/java/org/apache/calcite/runtime/Hook.java +++ b/core/src/main/java/org/apache/calcite/runtime/Hook.java @@ -22,6 +22,7 @@ import org.apache.calcite.util.Util; import org.apiguardian.api.API; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -189,7 +190,8 @@ private boolean removeThread(Consumer handler) { /** @deprecated Use {@link #propertyJ}. */ @SuppressWarnings("Guava") @Deprecated // return type will change in 2.0 - public static com.google.common.base.Function, Void> property(final V v) { + public static com.google.common.base.Function, @Nullable Void> property( + final V v) { return holder -> { holder.set(v); return null; diff --git a/core/src/main/java/org/apache/calcite/runtime/HttpUtils.java b/core/src/main/java/org/apache/calcite/runtime/HttpUtils.java index fb524bb7e032..a3af68ea2963 100644 --- a/core/src/main/java/org/apache/calcite/runtime/HttpUtils.java +++ b/core/src/main/java/org/apache/calcite/runtime/HttpUtils.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.runtime; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.IOException; import java.io.InputStream; diff --git a/core/src/main/java/org/apache/calcite/runtime/ImmutablePairList.java b/core/src/main/java/org/apache/calcite/runtime/ImmutablePairList.java index f285338675f4..b77d6d9a5b17 100644 --- a/core/src/main/java/org/apache/calcite/runtime/ImmutablePairList.java +++ b/core/src/main/java/org/apache/calcite/runtime/ImmutablePairList.java @@ -16,8 +16,6 @@ */ package org.apache.calcite.runtime; -import org.checkerframework.checker.nullness.qual.NonNull; - import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -25,8 +23,6 @@ import static com.google.common.base.Preconditions.checkArgument; -import static org.apache.calcite.linq4j.Nullness.castNonNull; - import static java.util.Objects.requireNonNull; /** Immutable list of pairs. @@ -63,7 +59,7 @@ static PairList copyOf(T t, U u, Object... rest) { /** Creates an ImmutablePairList whose contents are a copy of a given * collection. */ @SuppressWarnings("unchecked") - static <@NonNull T, @NonNull U> ImmutablePairList copyOf( + static ImmutablePairList copyOf( Iterable> iterable) { // Every PairList - mutable and immutable - knows how to quickly make // itself immutable. @@ -90,8 +86,8 @@ static PairList copyOf(T t, U u, Object... rest) { Object[] elements = new Object[2 * collection.size()]; int i = 0; for (Map.Entry entry2 : iterable) { - elements[i++] = castNonNull(entry2.getKey()); - elements[i++] = castNonNull(entry2.getValue()); + elements[i++] = entry2.getKey(); + elements[i++] = entry2.getValue(); } return new PairLists.ArrayImmutablePairList<>(elements); } @@ -100,8 +96,8 @@ static PairList copyOf(T t, U u, Object... rest) { // Not a collection, so we don't know its size in advance. final List list = new ArrayList<>(); iterable.forEach(entry -> { - list.add(castNonNull(entry.getKey())); - list.add(castNonNull(entry.getValue())); + list.add(entry.getKey()); + list.add(entry.getValue()); }); return PairLists.immutableBackedBy(list); } diff --git a/core/src/main/java/org/apache/calcite/runtime/JsonFunctions.java b/core/src/main/java/org/apache/calcite/runtime/JsonFunctions.java index f5ce8dc479bd..a3e6b0c273dd 100644 --- a/core/src/main/java/org/apache/calcite/runtime/JsonFunctions.java +++ b/core/src/main/java/org/apache/calcite/runtime/JsonFunctions.java @@ -16,6 +16,7 @@ */ package org.apache.calcite.runtime; +import org.apache.calcite.linq4j.annotations.EnsuresNonNullIf; import org.apache.calcite.linq4j.function.Deterministic; import org.apache.calcite.sql.SqlJsonConstructorNullClause; import org.apache.calcite.sql.SqlJsonExistsErrorBehavior; @@ -40,8 +41,7 @@ import com.jayway.jsonpath.spi.mapper.JacksonMappingProvider; import com.jayway.jsonpath.spi.mapper.MappingProvider; -import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Arrays; @@ -447,7 +447,8 @@ public static String jsonObject(SqlJsonConstructorNullClause nullClause, return jsonize(map); } - public static void jsonObjectAggAdd(Map map, String k, @Nullable Object v, + public static void jsonObjectAggAdd(Map map, String k, + @Nullable Object v, SqlJsonConstructorNullClause nullClause) { if (k == null) { throw RESOURCE.nullKeyOfJsonObjectNotAllowed().ex(); @@ -476,7 +477,7 @@ public static String jsonArray(SqlJsonConstructorNullClause nullClause, return jsonize(list); } - public static void jsonArrayAggAdd(List list, @Nullable Object element, + public static void jsonArrayAggAdd(List<@Nullable Object> list, @Nullable Object element, SqlJsonConstructorNullClause nullClause) { if (element == null) { if (nullClause == SqlJsonConstructorNullClause.NULL_ON_NULL) { @@ -901,7 +902,7 @@ private JsonPathContext(PathMode mode, @Nullable Object obj, @Nullable Exception this.exc = exc; } - @EnsuresNonNullIf(expression = "exc", result = true) + @EnsuresNonNullIf(value = "exc", result = true) public boolean hasException() { return exc != null; } @@ -966,7 +967,7 @@ Object obj() { return requireNonNull(obj, "json object must not be null"); } - @EnsuresNonNullIf(expression = "exc", result = true) + @EnsuresNonNullIf(value = "exc", result = true) public boolean hasException() { return exc != null; } diff --git a/core/src/main/java/org/apache/calcite/runtime/Like.java b/core/src/main/java/org/apache/calcite/runtime/Like.java index 376e7ca58db3..0dafc46ea8ee 100644 --- a/core/src/main/java/org/apache/calcite/runtime/Like.java +++ b/core/src/main/java/org/apache/calcite/runtime/Like.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.runtime; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Arrays; import java.util.Locale; diff --git a/core/src/main/java/org/apache/calcite/runtime/MapEntry.java b/core/src/main/java/org/apache/calcite/runtime/MapEntry.java index 8b1a3a1354af..209d1c552758 100644 --- a/core/src/main/java/org/apache/calcite/runtime/MapEntry.java +++ b/core/src/main/java/org/apache/calcite/runtime/MapEntry.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.runtime; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Map; import java.util.Objects; @@ -31,7 +31,8 @@ * @param Key type * @param Value type */ -public class MapEntry implements Map.Entry { +public class MapEntry + implements Map.Entry { final T t; final U u; diff --git a/core/src/main/java/org/apache/calcite/runtime/Matcher.java b/core/src/main/java/org/apache/calcite/runtime/Matcher.java index b0fdb17ffb42..699db8eee7bf 100644 --- a/core/src/main/java/org/apache/calcite/runtime/Matcher.java +++ b/core/src/main/java/org/apache/calcite/runtime/Matcher.java @@ -24,7 +24,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 java.util.Arrays; import java.util.Collection; @@ -38,6 +38,8 @@ import java.util.function.Predicate; import java.util.stream.Collectors; +import static org.apache.calcite.linq4j.Nullness.castNonNull; + import static java.util.Objects.requireNonNull; /** @@ -123,7 +125,8 @@ protected List> matchOneWithSymbols(MemoryFactory.Memory rows for (DeterministicAutomaton.Transition transition : transitions) { // System.out.println("Append new transition to "); final PartialMatch newMatch = - pm.append(transition.symbol, rows.get(), transition.toState); + pm.append(transition.symbol, castNonNull(rows.get()), + transition.toState); newMatches.add(newMatch); } } @@ -139,7 +142,7 @@ protected List> matchOneWithSymbols(MemoryFactory.Memory rows for (DeterministicAutomaton.Transition transition : transitions) { final PartialMatch newMatch = new PartialMatch<>(-1L, ImmutableList.of(transition.symbol), - ImmutableList.of(rows.get()), transition.toState); + ImmutableList.of(castNonNull(rows.get())), transition.toState); newMatches.add(newMatch); } } diff --git a/core/src/main/java/org/apache/calcite/runtime/PairList.java b/core/src/main/java/org/apache/calcite/runtime/PairList.java index d4fa9aaa2bf5..667d7cb76839 100644 --- a/core/src/main/java/org/apache/calcite/runtime/PairList.java +++ b/core/src/main/java/org/apache/calcite/runtime/PairList.java @@ -20,7 +20,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; @@ -39,15 +39,16 @@ * @param First type * @param Second type */ -public interface PairList extends List> { +public interface PairList + extends List> { /** Creates an empty PairList. */ - static PairList of() { + static PairList of() { return new PairLists.MutablePairList<>(new ArrayList<>()); } /** Creates a singleton PairList. */ @SuppressWarnings("RedundantCast") - static PairList of(T t, U u) { + static PairList of(T t, U u) { final List<@Nullable Object> list = new ArrayList<>(); list.add((Object) t); list.add((Object) u); @@ -55,14 +56,16 @@ static PairList of(T t, U u) { } /** Creates a PairList with one or more entries. */ - static PairList copyOf(T t, U u, Object... rest) { + static + PairList copyOf(T t, U u, Object... rest) { checkArgument(rest.length % 2 == 0, "even number"); final List<@Nullable Object> list = Lists.asList(t, u, rest); return new PairLists.MutablePairList<>(new ArrayList<>(list)); } /** Creates an empty PairList with a specified initial capacity. */ - static PairList withCapacity(int initialCapacity) { + static + PairList withCapacity(int initialCapacity) { return backedBy(new ArrayList<>(initialCapacity)); } @@ -70,13 +73,14 @@ static PairList withCapacity(int initialCapacity) { * *

    Changes to the backing list will be reflected in the PairList. * If the backing list is immutable, this PairList will be also. */ - static PairList backedBy(List<@Nullable Object> list) { + static + PairList backedBy(List<@Nullable Object> list) { return new PairLists.MutablePairList<>(list); } /** Creates a PairList from a Map. */ @SuppressWarnings("RedundantCast") - static PairList of(Map map) { + static PairList of(Map map) { final List<@Nullable Object> list = new ArrayList<>(map.size() * 2); map.forEach((t, u) -> { list.add((Object) t); @@ -86,7 +90,7 @@ static PairList of(Map map) { } /** Creates a Builder. */ - static Builder builder() { + static Builder builder() { return new Builder<>(); } @@ -187,6 +191,8 @@ default void reverse() { * reversed. * *

    Throws {@link NullPointerException} if any keys or values are null. */ + // On JDK 21 and later this overrides List.reversed(), but Calcite still compiles on JDK 8 + @SuppressWarnings("MissingOverride") ImmutablePairList reversed(); /** Action to be taken each step of an indexed iteration over a PairList. diff --git a/core/src/main/java/org/apache/calcite/runtime/PairLists.java b/core/src/main/java/org/apache/calcite/runtime/PairLists.java index 51a7c4a0ed3d..81a05292fa95 100644 --- a/core/src/main/java/org/apache/calcite/runtime/PairLists.java +++ b/core/src/main/java/org/apache/calcite/runtime/PairLists.java @@ -22,11 +22,12 @@ import com.google.common.collect.ImmutableMap; import com.google.errorprone.annotations.CanIgnoreReturnValue; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import java.util.AbstractList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.RandomAccess; @@ -56,8 +57,8 @@ static ImmutablePairList immutableBackedBy( return ImmutablePairList.of(); case 2: return new SingletonImmutablePairList<>( - castNonNull((T) list.get(0)), - castNonNull((U) list.get(1))); + element(list.get(0)), + element(list.get(1))); default: return new ArrayImmutablePairList<>(list.toArray()); } @@ -78,12 +79,28 @@ static void checkElementNotNull(int i, @Nullable Object element) { } } + /** Casts an element of a packed list back to the type it was stored with. + * + *

    A {@link PairList} keeps both halves of every pair in one + * {@code List<@Nullable Object>}, so the element type cannot carry the nullability of + * {@code T} and of {@code U} separately. A slot holds whatever was written into it: null + * only when the type argument it belongs to is itself nullable. + * + * @param o element of the packed list + * @param type the element was stored with + * @return the element, typed + */ + @SuppressWarnings({"unchecked", "NullAway"}) + private static E element(@Nullable Object o) { + return (E) o; + } + /** Base class for all implementations of PairList. * * @param First type * @param Second type */ - abstract static class AbstractPairList + abstract static class AbstractPairList extends AbstractList> implements PairList { /** Returns a list containing the alternating left and right elements @@ -112,7 +129,8 @@ static void subListRangeCheck(int fromIndex, int toIndex, int size) { * @param First type * @param Second type */ - static class MutablePairList extends AbstractPairList { + static class MutablePairList + extends AbstractPairList { final List<@Nullable Object> list; MutablePairList(List<@Nullable Object> list) { @@ -138,19 +156,19 @@ static class MutablePairList extends AbstractPairList { @SuppressWarnings("unchecked") @Override public Map.Entry get(int index) { int x = index * 2; - return new MapEntry<>((T) list.get(x), (U) list.get(x + 1)); + return new MapEntry<>(element(list.get(x)), element(list.get(x + 1))); } @SuppressWarnings("unchecked") @Override public T left(int index) { int x = index * 2; - return (T) list.get(x); + return element(list.get(x)); } @SuppressWarnings("unchecked") @Override public U right(int index) { int x = index * 2; - return (U) list.get(x + 1); + return element(list.get(x + 1)); } @Override public Map.Entry set(int index, @@ -164,16 +182,16 @@ static class MutablePairList extends AbstractPairList { @SuppressWarnings("unchecked") @Override public Map.Entry set(int index, T t, U u) { int x = index * 2; - T t0 = (T) list.set(x, t); - U u0 = (U) list.set(x + 1, u); + T t0 = element(list.set(x, t)); + U u0 = element(list.set(x + 1, u)); return new MapEntry<>(t0, u0); } @SuppressWarnings("unchecked") @Override public Map.Entry remove(int index) { final int x = index * 2; - T t = (T) list.remove(x); - U u = (U) list.remove(x); + T t = element(list.remove(x)); + U u = element(list.remove(x)); return new MapEntry<>(t, u); } @@ -222,7 +240,7 @@ static class MutablePairList extends AbstractPairList { } @Override public T get(int index) { - return (T) list.get(index * 2); + return element(list.get(index * 2)); } }; } @@ -236,7 +254,7 @@ static class MutablePairList extends AbstractPairList { } @Override public U get(int index) { - return (U) list.get(index * 2 + 1); + return element(list.get(index * 2 + 1)); } }; } @@ -245,8 +263,8 @@ static class MutablePairList extends AbstractPairList { @Override public void forEach(BiConsumer consumer) { requireNonNull(consumer, "consumer"); for (int i = 0; i < list.size();) { - T t = (T) list.get(i++); - U u = (U) list.get(i++); + T t = element(list.get(i++)); + U u = element(list.get(i++)); consumer.accept(t, u); } } @@ -255,8 +273,8 @@ static class MutablePairList extends AbstractPairList { @Override public void forEachIndexed(IndexedBiConsumer consumer) { requireNonNull(consumer, "consumer"); for (int i = 0, j = 0; i < list.size();) { - T t = (T) list.get(i++); - U u = (U) list.get(i++); + T t = element(list.get(i++)); + U u = element(list.get(i++)); consumer.accept(j++, t, u); } } @@ -275,8 +293,8 @@ static class MutablePairList extends AbstractPairList { @Override public List transform(BiFunction function) { return Functions.generate(list.size() / 2, index -> { final int x = index * 2; - final T t = (T) list.get(x); - final U u = (U) list.get(x + 1); + final T t = element(list.get(x)); + final U u = element(list.get(x + 1)); return function.apply(t, u); }); } @@ -289,8 +307,8 @@ static class MutablePairList extends AbstractPairList { } final ImmutableList.Builder builder = ImmutableList.builder(); for (int i = 0, n = list.size(); i < n;) { - final T t = (T) list.get(i++); - final U u = (U) list.get(i++); + final T t = element(list.get(i++)); + final U u = element(list.get(i++)); builder.add(function.apply(t, u)); } return builder.build(); @@ -303,8 +321,8 @@ static class MutablePairList extends AbstractPairList { @SuppressWarnings("unchecked") @Override public boolean anyMatch(BiPredicate predicate) { for (int i = 0; i < list.size();) { - final T t = (T) list.get(i++); - final U u = (U) list.get(i++); + final T t = element(list.get(i++)); + final U u = element(list.get(i++)); if (predicate.test(t, u)) { return true; } @@ -315,8 +333,8 @@ static class MutablePairList extends AbstractPairList { @SuppressWarnings("unchecked") @Override public boolean allMatch(BiPredicate predicate) { for (int i = 0; i < list.size();) { - final T t = (T) list.get(i++); - final U u = (U) list.get(i++); + final T t = element(list.get(i++)); + final U u = element(list.get(i++)); if (!predicate.test(t, u)) { return false; } @@ -327,8 +345,8 @@ static class MutablePairList extends AbstractPairList { @SuppressWarnings("unchecked") @Override public boolean noMatch(BiPredicate predicate) { for (int i = 0; i < list.size();) { - final T t = (T) list.get(i++); - final U u = (U) list.get(i++); + final T t = element(list.get(i++)); + final U u = element(list.get(i++)); if (predicate.test(t, u)) { return false; } @@ -369,11 +387,11 @@ static class MutablePairList extends AbstractPairList { * @param First type * @param Second type */ - static class EmptyImmutablePairList + static class EmptyImmutablePairList extends AbstractPairList implements ImmutablePairList { @Override List<@Nullable Object> backingList() { - return ImmutableList.of(); + return Collections.emptyList(); } @Override public Map.Entry get(int index) { @@ -443,7 +461,7 @@ static class EmptyImmutablePairList * @param First type * @param Second type */ - static class SingletonImmutablePairList + static class SingletonImmutablePairList extends AbstractPairList implements ImmutablePairList { private final T t; @@ -457,7 +475,7 @@ static class SingletonImmutablePairList } @Override List<@Nullable Object> backingList() { - return ImmutableList.of(t, u); + return Arrays.asList(t, u); } @Override public Map.Entry get(int index) { @@ -547,7 +565,7 @@ abstract static class RandomAccessList * @param First type * @param Second type */ - static class ArrayImmutablePairList + static class ArrayImmutablePairList extends AbstractPairList implements ImmutablePairList { private final Object[] elements; diff --git a/core/src/main/java/org/apache/calcite/runtime/PredicateImpl.java b/core/src/main/java/org/apache/calcite/runtime/PredicateImpl.java index f68134e0dd2b..fa4aab552545 100644 --- a/core/src/main/java/org/apache/calcite/runtime/PredicateImpl.java +++ b/core/src/main/java/org/apache/calcite/runtime/PredicateImpl.java @@ -18,7 +18,7 @@ import com.google.common.base.Predicate; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Abstract implementation of {@link com.google.common.base.Predicate}. diff --git a/core/src/main/java/org/apache/calcite/runtime/RandomFunction.java b/core/src/main/java/org/apache/calcite/runtime/RandomFunction.java index 71936c383bd2..c4843fe8aeb9 100644 --- a/core/src/main/java/org/apache/calcite/runtime/RandomFunction.java +++ b/core/src/main/java/org/apache/calcite/runtime/RandomFunction.java @@ -16,11 +16,10 @@ */ package org.apache.calcite.runtime; +import org.apache.calcite.linq4j.annotations.MonotonicNonNull; import org.apache.calcite.linq4j.function.Deterministic; import org.apache.calcite.linq4j.function.Parameter; -import org.checkerframework.checker.nullness.qual.MonotonicNonNull; - import java.util.Random; /** diff --git a/core/src/main/java/org/apache/calcite/runtime/Resources.java b/core/src/main/java/org/apache/calcite/runtime/Resources.java index b0ec8c9922b6..5770b5ee11b6 100644 --- a/core/src/main/java/org/apache/calcite/runtime/Resources.java +++ b/core/src/main/java/org/apache/calcite/runtime/Resources.java @@ -16,10 +16,8 @@ */ package org.apache.calcite.runtime; -import org.checkerframework.checker.initialization.qual.UnderInitialization; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.PolyNull; -import org.checkerframework.checker.nullness.qual.RequiresNonNull; +import org.apache.calcite.linq4j.annotations.Contract; +import org.jspecify.annotations.Nullable; import java.io.IOException; import java.io.InputStream; @@ -287,7 +285,7 @@ public static class Element { protected final Method method; protected final String key; - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") public Element(Method method) { this.method = method; this.key = deriveKey(); @@ -625,10 +623,7 @@ protected Prop(PropertyAccessor accessor, Method method) { this.hasDefault = resource != null; } - @RequiresNonNull("method") - protected final @Nullable Default getDefault( - @UnderInitialization Prop this - ) { + protected final @Nullable Default getDefault() { if (hasDefault) { return castNonNull(method.getAnnotation(Default.class)); } else { @@ -775,7 +770,8 @@ public StringProp(PropertyAccessor accessor, Method method) { * value if the property is not set. * *

    If {@code defaultValue} is not null, never returns null. */ - public @PolyNull String get(@PolyNull String defaultValue) { + @Contract("!null -> !null") + public @Nullable String get(@Nullable String defaultValue) { return accessor.stringValue(this, defaultValue); } @@ -800,7 +796,8 @@ public interface PropertyAccessor { int intValue(IntProp p); int intValue(IntProp p, int defaultValue); @Nullable String stringValue(StringProp p); - @PolyNull String stringValue(StringProp p, @PolyNull String defaultValue); + @Contract("_, !null -> !null") + @Nullable String stringValue(StringProp p, @Nullable String defaultValue); boolean booleanValue(BooleanProp p); boolean booleanValue(BooleanProp p, boolean defaultValue); double doubleValue(DoubleProp p); @@ -829,8 +826,9 @@ public int intValue(IntProp p, int defaultValue) { return p.defaultValue(); } - @Override public @PolyNull String stringValue(StringProp p, - @PolyNull String defaultValue) { + @Contract("_, !null -> !null") + @Override public @Nullable String stringValue(StringProp p, + @Nullable String defaultValue) { return defaultValue; } @@ -1143,8 +1141,8 @@ public int intValue(IntProp p, int defaultValue) { return p.defaultValue; } - @Override public @PolyNull String stringValue(StringProp p, - @PolyNull String defaultValue) { + @Override public @Nullable String stringValue(StringProp p, + @Nullable String defaultValue) { final String s = properties.getProperty(p.key); return s == null ? defaultValue : s; } diff --git a/core/src/main/java/org/apache/calcite/runtime/ResultSetEnumerable.java b/core/src/main/java/org/apache/calcite/runtime/ResultSetEnumerable.java index 5d60b6552f38..c9370153a833 100644 --- a/core/src/main/java/org/apache/calcite/runtime/ResultSetEnumerable.java +++ b/core/src/main/java/org/apache/calcite/runtime/ResultSetEnumerable.java @@ -26,7 +26,7 @@ import org.apache.calcite.linq4j.tree.Primitive; import org.apache.calcite.util.Static; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -61,7 +61,7 @@ * * @param Element type */ -public class ResultSetEnumerable extends AbstractEnumerable { +public class ResultSetEnumerable extends AbstractEnumerable { private final DataSource dataSource; private final String sql; private final Function1> rowBuilderFactory; @@ -151,7 +151,7 @@ private ResultSetEnumerable( /** Executes a SQL query and returns the results as an enumerator, using a * row builder to convert JDBC column values into rows. */ - public static ResultSetEnumerable of( + public static ResultSetEnumerable of( DataSource dataSource, String sql, Function1> rowBuilderFactory) { @@ -163,7 +163,7 @@ public static ResultSetEnumerable of( * *

    It uses a {@link PreparedStatement} for computing the query result, * and that means that it can bind parameters. */ - public static ResultSetEnumerable of( + public static ResultSetEnumerable of( DataSource dataSource, String sql, Function1> rowBuilderFactory, diff --git a/core/src/main/java/org/apache/calcite/runtime/SpaceFillingCurve2D.java b/core/src/main/java/org/apache/calcite/runtime/SpaceFillingCurve2D.java index d66cbf9dc05d..3330307a7016 100644 --- a/core/src/main/java/org/apache/calcite/runtime/SpaceFillingCurve2D.java +++ b/core/src/main/java/org/apache/calcite/runtime/SpaceFillingCurve2D.java @@ -115,7 +115,7 @@ class OverlappingRange extends AbstractRange { /** Lexicographic ordering for {@link IndexRange}. */ class IndexRangeOrdering extends Ordering { - @SuppressWarnings("override.param.invalid") + @SuppressWarnings("NullAway") @Override public int compare(IndexRange x, IndexRange y) { final int c1 = Long.compare(x.lower(), y.lower()); if (c1 != 0) { diff --git a/core/src/main/java/org/apache/calcite/runtime/SpatialTypeFunctions.java b/core/src/main/java/org/apache/calcite/runtime/SpatialTypeFunctions.java index 1942ef22d910..9270e6b17407 100644 --- a/core/src/main/java/org/apache/calcite/runtime/SpatialTypeFunctions.java +++ b/core/src/main/java/org/apache/calcite/runtime/SpatialTypeFunctions.java @@ -26,7 +26,7 @@ import org.apache.calcite.linq4j.function.Strict; import org.apache.calcite.runtime.SpatialTypeUtils.SpatialType; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.locationtech.jts.algorithm.InteriorPoint; import org.locationtech.jts.algorithm.MinimumBoundingCircle; import org.locationtech.jts.algorithm.MinimumDiameter; diff --git a/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java b/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java index 65a26e05d6c0..4c1e47c9832e 100644 --- a/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java +++ b/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java @@ -28,6 +28,7 @@ import org.apache.calcite.linq4j.Enumerator; import org.apache.calcite.linq4j.Linq4j; import org.apache.calcite.linq4j.Ord; +import org.apache.calcite.linq4j.annotations.Contract; import org.apache.calcite.linq4j.function.Deterministic; import org.apache.calcite.linq4j.function.Experimental; import org.apache.calcite.linq4j.function.Function1; @@ -73,13 +74,12 @@ import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.UncheckedExecutionException; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.PolyNull; import org.joou.UByte; import org.joou.UInteger; import org.joou.ULong; import org.joou.UShort; import org.joou.Unsigned; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Field; import java.math.BigDecimal; @@ -224,14 +224,14 @@ public class SqlFunctions { /** Like {@link #LIST_AS_ENUMERABLE}, but for outer join mode: an empty or NULL * collection yields one NULL element rather than no elements. */ - private static final Function1, Enumerable<@Nullable Object>> - OUTER_LIST_AS_ENUMERABLE = + private static final Function1<@Nullable List<@Nullable Object>, + Enumerable<@Nullable Object>> OUTER_LIST_AS_ENUMERABLE = a0 -> a0 == null || a0.isEmpty() ? Linq4j.asEnumerable(SINGLE_NULL) : Linq4j.asEnumerable(a0); /** Like {@link #STRUCT_LIST_AS_ENUMERABLE}, but for outer join mode. */ - private static final Function1, Enumerable<@Nullable Object>> - OUTER_STRUCT_LIST_AS_ENUMERABLE = + private static final Function1<@Nullable List<@Nullable Object>, + Enumerable<@Nullable Object>> OUTER_STRUCT_LIST_AS_ENUMERABLE = a0 -> a0 == null || a0.isEmpty() ? Linq4j.asEnumerable(SINGLE_NULL) : Linq4j.asEnumerable(a0).<@Nullable Object>select(SqlFunctions::structValue); @@ -251,7 +251,8 @@ public class SqlFunctions { /** * WARNING: keep this logic as a static method. JDK 8 and 11 produce invalid bytecode when - * checkerframework annotations are used on static lambdas. See CALCITE-6393. + * type-use annotations such as {@code @Nullable} are used on static lambdas. + * See CALCITE-6393. */ private static Enumerable<@Nullable Object[]> arrayCartesianProduct(Object[] lists) { final List> enumerators = new ArrayList<>(); @@ -272,7 +273,10 @@ private static class ArrayCartesianProductEnumerable } @Override public Enumerator<@Nullable Object[]> enumerator() { - return Linq4j.transform(product, List::toArray); + // A List::toArray method reference does not resolve: the JDK model reports one + // signature at a call site and requires another in an override. + // https://github.com/uber/NullAway/issues/1728 + return Linq4j.transform(product, list -> list.toArray()); } } @@ -331,7 +335,8 @@ public static void resetThreadSequences() { /** Whether the current Java version is 8 (1.8). */ private static final boolean IS_JDK_8 = - System.getProperty("java.version").startsWith("1.8"); + requireNonNull(System.getProperty("java.version"), "java.version") + .startsWith("1.8"); private SqlFunctions() { } @@ -2793,45 +2798,52 @@ public static int plus(int b0, int b1) { /** SQL + operator applied to int values; left side may be * null. */ - public static @PolyNull Integer plus(@PolyNull Integer b0, int b1) { + @Contract("!null, _ -> !null") + public static @Nullable Integer plus(@Nullable Integer b0, int b1) { return b0 == null ? castNonNull(null) : (b0 + b1); } /** SQL + operator applied to int values; right side may be * null. */ - public static @PolyNull Integer plus(int b0, @PolyNull Integer b1) { + @Contract("_, !null -> !null") + public static @Nullable Integer plus(int b0, @Nullable Integer b1) { return b1 == null ? castNonNull(null) : (b0 + b1); } /** SQL + operator applied to nullable int values. */ - public static @PolyNull Integer plus(@PolyNull Integer b0, @PolyNull Integer b1) { + @Contract("!null, !null -> !null") + public static @Nullable Integer plus(@Nullable Integer b0, @Nullable Integer b1) { return (b0 == null || b1 == null) ? castNonNull(null) : (b0 + b1); } /** SQL + operator applied to nullable long and int values. */ - public static @PolyNull Long plus(@PolyNull Long b0, @PolyNull Integer b1) { + @Contract("!null, !null -> !null") + public static @Nullable Long plus(@Nullable Long b0, @Nullable Integer b1) { return (b0 == null || b1 == null) ? castNonNull(null) : (b0.longValue() + b1.longValue()); } /** SQL + operator applied to nullable int and long values. */ - public static @PolyNull Long plus(@PolyNull Integer b0, @PolyNull Long b1) { + @Contract("!null, !null -> !null") + public static @Nullable Long plus(@Nullable Integer b0, @Nullable Long b1) { return (b0 == null || b1 == null) ? castNonNull(null) : (b0.longValue() + b1.longValue()); } /** SQL + operator applied to BigDecimal values. */ - public static @PolyNull BigDecimal plus(@PolyNull BigDecimal b0, - @PolyNull BigDecimal b1) { + @Contract("!null, !null -> !null") + public static @Nullable BigDecimal plus(@Nullable BigDecimal b0, + @Nullable BigDecimal b1) { return (b0 == null || b1 == null) ? castNonNull(null) : b0.add(b1); } /** SQL + operator applied to Object values (at least one operand * has ANY type; either may be null). */ - public static @PolyNull Object plusAny(@PolyNull Object b0, - @PolyNull Object b1) { + @Contract("!null, !null -> !null") + public static @Nullable Object plusAny(@Nullable Object b0, + @Nullable Object b1) { if (b0 == null || b1 == null) { return castNonNull(null); } @@ -2843,25 +2855,29 @@ public static int plus(int b0, int b1) { throw notArithmetic("+", b0, b1); } - public static @PolyNull UByte plus(@PolyNull UByte b0, @PolyNull UByte b1) { + @Contract("!null, !null -> !null") + public static @Nullable UByte plus(@Nullable UByte b0, @Nullable UByte b1) { return (b0 == null || b1 == null) ? castNonNull(null) : b0.add(b1); } - public static @PolyNull UShort plus(@PolyNull UShort b0, @PolyNull UShort b1) { + @Contract("!null, !null -> !null") + public static @Nullable UShort plus(@Nullable UShort b0, @Nullable UShort b1) { return (b0 == null || b1 == null) ? castNonNull(null) : b0.add(b1); } - public static @PolyNull UInteger plus(@PolyNull UInteger b0, @PolyNull UInteger b1) { + @Contract("!null, !null -> !null") + public static @Nullable UInteger plus(@Nullable UInteger b0, @Nullable UInteger b1) { return (b0 == null || b1 == null) ? castNonNull(null) : b0.add(b1); } - public static @PolyNull ULong plus(@PolyNull ULong b0, @PolyNull ULong b1) { + @Contract("!null, !null -> !null") + public static @Nullable ULong plus(@Nullable ULong b0, @Nullable ULong b1) { return (b0 == null || b1 == null) ? castNonNull(null) : b0.add(b1); @@ -2926,51 +2942,59 @@ public static int minus(int b0, int b1) { /** SQL - operator applied to int values; left side may be * null. */ - public static @PolyNull Integer minus(@PolyNull Integer b0, int b1) { + @Contract("!null, _ -> !null") + public static @Nullable Integer minus(@Nullable Integer b0, int b1) { return b0 == null ? castNonNull(null) : (b0 - b1); } /** SQL - operator applied to int values; right side may be * null. */ - public static @PolyNull Integer minus(int b0, @PolyNull Integer b1) { + @Contract("_, !null -> !null") + public static @Nullable Integer minus(int b0, @Nullable Integer b1) { return b1 == null ? castNonNull(null) : (b0 - b1); } /** SQL - operator applied to nullable int values. */ - public static @PolyNull Integer minus(@PolyNull Integer b0, @PolyNull Integer b1) { + @Contract("!null, !null -> !null") + public static @Nullable Integer minus(@Nullable Integer b0, @Nullable Integer b1) { return (b0 == null || b1 == null) ? castNonNull(null) : (b0 - b1); } /** SQL - operator applied to nullable long and int values. */ - public static @PolyNull Long minus(@PolyNull Long b0, @PolyNull Integer b1) { + @Contract("!null, !null -> !null") + public static @Nullable Long minus(@Nullable Long b0, @Nullable Integer b1) { return (b0 == null || b1 == null) ? castNonNull(null) : (b0.longValue() - b1.longValue()); } /** SQL - operator applied to nullable int and long values. */ - public static @PolyNull Long minus(@PolyNull Integer b0, @PolyNull Long b1) { + @Contract("!null, !null -> !null") + public static @Nullable Long minus(@Nullable Integer b0, @Nullable Long b1) { return (b0 == null || b1 == null) ? castNonNull(null) : (b0.longValue() - b1.longValue()); } /** SQL - operator applied to nullable long and long values. */ - public static @PolyNull Long minus(@PolyNull Long b0, @PolyNull Long b1) { + @Contract("!null, !null -> !null") + public static @Nullable Long minus(@Nullable Long b0, @Nullable Long b1) { return (b0 == null || b1 == null) ? castNonNull(null) : b0.longValue() - b1.longValue(); } /** SQL - operator applied to nullable BigDecimal values. */ - public static @PolyNull BigDecimal minus(@PolyNull BigDecimal b0, - @PolyNull BigDecimal b1) { + @Contract("!null, !null -> !null") + public static @Nullable BigDecimal minus(@Nullable BigDecimal b0, + @Nullable BigDecimal b1) { return (b0 == null || b1 == null) ? castNonNull(null) : b0.subtract(b1); } /** SQL - operator applied to Object values (at least one operand * has ANY type; either may be null). */ - public static @PolyNull Object minusAny(@PolyNull Object b0, @PolyNull Object b1) { + @Contract("!null, !null -> !null") + public static @Nullable Object minusAny(@Nullable Object b0, @Nullable Object b1) { if (b0 == null || b1 == null) { return castNonNull(null); } @@ -2982,20 +3006,24 @@ public static int minus(int b0, int b1) { throw notArithmetic("-", b0, b1); } - public static @PolyNull UByte minus(@PolyNull UByte b0, @PolyNull UByte b1) { + @Contract("!null, !null -> !null") + public static @Nullable UByte minus(@Nullable UByte b0, @Nullable UByte b1) { return (b0 == null || b1 == null) ? castNonNull(null) : b0.subtract(b1); } - public static @PolyNull UShort minus(@PolyNull UShort b0, @PolyNull UShort b1) { + @Contract("!null, !null -> !null") + public static @Nullable UShort minus(@Nullable UShort b0, @Nullable UShort b1) { return (b0 == null || b1 == null) ? castNonNull(null) : b0.subtract(b1); } - public static @PolyNull UInteger minus(@PolyNull UInteger b0, @PolyNull UInteger b1) { + @Contract("!null, !null -> !null") + public static @Nullable UInteger minus(@Nullable UInteger b0, @Nullable UInteger b1) { return (b0 == null || b1 == null) ? castNonNull(null) : b0.subtract(b1); } /** SQL - operator applied to nullable unsigned long and long values. */ - public static @PolyNull ULong minus(@PolyNull ULong b0, @PolyNull ULong b1) { + @Contract("!null, !null -> !null") + public static @Nullable ULong minus(@Nullable ULong b0, @Nullable ULong b1) { return (b0 == null || b1 == null) ? castNonNull(null) : b0.subtract(b1); @@ -3076,39 +3104,45 @@ public static int divide(int b0, int b1) { /** SQL / operator applied to int values; left side may be * null. */ - public static @PolyNull Integer divide(@PolyNull Integer b0, int b1) { + @Contract("!null, _ -> !null") + public static @Nullable Integer divide(@Nullable Integer b0, int b1) { return b0 == null ? castNonNull(null) : (b0 / b1); } /** SQL / operator applied to int values; right side may be * null. */ - public static @PolyNull Integer divide(int b0, @PolyNull Integer b1) { + @Contract("_, !null -> !null") + public static @Nullable Integer divide(int b0, @Nullable Integer b1) { return b1 == null ? castNonNull(null) : (b0 / b1); } /** SQL / operator applied to nullable int values. */ - public static @PolyNull Integer divide(@PolyNull Integer b0, - @PolyNull Integer b1) { + @Contract("!null, !null -> !null") + public static @Nullable Integer divide(@Nullable Integer b0, + @Nullable Integer b1) { return (b0 == null || b1 == null) ? castNonNull(null) : (b0 / b1); } /** SQL / operator applied to nullable long and int values. */ - public static @PolyNull Long divide(Long b0, @PolyNull Integer b1) { + @Contract("_, !null -> !null") + public static @Nullable Long divide(Long b0, @Nullable Integer b1) { return (b0 == null || b1 == null) ? castNonNull(null) : (b0.longValue() / b1.longValue()); } /** SQL / operator applied to nullable int and long values. */ - public static @PolyNull Long divide(@PolyNull Integer b0, @PolyNull Long b1) { + @Contract("!null, !null -> !null") + public static @Nullable Long divide(@Nullable Integer b0, @Nullable Long b1) { return (b0 == null || b1 == null) ? castNonNull(null) : (b0.longValue() / b1.longValue()); } /** SQL / operator applied to BigDecimal values. */ - public static @PolyNull BigDecimal divide(@PolyNull BigDecimal b0, - @PolyNull BigDecimal b1) { + @Contract("!null, !null -> !null") + public static @Nullable BigDecimal divide(@Nullable BigDecimal b0, + @Nullable BigDecimal b1) { return (b0 == null || b1 == null) ? castNonNull(null) : b0.divide(b1, MathContext.DECIMAL64); @@ -3116,8 +3150,9 @@ public static int divide(int b0, int b1) { /** SQL / operator applied to Object values (at least one operand * has ANY type; either may be null). */ - public static @PolyNull Object divideAny(@PolyNull Object b0, - @PolyNull Object b1) { + @Contract("!null, !null -> !null") + public static @Nullable Object divideAny(@Nullable Object b0, + @Nullable Object b1) { if (b0 == null || b1 == null) { return castNonNull(null); } @@ -3139,26 +3174,30 @@ public static long divide(long b0, BigDecimal b1) { .divide(b1, RoundingMode.HALF_DOWN).longValue(); } - public static @PolyNull UByte divide(@PolyNull UByte b0, - @PolyNull UByte b1) { + @Contract("!null, !null -> !null") + public static @Nullable UByte divide(@Nullable UByte b0, + @Nullable UByte b1) { return (b0 == null || b1 == null) ? castNonNull(null) : UByte.valueOf(b0.intValue() / b1.intValue()); } - public static @PolyNull UShort divide(@PolyNull UShort b0, - @PolyNull UShort b1) { + @Contract("!null, !null -> !null") + public static @Nullable UShort divide(@Nullable UShort b0, + @Nullable UShort b1) { return (b0 == null || b1 == null) ? castNonNull(null) : UShort.valueOf(b0.intValue() / b1.intValue()); } - public static @PolyNull UInteger divide(@PolyNull UInteger b0, - @PolyNull UInteger b1) { + @Contract("!null, !null -> !null") + public static @Nullable UInteger divide(@Nullable UInteger b0, + @Nullable UInteger b1) { return (b0 == null || b1 == null) ? castNonNull(null) : UInteger.valueOf(b0.longValue() / b1.longValue()); } - public static @PolyNull ULong divide(@PolyNull ULong b0, - @PolyNull ULong b1) { + @Contract("!null, !null -> !null") + public static @Nullable ULong divide(@Nullable ULong b0, + @Nullable ULong b1) { return (b0 == null || b1 == null) ? castNonNull(null) : ULong.valueOf(UnsignedType.toBigInteger(b0).divide(UnsignedType.toBigInteger(b1))); } @@ -3230,42 +3269,49 @@ public static int multiply(int b0, int b1) { /** SQL * operator applied to int values; left side may be * null. */ - public static @PolyNull Integer multiply(@PolyNull Integer b0, int b1) { + @Contract("!null, _ -> !null") + public static @Nullable Integer multiply(@Nullable Integer b0, int b1) { return b0 == null ? castNonNull(null) : (b0 * b1); } /** SQL * operator applied to int values; right side may be * null. */ - public static @PolyNull Integer multiply(int b0, @PolyNull Integer b1) { + @Contract("_, !null -> !null") + public static @Nullable Integer multiply(int b0, @Nullable Integer b1) { return b1 == null ? castNonNull(null) : (b0 * b1); } /** SQL * operator applied to nullable int values. */ - public static @PolyNull Integer multiply(@PolyNull Integer b0, - @PolyNull Integer b1) { + @Contract("!null, !null -> !null") + public static @Nullable Integer multiply(@Nullable Integer b0, + @Nullable Integer b1) { return (b0 == null || b1 == null) ? castNonNull(null) : (b0 * b1); } - public static @PolyNull UByte multiply(@PolyNull UByte b0, - @PolyNull UByte b1) { + @Contract("!null, !null -> !null") + public static @Nullable UByte multiply(@Nullable UByte b0, + @Nullable UByte b1) { return (b0 == null || b1 == null) ? castNonNull(null) : UByte.valueOf(b0.longValue() * b1.longValue()); } - public static @PolyNull UShort multiply(@PolyNull UShort b0, - @PolyNull UShort b1) { + @Contract("!null, !null -> !null") + public static @Nullable UShort multiply(@Nullable UShort b0, + @Nullable UShort b1) { return (b0 == null || b1 == null) ? castNonNull(null) : UShort.valueOf(b0.intValue() * b1.intValue()); } - public static @PolyNull UInteger multiply(@PolyNull UInteger b0, - @PolyNull UInteger b1) { + @Contract("!null, !null -> !null") + public static @Nullable UInteger multiply(@Nullable UInteger b0, + @Nullable UInteger b1) { return (b0 == null || b1 == null) ? castNonNull(null) : UInteger.valueOf(b0.longValue() * b1.longValue()); } - public static @PolyNull ULong multiply(@PolyNull ULong b0, - @PolyNull ULong b1) { + @Contract("!null, !null -> !null") + public static @Nullable ULong multiply(@Nullable ULong b0, + @Nullable ULong b1) { if (b0 == null || b1 == null) { return castNonNull(null); } @@ -3274,29 +3320,33 @@ public static int multiply(int b0, int b1) { } /** SQL * operator applied to nullable long and int values. */ - public static @PolyNull Long multiply(@PolyNull Long b0, @PolyNull Integer b1) { + @Contract("!null, !null -> !null") + public static @Nullable Long multiply(@Nullable Long b0, @Nullable Integer b1) { return (b0 == null || b1 == null) ? castNonNull(null) : (b0.longValue() * b1.longValue()); } /** SQL * operator applied to nullable int and long values. */ - public static @PolyNull Long multiply(@PolyNull Integer b0, @PolyNull Long b1) { + @Contract("!null, !null -> !null") + public static @Nullable Long multiply(@Nullable Integer b0, @Nullable Long b1) { return (b0 == null || b1 == null) ? castNonNull(null) : (b0.longValue() * b1.longValue()); } /** SQL * operator applied to nullable BigDecimal values. */ - public static @PolyNull BigDecimal multiply(@PolyNull BigDecimal b0, - @PolyNull BigDecimal b1) { + @Contract("!null, !null -> !null") + public static @Nullable BigDecimal multiply(@Nullable BigDecimal b0, + @Nullable BigDecimal b1) { return (b0 == null || b1 == null) ? castNonNull(null) : b0.multiply(b1); } /** SQL * operator applied to Object values (at least one operand * has ANY type; either may be null). */ - public static @PolyNull Object multiplyAny(@PolyNull Object b0, - @PolyNull Object b1) { + @Contract("!null, !null -> !null") + public static @Nullable Object multiplyAny(@Nullable Object b0, + @Nullable Object b1) { if (b0 == null || b1 == null) { return castNonNull(null); } @@ -5381,7 +5431,8 @@ public static int toInt(java.sql.Date v, TimeZone timeZone) { * @see #toInt(java.sql.Date, TimeZone) * @see #internalToDate(Integer) converse method */ - public static @PolyNull Integer toIntOptional(java.sql.@PolyNull Date v) { + @Contract("!null -> !null") + public static @Nullable Integer toIntOptional(java.sql.@Nullable Date v) { return v == null ? castNonNull(null) : toInt(v); @@ -5394,7 +5445,8 @@ public static int toInt(java.sql.Date v, TimeZone timeZone) { * * @see #toInt(java.sql.Date, TimeZone) */ - public static @PolyNull Integer toIntOptional(java.sql.@PolyNull Date v, + @Contract("!null, _ -> !null") + public static @Nullable Integer toIntOptional(java.sql.@Nullable Date v, TimeZone timeZone) { return v == null ? castNonNull(null) @@ -5422,7 +5474,8 @@ public static int toInt(java.sql.Time v) { * @see #toInt(java.sql.Time) * @see #internalToTime(Integer) converse method */ - public static @PolyNull Integer toIntOptional(java.sql.@PolyNull Time v) { + @Contract("!null -> !null") + public static @Nullable Integer toIntOptional(java.sql.@Nullable Time v) { return v == null ? castNonNull(null) : toInt(v); } @@ -5443,7 +5496,8 @@ public static int toInt(Object o) { : (Integer) cannotConvert(o, int.class); } - public static @PolyNull Integer toIntOptional(@PolyNull Object o) { + @Contract("!null -> !null") + public static @Nullable Integer toIntOptional(@Nullable Object o) { return o == null ? castNonNull(null) : toInt(o); } @@ -5508,7 +5562,8 @@ public static long toLong(Timestamp v, TimeZone timeZone) { * @see #toLong(Timestamp, TimeZone) * @see #internalToTimestamp(Long) converse method */ - public static @PolyNull Long toLongOptional(@PolyNull Timestamp v) { + @Contract("!null -> !null") + public static @Nullable Long toLongOptional(@Nullable Timestamp v) { return v == null ? castNonNull(null) : toLong(v, LOCAL_TZ); } @@ -5519,7 +5574,8 @@ public static long toLong(Timestamp v, TimeZone timeZone) { * * @see #toLong(Timestamp, TimeZone) */ - public static @PolyNull Long toLongOptional(@PolyNull Timestamp v, + @Contract("!null, _ -> !null") + public static @Nullable Long toLongOptional(@Nullable Timestamp v, TimeZone timeZone) { if (v == null) { return castNonNull(null); @@ -5549,7 +5605,8 @@ public static long toLong(Object o) { : (Long) cannotConvert(o, long.class); } - public static @PolyNull Long toLongOptional(@PolyNull Object o) { + @Contract("!null -> !null") + public static @Nullable Long toLongOptional(@Nullable Object o) { return o == null ? castNonNull(null) : toLong(o); } @@ -5646,7 +5703,8 @@ public static java.sql.Date internalToDate(int v) { * @see #internalToDate(int) * @see #toIntOptional(java.sql.Date) converse method */ - public static java.sql.@PolyNull Date internalToDate(@PolyNull Integer v) { + @Contract("!null -> !null") + public static java.sql.@Nullable Date internalToDate(@Nullable Integer v) { return v == null ? castNonNull(null) : internalToDate(v.intValue()); } @@ -5670,11 +5728,13 @@ public static java.sql.Time internalToTime(int v) { * @see #internalToTime(Integer) * @see #toIntOptional(java.sql.Time) converse method */ - public static java.sql.@PolyNull Time internalToTime(@PolyNull Integer v) { + @Contract("!null -> !null") + public static java.sql.@Nullable Time internalToTime(@Nullable Integer v) { return v == null ? castNonNull(null) : internalToTime(v.intValue()); } - public static @PolyNull Integer toTimeWithLocalTimeZone(@PolyNull String v) { + @Contract("!null -> !null") + public static @Nullable Integer toTimeWithLocalTimeZone(@Nullable String v) { if (v == null) { return castNonNull(null); } @@ -5684,7 +5744,8 @@ public static java.sql.Time internalToTime(int v) { .getMillisOfDay(); } - public static @PolyNull Integer toTimeWithLocalTimeZone(@PolyNull String v, + @Contract("!null, _ -> !null") + public static @Nullable Integer toTimeWithLocalTimeZone(@Nullable String v, TimeZone timeZone) { if (v == null) { return castNonNull(null); @@ -6049,7 +6110,8 @@ public static java.sql.Timestamp internalToTimestamp(long v) { * @see #toLongOptional(Timestamp, TimeZone) * @see #toLongOptional(Timestamp) converse method */ - public static java.sql.@PolyNull Timestamp internalToTimestamp(@PolyNull Long v) { + @Contract("!null -> !null") + public static java.sql.@Nullable Timestamp internalToTimestamp(@Nullable Long v) { return v == null ? castNonNull(null) : internalToTimestamp(v.longValue()); } @@ -6332,7 +6394,8 @@ public static int time(long timestampMillis, String timeZone) { / (1000L * 1000L)); // milli > micro > nano } - public static @PolyNull Long toTimestampWithLocalTimeZone(@PolyNull String v) { + @Contract("!null -> !null") + public static @Nullable Long toTimestampWithLocalTimeZone(@Nullable String v) { if (v == null) { return castNonNull(null); } @@ -6342,7 +6405,8 @@ public static int time(long timestampMillis, String timeZone) { .getMillisSinceEpoch(); } - public static @PolyNull Long toTimestampWithLocalTimeZone(@PolyNull String v, + @Contract("!null, _ -> !null") + public static @Nullable Long toTimestampWithLocalTimeZone(@Nullable String v, TimeZone timeZone) { if (v == null) { return castNonNull(null); @@ -6356,7 +6420,8 @@ public static int time(long timestampMillis, String timeZone) { // Don't need shortValueOf etc. - Short.valueOf is sufficient. /** Helper for CAST(... AS VARCHAR(maxLength)). */ - public static @PolyNull String truncate(@PolyNull String s, int maxLength) { + @Contract("!null, _ -> !null") + public static @Nullable String truncate(@Nullable String s, int maxLength) { if (s == null) { return s; } else if (s.length() > maxLength) { @@ -6367,7 +6432,8 @@ public static int time(long timestampMillis, String timeZone) { } /** Helper for CAST(... AS CHAR(maxLength)). */ - public static @PolyNull String truncateOrPad(@PolyNull String s, int maxLength) { + @Contract("!null, _ -> !null") + public static @Nullable String truncateOrPad(@Nullable String s, int maxLength) { if (s == null) { return s; } else { @@ -6380,7 +6446,8 @@ public static int time(long timestampMillis, String timeZone) { } } - public static @PolyNull ByteString stringToBinary(@PolyNull String s, Charset charset) { + @Contract("!null, _ -> !null") + public static @Nullable ByteString stringToBinary(@Nullable String s, Charset charset) { if (s == null) { return null; } else { @@ -6388,7 +6455,8 @@ public static int time(long timestampMillis, String timeZone) { } } - public static @PolyNull ByteString byteArrayToByteString(byte @PolyNull [] bytes) { + @Contract("!null -> !null") + public static @Nullable ByteString byteArrayToByteString(byte @Nullable [] bytes) { if (bytes == null) { return null; } else { @@ -6396,7 +6464,7 @@ public static int time(long timestampMillis, String timeZone) { } } - public static byte @PolyNull [] byteStringToByteArray(@PolyNull ByteString s) { + public static byte @Nullable [] byteStringToByteArray(@Nullable ByteString s) { if (s == null) { return null; } else { @@ -6405,7 +6473,8 @@ public static int time(long timestampMillis, String timeZone) { } /** Helper for CAST(... AS VARBINARY(maxLength)). */ - public static @PolyNull ByteString truncate(@PolyNull ByteString s, int maxLength) { + @Contract("!null, _ -> !null") + public static @Nullable ByteString truncate(@Nullable ByteString s, int maxLength) { if (s == null) { return s; } else if (s.length() > maxLength) { @@ -6416,7 +6485,8 @@ public static int time(long timestampMillis, String timeZone) { } /** Helper for CAST(... AS BINARY(maxLength)). */ - public static @PolyNull ByteString truncateOrPad(@PolyNull ByteString s, int maxLength) { + @Contract("!null, _ -> !null") + public static @Nullable ByteString truncateOrPad(@Nullable ByteString s, int maxLength) { if (s == null) { return s; } else { @@ -7030,12 +7100,14 @@ public static boolean isNotFalse(@Nullable Boolean b) { } /** NULL → NULL, FALSE → TRUE, TRUE → FALSE. */ - public static @PolyNull Boolean not(@PolyNull Boolean b) { + @Contract("!null -> !null") + public static @Nullable Boolean not(@Nullable Boolean b) { return b == null ? castNonNull(null) : !b; } /** Converts a JDBC array to a list. */ - public static @PolyNull List arrayToList(final java.sql.@PolyNull Array a) { + @Contract("!null -> !null") + public static @Nullable List arrayToList(final java.sql.@Nullable Array a) { if (a == null) { return castNonNull(null); } @@ -7090,7 +7162,7 @@ private static AtomicLong getAtomicLong(String key) { } /** Support the ARRAYS_ZIP function. */ - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") public static List arraysZip(List... lists) { final int biggestCardinality = lists.length == 0 ? 0 @@ -7142,7 +7214,7 @@ public static List distinct(List list) { } /** Support the ARRAY_MAX function. */ - public static @Nullable > T arrayMax( + public static @Nullable > T arrayMax( List list) { T max = null; @@ -7156,7 +7228,7 @@ public static List distinct(List list) { } /** Support the ARRAY_MIN function. */ - public static @Nullable > T arrayMin( + public static @Nullable > T arrayMin( List list) { T min = null; @@ -7222,7 +7294,7 @@ public static List arrayExcept(List list1, List list2) { return null; } int posInt = (int) pos; - Object[] baseArray = baselist.toArray(); + @Nullable Object[] baseArray = baselist.toArray(); if (posInt == 0 || posInt >= MAX_ARRAY_LENGTH || posInt <= -MAX_ARRAY_LENGTH) { throw new IllegalArgumentException("The index 0 is invalid. " + "An index shall be either < 0 or > 0 (the first element has index 1) " @@ -7431,7 +7503,7 @@ public static Map mapFromArrays(List keysArray, List valuesArray) { if (keysArray.size() != valuesArray.size()) { throw RESOURCE.illegalArgumentsInMapFromArraysFunc(keysArray.size(), valuesArray.size()).ex(); } - final Map map = new LinkedHashMap<>(); + final Map<@Nullable Object, @Nullable Object> map = new LinkedHashMap<>(); for (int i = 0; i < keysArray.size(); i++) { map.put(keysArray.get(i), valuesArray.get(i)); } @@ -7440,7 +7512,7 @@ public static Map mapFromArrays(List keysArray, List valuesArray) { /** Support the MAP_FROM_ENTRIES function. */ public static @Nullable Map mapFromEntries(List entries) { - final Map map = new LinkedHashMap<>(); + final Map<@Nullable Object, @Nullable Object> map = new LinkedHashMap<>(); for (Object entry : entries) { if (entry == null) { return null; @@ -7455,7 +7527,7 @@ public static Map mapFromArrays(List keysArray, List valuesArray) { *

    odd-indexed elements are keys and even-indexed elements are values. */ public static Map map(Object... args) { - final Map map = new LinkedHashMap<>(); + final Map<@Nullable Object, @Nullable Object> map = new LinkedHashMap<>(); for (int i = 0; i < args.length; i += 2) { Object key = args[i]; Object value = args[i + 1]; @@ -7503,7 +7575,7 @@ public static Map map(Object... args) { /** Support the STR_TO_MAP function. */ public static Map strToMap(String string, String stringDelimiter, String keyValueDelimiter) { - final Map map = new LinkedHashMap(); + final Map map = new LinkedHashMap<>(); final String[] keyValues = string.split(stringDelimiter, -1); for (String s : keyValues) { String[] keyValueArray = s.split(keyValueDelimiter, 2); @@ -7567,7 +7639,7 @@ private static int rfind(String string, String delim, int start) { /** Support the SLICE function. */ public static List slice(List list) { - List result = new ArrayList(list.size()); + List<@Nullable Object> result = new ArrayList<>(list.size()); for (Object e : list) { result.add(structAccess(e, 0, null)); } @@ -7788,7 +7860,8 @@ public static String arrayToString(List list, String delimiter, @Nullable String * Variant of {@link #flatList} for outer mode: an empty or {@code NULL} * collection yields one {@code NULL} element rather than no elements. */ - public static Function1, Enumerable<@Nullable Object>> flatListOuter() { + public static Function1<@Nullable List<@Nullable Object>, + Enumerable<@Nullable Object>> flatListOuter() { return inputList -> inputList == null || inputList.isEmpty() ? Linq4j.asEnumerable(SINGLE_NULL) : Linq4j.asEnumerable(inputList) @@ -8193,7 +8266,9 @@ private static class ProductComparableListEnumerator @Override public FlatLists.ComparableList current() { int i = 0; for (Object element : (Object[]) elements) { - Object[] a; + // toArray() yields @Nullable Object[] from the JDK model, and a SQL array may + // hold nulls. https://github.com/uber/NullAway/issues/1728 + @Nullable Object[] a; if (element.getClass().isArray()) { a = (Object[]) element; } else { diff --git a/core/src/main/java/org/apache/calcite/runtime/Utilities.java b/core/src/main/java/org/apache/calcite/runtime/Utilities.java index 3409af722480..148f2acca4f7 100644 --- a/core/src/main/java/org/apache/calcite/runtime/Utilities.java +++ b/core/src/main/java/org/apache/calcite/runtime/Utilities.java @@ -18,7 +18,7 @@ import org.apache.calcite.linq4j.EnumerableDefaults; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.text.Collator; import java.util.Comparator; @@ -220,6 +220,7 @@ public static int compareNullsLast(@Nullable Comparable v0, @Nullable Comparable : v0.compareTo(v1); } + @SuppressWarnings("NullAway") // a SQL comparator orders nulls; Comparator here is raw public static int compare(@Nullable Comparable v0, @Nullable Comparable v1, Comparator comparator) { //noinspection unchecked diff --git a/core/src/main/java/org/apache/calcite/runtime/XmlFunctions.java b/core/src/main/java/org/apache/calcite/runtime/XmlFunctions.java index 00660a1b4643..c3682b58245c 100644 --- a/core/src/main/java/org/apache/calcite/runtime/XmlFunctions.java +++ b/core/src/main/java/org/apache/calcite/runtime/XmlFunctions.java @@ -20,7 +20,7 @@ import org.apache.calcite.util.TryThreadLocal; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; diff --git a/core/src/main/java/org/apache/calcite/runtime/package-info.java b/core/src/main/java/org/apache/calcite/runtime/package-info.java index 6ab59fedc4f6..ef7ccadfb0f3 100644 --- a/core/src/main/java/org/apache/calcite/runtime/package-info.java +++ b/core/src/main/java/org/apache/calcite/runtime/package-info.java @@ -18,11 +18,7 @@ /** * Utilities required at runtime. */ -@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.runtime; -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/runtime/rtti/BasicSqlTypeRtti.java b/core/src/main/java/org/apache/calcite/runtime/rtti/BasicSqlTypeRtti.java index 00aa444a7b91..3a0aad78e4ea 100644 --- a/core/src/main/java/org/apache/calcite/runtime/rtti/BasicSqlTypeRtti.java +++ b/core/src/main/java/org/apache/calcite/runtime/rtti/BasicSqlTypeRtti.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.runtime.rtti; -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/runtime/rtti/GenericSqlTypeRtti.java b/core/src/main/java/org/apache/calcite/runtime/rtti/GenericSqlTypeRtti.java index 7c8893b3a862..89ce364612ae 100644 --- a/core/src/main/java/org/apache/calcite/runtime/rtti/GenericSqlTypeRtti.java +++ b/core/src/main/java/org/apache/calcite/runtime/rtti/GenericSqlTypeRtti.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.runtime.rtti; -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/runtime/rtti/RowSqlTypeRtti.java b/core/src/main/java/org/apache/calcite/runtime/rtti/RowSqlTypeRtti.java index 035c7aeb0294..882207afe869 100644 --- a/core/src/main/java/org/apache/calcite/runtime/rtti/RowSqlTypeRtti.java +++ b/core/src/main/java/org/apache/calcite/runtime/rtti/RowSqlTypeRtti.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.runtime.rtti; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Arrays; import java.util.Map; diff --git a/core/src/main/java/org/apache/calcite/runtime/rtti/RuntimeTypeInformation.java b/core/src/main/java/org/apache/calcite/runtime/rtti/RuntimeTypeInformation.java index 53e7c69301c4..a9187dd9b4d3 100644 --- a/core/src/main/java/org/apache/calcite/runtime/rtti/RuntimeTypeInformation.java +++ b/core/src/main/java/org/apache/calcite/runtime/rtti/RuntimeTypeInformation.java @@ -22,7 +22,7 @@ import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeField; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.AbstractMap; diff --git a/core/src/main/java/org/apache/calcite/runtime/rtti/package-info.java b/core/src/main/java/org/apache/calcite/runtime/rtti/package-info.java index 548b4ba62452..b15646d8d6f7 100644 --- a/core/src/main/java/org/apache/calcite/runtime/rtti/package-info.java +++ b/core/src/main/java/org/apache/calcite/runtime/rtti/package-info.java @@ -18,4 +18,7 @@ /** * Support for runtime type information. */ +@NullMarked package org.apache.calcite.runtime.rtti; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/runtime/variant/VariantNonNull.java b/core/src/main/java/org/apache/calcite/runtime/variant/VariantNonNull.java index 9c288e3058cc..d022cad04563 100644 --- a/core/src/main/java/org/apache/calcite/runtime/variant/VariantNonNull.java +++ b/core/src/main/java/org/apache/calcite/runtime/variant/VariantNonNull.java @@ -23,11 +23,11 @@ import org.apache.calcite.runtime.rtti.RowSqlTypeRtti; import org.apache.calcite.runtime.rtti.RuntimeTypeInformation; -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.math.BigDecimal; import java.math.BigInteger; diff --git a/core/src/main/java/org/apache/calcite/runtime/variant/VariantNull.java b/core/src/main/java/org/apache/calcite/runtime/variant/VariantNull.java index a11dbbed6a57..aeba450775b1 100644 --- a/core/src/main/java/org/apache/calcite/runtime/variant/VariantNull.java +++ b/core/src/main/java/org/apache/calcite/runtime/variant/VariantNull.java @@ -18,7 +18,7 @@ import org.apache.calcite.runtime.rtti.RuntimeTypeInformation; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** The VARIANT type has its own notion of null, which is * different from the SQL NULL value. For example, two variant nulls are equal diff --git a/core/src/main/java/org/apache/calcite/runtime/variant/VariantSqlNull.java b/core/src/main/java/org/apache/calcite/runtime/variant/VariantSqlNull.java index 85d424461dc3..4e04bd0a7b9e 100644 --- a/core/src/main/java/org/apache/calcite/runtime/variant/VariantSqlNull.java +++ b/core/src/main/java/org/apache/calcite/runtime/variant/VariantSqlNull.java @@ -18,7 +18,7 @@ import org.apache.calcite.runtime.rtti.RuntimeTypeInformation; -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/runtime/variant/VariantSqlValue.java b/core/src/main/java/org/apache/calcite/runtime/variant/VariantSqlValue.java index 36dc86a26da1..7e02f73d380d 100644 --- a/core/src/main/java/org/apache/calcite/runtime/variant/VariantSqlValue.java +++ b/core/src/main/java/org/apache/calcite/runtime/variant/VariantSqlValue.java @@ -18,7 +18,7 @@ import org.apache.calcite.runtime.rtti.RuntimeTypeInformation; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.RoundingMode; diff --git a/core/src/main/java/org/apache/calcite/runtime/variant/VariantValue.java b/core/src/main/java/org/apache/calcite/runtime/variant/VariantValue.java index 483b34db668b..247c0f9f5c86 100644 --- a/core/src/main/java/org/apache/calcite/runtime/variant/VariantValue.java +++ b/core/src/main/java/org/apache/calcite/runtime/variant/VariantValue.java @@ -18,7 +18,7 @@ import org.apache.calcite.runtime.rtti.RuntimeTypeInformation; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** Base class for the runtime support for values of the VARIANT SQL type. */ public abstract class VariantValue { diff --git a/core/src/main/java/org/apache/calcite/runtime/variant/package-info.java b/core/src/main/java/org/apache/calcite/runtime/variant/package-info.java index f8910457bf72..ccf09f4dd9e2 100644 --- a/core/src/main/java/org/apache/calcite/runtime/variant/package-info.java +++ b/core/src/main/java/org/apache/calcite/runtime/variant/package-info.java @@ -18,4 +18,7 @@ /** * Runtime support for values of the VARIANT data type. */ +@NullMarked package org.apache.calcite.runtime.variant; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/schema/FilterableTable.java b/core/src/main/java/org/apache/calcite/schema/FilterableTable.java index 718fcdba84b0..dc693455eb87 100644 --- a/core/src/main/java/org/apache/calcite/schema/FilterableTable.java +++ b/core/src/main/java/org/apache/calcite/schema/FilterableTable.java @@ -20,7 +20,7 @@ import org.apache.calcite.linq4j.Enumerable; 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/schema/FunctionContext.java b/core/src/main/java/org/apache/calcite/schema/FunctionContext.java index 172e2e9c0125..a949b1c1f46f 100644 --- a/core/src/main/java/org/apache/calcite/schema/FunctionContext.java +++ b/core/src/main/java/org/apache/calcite/schema/FunctionContext.java @@ -19,7 +19,7 @@ import org.apache.calcite.linq4j.function.Experimental; import org.apache.calcite.rel.type.RelDataTypeFactory; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Information about a function call that is passed to the constructor of a diff --git a/core/src/main/java/org/apache/calcite/schema/ModifiableTable.java b/core/src/main/java/org/apache/calcite/schema/ModifiableTable.java index 3b49b54805a9..de7c5ebe5c31 100644 --- a/core/src/main/java/org/apache/calcite/schema/ModifiableTable.java +++ b/core/src/main/java/org/apache/calcite/schema/ModifiableTable.java @@ -23,7 +23,7 @@ import org.apache.calcite.rel.core.TableModify; import org.apache.calcite.rex.RexNode; -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/schema/ProjectableFilterableTable.java b/core/src/main/java/org/apache/calcite/schema/ProjectableFilterableTable.java index fa8fab08f3af..f20981531853 100644 --- a/core/src/main/java/org/apache/calcite/schema/ProjectableFilterableTable.java +++ b/core/src/main/java/org/apache/calcite/schema/ProjectableFilterableTable.java @@ -20,7 +20,7 @@ import org.apache.calcite.linq4j.Enumerable; 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/schema/ScannableTable.java b/core/src/main/java/org/apache/calcite/schema/ScannableTable.java index 31b3c6896c88..2b95ca6ca6a6 100644 --- a/core/src/main/java/org/apache/calcite/schema/ScannableTable.java +++ b/core/src/main/java/org/apache/calcite/schema/ScannableTable.java @@ -19,7 +19,7 @@ import org.apache.calcite.DataContext; import org.apache.calcite.linq4j.Enumerable; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Table that can be scanned without creating an intermediate relational diff --git a/core/src/main/java/org/apache/calcite/schema/Schema.java b/core/src/main/java/org/apache/calcite/schema/Schema.java index 13f3fdb90715..af844a93908a 100644 --- a/core/src/main/java/org/apache/calcite/schema/Schema.java +++ b/core/src/main/java/org/apache/calcite/schema/Schema.java @@ -22,7 +22,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.Set; diff --git a/core/src/main/java/org/apache/calcite/schema/SchemaPlus.java b/core/src/main/java/org/apache/calcite/schema/SchemaPlus.java index c27edf09f0ef..df4bb66fa800 100644 --- a/core/src/main/java/org/apache/calcite/schema/SchemaPlus.java +++ b/core/src/main/java/org/apache/calcite/schema/SchemaPlus.java @@ -22,7 +22,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Extension to the {@link Schema} interface. @@ -93,7 +93,7 @@ default boolean removeTable(String name) { @Override boolean isMutable(); /** Returns an underlying object. */ - @Nullable T unwrap(Class clazz); + @Nullable T unwrap(Class clazz); void setPath(ImmutableList> path); diff --git a/core/src/main/java/org/apache/calcite/schema/Schemas.java b/core/src/main/java/org/apache/calcite/schema/Schemas.java index 8abff8dd8af0..edd8ed2867c4 100644 --- a/core/src/main/java/org/apache/calcite/schema/Schemas.java +++ b/core/src/main/java/org/apache/calcite/schema/Schemas.java @@ -47,7 +47,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.Connection; diff --git a/core/src/main/java/org/apache/calcite/schema/Statistic.java b/core/src/main/java/org/apache/calcite/schema/Statistic.java index 7d494f28358d..696e5bf4223c 100644 --- a/core/src/main/java/org/apache/calcite/schema/Statistic.java +++ b/core/src/main/java/org/apache/calcite/schema/Statistic.java @@ -21,7 +21,7 @@ import org.apache.calcite.rel.RelReferentialConstraint; 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/schema/Statistics.java b/core/src/main/java/org/apache/calcite/schema/Statistics.java index 85de175989e5..4d43345ac7d7 100644 --- a/core/src/main/java/org/apache/calcite/schema/Statistics.java +++ b/core/src/main/java/org/apache/calcite/schema/Statistics.java @@ -22,7 +22,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/schema/Table.java b/core/src/main/java/org/apache/calcite/schema/Table.java index bd422ff027f6..274992999a77 100644 --- a/core/src/main/java/org/apache/calcite/schema/Table.java +++ b/core/src/main/java/org/apache/calcite/schema/Table.java @@ -22,7 +22,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlNode; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Table. diff --git a/core/src/main/java/org/apache/calcite/schema/TableFactory.java b/core/src/main/java/org/apache/calcite/schema/TableFactory.java index 011cd63498a6..9676c2e05390 100644 --- a/core/src/main/java/org/apache/calcite/schema/TableFactory.java +++ b/core/src/main/java/org/apache/calcite/schema/TableFactory.java @@ -18,7 +18,7 @@ import org.apache.calcite.rel.type.RelDataType; -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/schema/TableFunction.java b/core/src/main/java/org/apache/calcite/schema/TableFunction.java index 495224ea4dc4..461d757b2cb1 100644 --- a/core/src/main/java/org/apache/calcite/schema/TableFunction.java +++ b/core/src/main/java/org/apache/calcite/schema/TableFunction.java @@ -19,7 +19,7 @@ import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeFactory; -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/schema/TableMacro.java b/core/src/main/java/org/apache/calcite/schema/TableMacro.java index 84c3c0b697ad..2eb929deb708 100644 --- a/core/src/main/java/org/apache/calcite/schema/TableMacro.java +++ b/core/src/main/java/org/apache/calcite/schema/TableMacro.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.schema; -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/schema/Wrapper.java b/core/src/main/java/org/apache/calcite/schema/Wrapper.java index 4b1bff4a3f18..29cf90ba2997 100644 --- a/core/src/main/java/org/apache/calcite/schema/Wrapper.java +++ b/core/src/main/java/org/apache/calcite/schema/Wrapper.java @@ -17,7 +17,7 @@ package org.apache.calcite.schema; import org.apiguardian.api.API; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Optional; @@ -29,13 +29,13 @@ public interface Wrapper { /** Finds an instance of an interface implemented by this object, * or returns null if this object does not support that interface. */ - @Nullable C unwrap(Class aClass); + @Nullable C unwrap(Class aClass); /** Finds an instance of an interface implemented by this object, * or throws NullPointerException if this object does not support * that interface. */ @API(since = "1.27", status = API.Status.INTERNAL) - default C unwrapOrThrow(Class aClass) { + default C unwrapOrThrow(Class aClass) { return requireNonNull(unwrap(aClass), () -> "Can't unwrap " + aClass + " from " + this); } @@ -44,7 +44,7 @@ default C unwrapOrThrow(Class aClass) { * or returns {@link Optional#empty()} if this object does not support * that interface. */ @API(since = "1.27", status = API.Status.INTERNAL) - default Optional maybeUnwrap(Class aClass) { + default Optional maybeUnwrap(Class aClass) { return Optional.ofNullable(unwrap(aClass)); } } diff --git a/core/src/main/java/org/apache/calcite/schema/impl/AbstractSchema.java b/core/src/main/java/org/apache/calcite/schema/impl/AbstractSchema.java index 3b8f9d6a74c8..da1feef7f29f 100644 --- a/core/src/main/java/org/apache/calcite/schema/impl/AbstractSchema.java +++ b/core/src/main/java/org/apache/calcite/schema/impl/AbstractSchema.java @@ -33,7 +33,7 @@ import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Multimap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Collection; import java.util.Map; diff --git a/core/src/main/java/org/apache/calcite/schema/impl/AbstractTable.java b/core/src/main/java/org/apache/calcite/schema/impl/AbstractTable.java index 7f7d7b0ae92c..493afc10e4ed 100644 --- a/core/src/main/java/org/apache/calcite/schema/impl/AbstractTable.java +++ b/core/src/main/java/org/apache/calcite/schema/impl/AbstractTable.java @@ -25,7 +25,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlNode; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Abstract base class for implementing {@link Table}. @@ -48,7 +48,7 @@ protected AbstractTable() { return Schema.TableType.TABLE; } - @Override public @Nullable C unwrap(Class aClass) { + @Override public @Nullable C unwrap(Class aClass) { if (aClass.isInstance(this)) { return aClass.cast(this); } diff --git a/core/src/main/java/org/apache/calcite/schema/impl/AggregateFunctionImpl.java b/core/src/main/java/org/apache/calcite/schema/impl/AggregateFunctionImpl.java index e0a37fa86def..abf0e6a98a2c 100644 --- a/core/src/main/java/org/apache/calcite/schema/impl/AggregateFunctionImpl.java +++ b/core/src/main/java/org/apache/calcite/schema/impl/AggregateFunctionImpl.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.lang.reflect.Method; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/schema/impl/DelegatingSchema.java b/core/src/main/java/org/apache/calcite/schema/impl/DelegatingSchema.java index 55bfb8b7bf87..c5490dcbb554 100644 --- a/core/src/main/java/org/apache/calcite/schema/impl/DelegatingSchema.java +++ b/core/src/main/java/org/apache/calcite/schema/impl/DelegatingSchema.java @@ -26,7 +26,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.Set; diff --git a/core/src/main/java/org/apache/calcite/schema/impl/ListTransientTable.java b/core/src/main/java/org/apache/calcite/schema/impl/ListTransientTable.java index f04c9372b7a0..27da0d6d3a63 100644 --- a/core/src/main/java/org/apache/calcite/schema/impl/ListTransientTable.java +++ b/core/src/main/java/org/apache/calcite/schema/impl/ListTransientTable.java @@ -41,7 +41,7 @@ import org.apache.calcite.schema.Schemas; import org.apache.calcite.schema.TransientTable; -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/schema/impl/LongSchemaVersion.java b/core/src/main/java/org/apache/calcite/schema/impl/LongSchemaVersion.java index dc60dacbe6e0..f17e728a089c 100644 --- a/core/src/main/java/org/apache/calcite/schema/impl/LongSchemaVersion.java +++ b/core/src/main/java/org/apache/calcite/schema/impl/LongSchemaVersion.java @@ -18,7 +18,7 @@ import org.apache.calcite.schema.SchemaVersion; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** Implementation of SchemaVersion that uses a long value as representation. */ public class LongSchemaVersion implements SchemaVersion { diff --git a/core/src/main/java/org/apache/calcite/schema/impl/MaterializedViewTable.java b/core/src/main/java/org/apache/calcite/schema/impl/MaterializedViewTable.java index 125693ee9a8f..b686b494c309 100644 --- a/core/src/main/java/org/apache/calcite/schema/impl/MaterializedViewTable.java +++ b/core/src/main/java/org/apache/calcite/schema/impl/MaterializedViewTable.java @@ -30,7 +30,7 @@ import org.apache.calcite.schema.Table; import org.apache.calcite.schema.TranslatableTable; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.sql.DriverManager; diff --git a/core/src/main/java/org/apache/calcite/schema/impl/ModifiableViewTable.java b/core/src/main/java/org/apache/calcite/schema/impl/ModifiableViewTable.java index aee998c0eb36..d72d45c18ac8 100644 --- a/core/src/main/java/org/apache/calcite/schema/impl/ModifiableViewTable.java +++ b/core/src/main/java/org/apache/calcite/schema/impl/ModifiableViewTable.java @@ -40,7 +40,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; @@ -91,7 +91,7 @@ public ModifiableViewTable(Type elementType, RelProtoDataType rowType, return tablePath; } - @Override public @Nullable C unwrap(Class aClass) { + @Override public @Nullable C unwrap(Class aClass) { if (aClass.isInstance(initializerExpressionFactory)) { return aClass.cast(initializerExpressionFactory); } else if (aClass.isInstance(table)) { diff --git a/core/src/main/java/org/apache/calcite/schema/impl/ReflectiveFunctionBase.java b/core/src/main/java/org/apache/calcite/schema/impl/ReflectiveFunctionBase.java index c6dd6d7fe491..b265a0c106d3 100644 --- a/core/src/main/java/org/apache/calcite/schema/impl/ReflectiveFunctionBase.java +++ b/core/src/main/java/org/apache/calcite/schema/impl/ReflectiveFunctionBase.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.lang.reflect.Constructor; import java.lang.reflect.Method; diff --git a/core/src/main/java/org/apache/calcite/schema/impl/ScalarFunctionImpl.java b/core/src/main/java/org/apache/calcite/schema/impl/ScalarFunctionImpl.java index 1559a5c3918d..674b4232fbbb 100644 --- a/core/src/main/java/org/apache/calcite/schema/impl/ScalarFunctionImpl.java +++ b/core/src/main/java/org/apache/calcite/schema/impl/ScalarFunctionImpl.java @@ -32,7 +32,7 @@ import com.google.common.collect.ImmutableMultimap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Method; diff --git a/core/src/main/java/org/apache/calcite/schema/impl/StarTable.java b/core/src/main/java/org/apache/calcite/schema/impl/StarTable.java index e8dad3b66269..0e7592278474 100644 --- a/core/src/main/java/org/apache/calcite/schema/impl/StarTable.java +++ b/core/src/main/java/org/apache/calcite/schema/impl/StarTable.java @@ -16,6 +16,7 @@ */ package org.apache.calcite.schema.impl; +import org.apache.calcite.linq4j.annotations.MonotonicNonNull; import org.apache.calcite.materialize.Lattice; import org.apache.calcite.plan.Convention; import org.apache.calcite.plan.RelOptCluster; @@ -36,8 +37,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.MonotonicNonNull; -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/schema/impl/TableFunctionImpl.java b/core/src/main/java/org/apache/calcite/schema/impl/TableFunctionImpl.java index 8d510093b084..288995ae1a94 100644 --- a/core/src/main/java/org/apache/calcite/schema/impl/TableFunctionImpl.java +++ b/core/src/main/java/org/apache/calcite/schema/impl/TableFunctionImpl.java @@ -34,7 +34,7 @@ import org.apache.calcite.schema.TableFunction; import org.apache.calcite.util.BuiltInMethod; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; diff --git a/core/src/main/java/org/apache/calcite/schema/impl/TableMacroImpl.java b/core/src/main/java/org/apache/calcite/schema/impl/TableMacroImpl.java index 527ff288c9bb..b65a8a6289e6 100644 --- a/core/src/main/java/org/apache/calcite/schema/impl/TableMacroImpl.java +++ b/core/src/main/java/org/apache/calcite/schema/impl/TableMacroImpl.java @@ -19,7 +19,7 @@ import org.apache.calcite.schema.TableMacro; import org.apache.calcite.schema.TranslatableTable; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; diff --git a/core/src/main/java/org/apache/calcite/schema/impl/ViewTable.java b/core/src/main/java/org/apache/calcite/schema/impl/ViewTable.java index 2f683520d863..a2683f4b2486 100644 --- a/core/src/main/java/org/apache/calcite/schema/impl/ViewTable.java +++ b/core/src/main/java/org/apache/calcite/schema/impl/ViewTable.java @@ -35,7 +35,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.List; diff --git a/core/src/main/java/org/apache/calcite/schema/impl/ViewTableMacro.java b/core/src/main/java/org/apache/calcite/schema/impl/ViewTableMacro.java index 6fdf2a9654ea..45f7a4abb455 100644 --- a/core/src/main/java/org/apache/calcite/schema/impl/ViewTableMacro.java +++ b/core/src/main/java/org/apache/calcite/schema/impl/ViewTableMacro.java @@ -28,7 +28,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.Collections; diff --git a/core/src/main/java/org/apache/calcite/schema/impl/package-info.java b/core/src/main/java/org/apache/calcite/schema/impl/package-info.java index d8bf0bd9e59c..a819e808a138 100644 --- a/core/src/main/java/org/apache/calcite/schema/impl/package-info.java +++ b/core/src/main/java/org/apache/calcite/schema/impl/package-info.java @@ -18,4 +18,7 @@ /** * Utilities to help implement Calcite's SPIs. */ +@NullMarked package org.apache.calcite.schema.impl; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/schema/lookup/CompatibilityLookup.java b/core/src/main/java/org/apache/calcite/schema/lookup/CompatibilityLookup.java index 6ab340e9af30..23b868873bc0 100644 --- a/core/src/main/java/org/apache/calcite/schema/lookup/CompatibilityLookup.java +++ b/core/src/main/java/org/apache/calcite/schema/lookup/CompatibilityLookup.java @@ -18,7 +18,7 @@ import org.apache.calcite.linq4j.function.Predicate1; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Set; import java.util.function.Function; diff --git a/core/src/main/java/org/apache/calcite/schema/lookup/ConcatLookup.java b/core/src/main/java/org/apache/calcite/schema/lookup/ConcatLookup.java index cb09d2342fd7..465553a12d18 100644 --- a/core/src/main/java/org/apache/calcite/schema/lookup/ConcatLookup.java +++ b/core/src/main/java/org/apache/calcite/schema/lookup/ConcatLookup.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.schema.lookup; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Set; import java.util.stream.Collectors; diff --git a/core/src/main/java/org/apache/calcite/schema/lookup/EmptyLookup.java b/core/src/main/java/org/apache/calcite/schema/lookup/EmptyLookup.java index 0730a7856abf..1b480e0070f4 100644 --- a/core/src/main/java/org/apache/calcite/schema/lookup/EmptyLookup.java +++ b/core/src/main/java/org/apache/calcite/schema/lookup/EmptyLookup.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.util.Set; diff --git a/core/src/main/java/org/apache/calcite/schema/lookup/IgnoreCaseLookup.java b/core/src/main/java/org/apache/calcite/schema/lookup/IgnoreCaseLookup.java index a22e7accfce3..9d8d7243f6fd 100644 --- a/core/src/main/java/org/apache/calcite/schema/lookup/IgnoreCaseLookup.java +++ b/core/src/main/java/org/apache/calcite/schema/lookup/IgnoreCaseLookup.java @@ -19,7 +19,7 @@ import org.apache.calcite.util.LazyReference; import org.apache.calcite.util.NameMap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Map; import java.util.Set; diff --git a/core/src/main/java/org/apache/calcite/schema/lookup/LoadingCacheLookup.java b/core/src/main/java/org/apache/calcite/schema/lookup/LoadingCacheLookup.java index 8f8adaa5cb69..2772d4664602 100644 --- a/core/src/main/java/org/apache/calcite/schema/lookup/LoadingCacheLookup.java +++ b/core/src/main/java/org/apache/calcite/schema/lookup/LoadingCacheLookup.java @@ -21,7 +21,7 @@ import com.google.common.cache.LoadingCache; import com.google.common.util.concurrent.UncheckedExecutionException; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.time.Duration; import java.util.Set; diff --git a/core/src/main/java/org/apache/calcite/schema/lookup/Lookup.java b/core/src/main/java/org/apache/calcite/schema/lookup/Lookup.java index 40b42dab6db4..f98d99490f63 100644 --- a/core/src/main/java/org/apache/calcite/schema/lookup/Lookup.java +++ b/core/src/main/java/org/apache/calcite/schema/lookup/Lookup.java @@ -18,7 +18,7 @@ import org.apache.calcite.util.NameMap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Set; import java.util.function.BiFunction; diff --git a/core/src/main/java/org/apache/calcite/schema/lookup/NameMapLookup.java b/core/src/main/java/org/apache/calcite/schema/lookup/NameMapLookup.java index 7231eea6696b..3be365529e96 100644 --- a/core/src/main/java/org/apache/calcite/schema/lookup/NameMapLookup.java +++ b/core/src/main/java/org/apache/calcite/schema/lookup/NameMapLookup.java @@ -19,7 +19,7 @@ import org.apache.calcite.linq4j.function.Predicate1; import org.apache.calcite.util.NameMap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Map; import java.util.Set; diff --git a/core/src/main/java/org/apache/calcite/schema/lookup/Named.java b/core/src/main/java/org/apache/calcite/schema/lookup/Named.java index ec9c672f2fa0..544224a3cacd 100644 --- a/core/src/main/java/org/apache/calcite/schema/lookup/Named.java +++ b/core/src/main/java/org/apache/calcite/schema/lookup/Named.java @@ -16,8 +16,8 @@ */ package org.apache.calcite.schema.lookup; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import static java.util.Objects.requireNonNull; diff --git a/core/src/main/java/org/apache/calcite/schema/lookup/SnapshotLookup.java b/core/src/main/java/org/apache/calcite/schema/lookup/SnapshotLookup.java index 9f89cfa8903c..5823a4d1d3c0 100644 --- a/core/src/main/java/org/apache/calcite/schema/lookup/SnapshotLookup.java +++ b/core/src/main/java/org/apache/calcite/schema/lookup/SnapshotLookup.java @@ -19,7 +19,7 @@ import org.apache.calcite.util.LazyReference; import org.apache.calcite.util.NameMap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Set; diff --git a/core/src/main/java/org/apache/calcite/schema/lookup/TransformingLookup.java b/core/src/main/java/org/apache/calcite/schema/lookup/TransformingLookup.java index 384b53e5d983..83191aeee772 100644 --- a/core/src/main/java/org/apache/calcite/schema/lookup/TransformingLookup.java +++ b/core/src/main/java/org/apache/calcite/schema/lookup/TransformingLookup.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.schema.lookup; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Set; import java.util.function.BiFunction; diff --git a/core/src/main/java/org/apache/calcite/schema/lookup/package-info.java b/core/src/main/java/org/apache/calcite/schema/lookup/package-info.java index edd5b38d382b..e440267e0572 100644 --- a/core/src/main/java/org/apache/calcite/schema/lookup/package-info.java +++ b/core/src/main/java/org/apache/calcite/schema/lookup/package-info.java @@ -21,11 +21,7 @@ *

    The interfaces and classes in this package are used to lookup * tables and subschemas within a schema. */ -@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.schema.lookup; -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/schema/package-info.java b/core/src/main/java/org/apache/calcite/schema/package-info.java index e6eccdc15910..5d34c0cef87e 100644 --- a/core/src/main/java/org/apache/calcite/schema/package-info.java +++ b/core/src/main/java/org/apache/calcite/schema/package-info.java @@ -22,11 +22,7 @@ * SQL validator to validate SQL abstract syntax trees and resolve * identifiers to objects. */ -@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.schema; -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/server/CalciteServerStatement.java b/core/src/main/java/org/apache/calcite/server/CalciteServerStatement.java index 91e6f0865340..439d307527b3 100644 --- a/core/src/main/java/org/apache/calcite/server/CalciteServerStatement.java +++ b/core/src/main/java/org/apache/calcite/server/CalciteServerStatement.java @@ -20,7 +20,7 @@ import org.apache.calcite.jdbc.CalciteConnection; import org.apache.calcite.jdbc.CalcitePrepare; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Iterator; diff --git a/core/src/main/java/org/apache/calcite/server/DdlExecutorImpl.java b/core/src/main/java/org/apache/calcite/server/DdlExecutorImpl.java index 914b98f27b2a..0b35d45b219e 100644 --- a/core/src/main/java/org/apache/calcite/server/DdlExecutorImpl.java +++ b/core/src/main/java/org/apache/calcite/server/DdlExecutorImpl.java @@ -31,7 +31,7 @@ protected DdlExecutorImpl() { /** Dispatches calls to the appropriate method based on the type of the * first argument. */ - @SuppressWarnings({"method.invocation.invalid", "argument.type.incompatible"}) + @SuppressWarnings("NullAway") private final ReflectUtil.MethodDispatcher dispatcher = ReflectUtil.createMethodDispatcher(void.class, this, "execute", SqlNode.class, CalcitePrepare.Context.class); diff --git a/core/src/main/java/org/apache/calcite/server/package-info.java b/core/src/main/java/org/apache/calcite/server/package-info.java index 1d9a89498818..3b89aa4e14aa 100644 --- a/core/src/main/java/org/apache/calcite/server/package-info.java +++ b/core/src/main/java/org/apache/calcite/server/package-info.java @@ -18,11 +18,7 @@ /** * Provides a server for hosting Calcite connections. */ -@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.server; -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/sql/ExplicitOperatorBinding.java b/core/src/main/java/org/apache/calcite/sql/ExplicitOperatorBinding.java index c66730f354a9..431e527a7ea6 100644 --- a/core/src/main/java/org/apache/calcite/sql/ExplicitOperatorBinding.java +++ b/core/src/main/java/org/apache/calcite/sql/ExplicitOperatorBinding.java @@ -23,7 +23,7 @@ import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.sql.validate.SqlValidatorException; -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/sql/SqlAggFunction.java b/core/src/main/java/org/apache/calcite/sql/SqlAggFunction.java index 609bfee6d517..913eb69497f5 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlAggFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlAggFunction.java @@ -29,7 +29,7 @@ import org.apache.calcite.util.Optionality; import org.apache.calcite.util.Static; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -119,7 +119,7 @@ protected SqlAggFunction( //~ Methods ---------------------------------------------------------------- - @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/sql/SqlAlter.java b/core/src/main/java/org/apache/calcite/sql/SqlAlter.java index e7f232bbc245..dd31eb527488 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlAlter.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlAlter.java @@ -18,7 +18,7 @@ import org.apache.calcite.sql.parser.SqlParserPos; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Base class for an ALTER statements parse tree nodes. The portion of the diff --git a/core/src/main/java/org/apache/calcite/sql/SqlAsOperator.java b/core/src/main/java/org/apache/calcite/sql/SqlAsOperator.java index 0bf30013144c..6cf9fe60802d 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlAsOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlAsOperator.java @@ -30,6 +30,8 @@ import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.util.Util; +import org.jspecify.annotations.Nullable; + import java.util.List; import static org.apache.calcite.util.Static.RESOURCE; @@ -119,7 +121,7 @@ protected SqlAsOperator(String name, SqlKind kind, int prec, } } - @Override public void acceptCall( + @Override public void acceptCall( SqlVisitor visitor, SqlCall call, boolean onlyExpressions, diff --git a/core/src/main/java/org/apache/calcite/sql/SqlAsofJoin.java b/core/src/main/java/org/apache/calcite/sql/SqlAsofJoin.java index 14f9723d37d8..5321026824e0 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlAsofJoin.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlAsofJoin.java @@ -21,7 +21,7 @@ import org.apache.calcite.util.ImmutableNullableList; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.function.UnaryOperator; @@ -43,7 +43,7 @@ public SqlAsofJoin(SqlParserPos pos, SqlNode left, SqlLiteral natural, this.matchCondition = matchCondition; } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public List getOperandList() { return ImmutableNullableList.of(left, natural, joinType, right, conditionType, condition, matchCondition); @@ -53,7 +53,7 @@ public SqlAsofJoin(SqlParserPos pos, SqlNode left, SqlLiteral natural, return ASOF_OPERATOR; } - @SuppressWarnings("assignment.type.incompatible") + @SuppressWarnings("NullAway") @Override public void setOperand(int i, @Nullable SqlNode operand) { switch (i) { case 0: @@ -107,7 +107,7 @@ private SqlAsofJoinOperator(String name, int prec) { return SqlSyntax.SPECIAL; } - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") @Override public SqlCall createCall( @Nullable SqlLiteral functionQualifier, SqlParserPos pos, diff --git a/core/src/main/java/org/apache/calcite/sql/SqlBasicCall.java b/core/src/main/java/org/apache/calcite/sql/SqlBasicCall.java index 8279924af1a0..8a7c6fc9ca61 100755 --- a/core/src/main/java/org/apache/calcite/sql/SqlBasicCall.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlBasicCall.java @@ -19,7 +19,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; @@ -110,7 +110,7 @@ public void setOperator(SqlOperator operator) { return operator; } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public List getOperandList() { return operandList; } @@ -134,13 +134,13 @@ public void setOperator(SqlOperator operator) { /** Sets the {@code i}th element of {@code list} to value {@code e}, creating * an immutable copy of the list. */ - private static List<@Nullable E> set(List list, int i, @Nullable E e) { + private static List<@Nullable E> set(List<@Nullable E> list, int i, @Nullable E e) { if (i == 0 && list.size() == 1) { // short-cut case where the contents of the previous list can be ignored return ImmutableNullableList.of(e); } //noinspection unchecked - @Nullable E[] objects = (E[]) list.toArray(); + @Nullable E[] objects = (@Nullable E[]) list.toArray(); objects[i] = e; return ImmutableNullableList.copyOf(objects); } diff --git a/core/src/main/java/org/apache/calcite/sql/SqlBasicFunction.java b/core/src/main/java/org/apache/calcite/sql/SqlBasicFunction.java index fa511d447685..fa677b26d5a1 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlBasicFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlBasicFunction.java @@ -25,7 +25,7 @@ import org.apache.calcite.sql.validate.SqlValidator; import org.apache.calcite.sql.validate.SqlValidatorScope; -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/sql/SqlBasicTypeNameSpec.java b/core/src/main/java/org/apache/calcite/sql/SqlBasicTypeNameSpec.java index 7213352e6dc9..dc51fad5253a 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlBasicTypeNameSpec.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlBasicTypeNameSpec.java @@ -24,7 +24,7 @@ import org.apache.calcite.sql.validate.SqlValidator; import org.apache.calcite.util.Litmus; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.nio.charset.Charset; import java.util.Objects; diff --git a/core/src/main/java/org/apache/calcite/sql/SqlBinaryOperator.java b/core/src/main/java/org/apache/calcite/sql/SqlBinaryOperator.java index 514c61fe099d..34b1cb7cf928 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlBinaryOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlBinaryOperator.java @@ -28,7 +28,7 @@ import org.apache.calcite.util.Litmus; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.nio.charset.Charset; @@ -166,7 +166,7 @@ private RelDataType convertType(SqlValidator validator, SqlCall call, RelDataTyp validator.getTypeFactory() .createTypeWithCharsetAndCollation( type, - type.getCharset(), + requireNonNull(type.getCharset(), "charset"), requireNonNull(resultCol, "resultCol")); } } diff --git a/core/src/main/java/org/apache/calcite/sql/SqlByRewriter.java b/core/src/main/java/org/apache/calcite/sql/SqlByRewriter.java index b8d6cc910e2e..45b587365155 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlByRewriter.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlByRewriter.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.sql; -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/sql/SqlCall.java b/core/src/main/java/org/apache/calcite/sql/SqlCall.java index 1747272f621a..701ad8761a87 100755 --- a/core/src/main/java/org/apache/calcite/sql/SqlCall.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlCall.java @@ -27,15 +27,12 @@ import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.util.Litmus; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import static org.apache.calcite.linq4j.Nullness.castNonNull; - import static java.util.Objects.requireNonNull; /** @@ -76,7 +73,6 @@ public void setOperand(int i, @Nullable SqlNode operand) { return getOperator().getKind(); } - @Pure public abstract SqlOperator getOperator(); /** @@ -105,7 +101,7 @@ public void setOperand(int i, @Nullable SqlNode operand) { public S operand(int i) { // Note: in general, null elements exist in the list, however, the code // assumes operand(..) is non-nullable, so we add a cast here - return (S) castNonNull(getOperandList().get(i)); + return (S) getOperandList().get(i); } public int operandCount() { @@ -172,7 +168,7 @@ private boolean needsParentheses(SqlWriter writer, int leftPrec, int rightPrec) // no valid options } - @Override public R accept(SqlVisitor visitor) { + @Override public R accept(SqlVisitor visitor) { return visitor.visit(this); } @@ -245,7 +241,6 @@ && operandCount() == 1) { return false; } - @Pure public @Nullable SqlLiteral getFunctionQuantifier() { return null; } diff --git a/core/src/main/java/org/apache/calcite/sql/SqlCallBinding.java b/core/src/main/java/org/apache/calcite/sql/SqlCallBinding.java index 95e403901ce7..1346ba0e46bb 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlCallBinding.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlCallBinding.java @@ -44,7 +44,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.ArrayList; @@ -272,13 +272,13 @@ public SqlCall permutedCall() { throw new AssertionError(); } - @Override public @Nullable T getOperandLiteralValue(int ordinal, + @Override public @Nullable T getOperandLiteralValue(int ordinal, Class clazz) { final SqlNode node = operand(ordinal); return valueAs(node, clazz); } - private @Nullable T valueAs(SqlNode node, Class clazz) { + private @Nullable T valueAs(SqlNode node, Class clazz) { final SqlLiteral literal; switch (node.getKind()) { case ARRAY_VALUE_CONSTRUCTOR: diff --git a/core/src/main/java/org/apache/calcite/sql/SqlCharStringLiteral.java b/core/src/main/java/org/apache/calcite/sql/SqlCharStringLiteral.java index 2f720f774b18..205998bc1dcd 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlCharStringLiteral.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlCharStringLiteral.java @@ -22,7 +22,7 @@ import org.apache.calcite.util.NlsString; 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/sql/SqlCollation.java b/core/src/main/java/org/apache/calcite/sql/SqlCollation.java index 5f6e4805f764..26e864f28739 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlCollation.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlCollation.java @@ -28,9 +28,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; -import org.checkerframework.checker.initialization.qual.UnderInitialization; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.Nullable; import java.io.Serializable; import java.nio.charset.Charset; @@ -165,7 +163,6 @@ public SqlCollation( } protected String generateCollationName( - @UnderInitialization SqlCollation this, Charset charset) { return charset.name().toUpperCase(Locale.ROOT) + "$" + String.valueOf(locale) + "$" + strength; } @@ -340,7 +337,6 @@ public final Locale getLocale() { * collation, or {@code null} if no specific {@link Collator} is needed, in * which case {@link String#compareTo} will be used. */ - @Pure @JsonIgnore public @Nullable Collator getCollator() { return null; diff --git a/core/src/main/java/org/apache/calcite/sql/SqlConstantValueAggFunction.java b/core/src/main/java/org/apache/calcite/sql/SqlConstantValueAggFunction.java index 6091e7763695..62f040ca9ca6 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlConstantValueAggFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlConstantValueAggFunction.java @@ -20,7 +20,7 @@ import org.apache.calcite.rex.RexBuilder; import org.apache.calcite.rex.RexNode; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Aggregate function that returns a constant value when applied to constant diff --git a/core/src/main/java/org/apache/calcite/sql/SqlDataTypeSpec.java b/core/src/main/java/org/apache/calcite/sql/SqlDataTypeSpec.java index a1e68becc9a1..d425c5e36749 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlDataTypeSpec.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlDataTypeSpec.java @@ -25,7 +25,7 @@ import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.util.Litmus; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Objects; import java.util.TimeZone; @@ -194,7 +194,7 @@ public SqlDataTypeSpec getComponentTypeSpec() { validator.validateDataType(this); } - @Override public R accept(SqlVisitor visitor) { + @Override public R accept(SqlVisitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/org/apache/calcite/sql/SqlDelete.java b/core/src/main/java/org/apache/calcite/sql/SqlDelete.java index 7b3cf41c5cfe..edec0bae303c 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlDelete.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlDelete.java @@ -22,7 +22,7 @@ import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.util.ImmutableNullableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -33,7 +33,7 @@ public class SqlDelete extends SqlCall { public static final SqlSpecialOperator OPERATOR = new SqlSpecialOperator("DELETE", SqlKind.DELETE) { - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") @Override public SqlCall createCall( @Nullable SqlLiteral functionQualifier, SqlParserPos pos, @@ -77,12 +77,12 @@ public SqlDelete( return OPERATOR; } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public List getOperandList() { return ImmutableNullableList.of(targetTable, condition, sourceSelect, alias); } - @SuppressWarnings("assignment.type.incompatible") + @SuppressWarnings("NullAway") @Override public void setOperand(int i, @Nullable SqlNode operand) { switch (i) { case 0: diff --git a/core/src/main/java/org/apache/calcite/sql/SqlDescribeSchema.java b/core/src/main/java/org/apache/calcite/sql/SqlDescribeSchema.java index bdf2cda65193..80a5930ddf65 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlDescribeSchema.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlDescribeSchema.java @@ -19,7 +19,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; @@ -31,7 +31,7 @@ public class SqlDescribeSchema extends SqlCall { public static final SqlSpecialOperator OPERATOR = new SqlSpecialOperator("DESCRIBE_SCHEMA", SqlKind.DESCRIBE_SCHEMA) { - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") @Override public SqlCall createCall(@Nullable SqlLiteral functionQualifier, SqlParserPos pos, @Nullable SqlNode... operands) { return new SqlDescribeSchema(pos, (SqlIdentifier) operands[0]); @@ -52,7 +52,7 @@ public SqlDescribeSchema(SqlParserPos pos, SqlIdentifier schema) { schema.unparse(writer, leftPrec, rightPrec); } - @SuppressWarnings("assignment.type.incompatible") + @SuppressWarnings("NullAway") @Override public void setOperand(int i, @Nullable SqlNode operand) { switch (i) { case 0: diff --git a/core/src/main/java/org/apache/calcite/sql/SqlDescribeTable.java b/core/src/main/java/org/apache/calcite/sql/SqlDescribeTable.java index b956bebc00dc..07ae6b204b09 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlDescribeTable.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlDescribeTable.java @@ -19,7 +19,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; @@ -33,7 +33,7 @@ public class SqlDescribeTable extends SqlCall { public static final SqlSpecialOperator OPERATOR = new SqlSpecialOperator("DESCRIBE_TABLE", SqlKind.DESCRIBE_TABLE) { - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") @Override public SqlCall createCall(@Nullable SqlLiteral functionQualifier, SqlParserPos pos, @Nullable SqlNode... operands) { return new SqlDescribeTable(pos, (SqlIdentifier) operands[0], @@ -62,7 +62,7 @@ public SqlDescribeTable(SqlParserPos pos, } } - @SuppressWarnings("assignment.type.incompatible") + @SuppressWarnings("NullAway") @Override public void setOperand(int i, @Nullable SqlNode operand) { switch (i) { case 0: @@ -80,7 +80,7 @@ public SqlDescribeTable(SqlParserPos pos, return OPERATOR; } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public List getOperandList() { return ImmutableNullableList.of(table, column); } diff --git a/core/src/main/java/org/apache/calcite/sql/SqlDialect.java b/core/src/main/java/org/apache/calcite/sql/SqlDialect.java index eef1c386d594..f2334f97c436 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlDialect.java @@ -47,8 +47,7 @@ import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableSet; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -737,7 +736,6 @@ public DatabaseProduct getDatabaseProduct() { * Returns whether the dialect supports character set names as part of a * data type, for instance {@code VARCHAR(30) CHARACTER SET `ISO-8859-1`}. */ - @Pure public boolean supportsCharSet() { return true; } @@ -1548,7 +1546,7 @@ public enum DatabaseProduct { @SuppressWarnings("ImmutableEnumChecker") private final Supplier dialect; - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") DatabaseProduct(String databaseProductName, @Nullable String quoteString, NullCollation nullCollation) { requireNonNull(databaseProductName, "databaseProductName"); diff --git a/core/src/main/java/org/apache/calcite/sql/SqlDialectFactoryImpl.java b/core/src/main/java/org/apache/calcite/sql/SqlDialectFactoryImpl.java index 3b8de0d65c0c..0d1f238dafa3 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlDialectFactoryImpl.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlDialectFactoryImpl.java @@ -56,7 +56,7 @@ import org.apache.calcite.sql.dialect.TrinoSqlDialect; import org.apache.calcite.sql.dialect.VerticaSqlDialect; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.sql.DatabaseMetaData; import java.sql.SQLException; diff --git a/core/src/main/java/org/apache/calcite/sql/SqlDynamicParam.java b/core/src/main/java/org/apache/calcite/sql/SqlDynamicParam.java index 76e50c6b3410..a44b3e5b9472 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlDynamicParam.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlDynamicParam.java @@ -23,7 +23,7 @@ import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.util.Litmus; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * A SqlDynamicParam represents a dynamic parameter marker in an @@ -74,7 +74,7 @@ public int getIndex() { return SqlMonotonicity.CONSTANT; } - @Override public R accept(SqlVisitor visitor) { + @Override public R accept(SqlVisitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/org/apache/calcite/sql/SqlExplain.java b/core/src/main/java/org/apache/calcite/sql/SqlExplain.java index d072a6ceacd1..62a6bf79ec9a 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlExplain.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlExplain.java @@ -19,8 +19,7 @@ import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.util.ImmutableNullableList; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -31,7 +30,7 @@ public class SqlExplain extends SqlCall { public static final SqlSpecialOperator OPERATOR = new SqlSpecialOperator("EXPLAIN", SqlKind.EXPLAIN) { - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") @Override public SqlCall createCall(@Nullable SqlLiteral functionQualifier, SqlParserPos pos, @Nullable SqlNode... operands) { return new SqlExplain(pos, operands[0], (SqlLiteral) operands[1], @@ -86,7 +85,7 @@ public SqlExplain(SqlParserPos pos, return ImmutableNullableList.of(explicandum, detailLevel, depth, format); } - @SuppressWarnings("assignment.type.incompatible") + @SuppressWarnings("NullAway") @Override public void setOperand(int i, @Nullable SqlNode operand) { switch (i) { case 0: @@ -109,7 +108,6 @@ public SqlExplain(SqlParserPos pos, /** * Returns the underlying SQL statement to be explained. */ - @Pure public SqlNode getExplicandum() { return explicandum; } @@ -117,7 +115,6 @@ public SqlNode getExplicandum() { /** * Return the detail level to be generated. */ - @Pure public SqlExplainLevel getDetailLevel() { return detailLevel.getValueAs(SqlExplainLevel.class); } @@ -125,7 +122,6 @@ public SqlExplainLevel getDetailLevel() { /** * Returns the level of abstraction at which this plan should be displayed. */ - @Pure public Depth getDepth() { return depth.getValueAs(Depth.class); } @@ -133,7 +129,6 @@ public Depth getDepth() { /** * Returns the number of dynamic parameters in the statement. */ - @Pure public int getDynamicParamCount() { return dynamicParameterCount; } @@ -141,7 +136,6 @@ public int getDynamicParamCount() { /** * Returns whether physical plan implementation should be returned. */ - @Pure public boolean withImplementation() { return getDepth() == Depth.PHYSICAL; } @@ -149,7 +143,6 @@ public boolean withImplementation() { /** * Returns whether type should be returned. */ - @Pure public boolean withType() { return getDepth() == Depth.TYPE; } @@ -157,7 +150,6 @@ public boolean withType() { /** * Returns the desired output format. */ - @Pure public SqlExplainFormat getFormat() { return format.getValueAs(SqlExplainFormat.class); } diff --git a/core/src/main/java/org/apache/calcite/sql/SqlFunction.java b/core/src/main/java/org/apache/calcite/sql/SqlFunction.java index 156150c41940..d6ed2b9d39d8 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlFunction.java @@ -30,8 +30,7 @@ import org.apache.calcite.sql.validate.implicit.TypeCoercion; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -191,7 +190,6 @@ public SqlFunctionCategory getFunctionType() { * ALL quantifier. The default is false; some aggregate * functions return true. */ - @Pure public boolean isQuantifierAllowed() { return false; } diff --git a/core/src/main/java/org/apache/calcite/sql/SqlFunctionalOperator.java b/core/src/main/java/org/apache/calcite/sql/SqlFunctionalOperator.java index 7f7f36ebc477..8273f7a65381 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlFunctionalOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlFunctionalOperator.java @@ -20,7 +20,7 @@ import org.apache.calcite.sql.type.SqlOperandTypeInference; import org.apache.calcite.sql.type.SqlReturnTypeInference; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * SqlFunctionalOperator is a base class for special operators which use diff --git a/core/src/main/java/org/apache/calcite/sql/SqlGroupedWindowFunction.java b/core/src/main/java/org/apache/calcite/sql/SqlGroupedWindowFunction.java index 2a9192595c97..4dfc3fd31918 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlGroupedWindowFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlGroupedWindowFunction.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.List; diff --git a/core/src/main/java/org/apache/calcite/sql/SqlHint.java b/core/src/main/java/org/apache/calcite/sql/SqlHint.java index 8c61828daec9..cb4d5cc51d75 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlHint.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlHint.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 java.util.HashMap; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/sql/SqlIdentifier.java b/core/src/main/java/org/apache/calcite/sql/SqlIdentifier.java index e3214579d3f3..f3bb728683f9 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlIdentifier.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlIdentifier.java @@ -28,8 +28,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -320,11 +319,10 @@ public SqlIdentifier skipLast(int n) { return litmus.succeed(); } - @Override public R accept(SqlVisitor visitor) { + @Override public R accept(SqlVisitor visitor) { return visitor.visit(this); } - @Pure public @Nullable SqlCollation getCollation() { return collation; } diff --git a/core/src/main/java/org/apache/calcite/sql/SqlInfixOperator.java b/core/src/main/java/org/apache/calcite/sql/SqlInfixOperator.java index 49aa1f0f737b..fd5742851cce 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlInfixOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlInfixOperator.java @@ -21,7 +21,7 @@ import org.apache.calcite.sql.type.SqlOperandTypeInference; import org.apache.calcite.sql.type.SqlReturnTypeInference; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * A generalization of a binary operator to involve several (two or more) diff --git a/core/src/main/java/org/apache/calcite/sql/SqlInsert.java b/core/src/main/java/org/apache/calcite/sql/SqlInsert.java index f0d3ba3e55a0..29de324211f3 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlInsert.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlInsert.java @@ -21,8 +21,7 @@ import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.util.ImmutableNullableList; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -35,7 +34,7 @@ public class SqlInsert extends SqlCall { public static final SqlSpecialOperator OPERATOR = new SqlSpecialOperator("INSERT", SqlKind.INSERT) { - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") @Override public SqlCall createCall(@Nullable SqlLiteral functionQualifier, SqlParserPos pos, @Nullable SqlNode... operands) { @@ -77,7 +76,7 @@ public SqlInsert(SqlParserPos pos, return OPERATOR; } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public List getOperandList() { return ImmutableNullableList.of(keywords, targetTable, source, columnList); } @@ -91,7 +90,7 @@ public final boolean isUpsert() { return getModifierNode(SqlInsertKeyword.UPSERT) != null; } - @SuppressWarnings("assignment.type.incompatible") + @SuppressWarnings("NullAway") @Override public void setOperand(int i, @Nullable SqlNode operand) { switch (i) { case 0: @@ -134,7 +133,6 @@ public void setSource(SqlSelect source) { * Returns the list of target column names, or null for all columns in the * target table. */ - @Pure public @Nullable SqlNodeList getTargetColumnList() { return columnList; } diff --git a/core/src/main/java/org/apache/calcite/sql/SqlInternalOperator.java b/core/src/main/java/org/apache/calcite/sql/SqlInternalOperator.java index 70c590650afc..16057a714e8e 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlInternalOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlInternalOperator.java @@ -25,7 +25,7 @@ import org.apache.calcite.sql.validate.SqlValidator; import org.apache.calcite.sql.validate.SqlValidatorScope; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Generic operator for nodes with internal syntax. diff --git a/core/src/main/java/org/apache/calcite/sql/SqlIntervalLiteral.java b/core/src/main/java/org/apache/calcite/sql/SqlIntervalLiteral.java index 0f311ce51341..b099a230045b 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlIntervalLiteral.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlIntervalLiteral.java @@ -20,7 +20,7 @@ import org.apache.calcite.sql.type.SqlTypeName; import org.apache.calcite.util.Litmus; -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/sql/SqlIntervalQualifier.java b/core/src/main/java/org/apache/calcite/sql/SqlIntervalQualifier.java index 5f81211b994e..93d987beb2c6 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlIntervalQualifier.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlIntervalQualifier.java @@ -32,7 +32,7 @@ import com.google.common.collect.ImmutableSet; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.Locale; @@ -280,7 +280,7 @@ public boolean isWeek() { validator.validateIntervalQualifier(this); } - @Override public R accept(SqlVisitor visitor) { + @Override public R accept(SqlVisitor visitor) { return visitor.visit(this); } @@ -401,7 +401,7 @@ public TimeUnit getEndUnit() { /** Returns {@code SECOND} for both {@code HOUR TO SECOND} and * {@code SECOND}. */ public TimeUnit getUnit() { - return Util.first(timeUnitRange.endUnit, timeUnitRange.startUnit); + return Util.firstNonNull(timeUnitRange.endUnit, timeUnitRange.startUnit); } @Override public SqlNode clone(SqlParserPos pos) { diff --git a/core/src/main/java/org/apache/calcite/sql/SqlJdbcDataTypeName.java b/core/src/main/java/org/apache/calcite/sql/SqlJdbcDataTypeName.java index cf6227941639..5c15194bf137 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlJdbcDataTypeName.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlJdbcDataTypeName.java @@ -20,7 +20,7 @@ import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static com.google.common.base.Preconditions.checkArgument; diff --git a/core/src/main/java/org/apache/calcite/sql/SqlJdbcFunctionCall.java b/core/src/main/java/org/apache/calcite/sql/SqlJdbcFunctionCall.java index 17691a3a950b..2d06e78240e1 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlJdbcFunctionCall.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlJdbcFunctionCall.java @@ -27,7 +27,7 @@ import com.google.common.collect.ImmutableMap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Map; @@ -674,7 +674,7 @@ private static class JdbcToInternalLookupTable { private final Map map; - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") private JdbcToInternalLookupTable() { // A table of all functions can be found at // http://java.sun.com/products/jdbc/driverdevs.html diff --git a/core/src/main/java/org/apache/calcite/sql/SqlJoin.java b/core/src/main/java/org/apache/calcite/sql/SqlJoin.java index f948a7d668d4..e3d7ca13bef4 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlJoin.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlJoin.java @@ -22,7 +22,7 @@ import org.apache.calcite.util.ImmutableNullableList; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.function.UnaryOperator; @@ -96,13 +96,13 @@ public SqlJoin(SqlParserPos pos, SqlNode left, SqlLiteral natural, return SqlKind.JOIN; } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public List getOperandList() { return ImmutableNullableList.of(left, natural, joinType, right, conditionType, condition); } - @SuppressWarnings("assignment.type.incompatible") + @SuppressWarnings("NullAway") @Override public void setOperand(int i, @Nullable SqlNode operand) { switch (i) { case 0: @@ -194,7 +194,7 @@ private SqlJoinOperator(String name, int prec) { return SqlSyntax.SPECIAL; } - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") @Override public SqlCall createCall( @Nullable SqlLiteral functionQualifier, SqlParserPos pos, diff --git a/core/src/main/java/org/apache/calcite/sql/SqlLambda.java b/core/src/main/java/org/apache/calcite/sql/SqlLambda.java index 696753b4f4e5..555fda118bac 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlLambda.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlLambda.java @@ -23,7 +23,7 @@ import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.util.UnmodifiableArrayList; -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/sql/SqlLiteral.java b/core/src/main/java/org/apache/calcite/sql/SqlLiteral.java index d0af5ba65228..8015961a4000 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlLiteral.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlLiteral.java @@ -42,7 +42,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.math.BigDecimal; import java.nio.charset.Charset; @@ -297,7 +297,7 @@ public static boolean valueMatchesType( * * @throws AssertionError if the value type is not supported */ - public T getValueAs(Class clazz) { + public T getValueAs(Class clazz) { Object value = this.value; if (clazz.isInstance(value)) { return clazz.cast(value); @@ -592,7 +592,7 @@ public static SqlLiteral unchain(SqlNode node) { validator.validateLiteral(this); } - @Override public R accept(SqlVisitor visitor) { + @Override public R accept(SqlVisitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/org/apache/calcite/sql/SqlMatchFunction.java b/core/src/main/java/org/apache/calcite/sql/SqlMatchFunction.java index 7c8f3a5673b2..18becfed7f89 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlMatchFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlMatchFunction.java @@ -20,7 +20,7 @@ import org.apache.calcite.sql.type.SqlOperandTypeInference; import org.apache.calcite.sql.type.SqlReturnTypeInference; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** Base class for all functions used in MATCH_RECOGNIZE. */ public class SqlMatchFunction extends SqlFunction { diff --git a/core/src/main/java/org/apache/calcite/sql/SqlMatchRecognize.java b/core/src/main/java/org/apache/calcite/sql/SqlMatchRecognize.java index ffd37c04d2c7..36cdab245311 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlMatchRecognize.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlMatchRecognize.java @@ -23,7 +23,7 @@ import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.util.ImmutableNullableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -105,7 +105,7 @@ public SqlMatchRecognize(SqlParserPos pos, SqlNode tableRef, SqlNode pattern, return SqlKind.MATCH_RECOGNIZE; } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public List getOperandList() { return ImmutableNullableList.of(tableRef, pattern, strictStart, strictEnd, patternDefList, measureList, after, subsetList, rowsPerMatch, partitionList, orderList, @@ -121,7 +121,7 @@ public SqlMatchRecognize(SqlParserPos pos, SqlNode tableRef, SqlNode pattern, validator.validateMatchRecognize(this); } - @SuppressWarnings("assignment.type.incompatible") + @SuppressWarnings("NullAway") @Override public void setOperand(int i, @Nullable SqlNode operand) { switch (i) { case OPERAND_TABLE_REF: @@ -271,7 +271,7 @@ private SqlMatchRecognizeOperator() { return SqlSyntax.SPECIAL; } - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") @Override public SqlCall createCall( @Nullable SqlLiteral functionQualifier, SqlParserPos pos, @@ -286,7 +286,7 @@ private SqlMatchRecognizeOperator() { (SqlNodeList) operands[9], (SqlNodeList) operands[10], (SqlLiteral) operands[11]); } - @Override public void acceptCall( + @Override public void acceptCall( SqlVisitor visitor, SqlCall call, boolean onlyExpressions, diff --git a/core/src/main/java/org/apache/calcite/sql/SqlMerge.java b/core/src/main/java/org/apache/calcite/sql/SqlMerge.java index df450974a56b..75eaf32ef135 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlMerge.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlMerge.java @@ -23,8 +23,7 @@ import org.apache.calcite.util.ImmutableNullableList; import org.apache.calcite.util.Pair; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -85,13 +84,13 @@ public SqlMerge(SqlParserPos pos, return SqlKind.MERGE; } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public List<@Nullable SqlNode> getOperandList() { return ImmutableNullableList.of(targetTable, condition, source, updateCall, insertCall, sourceSelect, alias); } - @SuppressWarnings("assignment.type.incompatible") + @SuppressWarnings("NullAway") @Override public void setOperand(int i, @Nullable SqlNode operand) { switch (i) { case 0: @@ -127,7 +126,6 @@ public SqlNode getTargetTable() { } /** Returns the alias for the target table of this MERGE. */ - @Pure public @Nullable SqlIdentifier getAlias() { return alias; } diff --git a/core/src/main/java/org/apache/calcite/sql/SqlNode.java b/core/src/main/java/org/apache/calcite/sql/SqlNode.java index fa642101b460..29b3ed6f2c7b 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlNode.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlNode.java @@ -28,7 +28,7 @@ import org.apache.calcite.util.Litmus; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; @@ -287,7 +287,7 @@ public void validateExpr( *

    The type parameter R must be consistent with the type * parameter of the visitor. */ - public abstract R accept(SqlVisitor visitor); + public abstract R accept(SqlVisitor visitor); /** * Returns whether this node is structurally equivalent to another node. @@ -384,7 +384,8 @@ public static boolean equalDeep(List operands0, ArrayList<@Nullable SqlNode>, SqlNodeList> toList(SqlParserPos pos) { //noinspection RedundantTypeArguments return Collector., SqlNodeList>of( - ArrayList::new, ArrayList::add, Util::combine, + () -> new ArrayList<@Nullable SqlNode>(), (list, e) -> list.add(e), + (list0, list1) -> Util.combine(list0, list1), (ArrayList<@Nullable SqlNode> list) -> SqlNodeList.of(pos, list)); } } diff --git a/core/src/main/java/org/apache/calcite/sql/SqlNodeList.java b/core/src/main/java/org/apache/calcite/sql/SqlNodeList.java index 507b74a6916d..bacd3b08ff55 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlNodeList.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlNodeList.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.ArrayList; import java.util.Collection; @@ -136,27 +136,27 @@ public static SqlNodeList of(SqlParserPos pos, List<@Nullable SqlNode> list) { ((List) list).forEach(action); } - @SuppressWarnings("return.type.incompatible") + @SuppressWarnings("NullAway") @Override public Iterator iterator() { return list.iterator(); } - @SuppressWarnings("return.type.incompatible") + @SuppressWarnings("NullAway") @Override public ListIterator listIterator() { return list.listIterator(); } - @SuppressWarnings("return.type.incompatible") + @SuppressWarnings("NullAway") @Override public ListIterator listIterator(int index) { return list.listIterator(index); } - @SuppressWarnings("return.type.incompatible") + @SuppressWarnings("NullAway") @Override public List subList(int fromIndex, int toIndex) { return list.subList(fromIndex, toIndex); } - @SuppressWarnings("return.type.incompatible") + @SuppressWarnings("NullAway") @Override public /*Nullable*/ SqlNode get(int n) { return list.get(n); } @@ -169,6 +169,10 @@ public static SqlNodeList of(SqlParserPos pos, List<@Nullable SqlNode> list) { return list.contains(o); } + // The unbounded wildcard of Collection is read from the bytecode signature, where it + // behaves as ? extends Object and rejects a nullable type argument. + // https://github.com/uber/NullAway/issues/1732 + @SuppressWarnings("NullAway") @Override public boolean containsAll(Collection c) { return list.containsAll(c); } @@ -181,15 +185,15 @@ public static SqlNodeList of(SqlParserPos pos, List<@Nullable SqlNode> list) { return list.lastIndexOf(o); } - @SuppressWarnings("return.type.incompatible") + @SuppressWarnings("NullAway") @Override public Object[] toArray() { // Per JDK specification, must return an Object[] not SqlNode[]; see e.g. // https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6260652 return list.toArray(); } - @SuppressWarnings("return.type.incompatible") - @Override public @Nullable T[] toArray(T @Nullable [] a) { + @SuppressWarnings("NullAway") + @Override public T[] toArray(T[] a) { return list.toArray(a); } @@ -221,10 +225,18 @@ public static SqlNodeList of(SqlParserPos pos, List<@Nullable SqlNode> list) { return castNonNull(list.remove(index)); } + // The unbounded wildcard of Collection is read from the bytecode signature, where it + // behaves as ? extends Object and rejects a nullable type argument. + // https://github.com/uber/NullAway/issues/1732 + @SuppressWarnings("NullAway") @Override public boolean removeAll(Collection c) { return list.removeAll(c); } + // The unbounded wildcard of Collection is read from the bytecode signature, where it + // behaves as ? extends Object and rejects a nullable type argument. + // https://github.com/uber/NullAway/issues/1732 + @SuppressWarnings("NullAway") @Override public boolean retainAll(Collection c) { return list.retainAll(c); } @@ -269,7 +281,7 @@ void andOrList(SqlWriter writer, SqlBinaryOperator sepOp) { } } - @Override public R accept(SqlVisitor visitor) { + @Override public R accept(SqlVisitor visitor) { return visitor.visit(this); } diff --git a/core/src/main/java/org/apache/calcite/sql/SqlNullTreatmentOperator.java b/core/src/main/java/org/apache/calcite/sql/SqlNullTreatmentOperator.java index 28ad44956c38..fa83e6535d30 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlNullTreatmentOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlNullTreatmentOperator.java @@ -23,7 +23,7 @@ import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.util.ImmutableNullableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static com.google.common.base.Preconditions.checkArgument; diff --git a/core/src/main/java/org/apache/calcite/sql/SqlNumericLiteral.java b/core/src/main/java/org/apache/calcite/sql/SqlNumericLiteral.java index 575388ed5621..ea7148e67584 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlNumericLiteral.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlNumericLiteral.java @@ -22,8 +22,7 @@ import org.apache.calcite.sql.type.SqlTypeName; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; @@ -66,7 +65,6 @@ private BigDecimal getValueNonNull() { return prec; } - @Pure public @Nullable Integer getScale() { return scale; } diff --git a/core/src/main/java/org/apache/calcite/sql/SqlOperator.java b/core/src/main/java/org/apache/calcite/sql/SqlOperator.java index dc8f09770997..4ac84ac892b4 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlOperator.java @@ -41,14 +41,12 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Objects; import java.util.function.Supplier; -import static org.apache.calcite.linq4j.Nullness.castNonNull; import static org.apache.calcite.util.Static.RESOURCE; import static java.util.Objects.requireNonNull; @@ -247,7 +245,6 @@ public SqlIdentifier getNameAsId() { return new SqlIdentifier(getName(), SqlParserPos.ZERO); } - @Pure public SqlKind getKind() { return kind; } @@ -627,7 +624,7 @@ argTypes, null, null, getSyntax(), getKind(), throw validator.handleUnresolvedFunction(call, this, argTypes, null); } - ((SqlBasicCall) call).setOperator(castNonNull(sqlOperator)); + ((SqlBasicCall) call).setOperator(sqlOperator); RelDataType type = call.getOperator().validateOperands(validator, scope, call); // Validate and determine coercibility and resulting collation @@ -875,7 +872,6 @@ public String getAllowedSignatures(String opNameToUse) { * @return whether this operator is an analytic function (aggregate function * or window function) */ - @Pure public boolean isAggregator() { return false; } @@ -951,7 +947,7 @@ public boolean isGroupAuxiliary() { * @param visitor Visitor * @param call Call to visit */ - public @Nullable R acceptCall(SqlVisitor visitor, SqlCall call) { + public @Nullable R acceptCall(SqlVisitor visitor, SqlCall call) { for (SqlNode operand : call.getOperandList()) { if (operand == null) { continue; @@ -976,7 +972,7 @@ public boolean isGroupAuxiliary() { * AS operator * @param argHandler Called for each operand */ - public void acceptCall( + public void acceptCall( SqlVisitor visitor, SqlCall call, boolean onlyExpressions, @@ -1032,7 +1028,6 @@ public void acceptCall( * * @see Strong */ - @Pure public @Nullable Supplier getStrongPolicyInference() { return null; } diff --git a/core/src/main/java/org/apache/calcite/sql/SqlOperatorBinding.java b/core/src/main/java/org/apache/calcite/sql/SqlOperatorBinding.java index 43e938d0e65d..2102d242715b 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlOperatorBinding.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlOperatorBinding.java @@ -28,7 +28,7 @@ import org.apache.calcite.sql.validate.SqlValidatorException; import org.apache.calcite.util.NlsString; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.AbstractList; import java.util.List; @@ -154,7 +154,7 @@ public int getIntLiteralOperand(int ordinal) { * * @return value of operand */ - public @Nullable T getOperandLiteralValue(int ordinal, Class clazz) { + public @Nullable T getOperandLiteralValue(int ordinal, Class clazz) { throw new UnsupportedOperationException(); } diff --git a/core/src/main/java/org/apache/calcite/sql/SqlOperatorTable.java b/core/src/main/java/org/apache/calcite/sql/SqlOperatorTable.java index 7bd58045f717..1851a6641097 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlOperatorTable.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlOperatorTable.java @@ -18,7 +18,7 @@ import org.apache.calcite.sql.validate.SqlNameMatcher; -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/sql/SqlOrderBy.java b/core/src/main/java/org/apache/calcite/sql/SqlOrderBy.java index c0c88240f80e..674732a2a64f 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlOrderBy.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlOrderBy.java @@ -19,7 +19,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; @@ -33,7 +33,7 @@ */ public class SqlOrderBy extends SqlCall { public static final SqlSpecialOperator OPERATOR = new Operator() { - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") @Override public SqlCall createCall(@Nullable SqlLiteral functionQualifier, SqlParserPos pos, @Nullable SqlNode... operands) { return new SqlOrderBy(pos, operands[0], (SqlNodeList) operands[1], @@ -67,7 +67,7 @@ public SqlOrderBy(SqlParserPos pos, SqlNode query, SqlNodeList orderList, return OPERATOR; } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public List getOperandList() { return ImmutableNullableList.of(query, orderList, offset, fetch); } diff --git a/core/src/main/java/org/apache/calcite/sql/SqlOverOperator.java b/core/src/main/java/org/apache/calcite/sql/SqlOverOperator.java index 1ec62f3309a2..d0ad2a2167d6 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlOverOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlOverOperator.java @@ -25,6 +25,8 @@ import org.apache.calcite.sql.validate.SqlValidator; import org.apache.calcite.sql.validate.SqlValidatorScope; +import org.jspecify.annotations.Nullable; + import static org.apache.calcite.util.Static.RESOURCE; /** @@ -164,7 +166,7 @@ public SqlOverOperator() { * * @param visitor Visitor */ - @Override public void acceptCall( + @Override public void acceptCall( SqlVisitor visitor, SqlCall call, boolean onlyExpressions, diff --git a/core/src/main/java/org/apache/calcite/sql/SqlPivot.java b/core/src/main/java/org/apache/calcite/sql/SqlPivot.java index 2d0f3652de10..d22de8549de3 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlPivot.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlPivot.java @@ -26,7 +26,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.HashSet; import java.util.List; @@ -76,7 +76,7 @@ public SqlPivot(SqlParserPos pos, SqlNode query, SqlNodeList aggList, return ImmutableNullableList.of(query, aggList, axisList, inList); } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public void setOperand(int i, @Nullable SqlNode operand) { // Only 'query' is mutable. (It is required for validation.) switch (i) { @@ -175,8 +175,8 @@ static SqlNodeList toNodes(SqlNode node) { * that are not used will become "GROUP BY" columns. */ public Set usedColumnNames() { final Set columnNames = new HashSet<>(); - final SqlVisitor nameCollector = new SqlBasicVisitor() { - @Override public Void visit(SqlIdentifier id) { + final SqlVisitor<@Nullable Void> nameCollector = new SqlBasicVisitor<@Nullable Void>() { + @Override public @Nullable Void visit(SqlIdentifier id) { columnNames.add(Util.last(id.names)); return super.visit(id); } diff --git a/core/src/main/java/org/apache/calcite/sql/SqlPostfixOperator.java b/core/src/main/java/org/apache/calcite/sql/SqlPostfixOperator.java index b4e172a032b5..4d95298524b7 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlPostfixOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlPostfixOperator.java @@ -25,7 +25,7 @@ import org.apache.calcite.util.Litmus; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static org.apache.calcite.linq4j.Nullness.castNonNull; diff --git a/core/src/main/java/org/apache/calcite/sql/SqlPrefixOperator.java b/core/src/main/java/org/apache/calcite/sql/SqlPrefixOperator.java index a7e2a144b1ca..9f316d4d1ab9 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlPrefixOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlPrefixOperator.java @@ -26,7 +26,7 @@ import org.apache.calcite.util.Litmus; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static org.apache.calcite.sql.type.NonNullableAccessors.getCharset; import static org.apache.calcite.sql.type.NonNullableAccessors.getCollation; diff --git a/core/src/main/java/org/apache/calcite/sql/SqlSelect.java b/core/src/main/java/org/apache/calcite/sql/SqlSelect.java index ad542c31a005..7a8b67abef85 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlSelect.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlSelect.java @@ -16,15 +16,14 @@ */ package org.apache.calcite.sql; +import org.apache.calcite.linq4j.annotations.EnsuresNonNullIf; import org.apache.calcite.sql.fun.SqlInternalOperators; import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.sql.validate.SqlValidator; import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.util.ImmutableNullableList; -import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -141,7 +140,7 @@ public SqlSelect(SqlParserPos pos, return SqlKind.SELECT; } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public List getOperandList() { return ImmutableNullableList.of(keywordList, selectList, from, where, groupBy, having, windowDecls, qualify, orderBy, offset, fetch, hints, @@ -214,7 +213,6 @@ public final boolean isDistinct() { return null; } - @Pure public final @Nullable SqlNode getFrom() { return from; } @@ -223,7 +221,6 @@ public void setFrom(@Nullable SqlNode from) { this.from = from; } - @Pure public final @Nullable SqlNodeList getGroup() { return groupBy; } @@ -232,7 +229,6 @@ public void setGroupBy(@Nullable SqlNodeList groupBy) { this.groupBy = groupBy; } - @Pure public final @Nullable SqlNode getHaving() { return having; } @@ -241,7 +237,6 @@ public void setHaving(@Nullable SqlNode having) { this.having = having; } - @Pure public final SqlNodeList getSelectList() { return selectList; } @@ -250,7 +245,6 @@ public void setSelectList(SqlNodeList selectList) { this.selectList = selectList; } - @Pure public final @Nullable SqlNode getWhere() { return where; } @@ -263,7 +257,6 @@ public final SqlNodeList getWindowList() { return windowDecls; } - @Pure public final @Nullable SqlNode getQualify() { return qualify; } @@ -272,7 +265,6 @@ public void setQualify(@Nullable SqlNode qualify) { this.qualify = qualify; } - @Pure public final @Nullable SqlNodeList getOrderList() { return orderBy; } @@ -289,7 +281,6 @@ public boolean hasByClause() { return hasByClause; } - @Pure public final @Nullable SqlNode getOffset() { return offset; } @@ -298,7 +289,6 @@ public void setOffset(@Nullable SqlNode offset) { this.offset = offset; } - @Pure public final @Nullable SqlNode getFetch() { return fetch; } @@ -307,12 +297,11 @@ public void setFetch(@Nullable SqlNode fetch) { this.fetch = fetch; } - @Pure public @Nullable SqlNodeList getHints() { return this.hints; } - @EnsuresNonNullIf(expression = "hints", result = true) + @EnsuresNonNullIf(value = "hints", result = true) public boolean hasHints() { // The hints may be passed as null explicitly. return this.hints != null && !this.hints.isEmpty(); diff --git a/core/src/main/java/org/apache/calcite/sql/SqlSelectOperator.java b/core/src/main/java/org/apache/calcite/sql/SqlSelectOperator.java index 1c1a8edfe8c3..36fb6ce2066d 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlSelectOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlSelectOperator.java @@ -21,7 +21,7 @@ import org.apache.calcite.sql.util.SqlBasicVisitor; import org.apache.calcite.sql.util.SqlVisitor; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -119,7 +119,7 @@ public SqlSelect createCall( null); } - @Override public void acceptCall( + @Override public void acceptCall( SqlVisitor visitor, SqlCall call, boolean onlyExpressions, diff --git a/core/src/main/java/org/apache/calcite/sql/SqlSetOperator.java b/core/src/main/java/org/apache/calcite/sql/SqlSetOperator.java index 0ce69276f71d..059c68e6c169 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlSetOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlSetOperator.java @@ -24,7 +24,7 @@ import org.apache.calcite.sql.validate.SqlValidator; import org.apache.calcite.sql.validate.SqlValidatorScope; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * SqlSetOperator represents a relational set theory operator (UNION, INTERSECT, diff --git a/core/src/main/java/org/apache/calcite/sql/SqlSetOption.java b/core/src/main/java/org/apache/calcite/sql/SqlSetOption.java index 689ba20642ba..9af4a9fb897c 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlSetOption.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlSetOption.java @@ -21,7 +21,7 @@ import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.util.ImmutableNullableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -64,7 +64,7 @@ public class SqlSetOption extends SqlAlter { public static final SqlSpecialOperator OPERATOR = new SqlSpecialOperator("SET_OPTION", SqlKind.SET_OPTION) { - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") @Override public SqlCall createCall(@Nullable SqlLiteral functionQualifier, SqlParserPos pos, @Nullable SqlNode... operands) { final SqlNode scopeNode = operands[0]; @@ -135,7 +135,7 @@ public SqlSetOption(SqlParserPos pos, @Nullable String scope, SqlIdentifier name return OPERATOR; } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public List getOperandList() { final List<@Nullable SqlNode> operandList = new ArrayList<>(); if (scope == null) { diff --git a/core/src/main/java/org/apache/calcite/sql/SqlSetSemanticsTableOperator.java b/core/src/main/java/org/apache/calcite/sql/SqlSetSemanticsTableOperator.java index f33003c74318..a5caded1d0fc 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlSetSemanticsTableOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlSetSemanticsTableOperator.java @@ -21,7 +21,7 @@ import org.apache.calcite.sql.validate.SqlValidator; import org.apache.calcite.sql.validate.SqlValidatorScope; -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/sql/SqlSnapshot.java b/core/src/main/java/org/apache/calcite/sql/SqlSnapshot.java index adf9f27f9fe2..6ce1cf163729 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlSnapshot.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlSnapshot.java @@ -21,7 +21,7 @@ import org.apache.calcite.sql.util.SqlVisitor; import org.apache.calcite.util.ImmutableNullableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -96,7 +96,7 @@ private SqlSnapshotOperator() { return SqlSyntax.SPECIAL; } - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") @Override public SqlCall createCall( @Nullable SqlLiteral functionQualifier, SqlParserPos pos, @@ -106,7 +106,7 @@ private SqlSnapshotOperator() { return new SqlSnapshot(pos, operands[0], operands[1]); } - @Override public void acceptCall( + @Override public void acceptCall( SqlVisitor visitor, SqlCall call, boolean onlyExpressions, diff --git a/core/src/main/java/org/apache/calcite/sql/SqlSpatialTypeOperatorTable.java b/core/src/main/java/org/apache/calcite/sql/SqlSpatialTypeOperatorTable.java index 6d0f920d2ae1..c8d7c8774d66 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlSpatialTypeOperatorTable.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlSpatialTypeOperatorTable.java @@ -33,7 +33,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/sql/SqlSpecialOperator.java b/core/src/main/java/org/apache/calcite/sql/SqlSpecialOperator.java index a37ec2ba9979..755e95f5e344 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlSpecialOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlSpecialOperator.java @@ -23,7 +23,7 @@ import org.apache.calcite.util.PrecedenceClimbingParser; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.function.Predicate; diff --git a/core/src/main/java/org/apache/calcite/sql/SqlSplittableAggFunction.java b/core/src/main/java/org/apache/calcite/sql/SqlSplittableAggFunction.java index d5bdeb00f334..0d19d275d2e3 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlSplittableAggFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlSplittableAggFunction.java @@ -33,7 +33,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/sql/SqlStarExclude.java b/core/src/main/java/org/apache/calcite/sql/SqlStarExclude.java index fc1d7f298889..ec76666226b4 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlStarExclude.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlStarExclude.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.List; @@ -33,7 +33,7 @@ public class SqlStarExclude extends SqlCall { public static final SqlOperator OPERATOR = new SqlSpecialOperator("STAR_EXCLUDE", SqlKind.OTHER) { - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") @Override public SqlCall createCall( @Nullable SqlLiteral functionQualifier, SqlParserPos pos, diff --git a/core/src/main/java/org/apache/calcite/sql/SqlStarReplace.java b/core/src/main/java/org/apache/calcite/sql/SqlStarReplace.java index 28b5f5ab4243..bab7827f9063 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlStarReplace.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlStarReplace.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.List; @@ -32,7 +32,7 @@ public class SqlStarReplace extends SqlCall { public static final SqlOperator OPERATOR = new SqlSpecialOperator("SELECT_STAR_REPLACE", SqlKind.OTHER) { - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") @Override public SqlCall createCall( @Nullable SqlLiteral functionQualifier, SqlParserPos pos, diff --git a/core/src/main/java/org/apache/calcite/sql/SqlStaticAggFunction.java b/core/src/main/java/org/apache/calcite/sql/SqlStaticAggFunction.java index 191e80550ed8..46b645fac063 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlStaticAggFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlStaticAggFunction.java @@ -23,7 +23,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** Aggregate function whose value may be a constant expression, based on * only the contents of the GROUP BY clause. */ diff --git a/core/src/main/java/org/apache/calcite/sql/SqlSyntax.java b/core/src/main/java/org/apache/calcite/sql/SqlSyntax.java index 826891794d29..59f2aa9fbf9d 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlSyntax.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlSyntax.java @@ -19,8 +19,7 @@ import org.apache.calcite.sql.validate.SqlConformance; import org.apache.calcite.util.Util; -import org.checkerframework.checker.initialization.qual.NotOnlyInitialized; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Enumeration of possible syntactic types of {@link SqlOperator operators}. @@ -180,7 +179,6 @@ public enum SqlSyntax { }; /** Syntax to treat this syntax as equivalent to when resolving operators. */ - @NotOnlyInitialized public final SqlSyntax family; SqlSyntax() { diff --git a/core/src/main/java/org/apache/calcite/sql/SqlTableFunction.java b/core/src/main/java/org/apache/calcite/sql/SqlTableFunction.java index bef0b7d12703..a28db757e5e2 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlTableFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlTableFunction.java @@ -18,7 +18,7 @@ import org.apache.calcite.sql.type.SqlReturnTypeInference; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * A function that returns a table. diff --git a/core/src/main/java/org/apache/calcite/sql/SqlTableRef.java b/core/src/main/java/org/apache/calcite/sql/SqlTableRef.java index e4665c116c82..b891e53b3f5f 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlTableRef.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlTableRef.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.List; diff --git a/core/src/main/java/org/apache/calcite/sql/SqlUnpivot.java b/core/src/main/java/org/apache/calcite/sql/SqlUnpivot.java index 732e6d4e6a19..bd46e038e62a 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlUnpivot.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlUnpivot.java @@ -22,7 +22,7 @@ import org.apache.calcite.util.ImmutableNullableList; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.HashSet; import java.util.List; @@ -84,7 +84,7 @@ public SqlUnpivot(SqlParserPos pos, SqlNode query, boolean includeNulls, SqlLiteral.createBoolean(includeNulls, SqlParserPos.ZERO)); } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public void setOperand(int i, @Nullable SqlNode operand) { // Only 'query' is mutable. (It is required for validation.) switch (i) { @@ -144,8 +144,8 @@ public void forEachNameValues( * clause. All columns that are not used will be part of the returned row. */ public Set usedColumnNames() { final Set columnNames = new HashSet<>(); - final SqlVisitor nameCollector = new SqlBasicVisitor() { - @Override public Void visit(SqlIdentifier id) { + final SqlVisitor<@Nullable Void> nameCollector = new SqlBasicVisitor<@Nullable Void>() { + @Override public @Nullable Void visit(SqlIdentifier id) { columnNames.add(Util.last(id.names)); return super.visit(id); } diff --git a/core/src/main/java/org/apache/calcite/sql/SqlUnresolvedFunction.java b/core/src/main/java/org/apache/calcite/sql/SqlUnresolvedFunction.java index d1f3d796a9bd..31c12db6dc98 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlUnresolvedFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlUnresolvedFunction.java @@ -23,7 +23,7 @@ import org.apache.calcite.sql.type.SqlReturnTypeInference; import org.apache.calcite.sql.type.SqlTypeName; -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/sql/SqlUpdate.java b/core/src/main/java/org/apache/calcite/sql/SqlUpdate.java index 0f743540d18e..6047b0dee3b1 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlUpdate.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlUpdate.java @@ -23,8 +23,7 @@ import org.apache.calcite.util.ImmutableNullableList; import org.apache.calcite.util.Pair; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -37,7 +36,7 @@ public class SqlUpdate extends SqlCall { public static final SqlSpecialOperator OPERATOR = new SqlSpecialOperator("UPDATE", SqlKind.UPDATE) { - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") @Override public SqlCall createCall(@Nullable SqlLiteral functionQualifier, SqlParserPos pos, @Nullable SqlNode... operands) { @@ -90,13 +89,13 @@ public SqlUpdate(SqlParserPos pos, return OPERATOR; } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public List<@Nullable SqlNode> getOperandList() { return ImmutableNullableList.of(targetTable, targetColumnList, sourceExpressionList, condition, sourceSelect, alias); } - @SuppressWarnings("assignment.type.incompatible") + @SuppressWarnings("NullAway") @Override public void setOperand(int i, @Nullable SqlNode operand) { switch (i) { case 0: @@ -129,7 +128,6 @@ public SqlNode getTargetTable() { } /** Returns the alias for the target table of this UPDATE. */ - @Pure public @Nullable SqlIdentifier getAlias() { return alias; } diff --git a/core/src/main/java/org/apache/calcite/sql/SqlUtil.java b/core/src/main/java/org/apache/calcite/sql/SqlUtil.java index e6bccfe51e3e..6dcb1f20713f 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlUtil.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlUtil.java @@ -19,6 +19,7 @@ import org.apache.calcite.avatica.util.ByteString; import org.apache.calcite.config.CalciteSystemProperty; import org.apache.calcite.linq4j.Ord; +import org.apache.calcite.linq4j.annotations.Contract; import org.apache.calcite.linq4j.function.Functions; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.hint.HintStrategyTable; @@ -56,8 +57,7 @@ import com.google.common.collect.Iterators; import com.google.common.collect.Lists; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.PolyNull; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.nio.charset.Charset; @@ -715,7 +715,7 @@ private static Iterator filterRoutinesByParameterTypeAndName( return true; } final SqlOperandMetadata operandMetadata = (SqlOperandMetadata) operandTypeChecker; - @SuppressWarnings("assignment.type.incompatible") + @SuppressWarnings("NullAway") final List<@Nullable RelDataType> paramTypes = operandMetadata.paramTypes(typeFactory); final List<@Nullable RelDataType> permutedArgTypes; @@ -1131,7 +1131,8 @@ public static void validateCharset(ByteString value, Charset charset) { /** If a node is "AS", returns the underlying expression; otherwise returns * the node. Returns null if and only if the node is null. */ - public static @PolyNull SqlNode stripAs(@PolyNull SqlNode node) { + @Contract("!null -> !null") + public static @Nullable SqlNode stripAs(@Nullable SqlNode node) { if (node != null && node.getKind() == SqlKind.AS) { return ((SqlCall) node).operand(0); } @@ -1333,9 +1334,9 @@ public static boolean containsAgg(SqlNode node) { public static boolean containsCall(SqlNode node, Predicate callPredicate) { try { - SqlVisitor visitor = - new SqlBasicVisitor() { - @Override public Void visit(SqlCall call) { + SqlVisitor<@Nullable Void> visitor = + new SqlBasicVisitor<@Nullable Void>() { + @Override public @Nullable Void visit(SqlCall call) { if (callPredicate.test(call)) { throw new Util.FoundOne(call); } @@ -1425,7 +1426,7 @@ public String getIdentifierQuoteString() { /** Walks over a {@link org.apache.calcite.sql.SqlNode} tree and returns the * ancestry stack when it finds a given node. */ - private static class Genealogist extends SqlBasicVisitor { + private static class Genealogist extends SqlBasicVisitor<@Nullable Void> { private final List ancestors = new ArrayList<>(); private final Predicate predicate; private final Predicate postPredicate; @@ -1465,11 +1466,11 @@ private void visitChild(@Nullable SqlNode node) { ancestors.remove(ancestors.size() - 1); } - @Override public Void visit(SqlIdentifier id) { + @Override public @Nullable Void visit(SqlIdentifier id) { return check(id); } - @Override public Void visit(SqlCall call) { + @Override public @Nullable Void visit(SqlCall call) { preCheck(call); for (SqlNode node : call.getOperandList()) { visitChild(node); @@ -1477,15 +1478,15 @@ private void visitChild(@Nullable SqlNode node) { return postCheck(call); } - @Override public Void visit(SqlIntervalQualifier intervalQualifier) { + @Override public @Nullable Void visit(SqlIntervalQualifier intervalQualifier) { return check(intervalQualifier); } - @Override public Void visit(SqlLiteral literal) { + @Override public @Nullable Void visit(SqlLiteral literal) { return check(literal); } - @Override public Void visit(SqlNodeList nodeList) { + @Override public @Nullable Void visit(SqlNodeList nodeList) { preCheck(nodeList); for (SqlNode node : nodeList) { visitChild(node); @@ -1493,11 +1494,11 @@ private void visitChild(@Nullable SqlNode node) { return postCheck(nodeList); } - @Override public Void visit(SqlDynamicParam param) { + @Override public @Nullable Void visit(SqlDynamicParam param) { return check(param); } - @Override public Void visit(SqlDataTypeSpec type) { + @Override public @Nullable Void visit(SqlDataTypeSpec type) { return check(type); } } diff --git a/core/src/main/java/org/apache/calcite/sql/SqlWindow.java b/core/src/main/java/org/apache/calcite/sql/SqlWindow.java index 66c4f8d7b766..11215bd50760 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlWindow.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlWindow.java @@ -17,6 +17,7 @@ package org.apache.calcite.sql; import org.apache.calcite.linq4j.Ord; +import org.apache.calcite.linq4j.annotations.EnsuresNonNullIf; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rex.RexWindowBound; import org.apache.calcite.rex.RexWindowBounds; @@ -35,9 +36,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.List; @@ -179,13 +178,13 @@ public static SqlWindow create(@Nullable SqlIdentifier declName, @Nullable SqlId return SqlKind.WINDOW; } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public List getOperandList() { return ImmutableNullableList.of(declName, refName, partitionList, orderList, isRows, lowerBound, upperBound, allowPartial, exclude); } - @SuppressWarnings("assignment.type.incompatible") + @SuppressWarnings("NullAway") @Override public void setOperand(int i, @Nullable SqlNode operand) { switch (i) { case 0: @@ -305,7 +304,6 @@ public void setRows(SqlLiteral isRows) { this.isRows = isRows; } - @Pure public boolean isRows() { return isRows.booleanValue(); } @@ -597,7 +595,7 @@ private static boolean setOperand(@Nullable SqlNode clonedOperand, @Nullable Sql * (for example, a window of size 1 hour which has only 45 minutes of data * in it) will appear to windowed aggregate functions to be empty. */ - @EnsuresNonNullIf(expression = "allowPartial", result = false) + @EnsuresNonNullIf(value = "allowPartial", result = false) public boolean isAllowPartial() { // Default (and standard behavior) is to allow partial windows. return allowPartial == null @@ -915,7 +913,7 @@ private SqlWindowOperator() { return SqlSyntax.SPECIAL; } - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") @Override public SqlCall createCall( @Nullable SqlLiteral functionQualifier, SqlParserPos pos, @@ -935,7 +933,7 @@ private SqlWindowOperator() { pos); } - @Override public void acceptCall( + @Override public void acceptCall( SqlVisitor visitor, SqlCall call, boolean onlyExpressions, diff --git a/core/src/main/java/org/apache/calcite/sql/SqlWindowTableFunction.java b/core/src/main/java/org/apache/calcite/sql/SqlWindowTableFunction.java index 601b38299450..f4f21491536c 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlWindowTableFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlWindowTableFunction.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; diff --git a/core/src/main/java/org/apache/calcite/sql/SqlWith.java b/core/src/main/java/org/apache/calcite/sql/SqlWith.java index 647e02e2bc11..317fbc35b985 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlWith.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlWith.java @@ -22,7 +22,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -55,7 +55,7 @@ public SqlWith(SqlParserPos pos, SqlNodeList withList, SqlNode body) { return ImmutableList.of(withList, body); } - @SuppressWarnings("assignment.type.incompatible") + @SuppressWarnings("NullAway") @Override public void setOperand(int i, @Nullable SqlNode operand) { switch (i) { case 0: @@ -115,7 +115,7 @@ private SqlWithOperator() { } - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") @Override public SqlCall createCall(@Nullable SqlLiteral functionQualifier, SqlParserPos pos, @Nullable SqlNode... operands) { return new SqlWith(pos, (SqlNodeList) operands[0], operands[1]); diff --git a/core/src/main/java/org/apache/calcite/sql/SqlWithItem.java b/core/src/main/java/org/apache/calcite/sql/SqlWithItem.java index 89fe2e8d9cdc..fb1e105292ff 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlWithItem.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlWithItem.java @@ -19,7 +19,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; @@ -56,12 +56,12 @@ public SqlWithItem(SqlParserPos pos, SqlIdentifier name, return SqlKind.WITH_ITEM; } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public List getOperandList() { return ImmutableNullableList.of(name, columnList, query, recursive); } - @SuppressWarnings("assignment.type.incompatible") + @SuppressWarnings("NullAway") @Override public void setOperand(int i, @Nullable SqlNode operand) { switch (i) { case 0: @@ -113,7 +113,7 @@ private static class SqlWithItemOperator extends SqlSpecialOperator { withItem.query.unparse(writer, MDX_PRECEDENCE, MDX_PRECEDENCE); } - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") @Override public SqlCall createCall(@Nullable SqlLiteral functionQualifier, SqlParserPos pos, @Nullable SqlNode... operands) { assert functionQualifier == null; diff --git a/core/src/main/java/org/apache/calcite/sql/SqlWriter.java b/core/src/main/java/org/apache/calcite/sql/SqlWriter.java index 9682f9c99f33..1764a8f16170 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlWriter.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlWriter.java @@ -19,8 +19,7 @@ import org.apache.calcite.sql.fun.SqlStdOperatorTable; import org.apache.calcite.sql.util.SqlString; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.Nullable; import java.util.function.Consumer; @@ -342,7 +341,6 @@ public static FrameType create(final String name) { * convert to upper or lower case. Does not add quotation marks. Adds * preceding whitespace if necessary. */ - @Pure void literal(String s); /** @@ -350,13 +348,11 @@ public static FrameType create(final String name) { * contain a space. For example, keyword("SELECT"), * keyword("CHARACTER SET"). */ - @Pure void keyword(String s); /** * Prints a string, preceded by whitespace if necessary. */ - @Pure void print(String s); /** @@ -364,7 +360,6 @@ public static FrameType create(final String name) { * * @param x Integer */ - @Pure void print(int x); /** @@ -436,7 +431,6 @@ public static FrameType create(final String name) { * * @see #endFunCall(Frame) */ - @Pure Frame startFunCall(String funName); /** @@ -445,13 +439,11 @@ public static FrameType create(final String name) { * @param frame Frame * @see #startFunCall(String) */ - @Pure void endFunCall(Frame frame); /** * Starts a list. */ - @Pure Frame startList(String open, String close); /** @@ -460,7 +452,6 @@ public static FrameType create(final String name) { * @param frameType Type of list. For example, a SELECT list will be * governed according to SELECT-list formatting preferences. */ - @Pure Frame startList(FrameTypeEnum frameType); /** @@ -472,7 +463,6 @@ public static FrameType create(final String name) { * string. * @param close String to close the list */ - @Pure Frame startList(FrameType frameType, String open, String close); /** @@ -480,13 +470,11 @@ public static FrameType create(final String name) { * * @param frame The frame which was created by {@link #startList}. */ - @Pure void endList(@Nullable Frame frame); /** * Writes a list. */ - @Pure SqlWriter list(FrameTypeEnum frameType, Consumer action); /** @@ -495,7 +483,6 @@ public static FrameType create(final String name) { * {@link SqlStdOperatorTable#OR OR}, or * {@link #COMMA COMMA}). */ - @Pure SqlWriter list(FrameTypeEnum frameType, SqlBinaryOperator sepOp, SqlNodeList list); @@ -505,7 +492,6 @@ SqlWriter list(FrameTypeEnum frameType, SqlBinaryOperator sepOp, * * @param sep List separator, typically ",". */ - @Pure void sep(String sep); /** @@ -514,13 +500,11 @@ SqlWriter list(FrameTypeEnum frameType, SqlBinaryOperator sepOp, * @param sep List separator, typically "," * @param printFirst Whether to print the first occurrence of the separator */ - @Pure void sep(String sep, boolean printFirst); /** * Sets whether whitespace is needed before the next token. */ - @Pure void setNeedWhitespace(boolean needWhitespace); /** diff --git a/core/src/main/java/org/apache/calcite/sql/SqlWriterConfig.java b/core/src/main/java/org/apache/calcite/sql/SqlWriterConfig.java index 038201bbd150..8e7434353556 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlWriterConfig.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlWriterConfig.java @@ -18,8 +18,8 @@ import org.apache.calcite.sql.pretty.SqlPrettyWriter; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; /** Configuration for {@link SqlWriter} and {@link SqlPrettyWriter}. */ @Value.Immutable diff --git a/core/src/main/java/org/apache/calcite/sql/TableCharacteristic.java b/core/src/main/java/org/apache/calcite/sql/TableCharacteristic.java index 245a965494bc..c0f0ad899b11 100644 --- a/core/src/main/java/org/apache/calcite/sql/TableCharacteristic.java +++ b/core/src/main/java/org/apache/calcite/sql/TableCharacteristic.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.sql; -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/sql/advise/SqlAdvisor.java b/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisor.java index c830dc2cd728..0da2f56901af 100644 --- a/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisor.java +++ b/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisor.java @@ -17,6 +17,7 @@ package org.apache.calcite.sql.advise; import org.apache.calcite.avatica.util.Casing; +import org.apache.calcite.linq4j.annotations.EnsuresNonNull; import org.apache.calcite.runtime.CalciteContextException; import org.apache.calcite.runtime.CalciteException; import org.apache.calcite.sql.SqlIdentifier; @@ -38,8 +39,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; -import org.checkerframework.checker.nullness.qual.EnsuresNonNull; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisorGetHintsFunction.java b/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisorGetHintsFunction.java index d1b05764e893..b705a02c5730 100644 --- a/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisorGetHintsFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisorGetHintsFunction.java @@ -36,7 +36,7 @@ import com.google.common.collect.Iterables; -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/sql/advise/SqlAdvisorGetHintsFunction2.java b/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisorGetHintsFunction2.java index 0ec33fda81b3..7fbbce4eddec 100644 --- a/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisorGetHintsFunction2.java +++ b/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisorGetHintsFunction2.java @@ -36,7 +36,7 @@ import com.google.common.collect.Iterables; -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/sql/advise/SqlAdvisorHint.java b/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisorHint.java index 9746fc62265e..ae07a5016f6a 100644 --- a/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisorHint.java +++ b/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisorHint.java @@ -18,7 +18,7 @@ import org.apache.calcite.sql.validate.SqlMoniker; -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/sql/advise/SqlAdvisorHint2.java b/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisorHint2.java index bf9a405d20cb..73cff70c3e9e 100644 --- a/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisorHint2.java +++ b/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisorHint2.java @@ -18,7 +18,7 @@ import org.apache.calcite.sql.validate.SqlMoniker; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * This class is used to return values for diff --git a/core/src/main/java/org/apache/calcite/sql/advise/SqlSimpleParser.java b/core/src/main/java/org/apache/calcite/sql/advise/SqlSimpleParser.java index 86d4c88e941c..61696d544419 100644 --- a/core/src/main/java/org/apache/calcite/sql/advise/SqlSimpleParser.java +++ b/core/src/main/java/org/apache/calcite/sql/advise/SqlSimpleParser.java @@ -19,7 +19,7 @@ import org.apache.calcite.avatica.util.Quoting; import org.apache.calcite.sql.parser.SqlParser; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.EnumSet; diff --git a/core/src/main/java/org/apache/calcite/sql/advise/package-info.java b/core/src/main/java/org/apache/calcite/sql/advise/package-info.java index 2b2726e43053..8b8b0d86c482 100644 --- a/core/src/main/java/org/apache/calcite/sql/advise/package-info.java +++ b/core/src/main/java/org/apache/calcite/sql/advise/package-info.java @@ -24,4 +24,7 @@ *

    The advisor uses the validation and parser framework set up in * org.apache.calcite.sql.validate package. */ +@NullMarked package org.apache.calcite.sql.advise; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/sql/ddl/SqlAttributeDefinition.java b/core/src/main/java/org/apache/calcite/sql/ddl/SqlAttributeDefinition.java index 494c262959a0..9ef3fbcd2ff8 100644 --- a/core/src/main/java/org/apache/calcite/sql/ddl/SqlAttributeDefinition.java +++ b/core/src/main/java/org/apache/calcite/sql/ddl/SqlAttributeDefinition.java @@ -30,7 +30,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; @@ -72,7 +72,7 @@ public class SqlAttributeDefinition extends SqlCall { return OPERATOR; } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public List getOperandList() { return ImmutableNullableList.of(name, dataType, expression, collation != null ? collation.asList() : null); diff --git a/core/src/main/java/org/apache/calcite/sql/ddl/SqlCheckConstraint.java b/core/src/main/java/org/apache/calcite/sql/ddl/SqlCheckConstraint.java index 8106f2d1e81c..69427c1fdc49 100644 --- a/core/src/main/java/org/apache/calcite/sql/ddl/SqlCheckConstraint.java +++ b/core/src/main/java/org/apache/calcite/sql/ddl/SqlCheckConstraint.java @@ -27,7 +27,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; @@ -64,7 +64,7 @@ public class SqlCheckConstraint extends SqlCall { return OPERATOR; } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public List getOperandList() { return ImmutableNullableList.of(name, expression); } diff --git a/core/src/main/java/org/apache/calcite/sql/ddl/SqlColumnDeclaration.java b/core/src/main/java/org/apache/calcite/sql/ddl/SqlColumnDeclaration.java index d57fcb502b2b..6e39b1fb6f81 100644 --- a/core/src/main/java/org/apache/calcite/sql/ddl/SqlColumnDeclaration.java +++ b/core/src/main/java/org/apache/calcite/sql/ddl/SqlColumnDeclaration.java @@ -29,7 +29,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; @@ -76,7 +76,7 @@ public class SqlColumnDeclaration extends SqlCall { return OPERATOR; } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public List getOperandList() { return ImmutableNullableList.of(name, dataType, expression, strategy != null ? new SqlIdentifier(strategy.name(), SqlParserPos.ZERO) : null); diff --git a/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateForeignSchema.java b/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateForeignSchema.java index e7a4993d8d8d..4e4fb30a1988 100644 --- a/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateForeignSchema.java +++ b/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateForeignSchema.java @@ -32,15 +32,13 @@ 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.List; import static com.google.common.base.Preconditions.checkArgument; -import static org.apache.calcite.linq4j.Nullness.castNonNull; - import static java.util.Objects.requireNonNull; /** @@ -79,7 +77,7 @@ public class SqlCreateForeignSchema extends SqlCreate { this.optionList = optionList; // may be null } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public List getOperandList() { return ImmutableNullableList.of( SqlLiteral.createBoolean(getReplace(), SqlParserPos.ZERO), @@ -133,8 +131,8 @@ private static List> options( } return new AbstractList>() { @Override public Pair get(int index) { - return Pair.of((SqlIdentifier) castNonNull(optionList.get(index * 2)), - castNonNull(optionList.get(index * 2 + 1))); + return Pair.of((SqlIdentifier) optionList.get(index * 2), + optionList.get(index * 2 + 1)); } @Override public int size() { diff --git a/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateFunction.java b/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateFunction.java index fb859b2013d0..9c74ebec37be 100644 --- a/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateFunction.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/sql/ddl/SqlCreateMaterializedView.java b/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateMaterializedView.java index 3894cc276971..0ffbfbbd6bb8 100644 --- a/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateMaterializedView.java +++ b/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateMaterializedView.java @@ -29,7 +29,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; @@ -66,7 +66,7 @@ public class SqlCreateMaterializedView extends SqlCreate { this.query = requireNonNull(query, "query"); } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public List getOperandList() { return ImmutableNullableList.of( SqlLiteral.createBoolean(getReplace(), SqlParserPos.ZERO), diff --git a/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateSchema.java b/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateSchema.java index d661daadc219..b028b888d06c 100644 --- a/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateSchema.java +++ b/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateSchema.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; diff --git a/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateTable.java b/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateTable.java index 51d4469dcf42..84b05b0a9b50 100644 --- a/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateTable.java +++ b/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateTable.java @@ -29,7 +29,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; @@ -71,7 +71,7 @@ protected SqlCreateTable(SqlParserPos pos, boolean replace, boolean ifNotExists, this(OPERATOR, pos, replace, ifNotExists, name, columnList, query); } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public List getOperandList() { return ImmutableNullableList.of( SqlLiteral.createBoolean(getReplace(), SqlParserPos.ZERO), diff --git a/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateTableLike.java b/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateTableLike.java index 225ae2d8d855..559f53344635 100644 --- a/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateTableLike.java +++ b/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateTableLike.java @@ -30,7 +30,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.HashSet; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateType.java b/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateType.java index 7e4dc1f632d8..5a3c363b9e7a 100644 --- a/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateType.java +++ b/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateType.java @@ -30,7 +30,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; @@ -65,7 +65,7 @@ public class SqlCreateType extends SqlCreate { this.dataType = dataType; // may be null } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public List getOperandList() { return ImmutableNullableList.of( SqlLiteral.createBoolean(getReplace(), SqlParserPos.ZERO), diff --git a/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateView.java b/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateView.java index 53a688acfe2c..821d4f778fcb 100644 --- a/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateView.java +++ b/core/src/main/java/org/apache/calcite/sql/ddl/SqlCreateView.java @@ -29,7 +29,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; @@ -64,7 +64,7 @@ public class SqlCreateView extends SqlCreate { this.query = requireNonNull(query, "query"); } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public List getOperandList() { return ImmutableNullableList.of( SqlLiteral.createBoolean(getReplace(), SqlParserPos.ZERO), diff --git a/core/src/main/java/org/apache/calcite/sql/ddl/SqlDropFunction.java b/core/src/main/java/org/apache/calcite/sql/ddl/SqlDropFunction.java index a8601ba9d0f8..1bd792efd871 100644 --- a/core/src/main/java/org/apache/calcite/sql/ddl/SqlDropFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/ddl/SqlDropFunction.java @@ -25,7 +25,7 @@ import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.parser.SqlParserPos; -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/sql/ddl/SqlDropMaterializedView.java b/core/src/main/java/org/apache/calcite/sql/ddl/SqlDropMaterializedView.java index 09807cbc96a8..5f1d735f323a 100644 --- a/core/src/main/java/org/apache/calcite/sql/ddl/SqlDropMaterializedView.java +++ b/core/src/main/java/org/apache/calcite/sql/ddl/SqlDropMaterializedView.java @@ -25,7 +25,7 @@ import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.parser.SqlParserPos; -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/sql/ddl/SqlDropSchema.java b/core/src/main/java/org/apache/calcite/sql/ddl/SqlDropSchema.java index 95689c29ef25..0820240abcac 100644 --- a/core/src/main/java/org/apache/calcite/sql/ddl/SqlDropSchema.java +++ b/core/src/main/java/org/apache/calcite/sql/ddl/SqlDropSchema.java @@ -29,7 +29,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/sql/ddl/SqlDropTable.java b/core/src/main/java/org/apache/calcite/sql/ddl/SqlDropTable.java index 314686f1e310..7510471b5da5 100644 --- a/core/src/main/java/org/apache/calcite/sql/ddl/SqlDropTable.java +++ b/core/src/main/java/org/apache/calcite/sql/ddl/SqlDropTable.java @@ -25,7 +25,7 @@ import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.parser.SqlParserPos; -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/sql/ddl/SqlDropType.java b/core/src/main/java/org/apache/calcite/sql/ddl/SqlDropType.java index 06ecf7427038..6162b70f4c55 100644 --- a/core/src/main/java/org/apache/calcite/sql/ddl/SqlDropType.java +++ b/core/src/main/java/org/apache/calcite/sql/ddl/SqlDropType.java @@ -25,7 +25,7 @@ import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.parser.SqlParserPos; -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/sql/ddl/SqlDropView.java b/core/src/main/java/org/apache/calcite/sql/ddl/SqlDropView.java index ff2d669a6810..8fca63c87f3d 100644 --- a/core/src/main/java/org/apache/calcite/sql/ddl/SqlDropView.java +++ b/core/src/main/java/org/apache/calcite/sql/ddl/SqlDropView.java @@ -25,7 +25,7 @@ import org.apache.calcite.sql.SqlSpecialOperator; import org.apache.calcite.sql.parser.SqlParserPos; -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/sql/ddl/SqlKeyConstraint.java b/core/src/main/java/org/apache/calcite/sql/ddl/SqlKeyConstraint.java index 37ad08be223e..7ed8b6eb326f 100644 --- a/core/src/main/java/org/apache/calcite/sql/ddl/SqlKeyConstraint.java +++ b/core/src/main/java/org/apache/calcite/sql/ddl/SqlKeyConstraint.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; @@ -91,7 +91,7 @@ public static SqlKeyConstraint primary(SqlParserPos pos, SqlIdentifier name, return UNIQUE; } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public List getOperandList() { return ImmutableNullableList.of(name, columnList); } diff --git a/core/src/main/java/org/apache/calcite/sql/ddl/SqlTruncateTable.java b/core/src/main/java/org/apache/calcite/sql/ddl/SqlTruncateTable.java index 1c633c819f72..08bff251fdce 100644 --- a/core/src/main/java/org/apache/calcite/sql/ddl/SqlTruncateTable.java +++ b/core/src/main/java/org/apache/calcite/sql/ddl/SqlTruncateTable.java @@ -29,7 +29,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/sql/ddl/package-info.java b/core/src/main/java/org/apache/calcite/sql/ddl/package-info.java index 669d4c9491c7..fefba9b62768 100644 --- a/core/src/main/java/org/apache/calcite/sql/ddl/package-info.java +++ b/core/src/main/java/org/apache/calcite/sql/ddl/package-info.java @@ -27,4 +27,7 @@ * the parser and its supporting classes into your own module, rather than try * to extend this one. */ +@NullMarked package org.apache.calcite.sql.ddl; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/sql/dialect/BigQuerySqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/BigQuerySqlDialect.java index 13314a1aeda1..ba56730c32db 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/BigQuerySqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/BigQuerySqlDialect.java @@ -48,7 +48,7 @@ import com.google.common.collect.ImmutableList; -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/sql/dialect/ClickHouseSqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/ClickHouseSqlDialect.java index fd5a719e1a38..49c51ab8bd63 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/ClickHouseSqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/ClickHouseSqlDialect.java @@ -45,7 +45,7 @@ import org.apache.calcite.sql.type.SqlTypeName; import org.apache.calcite.util.RelToSqlConverterUtil; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Locale; diff --git a/core/src/main/java/org/apache/calcite/sql/dialect/DorisSqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/DorisSqlDialect.java index 3f7e10d00265..ba2c27fa750f 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/DorisSqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/DorisSqlDialect.java @@ -25,7 +25,7 @@ import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.fun.SqlFloorFunction; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static org.apache.calcite.util.RelToSqlConverterUtil.unparseSparkArrayAndMap; diff --git a/core/src/main/java/org/apache/calcite/sql/dialect/ExasolSqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/ExasolSqlDialect.java index e3122b41a165..5a47ccbb0399 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/ExasolSqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/ExasolSqlDialect.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.List; import java.util.Locale; diff --git a/core/src/main/java/org/apache/calcite/sql/dialect/FireboltSqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/FireboltSqlDialect.java index 0b2d9e0e3490..12eee4a05dd1 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/FireboltSqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/FireboltSqlDialect.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.Arrays; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/sql/dialect/HiveSqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/HiveSqlDialect.java index 689ecc1ecf60..41893b1227d9 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/HiveSqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/HiveSqlDialect.java @@ -40,7 +40,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static org.apache.calcite.util.RelToSqlConverterUtil.unparseSparkArrayAndMap; diff --git a/core/src/main/java/org/apache/calcite/sql/dialect/HsqldbSqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/HsqldbSqlDialect.java index e5b47913589a..1ae53bdaa60e 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/HsqldbSqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/HsqldbSqlDialect.java @@ -33,7 +33,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * A SqlDialect implementation for the Hsqldb database. diff --git a/core/src/main/java/org/apache/calcite/sql/dialect/JethroDataSqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/JethroDataSqlDialect.java index 0dddb6de0522..c1e2c377931a 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/JethroDataSqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/JethroDataSqlDialect.java @@ -28,7 +28,7 @@ import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.sql.Connection; import java.sql.DatabaseMetaData; diff --git a/core/src/main/java/org/apache/calcite/sql/dialect/MssqlSqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/MssqlSqlDialect.java index 964fa03f8f91..f93ab2e09ccf 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/MssqlSqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/MssqlSqlDialect.java @@ -46,7 +46,7 @@ import org.apache.calcite.sql.type.ReturnTypes; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static org.apache.calcite.util.RelToSqlConverterUtil.unparseBoolLiteralToCondition; diff --git a/core/src/main/java/org/apache/calcite/sql/dialect/MysqlSqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/MysqlSqlDialect.java index 1f114a155331..539a982b4474 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/MysqlSqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/MysqlSqlDialect.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.util.List; import java.util.Locale; diff --git a/core/src/main/java/org/apache/calcite/sql/dialect/OracleSqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/OracleSqlDialect.java index 9aab15f5e247..a8e0b3098328 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/OracleSqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/OracleSqlDialect.java @@ -41,7 +41,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/sql/dialect/PhoenixSqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/PhoenixSqlDialect.java index c3cebb92ae42..dfb22f323385 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/PhoenixSqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/PhoenixSqlDialect.java @@ -27,7 +27,7 @@ import org.apache.calcite.sql.type.AbstractSqlType; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * A SqlDialect implementation for the Apache Phoenix database. diff --git a/core/src/main/java/org/apache/calcite/sql/dialect/PostgresqlSqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/PostgresqlSqlDialect.java index 19342fa4059f..4bb2137e3e64 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/PostgresqlSqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/PostgresqlSqlDialect.java @@ -52,7 +52,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.Locale; diff --git a/core/src/main/java/org/apache/calcite/sql/dialect/PrestoSqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/PrestoSqlDialect.java index 1d8479aa5811..a3aeb7b15910 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/PrestoSqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/PrestoSqlDialect.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.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/sql/dialect/RedshiftSqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/RedshiftSqlDialect.java index 7caf2ab2be24..5da2ff007a2b 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/RedshiftSqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/RedshiftSqlDialect.java @@ -28,7 +28,7 @@ import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * A SqlDialect implementation for the Redshift database. diff --git a/core/src/main/java/org/apache/calcite/sql/dialect/SnowflakeSqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/SnowflakeSqlDialect.java index 9deb0836eeea..d736a2aa9eea 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/SnowflakeSqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/SnowflakeSqlDialect.java @@ -29,7 +29,7 @@ import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * A SqlDialect implementation for the Snowflake database. diff --git a/core/src/main/java/org/apache/calcite/sql/dialect/SparkSqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/SparkSqlDialect.java index 6f6e3d3917b6..baaab0ef2ddb 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/SparkSqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/SparkSqlDialect.java @@ -41,7 +41,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static org.apache.calcite.util.RelToSqlConverterUtil.unparseHiveTrim; import static org.apache.calcite.util.RelToSqlConverterUtil.unparseSparkArrayAndMap; diff --git a/core/src/main/java/org/apache/calcite/sql/dialect/SqliteSqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/SqliteSqlDialect.java index 833ac5c10d96..53bc71cb03c7 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/SqliteSqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/SqliteSqlDialect.java @@ -35,7 +35,7 @@ import org.apache.calcite.sql.type.ReturnTypes; import org.apache.calcite.util.RelToSqlConverterUtil; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * A SqliteSqlDialect implementation for the SQLite database. diff --git a/core/src/main/java/org/apache/calcite/sql/dialect/StarRocksSqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/StarRocksSqlDialect.java index a877623bb2a2..dc2fed680d71 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/StarRocksSqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/StarRocksSqlDialect.java @@ -39,7 +39,7 @@ import org.apache.calcite.sql.type.SqlTypeName; import org.apache.calcite.util.RelToSqlConverterUtil; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static org.apache.calcite.util.RelToSqlConverterUtil.unparseHiveTrim; diff --git a/core/src/main/java/org/apache/calcite/sql/dialect/SybaseSqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/SybaseSqlDialect.java index f62e1d820d61..48d17b48a3f7 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/SybaseSqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/SybaseSqlDialect.java @@ -20,7 +20,7 @@ import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlWriter; -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/sql/dialect/TrinoSqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/TrinoSqlDialect.java index 5e5beac9e3ad..d2d6abc0b82f 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/TrinoSqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/TrinoSqlDialect.java @@ -25,7 +25,7 @@ import org.apache.calcite.sql.fun.SqlStdOperatorTable; import org.apache.calcite.util.RelToSqlConverterUtil; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * A SqlDialect implementation for the Trino database. diff --git a/core/src/main/java/org/apache/calcite/sql/dialect/VerticaSqlDialect.java b/core/src/main/java/org/apache/calcite/sql/dialect/VerticaSqlDialect.java index 1b28d9e10986..17d6b037c811 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/VerticaSqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/VerticaSqlDialect.java @@ -23,7 +23,7 @@ import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlWriter; -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/sql/dialect/package-info.java b/core/src/main/java/org/apache/calcite/sql/dialect/package-info.java index 058a471a914b..7b3504f7e566 100644 --- a/core/src/main/java/org/apache/calcite/sql/dialect/package-info.java +++ b/core/src/main/java/org/apache/calcite/sql/dialect/package-info.java @@ -18,4 +18,7 @@ /** * SQL unparsers for JDBC dialects. */ +@NullMarked package org.apache.calcite.sql.dialect; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlAbstractGroupFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlAbstractGroupFunction.java index a4aa00477c7b..13aecbd3d9ba 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlAbstractGroupFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlAbstractGroupFunction.java @@ -34,7 +34,7 @@ import org.apache.calcite.util.Optionality; import org.apache.calcite.util.Static; -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/sql/fun/SqlAnyValueAggFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlAnyValueAggFunction.java index f83e4f129fd1..6ffb90af45a9 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlAnyValueAggFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlAnyValueAggFunction.java @@ -24,7 +24,7 @@ import org.apache.calcite.sql.type.ReturnTypes; import org.apache.calcite.util.Optionality; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static com.google.common.base.Preconditions.checkArgument; @@ -55,7 +55,7 @@ public SqlAnyValueAggFunction(SqlKind kind) { //~ Methods ---------------------------------------------------------------- - @Override public @Nullable T unwrap(Class clazz) { + @Override public @Nullable T unwrap(Class clazz) { if (clazz.isInstance(SqlSplittableAggFunction.SelfSplitter.INSTANCE)) { return clazz.cast(SqlSplittableAggFunction.SelfSplitter.INSTANCE); } diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlAvgAggFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlAvgAggFunction.java index 93ccca514150..b25916ecd82e 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlAvgAggFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlAvgAggFunction.java @@ -27,7 +27,7 @@ import org.apache.calcite.sql.type.ReturnTypes; import org.apache.calcite.util.Optionality; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static com.google.common.base.Preconditions.checkArgument; diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlBasicAggFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlBasicAggFunction.java index 76b7e4de4489..7a74b3e5f500 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlBasicAggFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlBasicAggFunction.java @@ -32,7 +32,7 @@ import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.util.Optionality; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static java.util.Objects.requireNonNull; @@ -103,7 +103,7 @@ public static SqlBasicAggFunction create(String name, SqlKind kind, //~ Methods ---------------------------------------------------------------- - @Override public @Nullable T unwrap(Class clazz) { + @Override public @Nullable T unwrap(Class clazz) { if (clazz.isInstance(staticFun)) { return clazz.cast(staticFun); } diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlBetweenOperator.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlBetweenOperator.java index 7d11e510a223..470031f2932a 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlBetweenOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlBetweenOperator.java @@ -37,6 +37,8 @@ import org.apache.calcite.util.Litmus; import org.apache.calcite.util.Util; +import org.jspecify.annotations.Nullable; + import static org.apache.calcite.util.Static.RESOURCE; /** @@ -263,8 +265,8 @@ private static SqlBetweenOperator of(boolean negated, boolean symmetric) { /** * Finds an AND operator in an expression. */ - private static class AndFinder extends SqlBasicVisitor { - @Override public Void visit(SqlCall call) { + private static class AndFinder extends SqlBasicVisitor<@Nullable Void> { + @Override public @Nullable Void visit(SqlCall call) { final SqlOperator operator = call.getOperator(); if (operator == SqlStdOperatorTable.AND) { throw Util.FoundOne.NULL; diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlBitOpAggFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlBitOpAggFunction.java index 2f60a1185979..adabecabae88 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlBitOpAggFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlBitOpAggFunction.java @@ -24,7 +24,7 @@ import org.apache.calcite.sql.type.ReturnTypes; import org.apache.calcite.util.Optionality; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static com.google.common.base.Preconditions.checkArgument; @@ -73,7 +73,7 @@ public SqlBitOpAggFunction(String name, SqlKind kind) { || kind == SqlKind.BIT_XOR); } - @Override public @Nullable T unwrap(Class clazz) { + @Override public @Nullable T unwrap(Class clazz) { if (clazz.isInstance(SqlSplittableAggFunction.SelfSplitter.INSTANCE)) { return clazz.cast(SqlSplittableAggFunction.SelfSplitter.INSTANCE); } diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlCallFactory.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlCallFactory.java index 015f482b7c4b..550bf6c5c79e 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlCallFactory.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlCallFactory.java @@ -22,7 +22,7 @@ import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.parser.SqlParserPos; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * A factory for creating {@link org.apache.calcite.sql.SqlCall}. diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlCase.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlCase.java index 26ba031a28d4..eb9c246f826a 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlCase.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlCase.java @@ -25,7 +25,7 @@ import org.apache.calcite.sql.parser.SqlParserPos; import org.apache.calcite.util.UnmodifiableArrayList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -102,12 +102,12 @@ public static SqlCase createSwitched(SqlParserPos pos, @Nullable SqlNode value, return SqlStdOperatorTable.CASE; } - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") @Override public List getOperandList() { return UnmodifiableArrayList.of(value, whenList, thenList, elseExpr); } - @SuppressWarnings("assignment.type.incompatible") + @SuppressWarnings("NullAway") @Override public void setOperand(int i, @Nullable SqlNode operand) { switch (i) { case 0: diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlCaseOperator.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlCaseOperator.java index 4d5cbf9a6dc4..23b68cd39823 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlCaseOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlCaseOperator.java @@ -47,7 +47,7 @@ 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; @@ -330,7 +330,7 @@ private static RelDataType inferTypeFromOperands(SqlOperatorBinding opBinding) { return SqlSyntax.SPECIAL; } - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") @Override public SqlCall createCall( @Nullable SqlLiteral functionQualifier, SqlParserPos pos, diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlCoalesceFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlCoalesceFunction.java index 4a3fc60282e7..1a437191a162 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlCoalesceFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlCoalesceFunction.java @@ -35,7 +35,7 @@ import org.apache.calcite.sql.validate.implicit.TypeCoercion; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.NonNull; +import org.jspecify.annotations.NonNull; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlColonOperator.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlColonOperator.java index a1ac8e5d417f..c1b7a4507167 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlColonOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlColonOperator.java @@ -33,6 +33,8 @@ import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.util.Litmus; +import org.jspecify.annotations.Nullable; + import java.util.Arrays; import static java.util.Objects.requireNonNull; @@ -50,7 +52,7 @@ public class SqlColonOperator extends SqlSpecialOperator { // Path segments are structural literals/identifiers, never column refs, so // they must not be routed through expression visitors such as AggChecker. - @Override public void acceptCall(SqlVisitor visitor, SqlCall call, + @Override public void acceptCall(SqlVisitor visitor, SqlCall call, boolean onlyExpressions, SqlBasicVisitor.ArgHandler argHandler) { if (onlyExpressions) { argHandler.visitChild(visitor, call, 0, call.operand(0)); diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlConvertFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlConvertFunction.java index a57e59aa908c..5e5e979fa51a 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlConvertFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlConvertFunction.java @@ -41,7 +41,7 @@ import org.apache.calcite.sql.validate.SqlValidator; import org.apache.calcite.sql.validate.SqlValidatorScope; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.nio.charset.Charset; import java.util.List; @@ -101,7 +101,7 @@ protected SqlConvertFunction(String name, SqlKind kind, super.validateQuantifier(validator, call); } - @Override public void acceptCall(SqlVisitor visitor, SqlCall call, + @Override public void acceptCall(SqlVisitor visitor, SqlCall call, boolean onlyExpressions, SqlBasicVisitor.ArgHandler argHandler) { if (onlyExpressions) { // Both operand[1] and operand[2] are not an expression, but Charset diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlCountAggFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlCountAggFunction.java index 3007ad346593..80b6186fdf2b 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlCountAggFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlCountAggFunction.java @@ -35,7 +35,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -91,7 +91,7 @@ public SqlCountAggFunction(String name, return super.deriveType(validator, scope, call); } - @Override public @Nullable T unwrap(Class clazz) { + @Override public @Nullable T unwrap(Class clazz) { if (clazz.isInstance(SqlSplittableAggFunction.CountSplitter.INSTANCE)) { return clazz.cast(SqlSplittableAggFunction.CountSplitter.INSTANCE); } diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlDotOperator.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlDotOperator.java index 9d9749c3e589..88c9c6bc0eb1 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlDotOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlDotOperator.java @@ -43,6 +43,8 @@ import org.apache.calcite.util.Litmus; import org.apache.calcite.util.Static; +import org.jspecify.annotations.Nullable; + import java.util.Arrays; import static org.apache.calcite.sql.validate.SqlNonNullableAccessors.getOperandLiteralValueOrThrow; @@ -86,7 +88,7 @@ public class SqlDotOperator extends SqlSpecialOperator { return SqlOperandCountRanges.of(2); } - @Override public void acceptCall(SqlVisitor visitor, SqlCall call, + @Override public void acceptCall(SqlVisitor visitor, SqlCall call, boolean onlyExpressions, SqlBasicVisitor.ArgHandler argHandler) { if (onlyExpressions) { // Do not visit operands[1] -- it is not an expression. diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlFloorFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlFloorFunction.java index 784cf4d22734..18ddbe98bc46 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlFloorFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlFloorFunction.java @@ -37,7 +37,7 @@ import org.apache.calcite.sql.validate.SqlValidator; import org.apache.calcite.sql.validate.SqlValidatorScope; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static com.google.common.base.Preconditions.checkArgument; diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlGroupingFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlGroupingFunction.java index caf4aefc871a..c6dd1b4977c2 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlGroupingFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlGroupingFunction.java @@ -28,7 +28,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; @@ -84,7 +84,7 @@ class SqlGroupingFunction extends SqlAbstractGroupFunction { return null; } - @Override public @Nullable T unwrap(Class clazz) { + @Override public @Nullable T unwrap(Class clazz) { if (clazz.isInstance(STATIC)) { return clazz.cast(STATIC); } diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlInternalOperators.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlInternalOperators.java index d1429f501b04..e86830b156fd 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlInternalOperators.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlInternalOperators.java @@ -34,7 +34,7 @@ import org.apache.calcite.sql.type.SqlTypeTransforms; import org.apache.calcite.util.Litmus; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -57,7 +57,7 @@ private SqlInternalOperators() { new SqlRowOperator("$ANONYMOUS_ROW") { @Override public void unparse(SqlWriter writer, SqlCall call, int leftPrec, int rightPrec) { - @SuppressWarnings("assignment.type.incompatible") + @SuppressWarnings("NullAway") List<@Nullable SqlNode> operandList = call.getOperandList(); writer.list(SqlWriter.FrameTypeEnum.PARENTHESES, SqlWriter.COMMA, SqlNodeList.of(call.getParserPosition(), operandList)); diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonArrayAggAggFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonArrayAggAggFunction.java index cce6f38ff2bd..c491fb9197ff 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonArrayAggAggFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonArrayAggAggFunction.java @@ -34,7 +34,7 @@ import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.util.Optionality; -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/sql/fun/SqlJsonArrayFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonArrayFunction.java index a0fa2f2766ed..edbdd3f39bfa 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonArrayFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonArrayFunction.java @@ -33,7 +33,7 @@ import org.apache.calcite.sql.type.SqlOperandTypeChecker; import org.apache.calcite.sql.validate.SqlValidator; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Locale; diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonDepthFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonDepthFunction.java index 91a017bca6a6..5deb0386d5f8 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonDepthFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonDepthFunction.java @@ -28,7 +28,7 @@ import org.apache.calcite.sql.type.SqlTypeTransforms; import org.apache.calcite.sql.validate.SqlValidator; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * The JSON_DEPTH function. diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonModifyFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonModifyFunction.java index ba8896bf7c72..e3060af3608a 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonModifyFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonModifyFunction.java @@ -31,7 +31,7 @@ import org.apache.calcite.sql.type.SqlTypeUtil; import org.apache.calcite.sql.validate.SqlValidator; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Locale; diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonObjectFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonObjectFunction.java index 61d8393b39b7..be69ecdf3c07 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonObjectFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonObjectFunction.java @@ -36,7 +36,7 @@ import org.apache.calcite.sql.type.SqlTypeUtil; import org.apache.calcite.sql.validate.SqlValidator; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Locale; diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonPrettyFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonPrettyFunction.java index ab20f71f5e0a..00ef8ceb68be 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonPrettyFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonPrettyFunction.java @@ -28,7 +28,7 @@ import org.apache.calcite.sql.type.SqlTypeTransforms; import org.apache.calcite.sql.validate.SqlValidator; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * The JSON_TYPE function. diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonQueryFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonQueryFunction.java index ba3d0c31bf93..6984718b2aef 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonQueryFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonQueryFunction.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.ArrayList; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonTypeFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonTypeFunction.java index 12929993659d..1fb64bff210b 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonTypeFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonTypeFunction.java @@ -29,7 +29,7 @@ import org.apache.calcite.sql.type.SqlTypeTransforms; import org.apache.calcite.sql.validate.SqlValidator; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * The JSON_TYPE function. diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonValueFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonValueFunction.java index 005b4f46134a..cf4e53713f5c 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonValueFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlJsonValueFunction.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.util.ArrayList; import java.util.Arrays; diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlLibrary.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlLibrary.java index 2bdb1e8535d0..1615406bc559 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlLibrary.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlLibrary.java @@ -22,7 +22,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Arrays; import java.util.LinkedHashSet; @@ -34,7 +34,7 @@ import static com.google.common.base.Preconditions.checkArgument; import static org.apache.calcite.util.Util.filter; -import static org.apache.calcite.util.Util.first; +import static org.apache.calcite.util.Util.firstNonNull; import static java.util.Objects.requireNonNull; @@ -135,7 +135,7 @@ public List children() { *

    For example, {@link #REDSHIFT} inherits from {@link #POSTGRESQL}. * Never returns null. */ public Set inheritors() { - return first(INHERITOR_MAP.get(this), ImmutableSet.of()); + return firstNonNull(INHERITOR_MAP.get(this), ImmutableSet.of()); } /** Looks up a value. diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlLibraryOperatorTableFactory.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlLibraryOperatorTableFactory.java index 7cea1c9bde0f..645e30bdc2ce 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlLibraryOperatorTableFactory.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlLibraryOperatorTableFactory.java @@ -70,7 +70,7 @@ private SqlLibraryOperatorTableFactory(Class... classes) { /** A cache that returns an operator table for a given library (or set of * libraries). */ - @SuppressWarnings("methodref.receiver.bound.invalid") + @SuppressWarnings("NullAway") private final LoadingCache, SqlOperatorTable> cache = CacheBuilder.newBuilder().build(CacheLoader.from(this::create)); diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlLibraryOperators.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlLibraryOperators.java index 174f562a805e..d58dc0ba751c 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlLibraryOperators.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlLibraryOperators.java @@ -54,7 +54,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; @@ -1441,7 +1441,7 @@ private static RelDataType mapReturnType(SqlOperatorBinding opBinding) { OperandTypes.MAP_FUNCTION, SqlFunctionCategory.SYSTEM); - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") private static RelDataType arrayAppendPrependReturnType(SqlOperatorBinding opBinding) { final RelDataType arrayType = opBinding.collectOperandTypes().get(0); final RelDataType componentType = arrayType.getComponentType(); @@ -1493,7 +1493,7 @@ private static RelDataType arrayAppendPrependReturnType(SqlOperatorBinding opBin ReturnTypes.BOOLEAN_NULLABLE, OperandTypes.EXISTS); - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") private static RelDataType arrayCompactReturnType(SqlOperatorBinding opBinding) { final RelDataType arrayType = opBinding.collectOperandTypes().get(0); if (arrayType.getSqlTypeName() == SqlTypeName.NULL) { @@ -1573,7 +1573,7 @@ private static RelDataType arrayCompactReturnType(SqlOperatorBinding opBinding) OperandTypes.SAME_SAME, OperandTypes.family(SqlTypeFamily.ARRAY, SqlTypeFamily.ARRAY))); - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") private static RelDataType arrayInsertReturnType(SqlOperatorBinding opBinding) { final List operandTypes = opBinding.collectOperandTypes(); final RelDataType arrayType = operandTypes.get(0); diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlLiteralAggFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlLiteralAggFunction.java index 007f708f6e9d..c6d6d61997b1 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlLiteralAggFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlLiteralAggFunction.java @@ -29,7 +29,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; /** * The {@code LITERAL_AGG} aggregate function. diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlMapValueConstructor.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlMapValueConstructor.java index e7c013247242..52d56ce6f900 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlMapValueConstructor.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlMapValueConstructor.java @@ -26,7 +26,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.List; @@ -46,7 +46,7 @@ public SqlMapValueConstructor() { super("MAP", SqlKind.MAP_VALUE_CONSTRUCTOR, null); } - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") @Override public RelDataType inferReturnType(SqlOperatorBinding opBinding) { Pair<@Nullable RelDataType, @Nullable RelDataType> type = getComponentTypes( diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlMinMaxAggFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlMinMaxAggFunction.java index 2196a3647c2d..5bde15271ab5 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlMinMaxAggFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlMinMaxAggFunction.java @@ -29,7 +29,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -145,7 +145,7 @@ public int getMinMaxKind() { } } - @Override public @Nullable T unwrap(Class clazz) { + @Override public @Nullable T unwrap(Class clazz) { if (clazz.isInstance(SqlSplittableAggFunction.SelfSplitter.INSTANCE)) { return clazz.cast(SqlSplittableAggFunction.SelfSplitter.INSTANCE); } diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlMonotonicUnaryFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlMonotonicUnaryFunction.java index 22e9cd58591b..4c17467d1ee1 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlMonotonicUnaryFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlMonotonicUnaryFunction.java @@ -25,7 +25,7 @@ import org.apache.calcite.sql.type.SqlReturnTypeInference; import org.apache.calcite.sql.validate.SqlMonotonicity; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Base class for unary operators such as FLOOR/CEIL which are monotonic for diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlMultisetValueConstructor.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlMultisetValueConstructor.java index 99ee65736f87..f48144c2be9d 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlMultisetValueConstructor.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlMultisetValueConstructor.java @@ -31,7 +31,7 @@ import org.apache.calcite.sql.type.SqlOperandTypeInference; import org.apache.calcite.sql.type.SqlTypeUtil; -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/sql/fun/SqlOverlapsOperator.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlOverlapsOperator.java index 550b6c65c512..775d572e8a7c 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlOverlapsOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlOverlapsOperator.java @@ -33,7 +33,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * SqlOverlapsOperator represents the SQL:1999 standard {@code OVERLAPS} diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlQuantifyOperator.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlQuantifyOperator.java index 041d7abf09bb..872dda927a30 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlQuantifyOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlQuantifyOperator.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/sql/fun/SqlRowOperator.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlRowOperator.java index eaa77f03d55e..a854b1e6076c 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlRowOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlRowOperator.java @@ -31,7 +31,7 @@ import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.util.ImmutableNullableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -95,10 +95,9 @@ public SqlRowOperator(String name, @Nullable List fi final RelDataTypeFactory typeFactory = opBinding.getTypeFactory(); final RelDataTypeFactory.Builder builder = typeFactory.builder(); for (int i = 0; i < opBinding.getOperandCount(); i++) { + final String givenName = fieldNames == null ? null : fieldNames.get(i); final String fieldName = - fieldNames != null && fieldNames.get(i) != null - ? fieldNames.get(i) - : SqlUtil.deriveAliasFromOrdinal(i); + givenName != null ? givenName : SqlUtil.deriveAliasFromOrdinal(i); builder.add(fieldName, opBinding.getOperandType(i)); } final RelDataType recordType = builder.build(); diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlSingleValueAggFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlSingleValueAggFunction.java index 18973d2afe8d..910e3630c26f 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlSingleValueAggFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlSingleValueAggFunction.java @@ -28,7 +28,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -81,7 +81,7 @@ public RelDataType getType() { return type; } - @Override public @Nullable T unwrap(Class clazz) { + @Override public @Nullable T unwrap(Class clazz) { if (clazz.isInstance(SqlSplittableAggFunction.SelfSplitter.INSTANCE)) { return clazz.cast(SqlSplittableAggFunction.SelfSplitter.INSTANCE); } diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlSpatialTypeFunctions.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlSpatialTypeFunctions.java index 296ca3de0d5f..8008725c7759 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlSpatialTypeFunctions.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlSpatialTypeFunctions.java @@ -35,7 +35,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.locationtech.jts.geom.Geometry; import java.math.BigDecimal; @@ -156,8 +156,9 @@ public static class GridTable implements ScannableTable { if (geom != null && deltaX != null && deltaY != null) { if (deltaX.compareTo(BigDecimal.ZERO) > 0 && deltaY.compareTo(BigDecimal.ZERO) > 0) { - return new SpatialTypeFunctions.GridEnumerable(geom.getEnvelopeInternal(), deltaX, deltaY, - point); + return new SpatialTypeFunctions.GridEnumerable(geom.getEnvelopeInternal(), + deltaX, deltaY, point) + .select(row -> row); } } return Linq4j.emptyEnumerable(); diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlStdOperatorTable.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlStdOperatorTable.java index d50bc7299e67..f22b64021a4d 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlStdOperatorTable.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlStdOperatorTable.java @@ -81,7 +81,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.util.List; import java.util.function.BiConsumer; diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlSumAggFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlSumAggFunction.java index ba77d818f2ff..5ff0d4184667 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlSumAggFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlSumAggFunction.java @@ -28,7 +28,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -79,7 +79,7 @@ public RelDataType getType() { return type; } - @Override public @Nullable T unwrap(Class clazz) { + @Override public @Nullable T unwrap(Class clazz) { if (clazz.isInstance(SqlSplittableAggFunction.SumSplitter.INSTANCE)) { return clazz.cast(SqlSplittableAggFunction.SumSplitter.INSTANCE); } diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlSumEmptyIsZeroAggFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlSumEmptyIsZeroAggFunction.java index f3dbf54dae99..b32ee67606ad 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlSumEmptyIsZeroAggFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlSumEmptyIsZeroAggFunction.java @@ -29,7 +29,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -70,7 +70,7 @@ public SqlSumEmptyIsZeroAggFunction() { typeFactory.createSqlType(SqlTypeName.ANY), true); } - @Override public @Nullable T unwrap(Class clazz) { + @Override public @Nullable T unwrap(Class clazz) { if (clazz.isInstance(SqlSplittableAggFunction.Sum0Splitter.INSTANCE)) { return clazz.cast(SqlSplittableAggFunction.Sum0Splitter.INSTANCE); } diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlTimestampAddFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlTimestampAddFunction.java index ec886d201398..b825537750a4 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlTimestampAddFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlTimestampAddFunction.java @@ -34,7 +34,7 @@ import com.google.common.collect.ImmutableMap; -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/sql/fun/SqlTrimFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java index 7373bbc90029..4cda5ecc653c 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java @@ -35,7 +35,7 @@ import com.google.common.collect.ImmutableList; -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/sql/fun/package-info.java b/core/src/main/java/org/apache/calcite/sql/fun/package-info.java index 0bf59f39637c..9df53ce0cda0 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/package-info.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/package-info.java @@ -27,4 +27,7 @@ * which are not row-level (e.g. select and join) should be defined in package * {@link org.apache.calcite.sql} instead. */ +@NullMarked package org.apache.calcite.sql.fun; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/sql/package-info.java b/core/src/main/java/org/apache/calcite/sql/package-info.java index 27a8d137dd45..dd61d0df01bf 100644 --- a/core/src/main/java/org/apache/calcite/sql/package-info.java +++ b/core/src/main/java/org/apache/calcite/sql/package-info.java @@ -92,11 +92,7 @@ * {@link org.apache.calcite.sql.SqlNode}s into a SQL string. A * {@link org.apache.calcite.sql.SqlDialect} defines how this happens. */ -@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.sql; -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/sql/parser/Span.java b/core/src/main/java/org/apache/calcite/sql/parser/Span.java index c682769e6f6a..c8a257123105 100644 --- a/core/src/main/java/org/apache/calcite/sql/parser/Span.java +++ b/core/src/main/java/org/apache/calcite/sql/parser/Span.java @@ -19,7 +19,7 @@ import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; diff --git a/core/src/main/java/org/apache/calcite/sql/parser/SqlAbstractParserImpl.java b/core/src/main/java/org/apache/calcite/sql/parser/SqlAbstractParserImpl.java index 389a6fa56152..5b8a4bb9e54c 100644 --- a/core/src/main/java/org/apache/calcite/sql/parser/SqlAbstractParserImpl.java +++ b/core/src/main/java/org/apache/calcite/sql/parser/SqlAbstractParserImpl.java @@ -37,8 +37,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; -import org.checkerframework.checker.initialization.qual.UnderInitialization; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.Reader; import java.io.StringReader; @@ -432,7 +431,7 @@ public static Set getSql92ReservedWords() { * @param operands Operands to call * @return Call */ - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") protected SqlCall createCall( SqlIdentifier funName, SqlParserPos pos, @@ -741,7 +740,6 @@ public MetadataImpl(SqlAbstractParserImpl sqlParser) { * Initializes lists of keywords. */ private void initList( - @UnderInitialization MetadataImpl this, SqlAbstractParserImpl parserImpl, Set keywords, String name) { @@ -788,7 +786,6 @@ private void initList( * @return Result of calling method */ private @Nullable Object virtualCall( - @UnderInitialization MetadataImpl this, SqlAbstractParserImpl parserImpl, String name) throws Throwable { Class clazz = parserImpl.getClass(); @@ -804,8 +801,7 @@ private void initList( /** * Builds a comma-separated list of JDBC reserved words. */ - private String constructSql92ReservedWordList( - @UnderInitialization MetadataImpl this) { + private String constructSql92ReservedWordList() { StringBuilder sb = new StringBuilder(); TreeSet jdbcReservedSet = new TreeSet<>(); jdbcReservedSet.addAll(tokenSet); diff --git a/core/src/main/java/org/apache/calcite/sql/parser/SqlParserPos.java b/core/src/main/java/org/apache/calcite/sql/parser/SqlParserPos.java index ed74719ab332..ba0c508a7cbb 100644 --- a/core/src/main/java/org/apache/calcite/sql/parser/SqlParserPos.java +++ b/core/src/main/java/org/apache/calcite/sql/parser/SqlParserPos.java @@ -20,7 +20,7 @@ import com.google.common.collect.Lists; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.Serializable; import java.util.Collection; diff --git a/core/src/main/java/org/apache/calcite/sql/parser/SqlParserUtil.java b/core/src/main/java/org/apache/calcite/sql/parser/SqlParserUtil.java index 3c0b6bc99b6d..486c586ed51d 100644 --- a/core/src/main/java/org/apache/calcite/sql/parser/SqlParserUtil.java +++ b/core/src/main/java/org/apache/calcite/sql/parser/SqlParserUtil.java @@ -57,7 +57,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import java.io.StringReader; @@ -902,7 +902,7 @@ public static String rightTrim( * example, if list contains {A, B, C, D, E} then * replaceSublist(list, X, 1, 4) returns {A, X, E}. */ - public static void replaceSublist( + public static void replaceSublist( List list, int start, int end, diff --git a/core/src/main/java/org/apache/calcite/sql/parser/StringAndPos.java b/core/src/main/java/org/apache/calcite/sql/parser/StringAndPos.java index c2d8a23ae2e9..43103637ead1 100644 --- a/core/src/main/java/org/apache/calcite/sql/parser/StringAndPos.java +++ b/core/src/main/java/org/apache/calcite/sql/parser/StringAndPos.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.sql.parser; -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/sql/parser/impl/package-info.java b/core/src/main/java/org/apache/calcite/sql/parser/impl/package-info.java index ed141a67c449..4532b3ee50d2 100644 --- a/core/src/main/java/org/apache/calcite/sql/parser/impl/package-info.java +++ b/core/src/main/java/org/apache/calcite/sql/parser/impl/package-info.java @@ -19,4 +19,7 @@ * Contains generated code for the * {@link org.apache.calcite.sql.parser Calcite SQL parser}. */ +@NullMarked package org.apache.calcite.sql.parser.impl; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/sql/parser/package-info.java b/core/src/main/java/org/apache/calcite/sql/parser/package-info.java index 047c2e8e238f..385148825f70 100644 --- a/core/src/main/java/org/apache/calcite/sql/parser/package-info.java +++ b/core/src/main/java/org/apache/calcite/sql/parser/package-info.java @@ -18,4 +18,7 @@ /** * Provides a SQL parser. */ +@NullMarked package org.apache.calcite.sql.parser; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/sql/pretty/SqlPrettyWriter.java b/core/src/main/java/org/apache/calcite/sql/pretty/SqlPrettyWriter.java index 95fdfd27c221..e4c987f20994 100644 --- a/core/src/main/java/org/apache/calcite/sql/pretty/SqlPrettyWriter.java +++ b/core/src/main/java/org/apache/calcite/sql/pretty/SqlPrettyWriter.java @@ -31,7 +31,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.LoggerFactory; import java.io.PrintWriter; @@ -287,7 +287,7 @@ public class SqlPrettyWriter implements SqlWriter { //~ Constructors ----------------------------------------------------------- - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") private SqlPrettyWriter(SqlWriterConfig config, StringBuilder buf, @SuppressWarnings("unused") boolean ignore) { this.buf = requireNonNull(buf, "buf"); diff --git a/core/src/main/java/org/apache/calcite/sql/pretty/package-info.java b/core/src/main/java/org/apache/calcite/sql/pretty/package-info.java index b6bf65b03303..c56d9568a3b9 100644 --- a/core/src/main/java/org/apache/calcite/sql/pretty/package-info.java +++ b/core/src/main/java/org/apache/calcite/sql/pretty/package-info.java @@ -18,4 +18,7 @@ /** * Provides a pretty-printer for SQL statements. */ +@NullMarked package org.apache.calcite.sql.pretty; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/sql/type/AbstractSqlType.java b/core/src/main/java/org/apache/calcite/sql/type/AbstractSqlType.java index 16962b08560f..7e66042c3aea 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/AbstractSqlType.java +++ b/core/src/main/java/org/apache/calcite/sql/type/AbstractSqlType.java @@ -22,7 +22,7 @@ import org.apache.calcite.rel.type.RelDataTypeImpl; import org.apache.calcite.rel.type.RelDataTypePrecedenceList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.Serializable; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/sql/type/ArraySqlType.java b/core/src/main/java/org/apache/calcite/sql/type/ArraySqlType.java index 7d1d1afc470f..8569280be9f5 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/ArraySqlType.java +++ b/core/src/main/java/org/apache/calcite/sql/type/ArraySqlType.java @@ -20,7 +20,7 @@ import org.apache.calcite.rel.type.RelDataTypeFamily; import org.apache.calcite.rel.type.RelDataTypePrecedenceList; -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/sql/type/AssignableOperandTypeChecker.java b/core/src/main/java/org/apache/calcite/sql/type/AssignableOperandTypeChecker.java index 9f65e9ee470d..7f74e3b1e97c 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/AssignableOperandTypeChecker.java +++ b/core/src/main/java/org/apache/calcite/sql/type/AssignableOperandTypeChecker.java @@ -26,7 +26,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/sql/type/BasicSqlType.java b/core/src/main/java/org/apache/calcite/sql/type/BasicSqlType.java index b322c4eaa82e..2a79981d9a01 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/BasicSqlType.java +++ b/core/src/main/java/org/apache/calcite/sql/type/BasicSqlType.java @@ -20,7 +20,7 @@ import org.apache.calcite.sql.SqlCollation; import org.apache.calcite.util.SerializableCharset; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.nio.charset.Charset; diff --git a/core/src/main/java/org/apache/calcite/sql/type/CompositeOperandTypeChecker.java b/core/src/main/java/org/apache/calcite/sql/type/CompositeOperandTypeChecker.java index e3a509bf571e..28983291e650 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/CompositeOperandTypeChecker.java +++ b/core/src/main/java/org/apache/calcite/sql/type/CompositeOperandTypeChecker.java @@ -27,8 +27,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.UnknownKeyFor; +import org.jspecify.annotations.Nullable; import java.util.AbstractList; import java.util.ArrayList; @@ -88,9 +87,7 @@ public enum Composition { //~ Instance fields -------------------------------------------------------- - // It is not clear if @UnknownKeyFor is needed here or not, however, checkerframework inference - // fails otherwise, see https://github.com/typetools/checker-framework/issues/4048 - protected final ImmutableList<@UnknownKeyFor ? extends SqlOperandTypeChecker> allowedRules; + protected final ImmutableList allowedRules; protected final Composition composition; private final @Nullable String allowedSignatures; private final @Nullable BiFunction signatureGenerator; diff --git a/core/src/main/java/org/apache/calcite/sql/type/CompositeSingleOperandTypeChecker.java b/core/src/main/java/org/apache/calcite/sql/type/CompositeSingleOperandTypeChecker.java index 4f21ff154475..a1b6afecfe0a 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/CompositeSingleOperandTypeChecker.java +++ b/core/src/main/java/org/apache/calcite/sql/type/CompositeSingleOperandTypeChecker.java @@ -22,7 +22,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Allows multiple diff --git a/core/src/main/java/org/apache/calcite/sql/type/CursorReturnTypeInference.java b/core/src/main/java/org/apache/calcite/sql/type/CursorReturnTypeInference.java index c4cc272a8a58..c891860de17c 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/CursorReturnTypeInference.java +++ b/core/src/main/java/org/apache/calcite/sql/type/CursorReturnTypeInference.java @@ -19,7 +19,7 @@ import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.sql.SqlOperatorBinding; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Returns the rowtype of a cursor of the operand at a particular 0-based diff --git a/core/src/main/java/org/apache/calcite/sql/type/JavaToSqlTypeConversionRules.java b/core/src/main/java/org/apache/calcite/sql/type/JavaToSqlTypeConversionRules.java index 08fb73c231ee..0824a0bfb0b3 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/JavaToSqlTypeConversionRules.java +++ b/core/src/main/java/org/apache/calcite/sql/type/JavaToSqlTypeConversionRules.java @@ -21,7 +21,7 @@ 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.math.BigDecimal; diff --git a/core/src/main/java/org/apache/calcite/sql/type/MapSqlType.java b/core/src/main/java/org/apache/calcite/sql/type/MapSqlType.java index 9ad216057577..faaf015ff4ab 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/MapSqlType.java +++ b/core/src/main/java/org/apache/calcite/sql/type/MapSqlType.java @@ -19,7 +19,7 @@ import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeFamily; -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/sql/type/MatchReturnTypeInference.java b/core/src/main/java/org/apache/calcite/sql/type/MatchReturnTypeInference.java index 1426c51c3ec9..613e206f905c 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/MatchReturnTypeInference.java +++ b/core/src/main/java/org/apache/calcite/sql/type/MatchReturnTypeInference.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.List; diff --git a/core/src/main/java/org/apache/calcite/sql/type/MultisetSqlType.java b/core/src/main/java/org/apache/calcite/sql/type/MultisetSqlType.java index cbea4062c2ea..e00b9a294519 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/MultisetSqlType.java +++ b/core/src/main/java/org/apache/calcite/sql/type/MultisetSqlType.java @@ -20,7 +20,7 @@ import org.apache.calcite.rel.type.RelDataTypeFamily; import org.apache.calcite.rel.type.RelDataTypePrecedenceList; -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/sql/type/ObjectSqlType.java b/core/src/main/java/org/apache/calcite/sql/type/ObjectSqlType.java index b354688449d0..6fe5bc6f4f05 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/ObjectSqlType.java +++ b/core/src/main/java/org/apache/calcite/sql/type/ObjectSqlType.java @@ -21,7 +21,7 @@ import org.apache.calcite.rel.type.RelDataTypeField; import org.apache.calcite.sql.SqlIdentifier; -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/sql/type/OperandHandlers.java b/core/src/main/java/org/apache/calcite/sql/type/OperandHandlers.java index b45560390cfc..96f022ff96b4 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/OperandHandlers.java +++ b/core/src/main/java/org/apache/calcite/sql/type/OperandHandlers.java @@ -24,7 +24,7 @@ import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.validate.SqlValidator; -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/sql/type/OperandTypes.java b/core/src/main/java/org/apache/calcite/sql/type/OperandTypes.java index 114b11cf169d..7bdeb0142545 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/OperandTypes.java +++ b/core/src/main/java/org/apache/calcite/sql/type/OperandTypes.java @@ -46,7 +46,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.math.BigDecimal; import java.util.ArrayList; @@ -650,7 +650,7 @@ public static SqlOperandTypeChecker variadic( new FamilyOperandTypeChecker( ImmutableList.of(SqlTypeFamily.ARRAY, SqlTypeFamily.CHARACTER, SqlTypeFamily.CHARACTER), i -> i == 2) { - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") @Override public boolean checkOperandTypes( SqlCallBinding callBinding, boolean throwOnFailure) { @@ -2050,19 +2050,19 @@ protected boolean checkReturnType( * validated for the second time based on the given parameter type, * the type cached during the first validation must be cleared. */ - protected static class TypeRemover extends SqlBasicVisitor { + protected static class TypeRemover extends SqlBasicVisitor<@Nullable Void> { private final SqlValidator validator; protected TypeRemover(SqlValidator validator) { this.validator = validator; } - @Override public Void visit(SqlIdentifier id) { + @Override public @Nullable Void visit(SqlIdentifier id) { validator.removeValidatedNodeType(id); return super.visit(id); } - @Override public Void visit(SqlCall call) { + @Override public @Nullable Void visit(SqlCall call) { validator.removeValidatedNodeType(call); return super.visit(call); } diff --git a/core/src/main/java/org/apache/calcite/sql/type/ReturnTypes.java b/core/src/main/java/org/apache/calcite/sql/type/ReturnTypes.java index 2ad00299f8e2..35a986aed3fe 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/ReturnTypes.java +++ b/core/src/main/java/org/apache/calcite/sql/type/ReturnTypes.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.util.AbstractList; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/sql/type/SameOperandTypeChecker.java b/core/src/main/java/org/apache/calcite/sql/type/SameOperandTypeChecker.java index 80b3ce469f62..baba7a3a6701 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/SameOperandTypeChecker.java +++ b/core/src/main/java/org/apache/calcite/sql/type/SameOperandTypeChecker.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.Collections; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/sql/type/SameOperandTypeExceptLastOperandChecker.java b/core/src/main/java/org/apache/calcite/sql/type/SameOperandTypeExceptLastOperandChecker.java index 808a29b59a32..6a41b3f7e871 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/SameOperandTypeExceptLastOperandChecker.java +++ b/core/src/main/java/org/apache/calcite/sql/type/SameOperandTypeExceptLastOperandChecker.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.Collections; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/sql/type/SqlOperandTypeChecker.java b/core/src/main/java/org/apache/calcite/sql/type/SqlOperandTypeChecker.java index 2689f2a0dc28..0d4da9e0bde0 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/SqlOperandTypeChecker.java +++ b/core/src/main/java/org/apache/calcite/sql/type/SqlOperandTypeChecker.java @@ -20,7 +20,7 @@ import org.apache.calcite.sql.SqlOperandCountRange; import org.apache.calcite.sql.SqlOperator; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.function.BiFunction; diff --git a/core/src/main/java/org/apache/calcite/sql/type/SqlReturnTypeInference.java b/core/src/main/java/org/apache/calcite/sql/type/SqlReturnTypeInference.java index d832f96c6184..f7b6d119787c 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/SqlReturnTypeInference.java +++ b/core/src/main/java/org/apache/calcite/sql/type/SqlReturnTypeInference.java @@ -20,7 +20,7 @@ import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlOperatorBinding; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Strategy interface to infer the type of an operator call from the type of the diff --git a/core/src/main/java/org/apache/calcite/sql/type/SqlReturnTypeInferenceChain.java b/core/src/main/java/org/apache/calcite/sql/type/SqlReturnTypeInferenceChain.java index 3ed9875b189b..b32d69de1ffe 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/SqlReturnTypeInferenceChain.java +++ b/core/src/main/java/org/apache/calcite/sql/type/SqlReturnTypeInferenceChain.java @@ -21,7 +21,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static com.google.common.base.Preconditions.checkArgument; diff --git a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeExplicitPrecedenceList.java b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeExplicitPrecedenceList.java index da87c5166ce4..3707174dc7df 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeExplicitPrecedenceList.java +++ b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeExplicitPrecedenceList.java @@ -24,7 +24,7 @@ import com.google.common.collect.ImmutableMap; -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/sql/type/SqlTypeFactoryImpl.java b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeFactoryImpl.java index 544f9ca708da..3d9c49d01059 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeFactoryImpl.java +++ b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeFactoryImpl.java @@ -25,7 +25,7 @@ import org.apache.calcite.sql.SqlIntervalQualifier; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.nio.charset.Charset; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeFamily.java b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeFamily.java index 396932555a09..6ff982de7e19 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeFamily.java +++ b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeFamily.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.sql.Types; import java.util.Collection; diff --git a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeName.java b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeName.java index 73557737ca50..65b9b7c89c8c 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeName.java +++ b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeName.java @@ -29,7 +29,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Sets; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.sql.Types; diff --git a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeTransformCascade.java b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeTransformCascade.java index ae7bdee528ab..39ddec4280df 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeTransformCascade.java +++ b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeTransformCascade.java @@ -21,7 +21,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static com.google.common.base.Preconditions.checkArgument; diff --git a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeUtil.java b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeUtil.java index 5de00a50b4c8..71b73b4a4632 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeUtil.java +++ b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeUtil.java @@ -48,8 +48,7 @@ import com.google.common.collect.Sets; import org.apiguardian.api.API; -import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.math.BigInteger; @@ -486,16 +485,13 @@ public static boolean isTimestamp(RelDataType type) { } /** Returns whether a type is some kind of INTERVAL. */ - @SuppressWarnings("contracts.conditional.postcondition.not.satisfied") - @EnsuresNonNullIf(expression = "#1.getIntervalQualifier()", result = true) + @SuppressWarnings("NullAway") public static boolean isInterval(RelDataType type) { return SqlTypeFamily.DATETIME_INTERVAL.contains(type); } /** Returns whether a type is in SqlTypeFamily.Character. */ - @SuppressWarnings("contracts.conditional.postcondition.not.satisfied") - @EnsuresNonNullIf(expression = "#1.getCharset()", result = true) - @EnsuresNonNullIf(expression = "#1.getCollation()", result = true) + @SuppressWarnings("NullAway") public static boolean inCharFamily(RelDataType type) { return type.getFamily() == SqlTypeFamily.CHARACTER; } @@ -1422,7 +1418,10 @@ public static SqlDataTypeSpec convertTypeToSpec(RelDataType type, */ public static SqlDataTypeSpec convertTypeToSpec(RelDataType type) { // TODO jvs 28-Dec-2004: collation - String charSetName = inCharFamily(type) ? type.getCharset().name() : null; + String charSetName = + inCharFamily(type) + ? requireNonNull(type.getCharset(), "charset").name() + : null; return convertTypeToSpec(type, charSetName, RelDataType.PRECISION_NOT_SPECIFIED, RelDataType.SCALE_NOT_SPECIFIED); } diff --git a/core/src/main/java/org/apache/calcite/sql/type/TableFunctionReturnTypeInference.java b/core/src/main/java/org/apache/calcite/sql/type/TableFunctionReturnTypeInference.java index 5e54a19bad94..c0328e87a68d 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/TableFunctionReturnTypeInference.java +++ b/core/src/main/java/org/apache/calcite/sql/type/TableFunctionReturnTypeInference.java @@ -16,6 +16,8 @@ */ package org.apache.calcite.sql.type; +import org.apache.calcite.linq4j.annotations.MonotonicNonNull; +import org.apache.calcite.linq4j.annotations.RequiresNonNull; import org.apache.calcite.rel.metadata.RelColumnMapping; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeField; @@ -23,9 +25,7 @@ import org.apache.calcite.sql.SqlCallBinding; import org.apache.calcite.sql.SqlOperatorBinding; -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.HashSet; diff --git a/core/src/main/java/org/apache/calcite/sql/type/package-info.java b/core/src/main/java/org/apache/calcite/sql/type/package-info.java index f5b16a21e412..42937228f183 100644 --- a/core/src/main/java/org/apache/calcite/sql/type/package-info.java +++ b/core/src/main/java/org/apache/calcite/sql/type/package-info.java @@ -18,4 +18,7 @@ /** * SQL type system. */ +@NullMarked package org.apache.calcite.sql.type; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/sql/util/ChainedSqlOperatorTable.java b/core/src/main/java/org/apache/calcite/sql/util/ChainedSqlOperatorTable.java index 2cc599d81748..4fbf1400e2fe 100644 --- a/core/src/main/java/org/apache/calcite/sql/util/ChainedSqlOperatorTable.java +++ b/core/src/main/java/org/apache/calcite/sql/util/ChainedSqlOperatorTable.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/sql/util/IdPair.java b/core/src/main/java/org/apache/calcite/sql/util/IdPair.java index 1ecbdf457ef7..3870b3421685 100644 --- a/core/src/main/java/org/apache/calcite/sql/util/IdPair.java +++ b/core/src/main/java/org/apache/calcite/sql/util/IdPair.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.sql.util; -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/sql/util/ListSqlOperatorTable.java b/core/src/main/java/org/apache/calcite/sql/util/ListSqlOperatorTable.java index 05229e4eb5e6..522d31f9f8e8 100644 --- a/core/src/main/java/org/apache/calcite/sql/util/ListSqlOperatorTable.java +++ b/core/src/main/java/org/apache/calcite/sql/util/ListSqlOperatorTable.java @@ -27,7 +27,7 @@ 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/sql/util/ReflectiveSqlOperatorTable.java b/core/src/main/java/org/apache/calcite/sql/util/ReflectiveSqlOperatorTable.java index 545afc73ae99..be37a23d19bd 100644 --- a/core/src/main/java/org/apache/calcite/sql/util/ReflectiveSqlOperatorTable.java +++ b/core/src/main/java/org/apache/calcite/sql/util/ReflectiveSqlOperatorTable.java @@ -30,7 +30,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Field; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/sql/util/SqlBasicVisitor.java b/core/src/main/java/org/apache/calcite/sql/util/SqlBasicVisitor.java index 1a4fa559a415..73f110f94ae8 100644 --- a/core/src/main/java/org/apache/calcite/sql/util/SqlBasicVisitor.java +++ b/core/src/main/java/org/apache/calcite/sql/util/SqlBasicVisitor.java @@ -25,7 +25,7 @@ import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Basic implementation of {@link SqlVisitor} which does nothing at each node. @@ -36,7 +36,12 @@ * * @param Return type */ -public class SqlBasicVisitor<@Nullable R> implements SqlVisitor { + +// Every visitXxx returns null: this is the do-nothing traversal that subclasses override +// where they care. It is meaningful only when R is instantiated nullable, and JSpecify +// tracks upper bounds, so it cannot require that. +@SuppressWarnings("NullAway") +public class SqlBasicVisitor implements SqlVisitor { //~ Methods ---------------------------------------------------------------- @Override public R visit(SqlLiteral literal) { @@ -77,7 +82,7 @@ public class SqlBasicVisitor<@Nullable R> implements SqlVisitor { /** Argument handler. * * @param result type */ - public interface ArgHandler { + public interface ArgHandler { /** Returns the result of visiting all children of a call to an operator, * then the call itself. * @@ -102,11 +107,11 @@ R visitChild( * * @param result type */ - public static class ArgHandlerImpl<@Nullable R> implements ArgHandler { + public static class ArgHandlerImpl implements ArgHandler { private static final ArgHandler INSTANCE = new ArgHandlerImpl<>(); @SuppressWarnings("unchecked") - public static ArgHandler instance() { + public static ArgHandler instance() { return (ArgHandler) INSTANCE; } diff --git a/core/src/main/java/org/apache/calcite/sql/util/SqlShuttle.java b/core/src/main/java/org/apache/calcite/sql/util/SqlShuttle.java index 6ca2000642e4..5e948f6943dc 100644 --- a/core/src/main/java/org/apache/calcite/sql/util/SqlShuttle.java +++ b/core/src/main/java/org/apache/calcite/sql/util/SqlShuttle.java @@ -25,7 +25,7 @@ import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; -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/sql/util/SqlString.java b/core/src/main/java/org/apache/calcite/sql/util/SqlString.java index 1c105b8c91d6..316338413e79 100644 --- a/core/src/main/java/org/apache/calcite/sql/util/SqlString.java +++ b/core/src/main/java/org/apache/calcite/sql/util/SqlString.java @@ -20,8 +20,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.Nullable; import static java.util.Objects.requireNonNull; @@ -96,7 +95,6 @@ public String getSql() { * * @return indices of dynamic parameters */ - @Pure public @Nullable ImmutableList getDynamicParameters() { return dynamicParameters; } diff --git a/core/src/main/java/org/apache/calcite/sql/util/SqlVisitor.java b/core/src/main/java/org/apache/calcite/sql/util/SqlVisitor.java index 635454d14103..b4c15eee72a6 100644 --- a/core/src/main/java/org/apache/calcite/sql/util/SqlVisitor.java +++ b/core/src/main/java/org/apache/calcite/sql/util/SqlVisitor.java @@ -26,6 +26,8 @@ import org.apache.calcite.sql.SqlNodeList; import org.apache.calcite.sql.SqlOperator; +import org.jspecify.annotations.Nullable; + import java.util.List; /** @@ -42,7 +44,7 @@ * * @param Return type */ -public interface SqlVisitor { +public interface SqlVisitor { //~ Methods ---------------------------------------------------------------- /** diff --git a/core/src/main/java/org/apache/calcite/sql/util/package-info.java b/core/src/main/java/org/apache/calcite/sql/util/package-info.java index 064661cad30f..167c88c5397c 100644 --- a/core/src/main/java/org/apache/calcite/sql/util/package-info.java +++ b/core/src/main/java/org/apache/calcite/sql/util/package-info.java @@ -18,4 +18,7 @@ /** * Utility classes for the SQL object model, parsing, and validation. */ +@NullMarked package org.apache.calcite.sql.util; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/sql/validate/AbstractNamespace.java b/core/src/main/java/org/apache/calcite/sql/validate/AbstractNamespace.java index 4bfa1a80e014..d15148b107f1 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/AbstractNamespace.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/AbstractNamespace.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.List; diff --git a/core/src/main/java/org/apache/calcite/sql/validate/AggChecker.java b/core/src/main/java/org/apache/calcite/sql/validate/AggChecker.java index 23928b83ac69..718fda743841 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/AggChecker.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/AggChecker.java @@ -28,6 +28,8 @@ import com.google.common.collect.Iterables; +import org.jspecify.annotations.Nullable; + import java.util.ArrayDeque; import java.util.Deque; import java.util.List; @@ -40,7 +42,7 @@ * Visitor which throws an exception if any component of the expression is not a * group expression. */ -class AggChecker extends SqlBasicVisitor { +class AggChecker extends SqlBasicVisitor<@Nullable Void> { //~ Instance fields -------------------------------------------------------- private final Deque scopes = new ArrayDeque<>(); @@ -100,7 +102,7 @@ boolean isMeasureExp(SqlNode e) { return false; } - @Override public Void visit(SqlIdentifier id) { + @Override public @Nullable Void visit(SqlIdentifier id) { if (id.isStar()) { // Star may validly occur in "SELECT COUNT(*) OVER w" return null; @@ -165,7 +167,7 @@ private boolean isOuterReference(SqlValidatorScope scope, SqlQualified fqId) { return resolved.count() == 1 && !resolved.only().scope.isWithin(currentSelectScope); } - @Override public Void visit(SqlCall call) { + @Override public @Nullable Void visit(SqlCall call) { final SqlValidatorScope scope = requireNonNull(scopes.peek(), () -> "scope for " + call); if (call.getOperator().isAggregator()) { diff --git a/core/src/main/java/org/apache/calcite/sql/validate/AggFinder.java b/core/src/main/java/org/apache/calcite/sql/validate/AggFinder.java index 6a988401bfff..30bbba8c320d 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/AggFinder.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/AggFinder.java @@ -22,7 +22,7 @@ import org.apache.calcite.sql.SqlOperatorTable; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Iterator; diff --git a/core/src/main/java/org/apache/calcite/sql/validate/AggVisitor.java b/core/src/main/java/org/apache/calcite/sql/validate/AggVisitor.java index c8583e512019..9d7dde721854 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/AggVisitor.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/AggVisitor.java @@ -26,7 +26,7 @@ import org.apache.calcite.sql.fun.SqlAbstractGroupFunction; import org.apache.calcite.sql.util.SqlBasicVisitor; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -36,7 +36,7 @@ /** Visitor that can find aggregate and windowed aggregate functions. * * @see AggFinder */ -abstract class AggVisitor extends SqlBasicVisitor { +abstract class AggVisitor extends SqlBasicVisitor<@Nullable Void> { protected final SqlOperatorTable opTab; /** Whether to find windowed aggregates. */ protected final boolean over; @@ -69,7 +69,7 @@ abstract class AggVisitor extends SqlBasicVisitor { this.nameMatcher = requireNonNull(nameMatcher, "nameMatcher"); } - @Override public Void visit(SqlCall call) { + @Override public @Nullable Void visit(SqlCall call) { final SqlOperator operator = call.getOperator(); // If nested aggregates disallowed or found an aggregate at invalid level if (operator.isAggregator() diff --git a/core/src/main/java/org/apache/calcite/sql/validate/AliasNamespace.java b/core/src/main/java/org/apache/calcite/sql/validate/AliasNamespace.java index 99f84154e77b..f1b5bc88cc4c 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/AliasNamespace.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/AliasNamespace.java @@ -33,7 +33,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.List; diff --git a/core/src/main/java/org/apache/calcite/sql/validate/CollectNamespace.java b/core/src/main/java/org/apache/calcite/sql/validate/CollectNamespace.java index f2f153129402..cdba5b3edacd 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/CollectNamespace.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/CollectNamespace.java @@ -21,7 +21,7 @@ import org.apache.calcite.sql.SqlKind; import org.apache.calcite.sql.SqlNode; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Namespace for COLLECT and TABLE constructs. diff --git a/core/src/main/java/org/apache/calcite/sql/validate/CollectScope.java b/core/src/main/java/org/apache/calcite/sql/validate/CollectScope.java index 17678bdd76d4..0fdcc50707a7 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/CollectScope.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/CollectScope.java @@ -19,7 +19,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlNode; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * The name-resolution context for expression inside a multiset call. The diff --git a/core/src/main/java/org/apache/calcite/sql/validate/DelegatingNamespace.java b/core/src/main/java/org/apache/calcite/sql/validate/DelegatingNamespace.java index 21f59a3dfde3..6fc4d7d7f679 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/DelegatingNamespace.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/DelegatingNamespace.java @@ -21,7 +21,7 @@ import org.apache.calcite.sql.SqlNode; import org.apache.calcite.util.Pair; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -104,7 +104,7 @@ protected DelegatingNamespace(SqlValidatorNamespace namespace) { @Override public void makeNullable() { } - @Override public T unwrap(Class clazz) { + @Override public @Nullable T unwrap(Class clazz) { if (clazz.isInstance(this)) { return clazz.cast(this); } else { diff --git a/core/src/main/java/org/apache/calcite/sql/validate/DelegatingScope.java b/core/src/main/java/org/apache/calcite/sql/validate/DelegatingScope.java index 16a0e3a53b4d..f9b58ad37670 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/DelegatingScope.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/DelegatingScope.java @@ -37,7 +37,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.util.ArrayList; import java.util.Arrays; @@ -74,7 +74,7 @@ public abstract class DelegatingScope implements SqlValidatorScope { /** Computes and stores information that cannot be computed on construction, * but only after sub-queries have been validated. */ - @SuppressWarnings({"methodref.receiver.bound.invalid"}) + @SuppressWarnings("NullAway") public final Supplier resolved = Suppliers.memoize(this::resolve); @@ -294,7 +294,7 @@ protected void addColumnNames( RESOURCE.columnNotFound(columnName)); case 1: tableName = map.keySet().iterator().next(); - namespace = map.get(tableName).namespace; + namespace = requireNonNull(map.get(tableName), "tableName").namespace; break; default: throw validator.newValidationError(identifier, diff --git a/core/src/main/java/org/apache/calcite/sql/validate/DelegatingSqlValidatorCatalogReader.java b/core/src/main/java/org/apache/calcite/sql/validate/DelegatingSqlValidatorCatalogReader.java index 6f9b7531cbd2..09bee79a7cf4 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/DelegatingSqlValidatorCatalogReader.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/DelegatingSqlValidatorCatalogReader.java @@ -19,7 +19,7 @@ import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.sql.SqlIdentifier; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -58,7 +58,7 @@ protected DelegatingSqlValidatorCatalogReader( return catalogReader.getSchemaPaths(); } - @Override public @Nullable C unwrap(Class aClass) { + @Override public @Nullable C unwrap(Class aClass) { return catalogReader.unwrap(aClass); } } diff --git a/core/src/main/java/org/apache/calcite/sql/validate/EmptyScope.java b/core/src/main/java/org/apache/calcite/sql/validate/EmptyScope.java index 70b2954ae58c..d6eac25afc03 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/EmptyScope.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/EmptyScope.java @@ -38,7 +38,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.ArrayList; import java.util.Collection; diff --git a/core/src/main/java/org/apache/calcite/sql/validate/FieldNamespace.java b/core/src/main/java/org/apache/calcite/sql/validate/FieldNamespace.java index 15a0c0a02762..cf1389e39638 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/FieldNamespace.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/FieldNamespace.java @@ -20,7 +20,7 @@ import org.apache.calcite.rel.type.RelDataTypeField; import org.apache.calcite.sql.SqlNode; -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/sql/validate/IdentifierNamespace.java b/core/src/main/java/org/apache/calcite/sql/validate/IdentifierNamespace.java index f23ddec087ec..afecff602d87 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/IdentifierNamespace.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/IdentifierNamespace.java @@ -16,6 +16,7 @@ */ package org.apache.calcite.sql.validate; +import org.apache.calcite.linq4j.annotations.MonotonicNonNull; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeField; import org.apache.calcite.sql.SqlCall; @@ -28,8 +29,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.MonotonicNonNull; -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/sql/validate/JoinNamespace.java b/core/src/main/java/org/apache/calcite/sql/validate/JoinNamespace.java index c533796acd20..94e93fbd8ba2 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/JoinNamespace.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/JoinNamespace.java @@ -21,7 +21,7 @@ import org.apache.calcite.sql.SqlJoin; import org.apache.calcite.sql.SqlNode; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Namespace representing the row type produced by joining two relations. diff --git a/core/src/main/java/org/apache/calcite/sql/validate/JoinScope.java b/core/src/main/java/org/apache/calcite/sql/validate/JoinScope.java index f03f11201cde..f54847175871 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/JoinScope.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/JoinScope.java @@ -20,7 +20,7 @@ import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlWindow; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static org.apache.calcite.sql.JoinType.LEFT_ANTI_JOIN; import static org.apache.calcite.sql.JoinType.LEFT_SEMI_JOIN; diff --git a/core/src/main/java/org/apache/calcite/sql/validate/LambdaNamespace.java b/core/src/main/java/org/apache/calcite/sql/validate/LambdaNamespace.java index 216f77fe3140..3781349d6335 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/LambdaNamespace.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/LambdaNamespace.java @@ -20,7 +20,7 @@ import org.apache.calcite.sql.SqlLambda; import org.apache.calcite.sql.SqlNode; -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/sql/validate/ListScope.java b/core/src/main/java/org/apache/calcite/sql/validate/ListScope.java index 81a2a070cfaa..2df3697aa0de 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/ListScope.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/ListScope.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.Collection; diff --git a/core/src/main/java/org/apache/calcite/sql/validate/MatchRecognizeNamespace.java b/core/src/main/java/org/apache/calcite/sql/validate/MatchRecognizeNamespace.java index 91b4e70e3925..d70026918bae 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/MatchRecognizeNamespace.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/MatchRecognizeNamespace.java @@ -20,7 +20,7 @@ import org.apache.calcite.sql.SqlMatchRecognize; import org.apache.calcite.sql.SqlNode; -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/sql/validate/MeasureScope.java b/core/src/main/java/org/apache/calcite/sql/validate/MeasureScope.java index e43dd3ab8799..28dee4f770b1 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/MeasureScope.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/MeasureScope.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.ArrayList; import java.util.HashSet; diff --git a/core/src/main/java/org/apache/calcite/sql/validate/OrderByScope.java b/core/src/main/java/org/apache/calcite/sql/validate/OrderByScope.java index b8e58222ad97..76145a94f00f 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/OrderByScope.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/OrderByScope.java @@ -23,7 +23,7 @@ import org.apache.calcite.sql.SqlNodeList; import org.apache.calcite.sql.SqlSelect; -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/sql/validate/ParameterNamespace.java b/core/src/main/java/org/apache/calcite/sql/validate/ParameterNamespace.java index 9a2c54e31d05..52acc97022c4 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/ParameterNamespace.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/ParameterNamespace.java @@ -19,7 +19,7 @@ import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.sql.SqlNode; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Namespace representing the type of a dynamic parameter. diff --git a/core/src/main/java/org/apache/calcite/sql/validate/ParameterScope.java b/core/src/main/java/org/apache/calcite/sql/validate/ParameterScope.java index 249996be63e5..ee26d29a9058 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/ParameterScope.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/ParameterScope.java @@ -21,7 +21,7 @@ import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlNode; -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/sql/validate/ProcedureNamespace.java b/core/src/main/java/org/apache/calcite/sql/validate/ProcedureNamespace.java index 9d97a252efa5..0c65fffde82e 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/ProcedureNamespace.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/ProcedureNamespace.java @@ -25,7 +25,7 @@ import org.apache.calcite.sql.type.SqlReturnTypeInference; import org.apache.calcite.sql.type.SqlTypeName; -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/sql/validate/SchemaNamespace.java b/core/src/main/java/org/apache/calcite/sql/validate/SchemaNamespace.java index 2dce1178c650..62321d952641 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SchemaNamespace.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SchemaNamespace.java @@ -23,7 +23,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/sql/validate/SelectScope.java b/core/src/main/java/org/apache/calcite/sql/validate/SelectScope.java index 376a7c6482f0..bc03aa188ead 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SelectScope.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SelectScope.java @@ -16,6 +16,7 @@ */ package org.apache.calcite.sql.validate; +import org.apache.calcite.linq4j.annotations.MonotonicNonNull; import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlIdentifier; import org.apache.calcite.sql.SqlNode; @@ -27,8 +28,7 @@ import org.apache.calcite.util.Litmus; import org.apache.calcite.util.Pair; -import org.checkerframework.checker.nullness.qual.MonotonicNonNull; -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/sql/validate/SemanticTable.java b/core/src/main/java/org/apache/calcite/sql/validate/SemanticTable.java index 6b39af7065c7..c874ad44a7bc 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SemanticTable.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SemanticTable.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/sql/validate/SetopNamespace.java b/core/src/main/java/org/apache/calcite/sql/validate/SetopNamespace.java index 58c381e80c31..9d5af3b18a37 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SetopNamespace.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SetopNamespace.java @@ -22,7 +22,7 @@ import org.apache.calcite.sql.SqlNode; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static org.apache.calcite.util.Static.RESOURCE; @@ -74,7 +74,7 @@ protected SetopNamespace( namespace.getMonotonicity( namespace.getRowType().getFieldNames().get(index))); } - return Util.first(monotonicity, SqlMonotonicity.NOT_MONOTONIC); + return Util.firstNonNull(monotonicity, SqlMonotonicity.NOT_MONOTONIC); } private static SqlMonotonicity combine(@Nullable SqlMonotonicity m0, diff --git a/core/src/main/java/org/apache/calcite/sql/validate/SqlLambdaScope.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlLambdaScope.java index a4ba93d56ab0..574b7d55fe66 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SqlLambdaScope.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlLambdaScope.java @@ -22,7 +22,7 @@ import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.type.SqlTypeName; -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/sql/validate/SqlMonikerImpl.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlMonikerImpl.java index 0eff356b6b6b..b7c2c4212392 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SqlMonikerImpl.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlMonikerImpl.java @@ -22,7 +22,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.Objects; diff --git a/core/src/main/java/org/apache/calcite/sql/validate/SqlNameMatcher.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlNameMatcher.java index dee642efa3f1..c3e4df91c5d5 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SqlNameMatcher.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlNameMatcher.java @@ -22,7 +22,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.List; import java.util.Map; diff --git a/core/src/main/java/org/apache/calcite/sql/validate/SqlNameMatchers.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlNameMatchers.java index c01b7187acdb..3ebb511a16d8 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SqlNameMatchers.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlNameMatchers.java @@ -23,7 +23,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.LinkedHashSet; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/sql/validate/SqlNonNullableAccessors.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlNonNullableAccessors.java index 7fbca5f888fc..0a18f5a28b45 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SqlNonNullableAccessors.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlNonNullableAccessors.java @@ -109,7 +109,7 @@ public static SqlValidatorNamespace getNamespace(SqlCallBinding callBinding) { } @API(since = "1.27", status = API.Status.EXPERIMENTAL) - public static T getOperandLiteralValueOrThrow(SqlOperatorBinding opBinding, + public static T getOperandLiteralValueOrThrow(SqlOperatorBinding opBinding, int ordinal, Class clazz) { return requireNonNull(opBinding.getOperandLiteralValue(ordinal, clazz), () -> "expected non-null operand " + ordinal + " in " + safeToString(opBinding)); diff --git a/core/src/main/java/org/apache/calcite/sql/validate/SqlQualified.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlQualified.java index 2ec1099a230b..f41e9e8515f2 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SqlQualified.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlQualified.java @@ -19,7 +19,7 @@ import org.apache.calcite.sql.SqlIdentifier; 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/sql/validate/SqlScopedShuttle.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlScopedShuttle.java index ca4d55ff7a9a..073a47b5628e 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SqlScopedShuttle.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlScopedShuttle.java @@ -21,7 +21,7 @@ import org.apache.calcite.sql.util.SqlShuttle; import org.apache.calcite.sql.util.SqlVisitor; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayDeque; import java.util.Deque; diff --git a/core/src/main/java/org/apache/calcite/sql/validate/SqlUserDefinedAggFunction.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlUserDefinedAggFunction.java index d24d2d6df45d..5af6140ee3c7 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SqlUserDefinedAggFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlUserDefinedAggFunction.java @@ -29,7 +29,7 @@ import org.apache.calcite.util.Optionality; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * User-defined aggregate function. diff --git a/core/src/main/java/org/apache/calcite/sql/validate/SqlUserDefinedFunction.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlUserDefinedFunction.java index d75514ca614d..236694a3df34 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SqlUserDefinedFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlUserDefinedFunction.java @@ -30,7 +30,7 @@ import org.apache.calcite.sql.type.SqlReturnTypeInference; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -48,7 +48,7 @@ public class SqlUserDefinedFunction extends SqlFunction { @Deprecated // to be removed before 2.0 public SqlUserDefinedFunction(SqlIdentifier opName, SqlReturnTypeInference returnTypeInference, - SqlOperandTypeInference operandTypeInference, + @Nullable SqlOperandTypeInference operandTypeInference, @Nullable SqlOperandTypeChecker operandTypeChecker, List paramTypes, Function function) { @@ -62,7 +62,7 @@ public SqlUserDefinedFunction(SqlIdentifier opName, /** Creates a {@link SqlUserDefinedFunction}. */ public SqlUserDefinedFunction(SqlIdentifier opName, SqlKind kind, SqlReturnTypeInference returnTypeInference, - SqlOperandTypeInference operandTypeInference, + @Nullable SqlOperandTypeInference operandTypeInference, @Nullable SqlOperandMetadata operandMetadata, Function function) { this(opName, kind, returnTypeInference, operandTypeInference, @@ -72,7 +72,7 @@ public SqlUserDefinedFunction(SqlIdentifier opName, SqlKind kind, /** Creates a {@link SqlUserDefinedFunction} with sql syntax. */ public SqlUserDefinedFunction(SqlIdentifier opName, SqlKind kind, SqlReturnTypeInference returnTypeInference, - SqlOperandTypeInference operandTypeInference, + @Nullable SqlOperandTypeInference operandTypeInference, @Nullable SqlOperandMetadata operandMetadata, Function function, SqlSyntax syntax) { this(opName, kind, returnTypeInference, operandTypeInference, @@ -82,7 +82,7 @@ public SqlUserDefinedFunction(SqlIdentifier opName, SqlKind kind, /** Constructor used internally and by derived classes. */ protected SqlUserDefinedFunction(SqlIdentifier opName, SqlKind kind, SqlReturnTypeInference returnTypeInference, - SqlOperandTypeInference operandTypeInference, + @Nullable SqlOperandTypeInference operandTypeInference, @Nullable SqlOperandMetadata operandMetadata, Function function, SqlFunctionCategory category, SqlSyntax syntax) { diff --git a/core/src/main/java/org/apache/calcite/sql/validate/SqlUserDefinedTableFunction.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlUserDefinedTableFunction.java index 5b524daa772f..1a3880d552be 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SqlUserDefinedTableFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlUserDefinedTableFunction.java @@ -30,7 +30,7 @@ import org.apache.calcite.sql.type.SqlReturnTypeInference; import org.apache.calcite.util.Util; -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/sql/validate/SqlUserDefinedTableMacro.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlUserDefinedTableMacro.java index 7a8419d828ba..0ff9d1faac52 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SqlUserDefinedTableMacro.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlUserDefinedTableMacro.java @@ -35,7 +35,7 @@ import org.apache.calcite.sql.type.SqlReturnTypeInference; import org.apache.calcite.util.Util; -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/sql/validate/SqlValidator.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidator.java index 94b90c6789bc..d6018330f219 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidator.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidator.java @@ -53,9 +53,8 @@ import org.apache.calcite.sql.validate.implicit.TypeCoercions; import org.apiguardian.api.API; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.dataflow.qual.Pure; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Map; @@ -125,7 +124,6 @@ public interface SqlValidator { * * @return catalog reader */ - @Pure SqlValidatorCatalogReader getCatalogReader(); /** @@ -133,7 +131,6 @@ public interface SqlValidator { * * @return operator table */ - @Pure SqlOperatorTable getOperatorTable(); /** @@ -511,7 +508,6 @@ SqlNodeList expandStar(SqlNodeList selectList, SqlSelect query, * * @return type factory */ - @Pure RelDataTypeFactory getTypeFactory(); /** diff --git a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorCatalogReader.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorCatalogReader.java index 65b12a4d5367..991928d1a275 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorCatalogReader.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorCatalogReader.java @@ -23,7 +23,7 @@ import org.apache.calcite.schema.Wrapper; import org.apache.calcite.sql.SqlIdentifier; -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/sql/validate/SqlValidatorException.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorException.java index 12fbdbb3190d..a681e43a358b 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorException.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorException.java @@ -50,7 +50,7 @@ public class SqlValidatorException extends Exception * @param message error message * @param cause underlying cause */ - @SuppressWarnings({"argument.type.incompatible", "method.invocation.invalid"}) + @SuppressWarnings("NullAway") public SqlValidatorException( String message, Throwable cause) { diff --git a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java index 6642a1522b76..fc7238394450 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java @@ -17,6 +17,8 @@ package org.apache.calcite.sql.validate; import org.apache.calcite.linq4j.Ord; +import org.apache.calcite.linq4j.annotations.Contract; +import org.apache.calcite.linq4j.annotations.RequiresNonNull; import org.apache.calcite.linq4j.function.Functions; import org.apache.calcite.plan.RelOptTable; import org.apache.calcite.plan.RelOptUtil; @@ -132,13 +134,8 @@ import com.google.common.collect.Sets; import org.apiguardian.api.API; -import org.checkerframework.checker.initialization.qual.UnknownInitialization; -import org.checkerframework.checker.nullness.qual.KeyFor; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.PolyNull; -import org.checkerframework.checker.nullness.qual.RequiresNonNull; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import java.math.BigDecimal; @@ -182,6 +179,7 @@ import static org.apache.calcite.sql.validate.SqlNonNullableAccessors.getTable; import static org.apache.calcite.util.Static.RESOURCE; import static org.apache.calcite.util.Util.first; +import static org.apache.calcite.util.Util.firstNonNull; import static java.util.Collections.emptyList; import static java.util.Objects.requireNonNull; @@ -344,7 +342,7 @@ protected SqlValidatorImpl( groupFinder = new AggFinder(opTab, false, false, true, null, nameMatcher); aggOrOverOrGroupFinder = new AggFinder(opTab, true, true, true, null, nameMatcher); - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") TypeCoercion typeCoercion = config.typeCoercionFactory().create(typeFactory, this); this.typeCoercion = typeCoercion; @@ -378,17 +376,14 @@ public SqlConformance getConformance() { return config.conformance(); } - @Pure @Override public SqlValidatorCatalogReader getCatalogReader() { return catalogReader; } - @Pure @Override public SqlOperatorTable getOperatorTable() { return opTab; } - @Pure @Override public RelDataTypeFactory getTypeFactory() { return typeFactory; } @@ -408,7 +403,7 @@ public SqlConformance getConformance() { final Map expansions = new HashMap<>(); for (final SqlNode selectItem : selectList) { final RelDataType originalType = getValidatedNodeTypeIfKnown(selectItem); - expandSelectItem(selectItem, select, first(originalType, unknownType), + expandSelectItem(selectItem, select, firstNonNull(originalType, unknownType), list, catalogReader.nameMatcher().createSet(), types, expansions, includeSystemVars); } @@ -1243,7 +1238,7 @@ private void lookupFromHints( } final SqlValidatorNamespace ns = getNamespaceOrThrow(node); if (ns.isWrapperFor(IdentifierNamespace.class)) { - IdentifierNamespace idNs = ns.unwrap(IdentifierNamespace.class); + IdentifierNamespace idNs = requireNonNull(ns.unwrap(IdentifierNamespace.class), "idNs"); final SqlIdentifier id = idNs.getId(); for (int i = 0; i < id.names.size(); i++) { if (pos.toString().equals( @@ -1788,8 +1783,8 @@ && requireNonNull(((SqlNumericLiteral) node).bigDecimalValue()) RESOURCE.offsetFetchValueMustNotBeNegative(kind)); } validateNoAggs(aggOrOverFinder, node, kind); - node.accept(new SqlBasicVisitor() { - @Override public Void visit(SqlIdentifier id) { + node.accept(new SqlBasicVisitor<@Nullable Void>() { + @Override public @Nullable Void visit(SqlIdentifier id) { if (makeNullaryCall(id) != null) { return null; } @@ -1820,8 +1815,9 @@ && requireNonNull(((SqlNumericLiteral) node).bigDecimalValue()) * @param underFrom whether node appears directly under a FROM clause * @return rewritten expression, or null if the original expression is null */ - protected @PolyNull SqlNode performUnconditionalRewrites( - @PolyNull SqlNode node, + @Contract("!null, _ -> !null") + protected @Nullable SqlNode performUnconditionalRewrites( + @Nullable SqlNode node, boolean underFrom) { if (node == null) { return null; @@ -4478,7 +4474,9 @@ protected void validateSelect( // Namespace is either a select namespace or a wrapper around one. final SelectNamespace ns = - getNamespaceOrThrow(select).unwrap(SelectNamespace.class); + requireNonNull( + getNamespaceOrThrow(select).unwrap(SelectNamespace.class), + "ns"); // Its rowtype is null, meaning it hasn't been validated yet. // This is important, because we need to take the targetRowType into @@ -4516,7 +4514,7 @@ protected void validateSelect( //noinspection RedundantTypeArguments names = names.stream() .<@Nullable String>map(s -> s == null ? null : s.toUpperCase(Locale.ROOT)) - .collect(Collectors.toList()); + .collect(Collectors.<@Nullable String>toList()); } final int duplicateAliasOrdinal = Util.firstDuplicate(names); if (duplicateAliasOrdinal >= 0) { @@ -4578,8 +4576,8 @@ protected void validateSelect( */ private static void forEachQualified(SqlNode node, SqlValidatorScope scope, Consumer consumer) { - node.accept(new SqlBasicVisitor() { - @Override public Void visit(SqlIdentifier id) { + node.accept(new SqlBasicVisitor<@Nullable Void>() { + @Override public @Nullable Void visit(SqlIdentifier id) { final SqlQualified qualified = scope.fullyQualify(id); consumer.accept(qualified); return null; @@ -4592,8 +4590,8 @@ private static void forEachQualified(SqlNode node, SqlValidatorScope scope, private static void purgeForBypassFields(SqlNode node, SqlValidatorScope scope, Set qualifieds, Set bypassQualifieds, Set remnantMustFilterFields) { - node.accept(new SqlBasicVisitor() { - @Override public Void visit(SqlIdentifier id) { + node.accept(new SqlBasicVisitor<@Nullable Void>() { + @Override public @Nullable Void visit(SqlIdentifier id) { final SqlQualified qualified = scope.fullyQualify(id); if (bypassQualifieds.contains(qualified)) { // Clear all the must-filter qualifieds from the same table identifier @@ -6056,8 +6054,8 @@ private boolean referencesOnlyOuterColumns(SqlNode node, // ok[0] is cleared if any identifier is not an outer reference; // ok[1] is set once at least one outer column is found. final boolean[] ok = {true, false}; - node.accept(new SqlBasicVisitor() { - @Override public Void visit(SqlIdentifier id) { + node.accept(new SqlBasicVisitor<@Nullable Void>() { + @Override public @Nullable Void visit(SqlIdentifier id) { if (!isOuterReference(currentScope, id)) { ok[0] = false; return null; @@ -6081,8 +6079,8 @@ private boolean referencesOnlyOuterColumns(SqlNode node, */ private static boolean containsSubQuery(SqlNode node) { final boolean[] found = {false}; - node.accept(new SqlBasicVisitor() { - @Override public Void visit(SqlCall call) { + node.accept(new SqlBasicVisitor<@Nullable Void>() { + @Override public @Nullable Void visit(SqlCall call) { if (call.getKind().belongsTo(SqlKind.QUERY)) { found[0] = true; return null; @@ -6355,8 +6353,8 @@ private void checkConstraint( @SuppressWarnings("RedundantCast") final ImmutableBitSet constrainedColumns = ImmutableBitSet.of((Iterable) projectMap.keySet()); - @SuppressWarnings("assignment.type.incompatible") - List<@KeyFor({"tableIndexToTargetField", "projectMap"}) Integer> constrainedTargetColumns = + @SuppressWarnings("NullAway") + List constrainedTargetColumns = targetColumns.intersect(constrainedColumns).asList(); // Validate insert values against the view constraint. @@ -6373,7 +6371,7 @@ private void checkConstraint( RESOURCE.viewConstraintNotSatisfied(colName, Util.last(validatorTable.getQualifiedName()))); RelOptUtil.validateValueAgainstConstraint(sourceValue, - projectMap.get(colIndex), validationError); + requireNonNull(projectMap.get(colIndex), "colIndex"), validationError); } } } @@ -7076,7 +7074,9 @@ public void setOriginal(SqlNode expr, SqlNode original) { final SqlLambdaScope scope = (SqlLambdaScope) scopes.get(lambdaExpr); requireNonNull(scope, "scope"); final LambdaNamespace ns = - getNamespaceOrThrow(lambdaExpr).unwrap(LambdaNamespace.class); + requireNonNull( + getNamespaceOrThrow(lambdaExpr).unwrap(LambdaNamespace.class), + "ns"); // Check for duplicate lambda parameter names final SqlNameMatcher nameMatcher = catalogReader.nameMatcher(); @@ -7114,7 +7114,12 @@ public void setOriginal(SqlNode expr, SqlNode original) { (MatchRecognizeScope) getMatchRecognizeScope(matchRecognize); final MatchRecognizeNamespace ns = - getNamespaceOrThrow(call).unwrap(MatchRecognizeNamespace.class); + + requireNonNull( + + getNamespaceOrThrow(call).unwrap(MatchRecognizeNamespace.class), + + "ns"); assert ns.rowType == null; // rows per match @@ -7367,7 +7372,12 @@ public void validatePivot(SqlPivot pivot) { final PivotScope scope = (PivotScope) getJoinScope(pivot); final PivotNamespace ns = - getNamespaceOrThrow(pivot).unwrap(PivotNamespace.class); + + requireNonNull( + + getNamespaceOrThrow(pivot).unwrap(PivotNamespace.class), + + "ns"); assert ns.rowType == null; // Given @@ -7443,7 +7453,12 @@ public void validateUnpivot(SqlUnpivot unpivot) { final UnpivotScope scope = (UnpivotScope) getJoinScope(unpivot); final UnpivotNamespace ns = - getNamespaceOrThrow(unpivot).unwrap(UnpivotNamespace.class); + + requireNonNull( + + getNamespaceOrThrow(unpivot).unwrap(UnpivotNamespace.class), + + "ns"); assert ns.rowType == null; // Given @@ -7829,7 +7844,8 @@ public SqlNode extendedExpandGroupBy(SqlNode expr, requireNonNull(qualified.namespace, () -> "namespace for " + qualified); if (namespace.isWrapperFor(AliasNamespace.class)) { - AliasNamespace aliasNs = namespace.unwrap(AliasNamespace.class); + AliasNamespace aliasNs = + requireNonNull(namespace.unwrap(AliasNamespace.class), "aliasNs"); SqlNode aliased = requireNonNull(aliasNs.getNode(), () -> "sqlNode for aliasNs " + aliasNs); namespace = getNamespaceOrThrow(stripAs(aliased)); @@ -7844,7 +7860,8 @@ public SqlNode extendedExpandGroupBy(SqlNode expr, for (String name : qualified.suffix()) { if (namespace.isWrapperFor(UnnestNamespace.class)) { // If identifier is drawn from a repeated subrecord via unnest, add name of array field - UnnestNamespace unnestNamespace = namespace.unwrap(UnnestNamespace.class); + UnnestNamespace unnestNamespace = + requireNonNull(namespace.unwrap(UnnestNamespace.class), "unnestNamespace"); final SqlQualified columnUnnestedFrom = unnestNamespace.getColumnUnnestedFrom(name); if (columnUnnestedFrom != null) { origin.addAll(columnUnnestedFrom.suffix()); @@ -8003,43 +8020,43 @@ private static class MergeNamespace extends DmlNamespace { } /** Visitor that retrieves pattern variables defined. */ - private static class PatternVarVisitor implements SqlVisitor { + private static class PatternVarVisitor implements SqlVisitor<@Nullable Void> { private final MatchRecognizeScope scope; PatternVarVisitor(MatchRecognizeScope scope) { this.scope = scope; } - @Override public Void visit(SqlLiteral literal) { + @Override public @Nullable Void visit(SqlLiteral literal) { return null; } - @Override public Void visit(SqlCall call) { + @Override public @Nullable Void visit(SqlCall call) { for (int i = 0; i < call.getOperandList().size(); i++) { call.getOperandList().get(i).accept(this); } return null; } - @Override public Void visit(SqlNodeList nodeList) { + @Override public @Nullable Void visit(SqlNodeList nodeList) { throw Util.needToImplement(nodeList); } - @Override public Void visit(SqlIdentifier id) { + @Override public @Nullable Void visit(SqlIdentifier id) { checkArgument(id.isSimple()); scope.addPatternVar(id.getSimple()); return null; } - @Override public Void visit(SqlDataTypeSpec type) { + @Override public @Nullable Void visit(SqlDataTypeSpec type) { throw Util.needToImplement(type); } - @Override public Void visit(SqlDynamicParam param) { + @Override public @Nullable Void visit(SqlDynamicParam param) { throw Util.needToImplement(param); } - @Override public Void visit(SqlIntervalQualifier intervalQualifier) { + @Override public @Nullable Void visit(SqlIntervalQualifier intervalQualifier) { throw Util.needToImplement(intervalQualifier); } } @@ -8875,7 +8892,7 @@ static class ExtendedExpander extends Expander { * Add all possible expandable 'group by' ordinals to {@link aliasOrdinalExpandSet}. */ @RequiresNonNull({"root"}) - private void addExpandableOrdinals(@UnknownInitialization ExtendedExpander this) { + private void addExpandableOrdinals() { switch (root.getKind()) { case LITERAL: aliasOrdinalExpandSet.add(root); @@ -8900,7 +8917,7 @@ private void addExpandableOrdinals(@UnknownInitialization ExtendedExpander this) * * @param sqlNode expression within grouping sets, rollup, cube */ - private void addOrdinal2ExpandSet(@UnknownInitialization ExtendedExpander this, + private void addOrdinal2ExpandSet( SqlNode sqlNode) { if (sqlNode.getKind() == SqlKind.ROW) { List rowOperandList = ((SqlCall) sqlNode).getOperandList(); @@ -8920,9 +8937,9 @@ private void addOrdinal2ExpandSet(@UnknownInitialization ExtendedExpander this, */ private boolean containsIdentifier(SqlNode sqlNode, SqlIdentifier target) { try { - SqlVisitor visitor = - new SqlBasicVisitor() { - @Override public Void visit(SqlIdentifier identifier) { + SqlVisitor<@Nullable Void> visitor = + new SqlBasicVisitor<@Nullable Void>() { + @Override public @Nullable Void visit(SqlIdentifier identifier) { if (identifier.equalsDeep(target, Litmus.IGNORE)) { throw new Util.FoundOne(target); } diff --git a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorNamespace.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorNamespace.java index ed857859ba39..73c3eb8046d1 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorNamespace.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorNamespace.java @@ -21,8 +21,7 @@ import org.apache.calcite.sql.SqlNode; import org.apache.calcite.util.Pair; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -127,7 +126,6 @@ public interface SqlValidatorNamespace { * includes all decorations. If there are no decorations, returns the same * as {@link #getNode()}. */ - @Pure @Nullable SqlNode getEnclosingNode(); /** @@ -184,7 +182,7 @@ default boolean fieldExists(String name) { * @return This namespace cast to desired type * @throws ClassCastException if no such interface is available */ - T unwrap(Class clazz); + @Nullable T unwrap(Class clazz); /** * Returns whether this namespace implements a given interface, or wraps a diff --git a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorScope.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorScope.java index bbf7dca02ae2..d7493181a1f8 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorScope.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorScope.java @@ -31,7 +31,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.Collection; diff --git a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorUtil.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorUtil.java index b4465ab4345a..a48c2c7a52ce 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorUtil.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorUtil.java @@ -70,7 +70,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Sets; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.nio.charset.Charset; import java.util.ArrayList; @@ -122,16 +122,17 @@ private SqlValidatorUtil() {} boolean @Nullable [] usedDataset) { if (namespace.isWrapperFor(TableNamespace.class)) { final TableNamespace tableNamespace = - namespace.unwrap(TableNamespace.class); + requireNonNull(namespace.unwrap(TableNamespace.class), "tableNamespace"); return getRelOptTable(tableNamespace, requireNonNull(catalogReader, "catalogReader"), datasetName, usedDataset, tableNamespace.extendedFields); } else if (namespace.isWrapperFor(SqlValidatorImpl.DmlNamespace.class)) { final SqlValidatorImpl.DmlNamespace dmlNamespace = - namespace.unwrap(SqlValidatorImpl.DmlNamespace.class); + requireNonNull(namespace.unwrap(SqlValidatorImpl.DmlNamespace.class), "dmlNamespace"); final SqlValidatorNamespace resolvedNamespace = dmlNamespace.resolve(); if (resolvedNamespace.isWrapperFor(TableNamespace.class)) { - final TableNamespace tableNamespace = resolvedNamespace.unwrap(TableNamespace.class); + final TableNamespace tableNamespace = + requireNonNull(resolvedNamespace.unwrap(TableNamespace.class), "tableNamespace"); final SqlValidatorTable validatorTable = tableNamespace.getTable(); final List extendedFields = dmlNamespace.extendList == null ? ImmutableList.of() @@ -246,10 +247,7 @@ public static ImmutableBitSet getOrdinalBitSet( ImmutableBitSet.of( Util.transform(sourceRowType.getFieldList(), RelDataTypeField::getIndex)); - // checkerframework: found : Set<@KeyFor("indexToField") Integer> - //noinspection RedundantCast - ImmutableBitSet target = - ImmutableBitSet.of((Iterable) indexToField.keySet()); + ImmutableBitSet target = ImmutableBitSet.of(indexToField.keySet()); return source.intersect(target); } diff --git a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorWithHints.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorWithHints.java index d24a218ccf51..184c8ad1e00c 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorWithHints.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorWithHints.java @@ -20,7 +20,7 @@ import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.parser.SqlParserPos; -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/sql/validate/SqlWithItemTableRef.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlWithItemTableRef.java index dee61285db14..277ea2c5a5c1 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SqlWithItemTableRef.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlWithItemTableRef.java @@ -27,7 +27,7 @@ import org.apache.calcite.sql.SqlWithItem; import org.apache.calcite.sql.parser.SqlParserPos; -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/sql/validate/TableConstructorNamespace.java b/core/src/main/java/org/apache/calcite/sql/validate/TableConstructorNamespace.java index 58715a6327b9..5c0e2c360137 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/TableConstructorNamespace.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/TableConstructorNamespace.java @@ -20,7 +20,7 @@ import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlNode; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static org.apache.calcite.util.Static.RESOURCE; diff --git a/core/src/main/java/org/apache/calcite/sql/validate/TableNamespace.java b/core/src/main/java/org/apache/calcite/sql/validate/TableNamespace.java index 0b4b38336eca..d6bba2b8444b 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/TableNamespace.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/TableNamespace.java @@ -33,7 +33,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; -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/sql/validate/UnnestNamespace.java b/core/src/main/java/org/apache/calcite/sql/validate/UnnestNamespace.java index 34b6be2a30b0..71c8856fb467 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/UnnestNamespace.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/UnnestNamespace.java @@ -22,7 +22,7 @@ import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlUnnestOperator; -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/sql/validate/WithItemNamespace.java b/core/src/main/java/org/apache/calcite/sql/validate/WithItemNamespace.java index dc41d92d3c8e..a8e3c4e06f4a 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/WithItemNamespace.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/WithItemNamespace.java @@ -25,7 +25,7 @@ import org.apache.calcite.sql.SqlWithItem; import org.apache.calcite.util.Pair; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** Very similar to {@link AliasNamespace}. */ class WithItemNamespace extends AbstractNamespace { diff --git a/core/src/main/java/org/apache/calcite/sql/validate/WithItemRecursiveNamespace.java b/core/src/main/java/org/apache/calcite/sql/validate/WithItemRecursiveNamespace.java index 3b92ecc6bc6f..ca771da4fcf2 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/WithItemRecursiveNamespace.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/WithItemRecursiveNamespace.java @@ -23,7 +23,7 @@ import org.apache.calcite.sql.SqlWithItem; import org.apache.calcite.sql.parser.SqlParserPos; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** Very similar to {@link WithItemNamespace} but created only for RECURSIVE queries. */ class WithItemRecursiveNamespace extends WithItemNamespace { diff --git a/core/src/main/java/org/apache/calcite/sql/validate/WithNamespace.java b/core/src/main/java/org/apache/calcite/sql/validate/WithNamespace.java index 286b91d3cce5..ba5ab2dfc5c5 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/WithNamespace.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/WithNamespace.java @@ -22,7 +22,7 @@ import org.apache.calcite.sql.SqlWithItem; 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/sql/validate/WithRecursiveScope.java b/core/src/main/java/org/apache/calcite/sql/validate/WithRecursiveScope.java index 1fb33e643446..a023ce9c8e62 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/WithRecursiveScope.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/WithRecursiveScope.java @@ -22,7 +22,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/sql/validate/WithScope.java b/core/src/main/java/org/apache/calcite/sql/validate/WithScope.java index 7d6229895751..22c8dc71a4a1 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/WithScope.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/WithScope.java @@ -22,7 +22,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/sql/validate/implicit/AbstractTypeCoercion.java b/core/src/main/java/org/apache/calcite/sql/validate/implicit/AbstractTypeCoercion.java index 22f6e16c61f1..4266a2a196ca 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/implicit/AbstractTypeCoercion.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/implicit/AbstractTypeCoercion.java @@ -50,7 +50,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.nio.charset.Charset; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/sql/validate/implicit/TypeCoercion.java b/core/src/main/java/org/apache/calcite/sql/validate/implicit/TypeCoercion.java index f3d1d528fd99..ae7203c312da 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/implicit/TypeCoercion.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/implicit/TypeCoercion.java @@ -24,7 +24,7 @@ import org.apache.calcite.sql.type.SqlTypeFamily; import org.apache.calcite.sql.validate.SqlValidatorScope; -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/sql/validate/implicit/TypeCoercionImpl.java b/core/src/main/java/org/apache/calcite/sql/validate/implicit/TypeCoercionImpl.java index 46dc3af5ed80..57186fe646cf 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/implicit/TypeCoercionImpl.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/implicit/TypeCoercionImpl.java @@ -44,7 +44,7 @@ import org.apache.calcite.sql.validate.SqlValidatorScope; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.AbstractList; diff --git a/core/src/main/java/org/apache/calcite/sql/validate/implicit/package-info.java b/core/src/main/java/org/apache/calcite/sql/validate/implicit/package-info.java index 7e7c87c37698..fa062cde05c9 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/implicit/package-info.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/implicit/package-info.java @@ -79,4 +79,7 @@ * *

    See CalciteImplicitCasts. */ +@NullMarked package org.apache.calcite.sql.validate.implicit; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/sql/validate/package-info.java b/core/src/main/java/org/apache/calcite/sql/validate/package-info.java index 20d5f0dc2900..9066d21ac730 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/package-info.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/package-info.java @@ -18,4 +18,7 @@ /** * SQL validation. */ +@NullMarked package org.apache.calcite.sql.validate; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/sql2rel/AggConverter.java b/core/src/main/java/org/apache/calcite/sql2rel/AggConverter.java index 0193b17c3e00..0e6eaf2fab00 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/AggConverter.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/AggConverter.java @@ -55,7 +55,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.ArrayList; import java.util.HashMap; @@ -85,7 +85,7 @@ *

  • aggCalls = {AggCall(SUM, {1})}
  • * */ -class AggConverter implements SqlVisitor { +class AggConverter implements SqlVisitor<@Nullable Void> { private final SqlToRelConverter.Blackboard bb; private final Map nameMap; @@ -242,7 +242,7 @@ private void addExpr(RexNode expr, @Nullable String name) { convertedInputExprs.add(expr, name); } - @Override public Void visit(SqlIdentifier id) { + @Override public @Nullable Void visit(SqlIdentifier id) { if (isMeasureExpr(id)) { final SqlCall call = SqlInternalOperators.AGG_M2V.createCall(SqlParserPos.ZERO, id); @@ -256,28 +256,28 @@ private void addExpr(RexNode expr, @Nullable String name) { return null; } - @Override public Void visit(SqlNodeList nodeList) { + @Override public @Nullable Void visit(SqlNodeList nodeList) { nodeList.forEach(this::visitNode); return null; } - @Override public Void visit(SqlLiteral lit) { + @Override public @Nullable Void visit(SqlLiteral lit) { return null; } - @Override public Void visit(SqlDataTypeSpec type) { + @Override public @Nullable Void visit(SqlDataTypeSpec type) { return null; } - @Override public Void visit(SqlDynamicParam param) { + @Override public @Nullable Void visit(SqlDynamicParam param) { return null; } - @Override public Void visit(SqlIntervalQualifier intervalQualifier) { + @Override public @Nullable Void visit(SqlIntervalQualifier intervalQualifier) { return null; } - @Override public Void visit(SqlCall call) { + @Override public @Nullable Void visit(SqlCall call) { switch (call.getKind()) { case FILTER: case IGNORE_NULLS: diff --git a/core/src/main/java/org/apache/calcite/sql2rel/CorrelateProjectExtractor.java b/core/src/main/java/org/apache/calcite/sql2rel/CorrelateProjectExtractor.java index 127f4e487941..f903db1893ae 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/CorrelateProjectExtractor.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/CorrelateProjectExtractor.java @@ -40,7 +40,7 @@ import org.apache.calcite.util.ImmutableBitSet; import org.apiguardian.api.API; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.HashMap; diff --git a/core/src/main/java/org/apache/calcite/sql2rel/CorrelationReferenceFinder.java b/core/src/main/java/org/apache/calcite/sql2rel/CorrelationReferenceFinder.java index 0c18c357c89b..f6d2b3ecae4e 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/CorrelationReferenceFinder.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/CorrelationReferenceFinder.java @@ -25,15 +25,11 @@ import org.apache.calcite.rex.RexShuttle; import org.apache.calcite.rex.RexSubQuery; -import org.checkerframework.checker.initialization.qual.NotOnlyInitialized; -import org.checkerframework.checker.initialization.qual.UnderInitialization; - /** * Shuttle that finds references to a given {@link CorrelationId} within a tree * of {@link RelNode}s. */ public abstract class CorrelationReferenceFinder extends RelHomogeneousShuttle { - @NotOnlyInitialized private final MyRexVisitor rexVisitor; /** Creates CorrelationReferenceFinder. */ @@ -52,10 +48,9 @@ protected CorrelationReferenceFinder() { * Replaces alternative names of correlation variable to its canonical name. */ private static class MyRexVisitor extends RexShuttle { - @NotOnlyInitialized private final CorrelationReferenceFinder finder; - private MyRexVisitor(@UnderInitialization CorrelationReferenceFinder finder) { + private MyRexVisitor(CorrelationReferenceFinder finder) { this.finder = finder; } diff --git a/core/src/main/java/org/apache/calcite/sql2rel/DeduplicateCorrelateVariables.java b/core/src/main/java/org/apache/calcite/sql2rel/DeduplicateCorrelateVariables.java index b965b48f6443..e9c69d5126a7 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/DeduplicateCorrelateVariables.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/DeduplicateCorrelateVariables.java @@ -27,15 +27,11 @@ import com.google.common.collect.ImmutableSet; -import org.checkerframework.checker.initialization.qual.NotOnlyInitialized; -import org.checkerframework.checker.initialization.qual.UnderInitialization; - /** * Rewrites relations to ensure the same correlation is referenced by the same * correlation variable. */ public class DeduplicateCorrelateVariables extends RelHomogeneousShuttle { - @NotOnlyInitialized private final RexShuttle dedupRex; /** Creates a DeduplicateCorrelateVariables. */ @@ -69,12 +65,11 @@ private static class DeduplicateCorrelateVariablesShuttle extends RexShuttle { private final RexBuilder builder; private final CorrelationId canonicalId; private final ImmutableSet alternateIds; - @NotOnlyInitialized private final DeduplicateCorrelateVariables shuttle; private DeduplicateCorrelateVariablesShuttle(RexBuilder builder, CorrelationId canonicalId, ImmutableSet alternateIds, - @UnderInitialization DeduplicateCorrelateVariables shuttle) { + DeduplicateCorrelateVariables shuttle) { this.builder = builder; this.canonicalId = canonicalId; this.alternateIds = alternateIds; diff --git a/core/src/main/java/org/apache/calcite/sql2rel/InitializerExpressionFactory.java b/core/src/main/java/org/apache/calcite/sql2rel/InitializerExpressionFactory.java index e4e632fa53bb..9641255e3024 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/InitializerExpressionFactory.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/InitializerExpressionFactory.java @@ -23,7 +23,7 @@ import org.apache.calcite.schema.ColumnStrategy; import org.apache.calcite.sql.SqlFunction; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.function.BiFunction; diff --git a/core/src/main/java/org/apache/calcite/sql2rel/NullInitializerExpressionFactory.java b/core/src/main/java/org/apache/calcite/sql2rel/NullInitializerExpressionFactory.java index 13ac72c37ba1..28c856079a9d 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/NullInitializerExpressionFactory.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/NullInitializerExpressionFactory.java @@ -23,7 +23,7 @@ import org.apache.calcite.schema.ColumnStrategy; import org.apache.calcite.sql.SqlFunction; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.function.BiFunction; diff --git a/core/src/main/java/org/apache/calcite/sql2rel/ReflectiveConvertletTable.java b/core/src/main/java/org/apache/calcite/sql2rel/ReflectiveConvertletTable.java index 1b7077d53a7f..1d89431d0804 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/ReflectiveConvertletTable.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/ReflectiveConvertletTable.java @@ -22,9 +22,7 @@ import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.parser.SqlParserPos; -import org.checkerframework.checker.initialization.qual.UnderInitialization; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.RequiresNonNull; +import org.jspecify.annotations.Nullable; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -64,9 +62,7 @@ public ReflectiveConvertletTable() { * c. has a return type of "RexNode" or a subtype d. has a 2 parameters with * types ConvertletContext and SqlNode (or a subtype) respectively. */ - @RequiresNonNull("map") private void registerNodeTypeMethod( - @UnderInitialization ReflectiveConvertletTable this, final Method method) { if (!isPublic(method)) { return; @@ -90,7 +86,7 @@ private void registerNodeTypeMethod( } map.put(parameterType, (SqlRexConvertlet) (cx, call) -> { try { - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") RexNode result = (RexNode) method.invoke(ReflectiveConvertletTable.this, cx, call); return requireNonNull(result, @@ -107,9 +103,7 @@ private void registerNodeTypeMethod( * types: ConvertletContext; SqlOperator (or a subtype), SqlCall (or a * subtype). */ - @RequiresNonNull("map") private void registerOpTypeMethod( - @UnderInitialization ReflectiveConvertletTable this, final Method method) { if (!isPublic(method)) { return; @@ -137,7 +131,7 @@ private void registerOpTypeMethod( } map.put(opClass, (SqlRexConvertlet) (cx, call) -> { try { - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") RexNode result = (RexNode) method.invoke(ReflectiveConvertletTable.this, cx, call.getOperator(), call); @@ -192,7 +186,6 @@ private void registerOpTypeMethod( * @param convertlet Convertlet */ protected void registerOp( - @UnderInitialization ReflectiveConvertletTable this, SqlOperator op, SqlRexConvertlet convertlet) { map.put(op, convertlet); } @@ -204,7 +197,6 @@ protected void registerOp( * @param target Operator to translate calls to */ protected void addAlias( - @UnderInitialization ReflectiveConvertletTable this, final SqlOperator alias, final SqlOperator target) { map.put( alias, (SqlRexConvertlet) (cx, call) -> { diff --git a/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java b/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java index fbf949ac189a..278978224b27 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java @@ -110,8 +110,8 @@ import com.google.common.collect.Sets; import com.google.common.collect.SortedSetMultimap; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import java.math.BigDecimal; @@ -169,7 +169,7 @@ public class RelDecorrelator implements ReflectiveVisitor { * Each entry maps a CorrelationId to the Frame where its correlated variables originate. */ protected final Deque> frameStack = new ArrayDeque<>(); - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") protected final ReflectUtil.MethodDispatcher<@Nullable Frame> dispatcher = ReflectUtil.createMethodDispatcher( Frame.class, getVisitor(), "decorrelateRel", @@ -290,7 +290,7 @@ public static RelNode decorrelateQuery(RelNode rootRel, private void setCurrent(@Nullable RelNode root, @Nullable Correlate corRel) { currentRel = corRel; if (corRel != null) { - cm = new CorelMapBuilder().build(Util.first(root, corRel)); + cm = new CorelMapBuilder().build(Util.firstNonNull(root, corRel)); } } @@ -2800,7 +2800,7 @@ private RexNode createCaseExpression( // expression. They need to be added to the window partition keys so that // decorrelation does not widen the window computation scope. final List correlationFields = new ArrayList<>(); - over.accept(new RexVisitorImpl(true) { + over.accept(new RexVisitorImpl<@Nullable Void>(true) { @Override public Void visitFieldAccess(RexFieldAccess fieldAccess) { if (cm.mapFieldAccessToCorRef.containsKey(fieldAccess) && !correlationFields.contains(fieldAccess)) { @@ -3992,8 +3992,8 @@ private RelNode visitJoin(BiRel join) { return join; } - private RexVisitorImpl rexVisitor(final RelNode rel) { - return new RexVisitorImpl(true) { + private RexVisitorImpl<@Nullable Void> rexVisitor(final RelNode rel) { + return new RexVisitorImpl<@Nullable Void>(true) { @Override public Void visitFieldAccess(RexFieldAccess fieldAccess) { final RexNode ref = fieldAccess.getReferenceExpr(); if (ref instanceof RexCorrelVariable) { diff --git a/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java b/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java index d47adb17b5e0..c2bf100e4891 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java @@ -79,7 +79,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.ArrayList; @@ -132,7 +132,7 @@ public class RelFieldTrimmer implements ReflectiveVisitor { public RelFieldTrimmer(@Nullable SqlValidator validator, RelBuilder relBuilder) { Util.discard(validator); // may be useful one day this.relBuilder = relBuilder; - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") ReflectUtil.MethodDispatcher dispatcher = ReflectUtil.createMethodDispatcher( TrimResult.class, diff --git a/core/src/main/java/org/apache/calcite/sql2rel/RelStructuredTypeFlattener.java b/core/src/main/java/org/apache/calcite/sql2rel/RelStructuredTypeFlattener.java index 3ab73813eb28..cd14be3a7e69 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/RelStructuredTypeFlattener.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/RelStructuredTypeFlattener.java @@ -86,8 +86,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.SortedSetMultimap; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.common.value.qual.MinLen; +import org.jspecify.annotations.Nullable; import java.util.ArrayDeque; import java.util.ArrayList; @@ -1044,7 +1043,7 @@ private RelDataType removeDistinct(RelDataType type) { private RexNode flattenComparison( RexBuilder rexBuilder, SqlOperator op, - @MinLen(1) List exprs) { + List exprs) { final PairList flattenedExps = PairList.of(); flattenProjections(this, exprs, null, "", flattenedExps); int n = flattenedExps.size() / 2; diff --git a/core/src/main/java/org/apache/calcite/sql2rel/SqlRexConvertletTable.java b/core/src/main/java/org/apache/calcite/sql2rel/SqlRexConvertletTable.java index 92562019c327..2b35467d0f1a 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/SqlRexConvertletTable.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlRexConvertletTable.java @@ -18,7 +18,7 @@ import org.apache.calcite.sql.SqlCall; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Collection of {@link SqlRexConvertlet}s. diff --git a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java index c486e8ccded7..e19b638ddc7b 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java @@ -194,8 +194,8 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import java.lang.reflect.Type; @@ -1019,9 +1019,10 @@ private void distinctify( bottomNames.add(rel.getRowType().getFieldNames().get(i)); } + final Project bottomProject = castNonNull(project); bb.setRoot( - LogicalProject.create(castNonNull(project).getInput(), project.getHints(), - bottomExprs, bottomNames, project.getVariablesSet()), false); + LogicalProject.create(bottomProject.getInput(), bottomProject.getHints(), + bottomExprs, bottomNames, bottomProject.getVariablesSet()), false); final ImmutableBitSet aggGroupSet = ImmutableBitSet.range(groupSet.cardinality()); bb.setRoot( @@ -1044,7 +1045,7 @@ private void distinctify( if (idx >= 0) { topExprs.add(rexBuilder.makeInputRef(aggregate, idx)); } else { - topExprs.add(castNonNull(project).getProjects().get(i).accept(shuttle)); + topExprs.add(bottomProject.getProjects().get(i).accept(shuttle)); } } bb.setRoot( @@ -4555,7 +4556,9 @@ protected RelOptTable getTargetTable(SqlNode call) { final SqlValidatorNamespace targetNs = getNamespace(call); SqlValidatorNamespace namespace; if (targetNs.isWrapperFor(SqlValidatorImpl.DmlNamespace.class)) { - namespace = targetNs.unwrap(SqlValidatorImpl.DmlNamespace.class); + namespace = + requireNonNull(targetNs.unwrap(SqlValidatorImpl.DmlNamespace.class), + "DmlNamespace"); } else { namespace = targetNs.resolve(); } @@ -4636,7 +4639,7 @@ protected RelNode convertColumnList(final SqlInsert call, RelNode source) { } // sourceExps should not contain nulls (see the loop above) - @SuppressWarnings("assignment.type.incompatible") + @SuppressWarnings("NullAway") List nonNullExprs = sourceExps; return relBuilder.push(source) @@ -4682,7 +4685,7 @@ private static InitializerExpressionFactory getInitializerFactory( return NullInitializerExpressionFactory.INSTANCE; } - private static @Nullable T unwrap(@Nullable Object o, Class clazz) { + private static @Nullable T unwrap(@Nullable Object o, Class clazz) { if (o instanceof Wrapper) { return ((Wrapper) o).unwrap(clazz); } @@ -6739,13 +6742,13 @@ public static class SqlIdentifierFinder implements SqlVisitor { /** * Visitor that collects all aggregate functions in a {@link SqlNode} tree. */ - private static class AggregateFinder extends SqlBasicVisitor { + private static class AggregateFinder extends SqlBasicVisitor<@Nullable Void> { final List list = new ArrayList<>(); final List filterList = new ArrayList<>(); final List distinctList = new ArrayList<>(); final List orderList = new ArrayList<>(); - @Override public Void visit(SqlCall call) { + @Override public @Nullable Void visit(SqlCall call) { // ignore window aggregates and ranking functions (associated with OVER operator) if (call.getOperator().getKind() == SqlKind.OVER) { return null; diff --git a/core/src/main/java/org/apache/calcite/sql2rel/StandardConvertletTable.java b/core/src/main/java/org/apache/calcite/sql2rel/StandardConvertletTable.java index bff49f3924ea..bfee3b056a82 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/StandardConvertletTable.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/StandardConvertletTable.java @@ -86,8 +86,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.initialization.qual.UnknownInitialization; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.math.RoundingMode; @@ -740,7 +739,6 @@ public RexNode convertJdbc( } protected RexNode convertCast( - @UnknownInitialization StandardConvertletTable this, SqlRexContext cx, final SqlCall call) { RelDataTypeFactory typeFactory = cx.getTypeFactory(); @@ -875,7 +873,6 @@ protected RexNode convertFloorCeil(SqlRexContext cx, SqlCall call) { } protected RexNode convertCharset( - @UnknownInitialization StandardConvertletTable this, SqlRexContext cx, SqlCall call) { final RexBuilder rexBuilder = cx.getRexBuilder(); final SqlParserPos pos = call.getParserPosition(); @@ -912,7 +909,6 @@ protected RexNode convertCharset( } protected RexNode translateCharset( - @UnknownInitialization StandardConvertletTable this, SqlRexContext cx, SqlCall call) { final SqlParserPos pos = call.getParserPosition(); final SqlNode expr = call.operand(0); @@ -968,7 +964,6 @@ private static RexNode divide(SqlParserPos pos, RexBuilder rexBuilder, RexNode r } public RexNode convertDatetimeMinus( - @UnknownInitialization StandardConvertletTable this, SqlRexContext cx, SqlDatetimeSubtractionOperator op, SqlCall call) { @@ -1137,7 +1132,6 @@ private static RexNode makeConstructorCall( } private RexNode convertItem( - @UnknownInitialization StandardConvertletTable this, SqlRexContext cx, SqlCall call) { final RexBuilder rexBuilder = cx.getRexBuilder(); @@ -1173,7 +1167,6 @@ private RexNode convertItem( } private RexNode convertColon( - @UnknownInitialization StandardConvertletTable this, SqlRexContext cx, SqlCall call) { final RexBuilder rexBuilder = cx.getRexBuilder(); @@ -1199,7 +1192,6 @@ private RexNode convertColon( * @return Rex call */ public RexNode convertCall( - @UnknownInitialization StandardConvertletTable this, SqlRexContext cx, SqlCall call) { final SqlOperator op = call.getOperator(); @@ -1381,7 +1373,6 @@ private static List convertOperands(SqlRexContext cx, } private RexNode convertPlus( - @UnknownInitialization StandardConvertletTable this, SqlRexContext cx, SqlCall call) { final RexNode rex = convertCall(cx, call); switch (rex.getType().getSqlTypeName()) { @@ -1422,7 +1413,6 @@ private RexNode convertPlus( } private RexNode convertIsDistinctFrom( - @UnknownInitialization StandardConvertletTable this, SqlRexContext cx, SqlCall call, boolean neg) { @@ -1640,7 +1630,6 @@ private static Pair convertOverlapsOperand(SqlRexContext cx, @Deprecated // to be removed before 2.0 public RexNode castToValidatedType( - @UnknownInitialization StandardConvertletTable this, SqlRexContext cx, SqlCall call, RexNode value) { diff --git a/core/src/main/java/org/apache/calcite/sql2rel/SubQueryConverter.java b/core/src/main/java/org/apache/calcite/sql2rel/SubQueryConverter.java index f1c00864d3c9..fa6096f0d372 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/SubQueryConverter.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/SubQueryConverter.java @@ -19,7 +19,7 @@ import org.apache.calcite.rex.RexNode; import org.apache.calcite.sql.SqlCall; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * SubQueryConverter provides the interface for classes that convert sub-queries diff --git a/core/src/main/java/org/apache/calcite/sql2rel/TopDownGeneralDecorrelator.java b/core/src/main/java/org/apache/calcite/sql2rel/TopDownGeneralDecorrelator.java index ead86414f228..41559298fcdd 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/TopDownGeneralDecorrelator.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/TopDownGeneralDecorrelator.java @@ -63,7 +63,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.Collections; @@ -137,7 +137,7 @@ public class TopDownGeneralDecorrelator implements ReflectiveVisitor { // invokes using reflection a method named unnestInternal based on the // runtime type of the argument. - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") private final ReflectUtil.MethodDispatcher dispatcher = ReflectUtil.createMethodDispatcher( RelNode.class, getVisitor(), "unnestInternal", RelNode.class, boolean.class); @@ -153,7 +153,7 @@ public class TopDownGeneralDecorrelator implements ReflectiveVisitor { * expressions * @param parentMapRelToUnnestedQuery a map from RelNode to its UnnestedQuery */ - @SuppressWarnings("initialization.fields.uninitialized") + @SuppressWarnings("NullAway") private TopDownGeneralDecorrelator( RelBuilder builder, boolean hasParent, diff --git a/core/src/main/java/org/apache/calcite/sql2rel/package-info.java b/core/src/main/java/org/apache/calcite/sql2rel/package-info.java index 7e442a1288bc..dacbb9ca2c68 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/package-info.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/package-info.java @@ -18,11 +18,7 @@ /** * Translates a SQL parse tree to relational expression. */ -@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.sql2rel; -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/statistic/package-info.java b/core/src/main/java/org/apache/calcite/statistic/package-info.java index 016ed58efcea..2ebb222f3842 100644 --- a/core/src/main/java/org/apache/calcite/statistic/package-info.java +++ b/core/src/main/java/org/apache/calcite/statistic/package-info.java @@ -20,11 +20,7 @@ * * @see org.apache.calcite.materialize.SqlStatisticProvider */ -@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.statistic; -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/tools/FrameworkConfig.java b/core/src/main/java/org/apache/calcite/tools/FrameworkConfig.java index 68f727a318ff..b3b579e2f2e3 100644 --- a/core/src/main/java/org/apache/calcite/tools/FrameworkConfig.java +++ b/core/src/main/java/org/apache/calcite/tools/FrameworkConfig.java @@ -32,7 +32,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Interface that describes how to configure planning sessions generated diff --git a/core/src/main/java/org/apache/calcite/tools/Frameworks.java b/core/src/main/java/org/apache/calcite/tools/Frameworks.java index 2af5c7447e16..1df10860f658 100644 --- a/core/src/main/java/org/apache/calcite/tools/Frameworks.java +++ b/core/src/main/java/org/apache/calcite/tools/Frameworks.java @@ -46,7 +46,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.sql.Connection; import java.util.List; @@ -137,7 +137,7 @@ public static R withPlanner(final PlannerAction action, (cluster, relOptSchema, rootSchema, statement) -> { final CalciteSchema schema = CalciteSchema.from( - Util.first(config.getDefaultSchema(), rootSchema)); + Util.firstNonNull(config.getDefaultSchema(), rootSchema)); return action.apply(cluster, relOptSchema, schema.root().plus()); }); } diff --git a/core/src/main/java/org/apache/calcite/tools/Hoist.java b/core/src/main/java/org/apache/calcite/tools/Hoist.java index 1de2cb6c9af5..8d654439d796 100644 --- a/core/src/main/java/org/apache/calcite/tools/Hoist.java +++ b/core/src/main/java/org/apache/calcite/tools/Hoist.java @@ -28,8 +28,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.sql.PreparedStatement; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/tools/PigRelBuilder.java b/core/src/main/java/org/apache/calcite/tools/PigRelBuilder.java index 27024aad8cf4..78b0e99a376c 100644 --- a/core/src/main/java/org/apache/calcite/tools/PigRelBuilder.java +++ b/core/src/main/java/org/apache/calcite/tools/PigRelBuilder.java @@ -30,7 +30,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/tools/RelBuilder.java b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java index 97d2e3080dfe..517d8684f808 100644 --- a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java +++ b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java @@ -136,8 +136,8 @@ import com.google.common.collect.Multiset; import com.google.common.collect.Sets; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.AbstractList; @@ -172,6 +172,7 @@ import static org.apache.calcite.sql.SqlKind.UNION; import static org.apache.calcite.util.Static.RESOURCE; import static org.apache.calcite.util.Util.first; +import static org.apache.calcite.util.Util.firstNonNull; import static java.util.Objects.requireNonNull; @@ -2122,7 +2123,7 @@ private RelBuilder project_( // Perform a quick check for identity. We'll do a deeper check // later when we've derived column names. - if (!force && Iterables.isEmpty(fieldNames) + if (!force && !fieldNames.iterator().hasNext() && RexUtil.isIdentity(nodeList, inputRowType)) { return this; } @@ -3959,7 +3960,7 @@ private static RelFieldCollation collation(RexNode node, switch (node.getKind()) { case INPUT_REF: return new RelFieldCollation(((RexInputRef) node).getIndex(), direction, - first(nullDirection, direction.defaultNullDirection())); + firstNonNull(nullDirection, direction.defaultNullDirection())); case DESCENDING: return collation(((RexCall) node).getOperands().get(0), RelFieldCollation.Direction.DESCENDING, @@ -3974,7 +3975,7 @@ private static RelFieldCollation collation(RexNode node, final int fieldIndex = extraNodes.size(); extraNodes.add(node); return new RelFieldCollation(fieldIndex, direction, - first(nullDirection, direction.defaultNullDirection())); + firstNonNull(nullDirection, direction.defaultNullDirection())); } } diff --git a/core/src/main/java/org/apache/calcite/tools/RelBuilderFactory.java b/core/src/main/java/org/apache/calcite/tools/RelBuilderFactory.java index 57f716a8eef6..b0f08131c708 100644 --- a/core/src/main/java/org/apache/calcite/tools/RelBuilderFactory.java +++ b/core/src/main/java/org/apache/calcite/tools/RelBuilderFactory.java @@ -21,7 +21,7 @@ import org.apache.calcite.plan.RelOptSchema; import org.apache.calcite.rel.core.RelFactories; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** A partially-created RelBuilder. * diff --git a/core/src/main/java/org/apache/calcite/tools/RuleSets.java b/core/src/main/java/org/apache/calcite/tools/RuleSets.java index 8ad896148d21..2e282aca4eec 100644 --- a/core/src/main/java/org/apache/calcite/tools/RuleSets.java +++ b/core/src/main/java/org/apache/calcite/tools/RuleSets.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.Iterator; diff --git a/core/src/main/java/org/apache/calcite/tools/package-info.java b/core/src/main/java/org/apache/calcite/tools/package-info.java index 91e9a3b6f617..f6d43c3e63b7 100644 --- a/core/src/main/java/org/apache/calcite/tools/package-info.java +++ b/core/src/main/java/org/apache/calcite/tools/package-info.java @@ -18,11 +18,7 @@ /** * Provides utility classes. */ -@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.tools; -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/util/Arrow.java b/core/src/main/java/org/apache/calcite/util/Arrow.java index 01584264c90a..3e01a178c8a6 100644 --- a/core/src/main/java/org/apache/calcite/util/Arrow.java +++ b/core/src/main/java/org/apache/calcite/util/Arrow.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.util; -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/util/BarfingInvocationHandler.java b/core/src/main/java/org/apache/calcite/util/BarfingInvocationHandler.java index 50db7bb4bfc2..0f0e02cf0907 100644 --- a/core/src/main/java/org/apache/calcite/util/BarfingInvocationHandler.java +++ b/core/src/main/java/org/apache/calcite/util/BarfingInvocationHandler.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; @@ -44,7 +44,7 @@ protected BarfingInvocationHandler() { @Override public @Nullable Object invoke( Object proxy, Method method, - @Nullable Object[] args) throws Throwable { + @Nullable Object @Nullable [] args) throws Throwable { Class clazz = getClass(); Method matchingMethod; try { diff --git a/core/src/main/java/org/apache/calcite/util/BitSets.java b/core/src/main/java/org/apache/calcite/util/BitSets.java index d4b941eebb3e..31cf8884fd78 100644 --- a/core/src/main/java/org/apache/calcite/util/BitSets.java +++ b/core/src/main/java/org/apache/calcite/util/BitSets.java @@ -327,7 +327,7 @@ private static class Closure { private final SortedMap equivalence; private final NavigableMap closure = new TreeMap<>(); - @SuppressWarnings({"JdkObsolete", "method.invocation.invalid"}) + @SuppressWarnings({"JdkObsolete", "NullAway"}) Closure(SortedMap equivalence) { this.equivalence = equivalence; final ImmutableIntList keys = diff --git a/core/src/main/java/org/apache/calcite/util/BitString.java b/core/src/main/java/org/apache/calcite/util/BitString.java index 1d9459f7c90e..5190859c96da 100644 --- a/core/src/main/java/org/apache/calcite/util/BitString.java +++ b/core/src/main/java/org/apache/calcite/util/BitString.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigInteger; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/util/BlackholeMap.java b/core/src/main/java/org/apache/calcite/util/BlackholeMap.java index f22c72a2d029..517a9180aa0a 100644 --- a/core/src/main/java/org/apache/calcite/util/BlackholeMap.java +++ b/core/src/main/java/org/apache/calcite/util/BlackholeMap.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.AbstractMap; import java.util.AbstractSet; @@ -94,12 +94,12 @@ public static Set of() { private BlackholeMap() {} - @SuppressWarnings("contracts.postcondition.not.satisfied") + @SuppressWarnings("NullAway") @Override public @Nullable V put(K key, V value) { return null; } - @SuppressWarnings("override.return.invalid") + @SuppressWarnings("NullAway") @Override public Set> entrySet() { return BHSet.of(); } diff --git a/core/src/main/java/org/apache/calcite/util/BuiltInMethod.java b/core/src/main/java/org/apache/calcite/util/BuiltInMethod.java index 948b62f28816..e4bd92f0527c 100644 --- a/core/src/main/java/org/apache/calcite/util/BuiltInMethod.java +++ b/core/src/main/java/org/apache/calcite/util/BuiltInMethod.java @@ -128,7 +128,7 @@ import com.google.common.collect.ImmutableMap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Constructor; import java.lang.reflect.Field; @@ -1077,6 +1077,6 @@ public enum BuiltInMethod { } public String getMethodName() { - return castNonNull(method).getName(); + return method.getName(); } } diff --git a/core/src/main/java/org/apache/calcite/util/ChunkList.java b/core/src/main/java/org/apache/calcite/util/ChunkList.java index 7f7ea16250ef..47af033dcfc7 100644 --- a/core/src/main/java/org/apache/calcite/util/ChunkList.java +++ b/core/src/main/java/org/apache/calcite/util/ChunkList.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.AbstractSequentialList; import java.util.Arrays; @@ -63,7 +63,7 @@ public ChunkList() { * Creates a ChunkList whose contents are a given Collection. */ public ChunkList(Collection collection) { - @SuppressWarnings({"method.invocation.invalid", "unused"}) + @SuppressWarnings({"NullAway", "unused"}) boolean ignore = addAll(collection); } @@ -156,6 +156,9 @@ boolean isValid(boolean fail) { return (E @Nullable []) chunk[0]; } + // Slots 0 and 1 hold the neighbouring chunks rather than elements, and a chunk at + // either end has no neighbour. + @SuppressWarnings("NullAway") private static void setPrev(E[] chunk, E @Nullable [] prev) { //noinspection unchecked chunk[0] = (E) prev; @@ -166,6 +169,7 @@ private static void setPrev(E[] chunk, E @Nullable [] prev) { return (E @Nullable []) chunk[1]; } + @SuppressWarnings("NullAway") private static void setNext(E[] chunk, E @Nullable [] next) { assert chunk != next; //noinspection unchecked @@ -331,11 +335,8 @@ private E[] currentChunk() { if (r < start) { // Element we wish to eliminate is the last element in the previous // block. - E[] c = chunk; - if (c == null) { - c = last; - } - int o = occupied(castNonNull(c)); + final E[] c = castNonNull(chunk == null ? last : chunk); + int o = occupied(c); if (o == 1) { // Block is now empty; remove it final E[] prev = prev(c); @@ -375,8 +376,8 @@ private E[] currentChunk() { int s = start; if (p < start) { // The element is at the end of the previous chunk - c = prev(c); - s -= occupied(castNonNull(c)); + c = castNonNull(prev(c)); + s -= occupied(c); } setElement(c, HEADER_SIZE + p - s, e); } diff --git a/core/src/main/java/org/apache/calcite/util/Compatible.java b/core/src/main/java/org/apache/calcite/util/Compatible.java index 924621d2f9a4..9af767f97b0b 100644 --- a/core/src/main/java/org/apache/calcite/util/Compatible.java +++ b/core/src/main/java/org/apache/calcite/util/Compatible.java @@ -47,7 +47,8 @@ Compatible create() { // Use MethodHandles.privateLookupIn if it is available (JDK 9 // and above) @SuppressWarnings("rawtypes") - final Class clazz = (Class) requireNonNull(args[0], "args[0]"); + final Class clazz = + (Class) requireNonNull(requireNonNull(args, "args")[0], "args[0]"); try { final Method privateLookupMethod = MethodHandles.class.getMethod("privateLookupIn", diff --git a/core/src/main/java/org/apache/calcite/util/CompositeList.java b/core/src/main/java/org/apache/calcite/util/CompositeList.java index a79a90ff2b0e..96e498faec85 100644 --- a/core/src/main/java/org/apache/calcite/util/CompositeList.java +++ b/core/src/main/java/org/apache/calcite/util/CompositeList.java @@ -18,6 +18,8 @@ import com.google.common.collect.ImmutableList; +import org.jspecify.annotations.Nullable; + import java.util.AbstractList; import java.util.List; @@ -55,7 +57,7 @@ private CompositeList(ImmutableList> lists) { * @return List consisting of all lists */ @SafeVarargs - public static CompositeList of(List... lists) { + public static CompositeList of(List... lists) { //noinspection unchecked return new CompositeList((ImmutableList) ImmutableList.copyOf(lists)); } @@ -67,7 +69,7 @@ public static CompositeList of(List... lists) { * @param Element type * @return List consisting of all lists */ - public static CompositeList ofCopy(Iterable> lists) { + public static CompositeList ofCopy(Iterable> lists) { final ImmutableList> list = ImmutableList.copyOf(lists); return new CompositeList<>(list); } @@ -78,7 +80,7 @@ public static CompositeList ofCopy(Iterable> lists) { * @param Element type * @return List consisting of all lists */ - public static List of() { + public static List of() { return ImmutableList.of(); } @@ -89,7 +91,7 @@ public static List of() { * @param Element type * @return List consisting of all lists */ - public static List of(List list0) { + public static List of(List list0) { return list0; } @@ -101,7 +103,7 @@ public static List of(List list0) { * @param Element type * @return List consisting of all lists */ - public static CompositeList of(List list0, + public static CompositeList of(List list0, List list1) { //noinspection unchecked return new CompositeList((ImmutableList) ImmutableList.of(list0, list1)); @@ -116,7 +118,7 @@ public static CompositeList of(List list0, * @param Element type * @return List consisting of all lists */ - public static CompositeList of(List list0, + public static CompositeList of(List list0, List list1, List list2) { //noinspection unchecked diff --git a/core/src/main/java/org/apache/calcite/util/CompositeMap.java b/core/src/main/java/org/apache/calcite/util/CompositeMap.java index b5f7acd0d7c9..2a2f8252298f 100644 --- a/core/src/main/java/org/apache/calcite/util/CompositeMap.java +++ b/core/src/main/java/org/apache/calcite/util/CompositeMap.java @@ -19,8 +19,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import org.checkerframework.checker.nullness.qual.KeyFor; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Collection; import java.util.LinkedHashSet; @@ -71,7 +70,7 @@ private static ImmutableList list(E e, E[] es) { return true; } - @SuppressWarnings("contracts.conditional.postcondition.not.satisfied") + @SuppressWarnings("NullAway") @Override public boolean containsKey(@Nullable Object key) { for (Map map : maps) { if (map.containsKey(key)) { @@ -120,8 +119,8 @@ private static ImmutableList list(E e, E[] es) { throw new UnsupportedOperationException(); } - @SuppressWarnings("return.type.incompatible") - @Override public Set<@KeyFor("this") K> keySet() { + @SuppressWarnings("NullAway") + @Override public Set keySet() { final Set keys = new LinkedHashSet<>(); for (Map map : maps) { keys.addAll(map.keySet()); @@ -146,8 +145,8 @@ private Map combinedMap() { return combinedMap().values(); } - @SuppressWarnings("return.type.incompatible") - @Override public Set> entrySet() { + @SuppressWarnings("NullAway") + @Override public Set> entrySet() { return combinedMap().entrySet(); } } diff --git a/core/src/main/java/org/apache/calcite/util/ConversionUtil.java b/core/src/main/java/org/apache/calcite/util/ConversionUtil.java index 72c418db3e87..beab62aa6136 100644 --- a/core/src/main/java/org/apache/calcite/util/ConversionUtil.java +++ b/core/src/main/java/org/apache/calcite/util/ConversionUtil.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.nio.ByteOrder; import java.text.NumberFormat; diff --git a/core/src/main/java/org/apache/calcite/util/DateString.java b/core/src/main/java/org/apache/calcite/util/DateString.java index 86497047f195..1c178b7f47be 100644 --- a/core/src/main/java/org/apache/calcite/util/DateString.java +++ b/core/src/main/java/org/apache/calcite/util/DateString.java @@ -22,7 +22,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Calendar; import java.util.regex.Pattern; @@ -48,7 +48,7 @@ private DateString(String v, @SuppressWarnings("unused") boolean ignore) { } /** Creates a DateString. */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") public DateString(String v) { this(v, false); checkArgument(PATTERN.matcher(v).matches(), diff --git a/core/src/main/java/org/apache/calcite/util/DelegatingInvocationHandler.java b/core/src/main/java/org/apache/calcite/util/DelegatingInvocationHandler.java index 30e2db00dd70..5d237632150e 100644 --- a/core/src/main/java/org/apache/calcite/util/DelegatingInvocationHandler.java +++ b/core/src/main/java/org/apache/calcite/util/DelegatingInvocationHandler.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; @@ -56,7 +56,7 @@ public abstract class DelegatingInvocationHandler implements InvocationHandler { @Override public @Nullable Object invoke( Object proxy, Method method, - @Nullable Object[] args) throws Throwable { + @Nullable Object @Nullable [] args) throws Throwable { Class clazz = getClass(); Method matchingMethod; try { diff --git a/core/src/main/java/org/apache/calcite/util/Filterator.java b/core/src/main/java/org/apache/calcite/util/Filterator.java index c3c441031ef8..6aacbe69915c 100644 --- a/core/src/main/java/org/apache/calcite/util/Filterator.java +++ b/core/src/main/java/org/apache/calcite/util/Filterator.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Iterator; import java.util.NoSuchElementException; @@ -34,7 +34,7 @@ * * @param Element type */ -public class Filterator implements Iterator { +public class Filterator implements Iterator { //~ Instance fields -------------------------------------------------------- final Class includeFilter; diff --git a/core/src/main/java/org/apache/calcite/util/Glossary.java b/core/src/main/java/org/apache/calcite/util/Glossary.java index ddd6a723ef10..6b41f2537afe 100644 --- a/core/src/main/java/org/apache/calcite/util/Glossary.java +++ b/core/src/main/java/org/apache/calcite/util/Glossary.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * A collection of terms. diff --git a/core/src/main/java/org/apache/calcite/util/Holder.java b/core/src/main/java/org/apache/calcite/util/Holder.java index 78aedcd3eebd..6b923e075265 100644 --- a/core/src/main/java/org/apache/calcite/util/Holder.java +++ b/core/src/main/java/org/apache/calcite/util/Holder.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.function.UnaryOperator; @@ -29,7 +29,7 @@ * * @param Element type */ -public class Holder { +public class Holder { private E e; /** Creates a Holder containing a given value. diff --git a/core/src/main/java/org/apache/calcite/util/ImmutableBitSet.java b/core/src/main/java/org/apache/calcite/util/ImmutableBitSet.java index 29aac2d42120..c2574a354d25 100644 --- a/core/src/main/java/org/apache/calcite/util/ImmutableBitSet.java +++ b/core/src/main/java/org/apache/calcite/util/ImmutableBitSet.java @@ -17,6 +17,7 @@ package org.apache.calcite.util; import org.apache.calcite.linq4j.Linq4j; +import org.apache.calcite.linq4j.annotations.RequiresNonNull; import org.apache.calcite.runtime.Utilities; import org.apache.calcite.util.mapping.Mappings; @@ -24,10 +25,7 @@ import com.google.common.collect.ImmutableSortedMap; import com.google.common.collect.Ordering; -import org.checkerframework.checker.initialization.qual.UnderInitialization; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.RequiresNonNull; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.Nullable; import java.io.Serializable; import java.nio.LongBuffer; @@ -286,7 +284,6 @@ public static ImmutableBitSet range(int toIndex) { /** * Given a bit index, return word index containing it. */ - @Pure private static int wordIndex(int bitIndex) { return bitIndex >> ADDRESS_BITS_PER_WORD; } @@ -1044,7 +1041,6 @@ private static class Closure { @RequiresNonNull("equivalence") private ImmutableBitSet computeClosure( - @UnderInitialization Closure this, int pos) { ImmutableBitSet o = closure.get(pos); if (o != null) { diff --git a/core/src/main/java/org/apache/calcite/util/ImmutableIntList.java b/core/src/main/java/org/apache/calcite/util/ImmutableIntList.java index c8448aa9bcbc..0be7eee90bd5 100644 --- a/core/src/main/java/org/apache/calcite/util/ImmutableIntList.java +++ b/core/src/main/java/org/apache/calcite/util/ImmutableIntList.java @@ -25,7 +25,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.UnmodifiableListIterator; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Array; import java.util.ArrayList; @@ -135,7 +135,7 @@ private static ImmutableIntList copyFromCollection( return Arrays.hashCode(ints); } - @SuppressWarnings("contracts.conditional.postcondition.not.satisfied") + @SuppressWarnings("NullAway") @Override public boolean equals(@Nullable Object obj) { return ((this == obj) || (obj instanceof ImmutableIntList)) @@ -179,9 +179,9 @@ public void forEachInt(IntConsumer action) { return objects; } - @Override public @Nullable T[] toArray(T @Nullable [] a) { + @Override public T[] toArray(T[] a) { final int size = ints.length; - if (castNonNull(a).length < size) { + if (a.length < size) { // Make a new array of a's runtime type, but my contents: a = a.getClass() == Object[].class ? (T[]) new Object[size] @@ -335,8 +335,8 @@ private static class EmptyImmutableIntList extends ImmutableIntList { return EMPTY_ARRAY; } - @Override public @Nullable T[] toArray(T @Nullable [] a) { - if (castNonNull(a).length > 0) { + @Override public T[] toArray(T[] a) { + if (a.length > 0) { a[0] = castNonNull(null); } return a; diff --git a/core/src/main/java/org/apache/calcite/util/ImmutableNullableList.java b/core/src/main/java/org/apache/calcite/util/ImmutableNullableList.java index 34b2ce948d1b..1d186cbe0945 100644 --- a/core/src/main/java/org/apache/calcite/util/ImmutableNullableList.java +++ b/core/src/main/java/org/apache/calcite/util/ImmutableNullableList.java @@ -20,7 +20,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Iterators; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.AbstractList; import java.util.ArrayList; @@ -37,7 +37,7 @@ * * @param Element type */ -public class ImmutableNullableList extends AbstractList { +public class ImmutableNullableList extends AbstractList { private static final List SINGLETON_NULL = Collections.singletonList(null); private final E[] elements; @@ -54,7 +54,7 @@ private ImmutableNullableList(E[] elements) { * {@link com.google.common.collect.ImmutableList#copyOf(java.util.Collection)} * except that this list allows nulls. */ - public static List copyOf(Collection elements) { + public static List copyOf(Collection elements) { if (elements instanceof ImmutableNullableList || elements instanceof ImmutableList || elements == SINGLETON_NULL) { @@ -67,7 +67,7 @@ public static List copyOf(Collection elements) { // If there are no nulls, ImmutableList is better. for (E object : elements) { if (object == null) { - final Object[] objects = elements.toArray(); + final @Nullable Object[] objects = elements.toArray(); //noinspection unchecked return new ImmutableNullableList<>((E[]) objects); } @@ -82,7 +82,7 @@ public static List copyOf(Collection elements) { * {@link com.google.common.collect.ImmutableList#copyOf(Iterable)} * except that this list allows nulls. */ - public static List copyOf(Iterable elements) { + public static List copyOf(Iterable elements) { if (elements instanceof ImmutableNullableList || elements instanceof ImmutableList || elements == SINGLETON_NULL) { @@ -109,7 +109,7 @@ public static List copyOf(Iterable elements) { * {@link com.google.common.collect.ImmutableList#copyOf(Object[])} * except that this list allows nulls. */ - public static List copyOf(E[] elements) { + public static List copyOf(E[] elements) { // Check for nulls. for (E object : elements) { if (object == null) { @@ -122,55 +122,56 @@ public static List copyOf(E[] elements) { } /** Creates an immutable list of 1 element. */ - public static List of(@Nullable E e1) { + public static List of(@Nullable E e1) { //noinspection unchecked return e1 == null ? (List) SINGLETON_NULL : ImmutableList.of(e1); } /** Creates an immutable list of 2 elements. */ - public static List of(E e1, E e2) { + public static List of(E e1, E e2) { // Only we can see the varargs array. Therefore the list is immutable. //noinspection unchecked return UnmodifiableArrayList.of(e1, e2); } /** Creates an immutable list of 3 elements. */ - public static List of(E e1, E e2, E e3) { + public static List of(E e1, E e2, E e3) { // Only we can see the varargs array. Therefore the list is immutable. //noinspection unchecked return UnmodifiableArrayList.of(e1, e2, e3); } /** Creates an immutable list of 4 elements. */ - public static List of(E e1, E e2, E e3, E e4) { + public static List of(E e1, E e2, E e3, E e4) { // Only we can see the varargs array. Therefore the list is immutable. //noinspection unchecked return UnmodifiableArrayList.of(e1, e2, e3, e4); } /** Creates an immutable list of 5 elements. */ - public static List of(E e1, E e2, E e3, E e4, E e5) { + public static List of(E e1, E e2, E e3, E e4, E e5) { // Only we can see the varargs array. Therefore the list is immutable. //noinspection unchecked return UnmodifiableArrayList.of(e1, e2, e3, e4, e5); } /** Creates an immutable list of 6 elements. */ - public static List of(E e1, E e2, E e3, E e4, E e5, E e6) { + public static List of(E e1, E e2, E e3, E e4, E e5, E e6) { // Only we can see the varargs array. Therefore the list is immutable. //noinspection unchecked return UnmodifiableArrayList.of(e1, e2, e3, e4, e5, e6); } /** Creates an immutable list of 7 elements. */ - public static List of(E e1, E e2, E e3, E e4, E e5, E e6, E e7) { + public static List of(E e1, E e2, E e3, E e4, E e5, E e6, E e7) { // Only we can see the varargs array. Therefore the list is immutable. //noinspection unchecked return UnmodifiableArrayList.of(e1, e2, e3, e4, e5, e6, e7); } /** Creates an immutable list of 8 or more elements. */ - public static List of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, + public static + List of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E... others) { @SuppressWarnings("unchecked") E[] array = (E[]) new Object[8 + others.length]; @@ -198,7 +199,7 @@ public static List of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, * Returns a new builder. The generated builder is equivalent to the builder * created by the {@link Builder} constructor. */ - public static Builder builder() { + public static Builder builder() { return new Builder<>(); } @@ -207,7 +208,7 @@ public static Builder builder() { * * @param element type */ - public static final class Builder { + public static final class Builder { private final List contents = new ArrayList<>(); /** diff --git a/core/src/main/java/org/apache/calcite/util/ImmutableNullableSet.java b/core/src/main/java/org/apache/calcite/util/ImmutableNullableSet.java index 4c886a7c1515..08c02d88876a 100644 --- a/core/src/main/java/org/apache/calcite/util/ImmutableNullableSet.java +++ b/core/src/main/java/org/apache/calcite/util/ImmutableNullableSet.java @@ -23,8 +23,8 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Iterators; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import java.util.AbstractSet; import java.util.ArrayList; @@ -151,7 +151,7 @@ private static Set copyOf(E[] elements, boolean needCopy) { objects[i] = NullSentinel.INSTANCE; } } - @SuppressWarnings({"nullness", "NullableProblems"}) + @SuppressWarnings({"NullAway", "NullableProblems"}) @NonNull Object[] nonNullObjects = objects; return new ImmutableNullableSet(ImmutableSet.copyOf(nonNullObjects)); } diff --git a/core/src/main/java/org/apache/calcite/util/IntegerIntervalSet.java b/core/src/main/java/org/apache/calcite/util/IntegerIntervalSet.java index a2972daed655..0bb3a7f38bb9 100644 --- a/core/src/main/java/org/apache/calcite/util/IntegerIntervalSet.java +++ b/core/src/main/java/org/apache/calcite/util/IntegerIntervalSet.java @@ -19,7 +19,7 @@ import org.apache.calcite.linq4j.Enumerator; import org.apache.calcite.linq4j.Linq4j; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.AbstractSet; import java.util.Iterator; diff --git a/core/src/main/java/org/apache/calcite/util/JdbcType.java b/core/src/main/java/org/apache/calcite/util/JdbcType.java index eb5d26475074..f495e6aea8d0 100644 --- a/core/src/main/java/org/apache/calcite/util/JdbcType.java +++ b/core/src/main/java/org/apache/calcite/util/JdbcType.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.sql.ResultSet; diff --git a/core/src/main/java/org/apache/calcite/util/JdbcTypeImpl.java b/core/src/main/java/org/apache/calcite/util/JdbcTypeImpl.java index aa8d4853de30..aafd9a5ddf53 100644 --- a/core/src/main/java/org/apache/calcite/util/JdbcTypeImpl.java +++ b/core/src/main/java/org/apache/calcite/util/JdbcTypeImpl.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.sql.ResultSet; @@ -32,7 +32,10 @@ *

    It is frustrating that we can't use an {@code enum} to implement an * interface with a type parameter. At times like this, we wish Java had * Generalized Algebraic Data Types (GADTs). */ -@SuppressWarnings("rawtypes") +// The XXX_NULLABLE constants return null for a null column. They cannot say so in their +// signature: the enum implements JdbcType raw, because a constant cannot carry its own +// type argument, so every get() is checked against the erased T. +@SuppressWarnings({"rawtypes", "NullAway"}) enum JdbcTypeImpl implements JdbcType { BIG_DECIMAL(BigDecimal.class, false) { @Override public BigDecimal get(int column, diff --git a/core/src/main/java/org/apache/calcite/util/JsonBuilder.java b/core/src/main/java/org/apache/calcite/util/JsonBuilder.java index 600dbd14591d..f814c3a49cb8 100644 --- a/core/src/main/java/org/apache/calcite/util/JsonBuilder.java +++ b/core/src/main/java/org/apache/calcite/util/JsonBuilder.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.LinkedHashMap; diff --git a/core/src/main/java/org/apache/calcite/util/LazyReference.java b/core/src/main/java/org/apache/calcite/util/LazyReference.java index 32f5c174f7a3..d3aa98899e1e 100644 --- a/core/src/main/java/org/apache/calcite/util/LazyReference.java +++ b/core/src/main/java/org/apache/calcite/util/LazyReference.java @@ -16,6 +16,8 @@ */ package org.apache.calcite.util; +import org.jspecify.annotations.Nullable; + import java.util.concurrent.atomic.AtomicReference; import java.util.function.Supplier; @@ -32,7 +34,7 @@ */ public class LazyReference { - private final AtomicReference value = new AtomicReference<>(); + private final AtomicReference<@Nullable T> value = new AtomicReference<>(); /** * Atomically sets the value to {@code supplier.get()} @@ -51,7 +53,7 @@ public T getOrCompute(Supplier supplier) { return result; } T computed = supplier.get(); - if (value.compareAndSet((T) null, computed)) { + if (value.compareAndSet(null, computed)) { return computed; } } @@ -61,6 +63,6 @@ public T getOrCompute(Supplier supplier) { * Resets the current value. */ public void reset() { - value.set((T) null); + value.set(null); } } diff --git a/core/src/main/java/org/apache/calcite/util/Litmus.java b/core/src/main/java/org/apache/calcite/util/Litmus.java index 863e14964b61..4ac0fadcdecf 100644 --- a/core/src/main/java/org/apache/calcite/util/Litmus.java +++ b/core/src/main/java/org/apache/calcite/util/Litmus.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.helpers.MessageFormatter; /** diff --git a/core/src/main/java/org/apache/calcite/util/MonotonicSupplier.java b/core/src/main/java/org/apache/calcite/util/MonotonicSupplier.java index 861623589f25..f993bfa5a467 100644 --- a/core/src/main/java/org/apache/calcite/util/MonotonicSupplier.java +++ b/core/src/main/java/org/apache/calcite/util/MonotonicSupplier.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.function.Consumer; import java.util.function.Supplier; diff --git a/core/src/main/java/org/apache/calcite/util/NameMap.java b/core/src/main/java/org/apache/calcite/util/NameMap.java index a41e3cdd3d25..342fc2c58b53 100644 --- a/core/src/main/java/org/apache/calcite/util/NameMap.java +++ b/core/src/main/java/org/apache/calcite/util/NameMap.java @@ -20,7 +20,7 @@ import com.google.common.collect.ImmutableSortedMap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Collections; import java.util.Map; diff --git a/core/src/main/java/org/apache/calcite/util/NameMultimap.java b/core/src/main/java/org/apache/calcite/util/NameMultimap.java index d37f5366c98e..25e04e38e030 100644 --- a/core/src/main/java/org/apache/calcite/util/NameMultimap.java +++ b/core/src/main/java/org/apache/calcite/util/NameMultimap.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; diff --git a/core/src/main/java/org/apache/calcite/util/NameSet.java b/core/src/main/java/org/apache/calcite/util/NameSet.java index 26621ee868ad..3e73367217b0 100644 --- a/core/src/main/java/org/apache/calcite/util/NameSet.java +++ b/core/src/main/java/org/apache/calcite/util/NameSet.java @@ -18,7 +18,7 @@ import com.google.common.collect.Maps; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Collection; import java.util.Collections; @@ -70,11 +70,7 @@ public void add(String name) { * name. If case-sensitive, that iterable will have 0 or 1 elements; if * case-insensitive, it may have 0 or more. */ public Collection range(String name, boolean caseSensitive) { - // This produces checkerframework false-positive - // type of expression: Set<@KeyFor("this.names.range(name, caseSensitive)") String> - // method return type: Collection - //noinspection RedundantCast - return (Collection) names.range(name, caseSensitive).keySet(); + return names.range(name, caseSensitive).keySet(); } /** Returns whether this set contains the given name, with a given diff --git a/core/src/main/java/org/apache/calcite/util/NlsString.java b/core/src/main/java/org/apache/calcite/util/NlsString.java index b00041186476..42a39a0e0742 100644 --- a/core/src/main/java/org/apache/calcite/util/NlsString.java +++ b/core/src/main/java/org/apache/calcite/util/NlsString.java @@ -29,8 +29,7 @@ import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.Nullable; import java.nio.ByteBuffer; import java.nio.charset.CharacterCodingException; @@ -216,17 +215,14 @@ private NlsString(@Nullable String stringValue, @Nullable ByteString bytesValue, Comparator.nullsFirst(Comparator.naturalOrder())); } - @Pure public @Nullable String getCharsetName() { return charsetName; } - @Pure public @Nullable Charset getCharset() { return charset; } - @Pure public @Nullable SqlCollation getCollation() { return collation; } @@ -396,7 +392,6 @@ public NlsString copy(String value) { } /** Returns the value as a {@link ByteString}. */ - @Pure public @Nullable ByteString getValueBytes() { return bytesValue; } diff --git a/core/src/main/java/org/apache/calcite/util/NumberUtil.java b/core/src/main/java/org/apache/calcite/util/NumberUtil.java index cef004ad3eec..7891d4b4bae7 100644 --- a/core/src/main/java/org/apache/calcite/util/NumberUtil.java +++ b/core/src/main/java/org/apache/calcite/util/NumberUtil.java @@ -16,8 +16,9 @@ */ package org.apache.calcite.util; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.PolyNull; +import org.apache.calcite.linq4j.annotations.Contract; + +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.math.BigInteger; @@ -93,7 +94,8 @@ public static BigInteger getMinUnscaled(int precision) { /** Sets the scale of a BigDecimal {@code bd} if it is not null; * always returns {@code bd}. */ - public static @PolyNull BigDecimal rescaleBigDecimal(@PolyNull BigDecimal bd, + @Contract("!null, _ -> !null") + public static @Nullable BigDecimal rescaleBigDecimal(@Nullable BigDecimal bd, int scale) { if (bd != null) { bd = bd.setScale(scale, RoundingMode.HALF_UP); @@ -108,7 +110,8 @@ public static BigDecimal toBigDecimal(Number number, int scale) { /** Converts a number to a BigDecimal with the same value; * returns null if and only if the number is null. */ - public static @PolyNull BigDecimal toBigDecimal(@PolyNull Number number) { + @Contract("!null -> !null") + public static @Nullable BigDecimal toBigDecimal(@Nullable Number number) { if (number == null) { return castNonNull(null); } @@ -146,8 +149,15 @@ public static long round(double d) { } /** Returns the sum of two numbers, or null if either is null. */ - public static @PolyNull Double add(@PolyNull Double a, @PolyNull Double b) { - if (a == null || b == null) { + @Contract("!null, !null -> !null") + public static @Nullable Double add(@Nullable Double a, @Nullable Double b) { + // One if per argument, so that no control-flow merge precedes the return: the + // contract check treats a return reached by a merge as reachable even when every + // incoming edge is not. https://github.com/uber/NullAway/issues/1731 + if (a == null) { + return null; + } + if (b == null) { return null; } @@ -156,7 +166,8 @@ public static long round(double d) { /** Returns the difference of two numbers, * or null if either is null. */ - public static @PolyNull Double subtract(@PolyNull Double a, @PolyNull Double b) { + @Contract("!null, !null -> !null") + public static @Nullable Double subtract(@Nullable Double a, @Nullable Double b) { if (a == null || b == null) { return castNonNull(null); } @@ -176,7 +187,8 @@ public static long round(double d) { /** Returns the product of two numbers, * or null if either is null. */ - public static @PolyNull Double multiply(@PolyNull Double a, @PolyNull Double b) { + @Contract("!null, !null -> !null") + public static @Nullable Double multiply(@Nullable Double a, @Nullable Double b) { if (a == null || b == null) { return castNonNull(null); } @@ -188,7 +200,8 @@ public static long round(double d) { * returns the lesser of two numbers, * ignoring numbers that are null, * or null if both are null. */ - public static @PolyNull Double min(@PolyNull Double a, @PolyNull Double b) { + @Contract("!null, !null -> !null") + public static @Nullable Double min(@Nullable Double a, @Nullable Double b) { if (a == null) { return b; } else if (b == null) { @@ -201,7 +214,8 @@ public static long round(double d) { /** Like {@link Math#max} but null safe; * returns the greater of two numbers, * or null if either is null. */ - public static @PolyNull Double max(@PolyNull Double a, @PolyNull Double b) { + @Contract("!null, !null -> !null") + public static @Nullable Double max(@Nullable Double a, @Nullable Double b) { if (a == null || b == null) { return castNonNull(null); } diff --git a/core/src/main/java/org/apache/calcite/util/Pair.java b/core/src/main/java/org/apache/calcite/util/Pair.java index 15f5676740ed..104d9c65eabe 100644 --- a/core/src/main/java/org/apache/calcite/util/Pair.java +++ b/core/src/main/java/org/apache/calcite/util/Pair.java @@ -18,7 +18,7 @@ import org.apache.calcite.runtime.PairList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.Serializable; import java.util.AbstractList; @@ -43,8 +43,8 @@ * @param Left-hand type * @param Right-hand type */ -@SuppressWarnings("type.argument.type.incompatible") -public class Pair +@SuppressWarnings("NullAway") +public class Pair implements Comparable>, Map.Entry, Serializable { @SuppressWarnings({"rawtypes", "unchecked"}) @@ -82,12 +82,14 @@ public Pair(T1 left, T2 right) { * @param right right value * @return A Pair */ - public static Pair of(T1 left, T2 right) { + public static Pair of( + T1 left, T2 right) { return new Pair<>(left, right); } /** Creates a {@code Pair} from a {@link java.util.Map.Entry}. */ - public static Pair of(Map.Entry entry) { + public static + Pair of(Map.Entry entry) { return of(entry.getKey(), entry.getValue()); } @@ -148,7 +150,8 @@ public static Pair of(Map.Entry entry) { * @param pairs Collection of Pair objects * @return map with the same contents as the collection */ - public static Map toMap(Iterable> pairs) { + public static + Map toMap(Iterable> pairs) { final Map map = new HashMap<>(); for (Pair pair : pairs) { map.put(pair.left, pair.right); @@ -166,7 +169,8 @@ public static Map toMap(Iterable List> zip(List ks, List vs) { + public static + List> zip(List ks, List vs) { return zip(ks, vs, false); } @@ -182,7 +186,7 @@ public static List> zip(List ks, List List> zip( + public static List> zip( final List ks, final List vs, boolean strict) { @@ -208,7 +212,7 @@ public static List> zip( * @param vs Right iterable * @return Iterable over pairs */ - public static Iterable> zip( + public static Iterable> zip( final Iterable ks, final Iterable vs) { return () -> { @@ -230,7 +234,7 @@ public static Iterable> zip( * @param vs Right array * @return List of pairs */ - public static List> zip( + public static List> zip( final K[] ks, final V[] vs) { return new AbstractList>() { @@ -251,7 +255,8 @@ public static List> zip( * * @param Key (left) value type * @param Value (right) value type */ - public static List> zipMutable( + public static + List> zipMutable( final List ks, final List vs) { return new MutableZipList<>(ks, vs); @@ -272,7 +277,7 @@ public static List> zipMutable( * @param Left type * @param Right type */ - public static void forEach( + public static void forEach( final Iterable ks, final Iterable vs, BiConsumer consumer) { @@ -285,7 +290,8 @@ public static void forEach( /** Calls a consumer with an ordinal for each pair of items in two * iterables. */ - public static void forEachIndexed(Iterable ks, Iterable vs, + public static + void forEachIndexed(Iterable ks, Iterable vs, PairWithOrdinalConsumer consumer) { int i = 0; final Iterator ki = ks.iterator(); @@ -297,7 +303,7 @@ public static void forEachIndexed(Iterable ks, Iterable vs, /** Calls a consumer with an ordinal for each pair of items in an iterable * of pairs. */ - public static void forEachIndexed( + public static void forEachIndexed( Iterable> pairs, PairWithOrdinalConsumer consumer) { int i = 0; @@ -307,7 +313,8 @@ public static void forEachIndexed( } /** Calls a consumer for each entry in a map. */ - public static void forEachIndexed(Map map, + public static + void forEachIndexed(Map map, PairWithOrdinalConsumer consumer) { forEachIndexed(map.entrySet(), consumer); } @@ -322,7 +329,7 @@ public static void forEachIndexed(Map map, * @param Left type * @param Right type */ - public static void forEach( + public static void forEach( final Iterable> entries, BiConsumer consumer) { for (Map.Entry entry : entries) { @@ -338,7 +345,7 @@ public static void forEach( * @param Right type * @return Iterable over the left elements */ - public static Iterable left( + public static Iterable left( final Iterable> iterable) { return Util.transform(iterable, Map.Entry::getKey); } @@ -351,13 +358,13 @@ public static Iterable left( * @param Right type * @return Iterable over the right elements */ - public static Iterable right( + public static Iterable right( final Iterable> iterable) { return Util.transform(iterable, Map.Entry::getValue); } @SuppressWarnings("unchecked") - public static List left( + public static List left( final List> pairs) { if (pairs instanceof PairList) { return ((PairList) pairs).leftList(); @@ -366,7 +373,7 @@ public static List left( } @SuppressWarnings("unchecked") - public static List right( + public static List right( final List> pairs) { if (pairs instanceof PairList) { return ((PairList) pairs).rightList(); diff --git a/core/src/main/java/org/apache/calcite/util/PartiallyOrderedSet.java b/core/src/main/java/org/apache/calcite/util/PartiallyOrderedSet.java index 0a307e1e41ca..aa09108f068b 100644 --- a/core/src/main/java/org/apache/calcite/util/PartiallyOrderedSet.java +++ b/core/src/main/java/org/apache/calcite/util/PartiallyOrderedSet.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.AbstractSet; import java.util.ArrayDeque; @@ -134,7 +134,7 @@ public PartiallyOrderedSet(Ordering ordering, * @param ordering Ordering relation * @param collection Initial contents of partially-ordered set */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") public PartiallyOrderedSet(Ordering ordering, Collection collection) { this(ordering, new HashMap<>(collection.size() * 3 / 2), null, null); addAll(collection); diff --git a/core/src/main/java/org/apache/calcite/util/Permutation.java b/core/src/main/java/org/apache/calcite/util/Permutation.java index fd187ce23ec6..58ba67b1d72e 100644 --- a/core/src/main/java/org/apache/calcite/util/Permutation.java +++ b/core/src/main/java/org/apache/calcite/util/Permutation.java @@ -21,9 +21,7 @@ import org.apache.calcite.util.mapping.MappingType; import org.apache.calcite.util.mapping.Mappings; -import org.checkerframework.checker.initialization.qual.UnknownInitialization; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.RequiresNonNull; +import org.jspecify.annotations.Nullable; import java.util.Arrays; import java.util.Iterator; @@ -46,7 +44,7 @@ public class Permutation implements Mapping, Mappings.TargetMapping { * * @param size Number of elements in the permutation */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") public Permutation(int size) { targets = new int[size]; sources = new int[size]; @@ -436,8 +434,7 @@ private void setInternal(int source, int target) { * @param fail Whether to assert if invalid * @return Whether valid */ - @RequiresNonNull({"sources", "targets"}) - private boolean isValid(@UnknownInitialization Permutation this, boolean fail) { + private boolean isValid(boolean fail) { final int size = targets.length; if (sources.length != size) { assert !fail : "different lengths"; diff --git a/core/src/main/java/org/apache/calcite/util/PrecedenceClimbingParser.java b/core/src/main/java/org/apache/calcite/util/PrecedenceClimbingParser.java index 7eb5ed698914..62c71bf7edd0 100644 --- a/core/src/main/java/org/apache/calcite/util/PrecedenceClimbingParser.java +++ b/core/src/main/java/org/apache/calcite/util/PrecedenceClimbingParser.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.AbstractList; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/util/RangeSets.java b/core/src/main/java/org/apache/calcite/util/RangeSets.java index 743b170cc74b..0395fe49681c 100644 --- a/core/src/main/java/org/apache/calcite/util/RangeSets.java +++ b/core/src/main/java/org/apache/calcite/util/RangeSets.java @@ -22,8 +22,6 @@ import com.google.common.collect.RangeSet; import com.google.common.collect.TreeRangeSet; -import org.checkerframework.checker.nullness.qual.NonNull; - import java.util.Iterator; import java.util.Set; import java.util.function.BiConsumer; @@ -374,7 +372,7 @@ private static class SinkConsumer implements Consumer { * @param Value type * * @see Handler */ - public interface Consumer<@NonNull V> { + public interface Consumer { void all(); void atLeast(V lower); void atMost(V upper); diff --git a/core/src/main/java/org/apache/calcite/util/ReflectUtil.java b/core/src/main/java/org/apache/calcite/util/ReflectUtil.java index a621743b0d11..7bb3476137dc 100644 --- a/core/src/main/java/org/apache/calcite/util/ReflectUtil.java +++ b/core/src/main/java/org/apache/calcite/util/ReflectUtil.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.lang.annotation.Annotation; import java.lang.reflect.InvocationTargetException; @@ -417,7 +417,7 @@ private static boolean invokeVisitorInternal( * @return cache of methods */ public static ReflectiveVisitDispatcher createDispatcher( + E> ReflectiveVisitDispatcher createDispatcher( final Class visitorBaseClazz, final Class visiteeBaseClazz) { assert ReflectiveVisitor.class.isAssignableFrom(visitorBaseClazz); @@ -511,7 +511,7 @@ E extends Object> ReflectiveVisitDispatcher createDispatcher( * @param arg0Clazz Base type of argument zero * @param otherArgClasses Types of remaining arguments */ - public static MethodDispatcher createMethodDispatcher( + public static MethodDispatcher createMethodDispatcher( final Class returnClazz, final ReflectiveVisitor visitor, final String methodName, diff --git a/core/src/main/java/org/apache/calcite/util/ReflectiveVisitDispatcher.java b/core/src/main/java/org/apache/calcite/util/ReflectiveVisitDispatcher.java index 6f55e0267180..defc9b8348b9 100644 --- a/core/src/main/java/org/apache/calcite/util/ReflectiveVisitDispatcher.java +++ b/core/src/main/java/org/apache/calcite/util/ReflectiveVisitDispatcher.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Method; import java.util.List; @@ -35,7 +35,7 @@ * @param Return type */ public interface ReflectiveVisitDispatcher { + E> { //~ Methods ---------------------------------------------------------------- /** diff --git a/core/src/main/java/org/apache/calcite/util/Sarg.java b/core/src/main/java/org/apache/calcite/util/Sarg.java index 89e4c6e9a1c8..bf05ac17e9ab 100644 --- a/core/src/main/java/org/apache/calcite/util/Sarg.java +++ b/core/src/main/java/org/apache/calcite/util/Sarg.java @@ -25,7 +25,7 @@ import com.google.common.collect.Range; import com.google.common.collect.RangeSet; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.function.BiConsumer; @@ -65,7 +65,7 @@ * * @see SqlStdOperatorTable#SEARCH */ -@SuppressWarnings("type.argument.type.incompatible") +@SuppressWarnings("NullAway") public class Sarg> implements Comparable> { public final RangeSet rangeSet; public final RexUnknownAs nullAs; diff --git a/core/src/main/java/org/apache/calcite/util/SerializableCharset.java b/core/src/main/java/org/apache/calcite/util/SerializableCharset.java index e55f14875ebc..924830979eae 100644 --- a/core/src/main/java/org/apache/calcite/util/SerializableCharset.java +++ b/core/src/main/java/org/apache/calcite/util/SerializableCharset.java @@ -16,7 +16,9 @@ */ package org.apache.calcite.util; -import org.checkerframework.checker.nullness.qual.PolyNull; +import org.apache.calcite.linq4j.annotations.Contract; + +import org.jspecify.annotations.Nullable; import java.io.IOException; import java.io.ObjectInputStream; @@ -69,7 +71,7 @@ private void writeObject(ObjectOutputStream out) throws IOException { @SuppressWarnings("JdkObsolete") private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - charsetName = (String) in.readObject(); + charsetName = requireNonNull((String) in.readObject(), "charsetName"); charset = requireNonNull(Charset.availableCharsets().get(this.charsetName), () -> "charset is not found: " + charsetName); @@ -91,7 +93,8 @@ public Charset getCharset() { * @param charset Character set to wrap, or null * @return Wrapped charset */ - public static @PolyNull SerializableCharset forCharset(@PolyNull Charset charset) { + @Contract("!null -> !null") + public static @Nullable SerializableCharset forCharset(@Nullable Charset charset) { if (charset == null) { return null; } diff --git a/core/src/main/java/org/apache/calcite/util/SimpleNamespaceContext.java b/core/src/main/java/org/apache/calcite/util/SimpleNamespaceContext.java index 68bab8f134f5..3a2a4775c227 100644 --- a/core/src/main/java/org/apache/calcite/util/SimpleNamespaceContext.java +++ b/core/src/main/java/org/apache/calcite/util/SimpleNamespaceContext.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Collections; import java.util.HashMap; @@ -36,7 +36,7 @@ public class SimpleNamespaceContext implements NamespaceContext { private final Map prefixToNamespaceUri = new HashMap<>(); private final Map> namespaceUriToPrefixes = new HashMap<>(); - @SuppressWarnings({"method.invocation.invalid", "methodref.receiver.bound.invalid"}) + @SuppressWarnings("NullAway") public SimpleNamespaceContext(Map bindings) { bindNamespaceUri(XMLConstants.XML_NS_PREFIX, XMLConstants.XML_NS_URI); bindNamespaceUri(XMLConstants.XMLNS_ATTRIBUTE, XMLConstants.XMLNS_ATTRIBUTE_NS_URI); diff --git a/core/src/main/java/org/apache/calcite/util/Source.java b/core/src/main/java/org/apache/calcite/util/Source.java index 39b535b157b8..378f88059f9a 100644 --- a/core/src/main/java/org/apache/calcite/util/Source.java +++ b/core/src/main/java/org/apache/calcite/util/Source.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.File; import java.io.IOException; diff --git a/core/src/main/java/org/apache/calcite/util/Sources.java b/core/src/main/java/org/apache/calcite/util/Sources.java index 406b1e6ddc57..d93bbb72c8b4 100644 --- a/core/src/main/java/org/apache/calcite/util/Sources.java +++ b/core/src/main/java/org/apache/calcite/util/Sources.java @@ -18,7 +18,7 @@ import com.google.common.io.CharSource; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.File; import java.io.IOException; diff --git a/core/src/main/java/org/apache/calcite/util/Template.java b/core/src/main/java/org/apache/calcite/util/Template.java index 11047261af4f..7165dcdcfe57 100644 --- a/core/src/main/java/org/apache/calcite/util/Template.java +++ b/core/src/main/java/org/apache/calcite/util/Template.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.text.MessageFormat; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/util/TimeString.java b/core/src/main/java/org/apache/calcite/util/TimeString.java index 856ad167b4a0..172d90ab427c 100644 --- a/core/src/main/java/org/apache/calcite/util/TimeString.java +++ b/core/src/main/java/org/apache/calcite/util/TimeString.java @@ -22,7 +22,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Strings; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Calendar; import java.util.regex.Pattern; @@ -53,7 +53,7 @@ private TimeString(String v, @SuppressWarnings("unused") boolean ignore) { } /** Creates a TimeString. */ - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") public TimeString(String v) { this(v, false); checkArgument(INPUT_PATTERN.matcher(v).matches(), diff --git a/core/src/main/java/org/apache/calcite/util/TimeWithTimeZoneString.java b/core/src/main/java/org/apache/calcite/util/TimeWithTimeZoneString.java index 2087b79af631..08b86e58dbf8 100644 --- a/core/src/main/java/org/apache/calcite/util/TimeWithTimeZoneString.java +++ b/core/src/main/java/org/apache/calcite/util/TimeWithTimeZoneString.java @@ -18,7 +18,7 @@ import org.apache.calcite.avatica.util.DateTimeUtils; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.text.SimpleDateFormat; import java.util.Calendar; diff --git a/core/src/main/java/org/apache/calcite/util/TimestampString.java b/core/src/main/java/org/apache/calcite/util/TimestampString.java index a4b16b2896d9..3f3abdb96275 100644 --- a/core/src/main/java/org/apache/calcite/util/TimestampString.java +++ b/core/src/main/java/org/apache/calcite/util/TimestampString.java @@ -22,7 +22,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Strings; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Calendar; import java.util.TimeZone; diff --git a/core/src/main/java/org/apache/calcite/util/TimestampWithTimeZoneString.java b/core/src/main/java/org/apache/calcite/util/TimestampWithTimeZoneString.java index 52e9eb6d4f05..e9648e651ec9 100644 --- a/core/src/main/java/org/apache/calcite/util/TimestampWithTimeZoneString.java +++ b/core/src/main/java/org/apache/calcite/util/TimestampWithTimeZoneString.java @@ -18,7 +18,7 @@ import org.apache.calcite.avatica.util.DateTimeUtils; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.text.SimpleDateFormat; import java.util.Calendar; diff --git a/core/src/main/java/org/apache/calcite/util/TryThreadLocal.java b/core/src/main/java/org/apache/calcite/util/TryThreadLocal.java index 12e702753ca3..47c3158314d6 100644 --- a/core/src/main/java/org/apache/calcite/util/TryThreadLocal.java +++ b/core/src/main/java/org/apache/calcite/util/TryThreadLocal.java @@ -16,8 +16,8 @@ */ package org.apache.calcite.util; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import java.util.function.Supplier; @@ -30,12 +30,12 @@ * * @param Value type */ -public abstract class TryThreadLocal extends ThreadLocal<@Nullable T> { +public abstract class TryThreadLocal extends ThreadLocal<@Nullable T> { /** Creates a TryThreadLocal with a fixed initial value. * * @param initialValue Initial value */ - public static TryThreadLocal of(S initialValue) { + public static TryThreadLocal of(S initialValue) { return new FixedTryThreadLocal<>(initialValue); } diff --git a/core/src/main/java/org/apache/calcite/util/Util.java b/core/src/main/java/org/apache/calcite/util/Util.java index 05b9927192ed..122f47c41fc2 100644 --- a/core/src/main/java/org/apache/calcite/util/Util.java +++ b/core/src/main/java/org/apache/calcite/util/Util.java @@ -20,6 +20,7 @@ import org.apache.calcite.avatica.util.Spaces; import org.apache.calcite.config.CalciteSystemProperty; import org.apache.calcite.linq4j.Ord; +import org.apache.calcite.linq4j.annotations.Contract; import org.apache.calcite.runtime.CalciteException; import org.apache.calcite.sql.SqlAggFunction; import org.apache.calcite.sql.SqlCall; @@ -43,9 +44,7 @@ import com.google.common.collect.Sets; import org.apiguardian.api.API; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.PolyNull; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import java.io.BufferedReader; @@ -141,13 +140,13 @@ private Util() {} * necessary, to make them look like Linux actual. */ public static final String LINE_SEPARATOR = - System.getProperty("line.separator"); + requireNonNull(System.getProperty("line.separator"), "line.separator"); /** * System-dependent file separator, for example, "/" or "\." */ public static final String FILE_SEPARATOR = - System.getProperty("file.separator"); + requireNonNull(System.getProperty("file.separator"), "file.separator"); /** * Datetime format string for generating a timestamp string to be used as @@ -684,7 +683,8 @@ public static boolean isWindows() { * characters found in {@code search} are replaced by the character in the same position in * {@code replacement}; if {@code replacement} is shorter, remaining matches are removed. */ - public static @PolyNull String replaceChars(@PolyNull String s, @Nullable String search, + @Contract("!null, _, _ -> !null") + public static @Nullable String replaceChars(@Nullable String s, @Nullable String search, @Nullable String replacement) { if (s == null || s.isEmpty() || search == null || search.isEmpty()) { return s; @@ -753,7 +753,7 @@ public static URL toURL(File file) throws MalformedURLException { // This is a bunch of weird code that is required to // make a valid URL on the Windows platform, due // to inconsistencies in what getAbsolutePath returns. - String fs = System.getProperty("file.separator"); + String fs = FILE_SEPARATOR; if (fs.length() == 1) { char sep = fs.charAt(0); if (sep != '/') { @@ -1865,8 +1865,8 @@ public static List cast(List list, Class clazz) { * @param clazz Class to cast to * @return An iterator whose members are of the desired type. */ - public static Iterator cast( - final Iterator iter, + public static Iterator cast( + final Iterator iter, final Class clazz) { return transform(iter, x -> clazz.cast(castNonNull(x))); } @@ -2127,7 +2127,24 @@ public static List> pairs(final List list) { * *

    Equivalent to the Elvis operator ({@code ?:}) of languages such as * Groovy or PHP. */ - public static @PolyNull T first(@Nullable T v0, @PolyNull T v1) { + @Contract("_, !null -> !null") + public static @Nullable T first(@Nullable T v0, @Nullable T v1) { + return v0 != null ? v0 : v1; + } + + /** Returns the first argument if it is not null, otherwise the second. + * + *

    Same as {@link #first(Object, Object)}, for the common case where the fallback is not + * null and so neither is the result. Stating that in the signature rather than in a + * {@code @Contract} keeps it visible to NullAway's generic type inference; see + * NullAway#1730. + * + * @param v0 value, may be null + * @param v1 fallback, used when {@code v0} is null + * @param value type + * @return {@code v0} if it is not null, otherwise {@code v1} + */ + public static T firstNonNull(@Nullable T v0, T v1) { return v0 != null ? v0 : v1; } @@ -2220,12 +2237,12 @@ public static List last(List list, int n) { } /** Returns all but the first element of a list. */ - public static List skip(List list) { + public static List skip(List list) { return skip(list, 1); } /** Returns all but the first {@code n} elements of a list. */ - public static List skip(List list, int fromIndex) { + public static List skip(List list, int fromIndex) { return fromIndex == 0 ? list : list.subList(fromIndex, list.size()); } @@ -2271,7 +2288,7 @@ public static boolean isDistinct(List list) { * @param list List * @return Ordinal of first duplicate, or -1 if not found */ - public static int firstDuplicate(List list) { + public static int firstDuplicate(List list) { final int size = list.size(); if (size < 2) { // Lists of size 0 and 1 are always distinct. @@ -2576,7 +2593,7 @@ public static Map asIndexMapJ( } }; return new AbstractMap() { - @SuppressWarnings("override.return.invalid") + @SuppressWarnings("NullAway") @Override public Set> entrySet() { return entrySet; } @@ -2724,14 +2741,14 @@ public static Calendar calendar(long millis, TimeZone timeZone) { } /** Combines a second immutable list builder into a first. */ - public static ImmutableList.Builder combine( + public static ImmutableList.Builder combine( ImmutableList.Builder b0, ImmutableList.Builder b1) { b0.addAll(b1.build()); return b0; } /** Combines a second array list into a first. */ - public static ArrayList combine(ArrayList list0, + public static ArrayList combine(ArrayList list0, ArrayList list1) { list0.addAll(list1); return list0; @@ -2746,7 +2763,8 @@ public static UnaryOperator andThen(UnaryOperator op1, } /** Transforms a list, applying a function to each element. */ - public static List transform(List list, + public static + List transform(List list, java.util.function.Function function) { if (list.isEmpty() && list instanceof ImmutableList) { return ImmutableList.of(); // save ourselves some effort @@ -2759,7 +2777,8 @@ public static List transform(List list, /** Transforms a list, applying a function to each element, also passing in * the element's index in the list. */ - public static List transformIndexed(List list, + public static + List transformIndexed(List list, BiFunction function) { if (list.isEmpty() && list instanceof ImmutableList) { return ImmutableList.of(); // save ourselves some effort @@ -2772,7 +2791,8 @@ public static List transformIndexed(List list, /** Transforms an iterable, applying a function to each element. */ @API(since = "1.27", status = API.Status.EXPERIMENTAL) - public static Iterable transform(Iterable iterable, + public static + Iterable transform(Iterable iterable, java.util.function.Function function) { // FluentIterable provides toString return new FluentIterable() { @@ -2784,7 +2804,8 @@ public static Iterable transform(Iterable iterable, /** Transforms an iterator. */ @API(since = "1.27", status = API.Status.EXPERIMENTAL) - public static Iterator transform(Iterator iterator, + public static + Iterator transform(Iterator iterator, java.util.function.Function function) { return new TransformingIterator<>(iterator, function); } @@ -2883,7 +2904,6 @@ public FoundOne(@Nullable Object node) { this.node = node; } - @Pure public @Nullable Object getNode() { return node; } @@ -2893,10 +2913,10 @@ public FoundOne(@Nullable Object node) { * Visitor which looks for an OVER clause inside a tree of * {@link SqlNode} objects. */ - public static class OverFinder extends SqlBasicVisitor { + public static class OverFinder extends SqlBasicVisitor<@Nullable Void> { public static final OverFinder INSTANCE = new Util.OverFinder(); - @Override public Void visit(SqlCall call) { + @Override public @Nullable Void visit(SqlCall call) { if (call.getKind() == SqlKind.OVER) { throw FoundOne.NULL; } @@ -3003,7 +3023,7 @@ private static class FilteringIterator implements Iterator { Predicate predicate) { this.iterator = iterator; this.predicate = predicate; - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") T current = moveNext(); this.current = current; } diff --git a/core/src/main/java/org/apache/calcite/util/XmlOutput.java b/core/src/main/java/org/apache/calcite/util/XmlOutput.java index f802621a5a42..f7d08ca4f6b8 100644 --- a/core/src/main/java/org/apache/calcite/util/XmlOutput.java +++ b/core/src/main/java/org/apache/calcite/util/XmlOutput.java @@ -18,7 +18,7 @@ import com.google.common.collect.Lists; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.PrintWriter; import java.io.Writer; @@ -581,7 +581,7 @@ public void defineEscape(char from, String to) { * Call this before attempting to escape strings; after this, * defineEscape may not be called again. */ - @SuppressWarnings("assignment.type.incompatible") + @SuppressWarnings("NullAway") public void makeImmutable() { translationTable = requireNonNull(translationVector, "translationVector").toArray(new String[0]); diff --git a/core/src/main/java/org/apache/calcite/util/format/FormatModels.java b/core/src/main/java/org/apache/calcite/util/format/FormatModels.java index d9c68950f709..5188e56b396c 100644 --- a/core/src/main/java/org/apache/calcite/util/format/FormatModels.java +++ b/core/src/main/java/org/apache/calcite/util/format/FormatModels.java @@ -314,7 +314,7 @@ private static class FormatModelImpl implements FormatModel { elements.add(literalElement(literal)); } // add the element match - use literal as default to be safe. - String key = matcher.group(); + String key = requireNonNull(matcher.group(), "matcher.group()"); elements.add(getElementMap().getOrDefault(key, literalElement(key))); i = matcher.end(); } diff --git a/core/src/main/java/org/apache/calcite/util/format/package-info.java b/core/src/main/java/org/apache/calcite/util/format/package-info.java index 88ed6b551c56..437f16a31eff 100644 --- a/core/src/main/java/org/apache/calcite/util/format/package-info.java +++ b/core/src/main/java/org/apache/calcite/util/format/package-info.java @@ -18,4 +18,7 @@ /** * Utility classes for handling format strings. */ +@NullMarked package org.apache.calcite.util.format; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/util/format/postgresql/CompiledDateTimeFormat.java b/core/src/main/java/org/apache/calcite/util/format/postgresql/CompiledDateTimeFormat.java index 0941f8f6cb10..932915b97636 100644 --- a/core/src/main/java/org/apache/calcite/util/format/postgresql/CompiledDateTimeFormat.java +++ b/core/src/main/java/org/apache/calcite/util/format/postgresql/CompiledDateTimeFormat.java @@ -22,7 +22,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.text.ParseException; import java.text.ParsePosition; diff --git a/core/src/main/java/org/apache/calcite/util/format/postgresql/PostgresqlDateTimeFormatter.java b/core/src/main/java/org/apache/calcite/util/format/postgresql/PostgresqlDateTimeFormatter.java index b62f24895742..4c5195c87933 100644 --- a/core/src/main/java/org/apache/calcite/util/format/postgresql/PostgresqlDateTimeFormatter.java +++ b/core/src/main/java/org/apache/calcite/util/format/postgresql/PostgresqlDateTimeFormatter.java @@ -34,7 +34,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.text.ParseException; import java.text.ParsePosition; diff --git a/core/src/main/java/org/apache/calcite/util/format/postgresql/format/compiled/package-info.java b/core/src/main/java/org/apache/calcite/util/format/postgresql/format/compiled/package-info.java index c0b9a1518fc5..ca9ac33bbdcb 100644 --- a/core/src/main/java/org/apache/calcite/util/format/postgresql/format/compiled/package-info.java +++ b/core/src/main/java/org/apache/calcite/util/format/postgresql/format/compiled/package-info.java @@ -18,4 +18,7 @@ /** * Classes for that represent components of a parsed date/time format. */ +@NullMarked package org.apache.calcite.util.format.postgresql.format.compiled; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/util/format/postgresql/format/package-info.java b/core/src/main/java/org/apache/calcite/util/format/postgresql/format/package-info.java index e6da6fdf895a..f46917e029e4 100644 --- a/core/src/main/java/org/apache/calcite/util/format/postgresql/format/package-info.java +++ b/core/src/main/java/org/apache/calcite/util/format/postgresql/format/package-info.java @@ -18,4 +18,7 @@ /** * Classes used to build up a list of supported date/time format components. */ +@NullMarked package org.apache.calcite.util.format.postgresql.format; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/util/format/postgresql/package-info.java b/core/src/main/java/org/apache/calcite/util/format/postgresql/package-info.java index 0337e8d91b17..f987d64dcae8 100644 --- a/core/src/main/java/org/apache/calcite/util/format/postgresql/package-info.java +++ b/core/src/main/java/org/apache/calcite/util/format/postgresql/package-info.java @@ -18,4 +18,7 @@ /** * Classes for handling date/time format strings for PostgreSQL. */ +@NullMarked package org.apache.calcite.util.format.postgresql; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/util/graph/AttributedDirectedGraph.java b/core/src/main/java/org/apache/calcite/util/graph/AttributedDirectedGraph.java index 15c15a70c3d0..387853c73cee 100644 --- a/core/src/main/java/org/apache/calcite/util/graph/AttributedDirectedGraph.java +++ b/core/src/main/java/org/apache/calcite/util/graph/AttributedDirectedGraph.java @@ -18,8 +18,7 @@ import org.apache.calcite.util.Util; -import org.checkerframework.checker.initialization.qual.UnknownInitialization; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -33,7 +32,7 @@ public class AttributedDirectedGraph extends DefaultDirectedGraph { /** Creates an attributed graph. */ - public AttributedDirectedGraph(@UnknownInitialization AttributedEdgeFactory edgeFactory) { + public AttributedDirectedGraph(AttributedEdgeFactory edgeFactory) { super(edgeFactory); } diff --git a/core/src/main/java/org/apache/calcite/util/graph/DefaultDirectedGraph.java b/core/src/main/java/org/apache/calcite/util/graph/DefaultDirectedGraph.java index 71c14ca89ef4..f025c5df6374 100644 --- a/core/src/main/java/org/apache/calcite/util/graph/DefaultDirectedGraph.java +++ b/core/src/main/java/org/apache/calcite/util/graph/DefaultDirectedGraph.java @@ -19,9 +19,7 @@ import com.google.common.collect.Ordering; import org.apiguardian.api.API; -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.ArrayList; import java.util.Collection; @@ -33,8 +31,6 @@ import java.util.Map; import java.util.Set; -import static org.apache.calcite.linq4j.Nullness.castNonNull; - /** * Default implementation of {@link DirectedGraph}. * @@ -45,10 +41,10 @@ public class DefaultDirectedGraph implements DirectedGraph { final Set edges = new LinkedHashSet<>(); final Map> vertexMap = new LinkedHashMap<>(); - final @NotOnlyInitialized EdgeFactory edgeFactory; + final EdgeFactory edgeFactory; /** Creates a graph. */ - public DefaultDirectedGraph(@UnknownInitialization EdgeFactory edgeFactory) { + public DefaultDirectedGraph(EdgeFactory edgeFactory) { this.edgeFactory = edgeFactory; } @@ -97,7 +93,7 @@ private String toString(Ordering vertexOrdering, @API(since = "1.26", status = API.Status.EXPERIMENTAL) protected final VertexInfo getVertex(V vertex) { - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") final VertexInfo info = vertexMap.get(vertex); if (info == null) { throw new IllegalArgumentException("no vertex " + vertex); @@ -162,9 +158,7 @@ protected final VertexInfo getVertex(V vertex) { return outRemoved; } - @SuppressWarnings("return.type.incompatible") @Override public Set vertexSet() { - // Set -> Set return vertexMap.keySet(); } @@ -194,7 +188,7 @@ protected final VertexInfo getVertex(V vertex) { * if {@code collection} is a small fraction of the set of vertices. */ private void removeMinorityVertices(Collection collection) { for (V v : collection) { - @SuppressWarnings("argument.type.incompatible") // nullable keys are supported by .get + @SuppressWarnings("NullAway") // nullable keys are supported by .get final VertexInfo info = vertexMap.get(v); if (info == null) { continue; @@ -225,8 +219,8 @@ private void removeMinorityVertices(Collection collection) { private void removeMajorityVertices(Set vertexSet) { vertexMap.keySet().removeAll(vertexSet); for (VertexInfo info : vertexMap.values()) { - info.outEdges.removeIf(e -> vertexSet.contains(castNonNull((V) e.target))); - info.inEdges.removeIf(e -> vertexSet.contains(castNonNull((V) e.source))); + info.outEdges.removeIf(e -> vertexSet.contains((V) e.target)); + info.inEdges.removeIf(e -> vertexSet.contains((V) e.source)); } } diff --git a/core/src/main/java/org/apache/calcite/util/graph/DefaultEdge.java b/core/src/main/java/org/apache/calcite/util/graph/DefaultEdge.java index 4fb5449c0148..260fd9b830ba 100644 --- a/core/src/main/java/org/apache/calcite/util/graph/DefaultEdge.java +++ b/core/src/main/java/org/apache/calcite/util/graph/DefaultEdge.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.util.graph; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static java.util.Objects.requireNonNull; @@ -47,9 +47,7 @@ public DefaultEdge(Object source, Object target) { return source + " -> " + target; } - public static DirectedGraph.EdgeFactory factory() { - // see https://github.com/typetools/checker-framework/issues/3637 - //noinspection Convert2MethodRef - return (source1, target1) -> new DefaultEdge(source1, target1); + public static DirectedGraph.EdgeFactory factory() { + return DefaultEdge::new; } } diff --git a/core/src/main/java/org/apache/calcite/util/graph/DirectedGraph.java b/core/src/main/java/org/apache/calcite/util/graph/DirectedGraph.java index eb15a96b7afe..a1449395a1f0 100644 --- a/core/src/main/java/org/apache/calcite/util/graph/DirectedGraph.java +++ b/core/src/main/java/org/apache/calcite/util/graph/DirectedGraph.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.util.graph; -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/util/graph/Graphs.java b/core/src/main/java/org/apache/calcite/util/graph/Graphs.java index de230db779fd..e7b84e0b83a8 100644 --- a/core/src/main/java/org/apache/calcite/util/graph/Graphs.java +++ b/core/src/main/java/org/apache/calcite/util/graph/Graphs.java @@ -101,7 +101,7 @@ public static FrozenGraph makeImmutable( * @param Vertex type * @param Edge type */ - public static class FrozenGraph { + public static class FrozenGraph { private final DefaultDirectedGraph graph; private final Map, int[]> shortestDistances; diff --git a/core/src/main/java/org/apache/calcite/util/graph/TopologicalOrderIterator.java b/core/src/main/java/org/apache/calcite/util/graph/TopologicalOrderIterator.java index e880d72e4f38..789db7154850 100644 --- a/core/src/main/java/org/apache/calcite/util/graph/TopologicalOrderIterator.java +++ b/core/src/main/java/org/apache/calcite/util/graph/TopologicalOrderIterator.java @@ -16,11 +16,9 @@ */ package org.apache.calcite.util.graph; +import org.apache.calcite.linq4j.annotations.RequiresNonNull; import org.apache.calcite.plan.hep.HepMatchOrder; -import org.checkerframework.checker.initialization.qual.UnderInitialization; -import org.checkerframework.checker.nullness.qual.RequiresNonNull; - import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -66,7 +64,6 @@ public static Iterable of( @RequiresNonNull("graph") private void populate( - @UnderInitialization TopologicalOrderIterator this, Map countMap, List empties) { for (V v : graph.vertexMap.keySet()) { countMap.put(v, new int[] {0}); diff --git a/core/src/main/java/org/apache/calcite/util/graph/package-info.java b/core/src/main/java/org/apache/calcite/util/graph/package-info.java index 3e272a795827..2d24a3a13f40 100644 --- a/core/src/main/java/org/apache/calcite/util/graph/package-info.java +++ b/core/src/main/java/org/apache/calcite/util/graph/package-info.java @@ -18,4 +18,7 @@ /** * Graph-theoretic algorithms and data structures. */ +@NullMarked package org.apache.calcite.util.graph; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/util/javac/JaninoCompiler.java b/core/src/main/java/org/apache/calcite/util/javac/JaninoCompiler.java index 68ab65df09b2..ca11fe06e400 100644 --- a/core/src/main/java/org/apache/calcite/util/javac/JaninoCompiler.java +++ b/core/src/main/java/org/apache/calcite/util/javac/JaninoCompiler.java @@ -18,11 +18,11 @@ import org.apache.calcite.config.CalciteSystemProperty; -import org.checkerframework.checker.nullness.qual.Nullable; import org.codehaus.commons.compiler.util.resource.MapResourceFinder; import org.codehaus.commons.compiler.util.resource.ResourceFinder; import org.codehaus.janino.JavaSourceClassLoader; import org.codehaus.janino.util.ClassFile; +import org.jspecify.annotations.Nullable; import java.io.File; import java.io.FileOutputStream; diff --git a/core/src/main/java/org/apache/calcite/util/javac/package-info.java b/core/src/main/java/org/apache/calcite/util/javac/package-info.java index 4fc956fdfe5e..93899b55ab50 100644 --- a/core/src/main/java/org/apache/calcite/util/javac/package-info.java +++ b/core/src/main/java/org/apache/calcite/util/javac/package-info.java @@ -18,4 +18,7 @@ /** * Provides compilers for Java code. */ +@NullMarked package org.apache.calcite.util.javac; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/util/mapping/AbstractSourceMapping.java b/core/src/main/java/org/apache/calcite/util/mapping/AbstractSourceMapping.java index 805bda3c725a..caf22543736f 100644 --- a/core/src/main/java/org/apache/calcite/util/mapping/AbstractSourceMapping.java +++ b/core/src/main/java/org/apache/calcite/util/mapping/AbstractSourceMapping.java @@ -59,7 +59,7 @@ protected AbstractSourceMapping(int sourceCount, int targetCount) { return MappingType.INVERSE_PARTIAL_FUNCTION; } - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") @Override public Iterator iterator() { return new Iterator() { int source; diff --git a/core/src/main/java/org/apache/calcite/util/mapping/AbstractTargetMapping.java b/core/src/main/java/org/apache/calcite/util/mapping/AbstractTargetMapping.java index c9b7b9103c5c..375bf4081046 100644 --- a/core/src/main/java/org/apache/calcite/util/mapping/AbstractTargetMapping.java +++ b/core/src/main/java/org/apache/calcite/util/mapping/AbstractTargetMapping.java @@ -59,7 +59,7 @@ protected AbstractTargetMapping(int sourceCount, int targetCount) { return MappingType.PARTIAL_FUNCTION; } - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") @Override public Iterator iterator() { return new Iterator() { int source = -1; diff --git a/core/src/main/java/org/apache/calcite/util/mapping/IntPair.java b/core/src/main/java/org/apache/calcite/util/mapping/IntPair.java index 1c64c9e978b1..c2a016476bae 100644 --- a/core/src/main/java/org/apache/calcite/util/mapping/IntPair.java +++ b/core/src/main/java/org/apache/calcite/util/mapping/IntPair.java @@ -22,7 +22,7 @@ import com.google.common.base.Function; import com.google.common.collect.Ordering; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.AbstractList; import java.util.Comparator; diff --git a/core/src/main/java/org/apache/calcite/util/mapping/Mappings.java b/core/src/main/java/org/apache/calcite/util/mapping/Mappings.java index 0139473bc50d..9592ee095290 100644 --- a/core/src/main/java/org/apache/calcite/util/mapping/Mappings.java +++ b/core/src/main/java/org/apache/calcite/util/mapping/Mappings.java @@ -25,8 +25,7 @@ import com.google.common.primitives.Ints; import com.google.errorprone.annotations.CheckReturnValue; -import org.checkerframework.checker.initialization.qual.UnknownInitialization; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.AbstractList; import java.util.ArrayList; @@ -1358,8 +1357,7 @@ private class MappingItr implements Iterator { return i < targets.length; } - private void advance( - @UnknownInitialization MappingItr this) { + private void advance() { do { ++i; } while (i < targets.length && targets[i] == -1); @@ -1718,7 +1716,7 @@ private static class PartialFunctionImpl extends AbstractMapping return size; } - @SuppressWarnings("method.invocation.invalid") + @SuppressWarnings("NullAway") @Override public Iterator iterator() { return new Iterator() { int i = -1; diff --git a/core/src/main/java/org/apache/calcite/util/mapping/package-info.java b/core/src/main/java/org/apache/calcite/util/mapping/package-info.java index 81ea4ed0e80f..9537e61e2025 100644 --- a/core/src/main/java/org/apache/calcite/util/mapping/package-info.java +++ b/core/src/main/java/org/apache/calcite/util/mapping/package-info.java @@ -18,4 +18,7 @@ /** * Support for algebraic maps. */ +@NullMarked package org.apache.calcite.util.mapping; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/main/java/org/apache/calcite/util/package-info.java b/core/src/main/java/org/apache/calcite/util/package-info.java index 714aa1190c82..612efa27d8e1 100644 --- a/core/src/main/java/org/apache/calcite/util/package-info.java +++ b/core/src/main/java/org/apache/calcite/util/package-info.java @@ -18,11 +18,7 @@ /** * Provides utility classes. */ -@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.util; -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/util/trace/CalciteLogger.java b/core/src/main/java/org/apache/calcite/util/trace/CalciteLogger.java index 50888a43a04b..556477def10c 100644 --- a/core/src/main/java/org/apache/calcite/util/trace/CalciteLogger.java +++ b/core/src/main/java/org/apache/calcite/util/trace/CalciteLogger.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.util.trace; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import static java.util.Objects.requireNonNull; diff --git a/core/src/main/java/org/apache/calcite/util/trace/CalciteTimingTracer.java b/core/src/main/java/org/apache/calcite/util/trace/CalciteTimingTracer.java index 26101a3f572a..992d70b93380 100644 --- a/core/src/main/java/org/apache/calcite/util/trace/CalciteTimingTracer.java +++ b/core/src/main/java/org/apache/calcite/util/trace/CalciteTimingTracer.java @@ -18,7 +18,7 @@ import org.apache.calcite.util.NumberUtil; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import java.text.DecimalFormat; diff --git a/core/src/main/java/org/apache/calcite/util/trace/CalciteTrace.java b/core/src/main/java/org/apache/calcite/util/trace/CalciteTrace.java index 75c6a3dfb8c6..7aca0fe00cf6 100644 --- a/core/src/main/java/org/apache/calcite/util/trace/CalciteTrace.java +++ b/core/src/main/java/org/apache/calcite/util/trace/CalciteTrace.java @@ -24,7 +24,7 @@ import org.apache.calcite.prepare.Prepare; import org.apache.calcite.rel.rules.DpHyp; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/core/src/main/java/org/apache/calcite/util/trace/package-info.java b/core/src/main/java/org/apache/calcite/util/trace/package-info.java index 425046e2114b..353480d49bd5 100644 --- a/core/src/main/java/org/apache/calcite/util/trace/package-info.java +++ b/core/src/main/java/org/apache/calcite/util/trace/package-info.java @@ -18,4 +18,7 @@ /** * Tracing services. */ +@NullMarked package org.apache.calcite.util.trace; + +import org.jspecify.annotations.NullMarked; diff --git a/core/src/test/java/org/apache/calcite/adapter/enumerable/EnumerableCustomAggregateTest.java b/core/src/test/java/org/apache/calcite/adapter/enumerable/EnumerableCustomAggregateTest.java index 8e68b547574e..81b3cd6b878b 100644 --- a/core/src/test/java/org/apache/calcite/adapter/enumerable/EnumerableCustomAggregateTest.java +++ b/core/src/test/java/org/apache/calcite/adapter/enumerable/EnumerableCustomAggregateTest.java @@ -53,7 +53,7 @@ import com.google.common.collect.ImmutableMap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.util.ArrayList; diff --git a/core/src/test/java/org/apache/calcite/adapter/enumerable/RexImplementorTableTest.java b/core/src/test/java/org/apache/calcite/adapter/enumerable/RexImplementorTableTest.java index 6fb3039a61d0..ead6d31f9ccb 100644 --- a/core/src/test/java/org/apache/calcite/adapter/enumerable/RexImplementorTableTest.java +++ b/core/src/test/java/org/apache/calcite/adapter/enumerable/RexImplementorTableTest.java @@ -42,7 +42,7 @@ import org.apache.calcite.sql.type.ReturnTypes; import org.apache.calcite.sql.validate.SqlConformanceEnum; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.lang.reflect.Type; diff --git a/core/src/test/java/org/apache/calcite/adapter/generate/RangeTable.java b/core/src/test/java/org/apache/calcite/adapter/generate/RangeTable.java index 46eb8afd74e0..d284b7344a9d 100644 --- a/core/src/test/java/org/apache/calcite/adapter/generate/RangeTable.java +++ b/core/src/test/java/org/apache/calcite/adapter/generate/RangeTable.java @@ -27,7 +27,7 @@ import org.apache.calcite.schema.impl.AbstractTableQueryable; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Map; import java.util.NoSuchElementException; diff --git a/core/src/test/java/org/apache/calcite/jdbc/CalciteRemoteDriverTest.java b/core/src/test/java/org/apache/calcite/jdbc/CalciteRemoteDriverTest.java index 4c15a1476ad6..578586207b28 100644 --- a/core/src/test/java/org/apache/calcite/jdbc/CalciteRemoteDriverTest.java +++ b/core/src/test/java/org/apache/calcite/jdbc/CalciteRemoteDriverTest.java @@ -34,7 +34,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Disabled; diff --git a/core/src/test/java/org/apache/calcite/materialize/CustomMaterializedViewRecognitionRuleTest.java b/core/src/test/java/org/apache/calcite/materialize/CustomMaterializedViewRecognitionRuleTest.java index 7a485ccecbb0..ff17880ef347 100644 --- a/core/src/test/java/org/apache/calcite/materialize/CustomMaterializedViewRecognitionRuleTest.java +++ b/core/src/test/java/org/apache/calcite/materialize/CustomMaterializedViewRecognitionRuleTest.java @@ -47,7 +47,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.util.ArrayList; diff --git a/core/src/test/java/org/apache/calcite/plan/RelWriterTest.java b/core/src/test/java/org/apache/calcite/plan/RelWriterTest.java index a107afd17f0d..29147b9df6c4 100644 --- a/core/src/test/java/org/apache/calcite/plan/RelWriterTest.java +++ b/core/src/test/java/org/apache/calcite/plan/RelWriterTest.java @@ -86,8 +86,8 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; -import org.checkerframework.checker.nullness.qual.Nullable; import org.hamcrest.Matcher; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; diff --git a/core/src/test/java/org/apache/calcite/plan/volcano/CollationConversionTest.java b/core/src/test/java/org/apache/calcite/plan/volcano/CollationConversionTest.java index 7dacef208ac9..df12fb4dac09 100644 --- a/core/src/test/java/org/apache/calcite/plan/volcano/CollationConversionTest.java +++ b/core/src/test/java/org/apache/calcite/plan/volcano/CollationConversionTest.java @@ -37,8 +37,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 org.junit.jupiter.api.Test; import java.util.List; diff --git a/core/src/test/java/org/apache/calcite/plan/volcano/ComboRuleTest.java b/core/src/test/java/org/apache/calcite/plan/volcano/ComboRuleTest.java index 60178619c7a3..04ff33acc00f 100644 --- a/core/src/test/java/org/apache/calcite/plan/volcano/ComboRuleTest.java +++ b/core/src/test/java/org/apache/calcite/plan/volcano/ComboRuleTest.java @@ -29,8 +29,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 org.junit.jupiter.api.Test; import java.util.List; diff --git a/core/src/test/java/org/apache/calcite/plan/volcano/MultipleTraitConversionTest.java b/core/src/test/java/org/apache/calcite/plan/volcano/MultipleTraitConversionTest.java index 0322311f143a..6b96f24fed20 100644 --- a/core/src/test/java/org/apache/calcite/plan/volcano/MultipleTraitConversionTest.java +++ b/core/src/test/java/org/apache/calcite/plan/volcano/MultipleTraitConversionTest.java @@ -30,7 +30,7 @@ import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.calcite.util.ImmutableIntList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.util.List; diff --git a/core/src/test/java/org/apache/calcite/plan/volcano/PlannerTests.java b/core/src/test/java/org/apache/calcite/plan/volcano/PlannerTests.java index 9e46f13f4864..cb0e52502afe 100644 --- a/core/src/test/java/org/apache/calcite/plan/volcano/PlannerTests.java +++ b/core/src/test/java/org/apache/calcite/plan/volcano/PlannerTests.java @@ -35,8 +35,8 @@ import org.apache.calcite.rex.RexBuilder; import org.apache.calcite.sql.type.SqlTypeFactoryImpl; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.List; diff --git a/core/src/test/java/org/apache/calcite/plan/volcano/TraitConversionTest.java b/core/src/test/java/org/apache/calcite/plan/volcano/TraitConversionTest.java index b66d50fba931..1b1ebbe77d2f 100644 --- a/core/src/test/java/org/apache/calcite/plan/volcano/TraitConversionTest.java +++ b/core/src/test/java/org/apache/calcite/plan/volcano/TraitConversionTest.java @@ -30,8 +30,8 @@ import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.metadata.RelMetadataQuery; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.util.List; diff --git a/core/src/test/java/org/apache/calcite/plan/volcano/TraitPropagationTest.java b/core/src/test/java/org/apache/calcite/plan/volcano/TraitPropagationTest.java index 0caa7ec3e598..0e8f9e084e47 100644 --- a/core/src/test/java/org/apache/calcite/plan/volcano/TraitPropagationTest.java +++ b/core/src/test/java/org/apache/calcite/plan/volcano/TraitPropagationTest.java @@ -74,8 +74,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 org.junit.jupiter.api.Test; import java.sql.Connection; diff --git a/core/src/test/java/org/apache/calcite/plan/volcano/VolcanoPlannerTraitTest.java b/core/src/test/java/org/apache/calcite/plan/volcano/VolcanoPlannerTraitTest.java index c3e9c23a3013..e75d1951f749 100644 --- a/core/src/test/java/org/apache/calcite/plan/volcano/VolcanoPlannerTraitTest.java +++ b/core/src/test/java/org/apache/calcite/plan/volcano/VolcanoPlannerTraitTest.java @@ -44,8 +44,8 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; diff --git a/core/src/test/java/org/apache/calcite/prepare/LookupOperatorOverloadsTest.java b/core/src/test/java/org/apache/calcite/prepare/LookupOperatorOverloadsTest.java index a05dbfc82633..0224e8a47240 100644 --- a/core/src/test/java/org/apache/calcite/prepare/LookupOperatorOverloadsTest.java +++ b/core/src/test/java/org/apache/calcite/prepare/LookupOperatorOverloadsTest.java @@ -44,7 +44,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Multimap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.sql.Connection; diff --git a/core/src/test/java/org/apache/calcite/rel/logical/ToLogicalConverterTest.java b/core/src/test/java/org/apache/calcite/rel/logical/ToLogicalConverterTest.java index fb7deb5b8a30..7dc5275f840f 100644 --- a/core/src/test/java/org/apache/calcite/rel/logical/ToLogicalConverterTest.java +++ b/core/src/test/java/org/apache/calcite/rel/logical/ToLogicalConverterTest.java @@ -43,7 +43,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.junit.jupiter.api.Test; import java.util.Locale; diff --git a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java index 8e2b6efb53b0..b354f6c9538b 100644 --- a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java +++ b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java @@ -112,7 +112,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import org.opentest4j.TestAbortedException; diff --git a/core/src/test/java/org/apache/calcite/rex/RexProgramTest.java b/core/src/test/java/org/apache/calcite/rex/RexProgramTest.java index ca063c48559b..d7282f89255e 100644 --- a/core/src/test/java/org/apache/calcite/rex/RexProgramTest.java +++ b/core/src/test/java/org/apache/calcite/rex/RexProgramTest.java @@ -57,8 +57,8 @@ import com.google.common.collect.Range; import com.google.common.collect.RangeSet; -import org.checkerframework.checker.nullness.qual.Nullable; import org.hamcrest.Matcher; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; diff --git a/core/src/test/java/org/apache/calcite/runtime/EnumerablesTest.java b/core/src/test/java/org/apache/calcite/runtime/EnumerablesTest.java index 575a8bfec651..19e7c51bb813 100644 --- a/core/src/test/java/org/apache/calcite/runtime/EnumerablesTest.java +++ b/core/src/test/java/org/apache/calcite/runtime/EnumerablesTest.java @@ -27,7 +27,7 @@ import com.google.common.collect.Lists; -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/core/src/test/java/org/apache/calcite/schema/lookup/FakeLookup.java b/core/src/test/java/org/apache/calcite/schema/lookup/FakeLookup.java index c0eb4d9bc788..f0014e8d5ee9 100644 --- a/core/src/test/java/org/apache/calcite/schema/lookup/FakeLookup.java +++ b/core/src/test/java/org/apache/calcite/schema/lookup/FakeLookup.java @@ -18,7 +18,7 @@ import org.apache.calcite.linq4j.function.Predicate1; -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/test/java/org/apache/calcite/schema/lookup/IgnoreCaseLookupTest.java b/core/src/test/java/org/apache/calcite/schema/lookup/IgnoreCaseLookupTest.java index 95aef8473888..2c30c8cd4116 100644 --- a/core/src/test/java/org/apache/calcite/schema/lookup/IgnoreCaseLookupTest.java +++ b/core/src/test/java/org/apache/calcite/schema/lookup/IgnoreCaseLookupTest.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.schema.lookup; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.util.Collections; diff --git a/core/src/test/java/org/apache/calcite/schemas/HrClusteredSchema.java b/core/src/test/java/org/apache/calcite/schemas/HrClusteredSchema.java index 08a644304f58..87cd7b532cbb 100644 --- a/core/src/test/java/org/apache/calcite/schemas/HrClusteredSchema.java +++ b/core/src/test/java/org/apache/calcite/schemas/HrClusteredSchema.java @@ -34,7 +34,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.ArrayList; import java.util.Arrays; diff --git a/core/src/test/java/org/apache/calcite/sql/test/SqlAdvisorTest.java b/core/src/test/java/org/apache/calcite/sql/test/SqlAdvisorTest.java index 01488fcc4bad..0cff350fa63d 100644 --- a/core/src/test/java/org/apache/calcite/sql/test/SqlAdvisorTest.java +++ b/core/src/test/java/org/apache/calcite/sql/test/SqlAdvisorTest.java @@ -29,7 +29,7 @@ import com.google.common.collect.ImmutableMap; -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/core/src/test/java/org/apache/calcite/sql/test/SqlPrettyWriterFixture.java b/core/src/test/java/org/apache/calcite/sql/test/SqlPrettyWriterFixture.java index d92eef1badd7..3270a52e92fa 100644 --- a/core/src/test/java/org/apache/calcite/sql/test/SqlPrettyWriterFixture.java +++ b/core/src/test/java/org/apache/calcite/sql/test/SqlPrettyWriterFixture.java @@ -26,7 +26,7 @@ import org.apache.calcite.test.DiffRepository; import org.apache.calcite.util.Litmus; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.PrintWriter; import java.io.StringWriter; diff --git a/core/src/test/java/org/apache/calcite/sql/test/SqlPrettyWriterTest.java b/core/src/test/java/org/apache/calcite/sql/test/SqlPrettyWriterTest.java index 4bef9b541d46..26cbd51d7284 100644 --- a/core/src/test/java/org/apache/calcite/sql/test/SqlPrettyWriterTest.java +++ b/core/src/test/java/org/apache/calcite/sql/test/SqlPrettyWriterTest.java @@ -26,7 +26,7 @@ import org.apache.calcite.sql.pretty.SqlPrettyWriter; import org.apache.calcite.test.DiffRepository; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; diff --git a/core/src/test/java/org/apache/calcite/sql/type/RelDataTypeSystemTest.java b/core/src/test/java/org/apache/calcite/sql/type/RelDataTypeSystemTest.java index 58d56c99dd1d..c5858d7f7334 100644 --- a/core/src/test/java/org/apache/calcite/sql/type/RelDataTypeSystemTest.java +++ b/core/src/test/java/org/apache/calcite/sql/type/RelDataTypeSystemTest.java @@ -34,7 +34,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.util.AbstractMap; diff --git a/core/src/test/java/org/apache/calcite/sql/validate/LexCaseSensitiveTest.java b/core/src/test/java/org/apache/calcite/sql/validate/LexCaseSensitiveTest.java index 67e91454915a..665af0929148 100644 --- a/core/src/test/java/org/apache/calcite/sql/validate/LexCaseSensitiveTest.java +++ b/core/src/test/java/org/apache/calcite/sql/validate/LexCaseSensitiveTest.java @@ -33,7 +33,7 @@ import org.apache.calcite.tools.Programs; import org.apache.calcite.tools.ValidationException; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.util.List; diff --git a/core/src/test/java/org/apache/calcite/sql/validate/LexEscapeTest.java b/core/src/test/java/org/apache/calcite/sql/validate/LexEscapeTest.java index 64f5a0a75e52..a311d3bf716d 100644 --- a/core/src/test/java/org/apache/calcite/sql/validate/LexEscapeTest.java +++ b/core/src/test/java/org/apache/calcite/sql/validate/LexEscapeTest.java @@ -40,7 +40,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.util.List; diff --git a/core/src/test/java/org/apache/calcite/sql2rel/CorrelateProjectExtractorTest.java b/core/src/test/java/org/apache/calcite/sql2rel/CorrelateProjectExtractorTest.java index da0a17296b3c..0bee7d0ef1bd 100644 --- a/core/src/test/java/org/apache/calcite/sql2rel/CorrelateProjectExtractorTest.java +++ b/core/src/test/java/org/apache/calcite/sql2rel/CorrelateProjectExtractorTest.java @@ -29,7 +29,7 @@ import org.apache.calcite.tools.RelBuilder; import org.apache.calcite.util.Holder; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.util.List; diff --git a/core/src/test/java/org/apache/calcite/sql2rel/RelDecorrelatorTest.java b/core/src/test/java/org/apache/calcite/sql2rel/RelDecorrelatorTest.java index 80ef7f588ade..8c2d424133f3 100644 --- a/core/src/test/java/org/apache/calcite/sql2rel/RelDecorrelatorTest.java +++ b/core/src/test/java/org/apache/calcite/sql2rel/RelDecorrelatorTest.java @@ -51,7 +51,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.util.Collections; diff --git a/core/src/test/java/org/apache/calcite/sql2rel/RelFieldTrimmerTest.java b/core/src/test/java/org/apache/calcite/sql2rel/RelFieldTrimmerTest.java index 535dc07b1602..c1a23161e154 100644 --- a/core/src/test/java/org/apache/calcite/sql2rel/RelFieldTrimmerTest.java +++ b/core/src/test/java/org/apache/calcite/sql2rel/RelFieldTrimmerTest.java @@ -47,7 +47,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.util.Collections; diff --git a/core/src/test/java/org/apache/calcite/test/CollectionTypeTest.java b/core/src/test/java/org/apache/calcite/test/CollectionTypeTest.java index 1ea33de0b20f..8db230f4a6fb 100644 --- a/core/src/test/java/org/apache/calcite/test/CollectionTypeTest.java +++ b/core/src/test/java/org/apache/calcite/test/CollectionTypeTest.java @@ -34,7 +34,7 @@ import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.sql.Connection; diff --git a/core/src/test/java/org/apache/calcite/test/CoreQuidemTest.java b/core/src/test/java/org/apache/calcite/test/CoreQuidemTest.java index bbb547b85833..70b9c2468f19 100644 --- a/core/src/test/java/org/apache/calcite/test/CoreQuidemTest.java +++ b/core/src/test/java/org/apache/calcite/test/CoreQuidemTest.java @@ -28,7 +28,7 @@ import net.hydromatic.quidem.CommandHandler; import net.hydromatic.quidem.Quidem; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.sql.Connection; import java.util.Collection; diff --git a/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java b/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java index 1729817e368d..1940d7237653 100644 --- a/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java +++ b/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java @@ -37,7 +37,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Test; diff --git a/core/src/test/java/org/apache/calcite/test/InterpreterTest.java b/core/src/test/java/org/apache/calcite/test/InterpreterTest.java index c138056e727a..e552642afdb8 100644 --- a/core/src/test/java/org/apache/calcite/test/InterpreterTest.java +++ b/core/src/test/java/org/apache/calcite/test/InterpreterTest.java @@ -52,7 +52,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/core/src/test/java/org/apache/calcite/test/JdbcTest.java b/core/src/test/java/org/apache/calcite/test/JdbcTest.java index a75983c76a98..3e1d316f3450 100644 --- a/core/src/test/java/org/apache/calcite/test/JdbcTest.java +++ b/core/src/test/java/org/apache/calcite/test/JdbcTest.java @@ -106,11 +106,11 @@ import com.google.common.collect.LinkedListMultimap; import com.google.common.collect.Multimap; -import org.checkerframework.checker.nullness.qual.Nullable; import org.hamcrest.Matcher; import org.hamcrest.comparator.ComparatorMatcherBuilder; import org.hamcrest.number.OrderingComparison; import org.hsqldb.jdbcDriver; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -281,7 +281,7 @@ private static DataSource getDataSource() { return this; } - @Override public @Nullable T unwrap(Class clazz) { + @Override public @Nullable T unwrap(Class clazz) { if (schema instanceof Wrapper) { return ((Wrapper) schema).unwrap(clazz); } diff --git a/core/src/test/java/org/apache/calcite/test/LintTest.java b/core/src/test/java/org/apache/calcite/test/LintTest.java index ef0db448315d..0714beb1a71b 100644 --- a/core/src/test/java/org/apache/calcite/test/LintTest.java +++ b/core/src/test/java/org/apache/calcite/test/LintTest.java @@ -27,7 +27,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.junit.jupiter.api.Test; import java.io.File; diff --git a/core/src/test/java/org/apache/calcite/test/MaterializationTest.java b/core/src/test/java/org/apache/calcite/test/MaterializationTest.java index c91f0e75eceb..ad951f286d3f 100644 --- a/core/src/test/java/org/apache/calcite/test/MaterializationTest.java +++ b/core/src/test/java/org/apache/calcite/test/MaterializationTest.java @@ -44,7 +44,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.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; diff --git a/core/src/test/java/org/apache/calcite/test/MaterializedViewFixture.java b/core/src/test/java/org/apache/calcite/test/MaterializedViewFixture.java index f0269081be26..1cdac2410220 100644 --- a/core/src/test/java/org/apache/calcite/test/MaterializedViewFixture.java +++ b/core/src/test/java/org/apache/calcite/test/MaterializedViewFixture.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.function.Predicate; diff --git a/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java b/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java index ebe8990c1ddc..c3e1290edec5 100644 --- a/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java +++ b/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java @@ -103,9 +103,9 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; -import org.checkerframework.checker.nullness.qual.Nullable; import org.hamcrest.FeatureMatcher; import org.hamcrest.Matcher; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; diff --git a/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java b/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java index abb934457a0e..efccc070148d 100644 --- a/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java +++ b/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java @@ -125,8 +125,8 @@ import com.google.common.collect.Multimap; import com.google.common.collect.Sets; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; diff --git a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java index 76ff0a831335..385fe5950c31 100644 --- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java +++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java @@ -148,8 +148,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 org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; diff --git a/core/src/test/java/org/apache/calcite/test/RuleMatchVisualizerTest.java b/core/src/test/java/org/apache/calcite/test/RuleMatchVisualizerTest.java index 7a1e3fd9a0ea..b4f59e9c8e4b 100644 --- a/core/src/test/java/org/apache/calcite/test/RuleMatchVisualizerTest.java +++ b/core/src/test/java/org/apache/calcite/test/RuleMatchVisualizerTest.java @@ -26,7 +26,7 @@ import org.apache.calcite.rel.RelCollationTraitDef; import org.apache.calcite.rel.rules.CoreRules; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Test; diff --git a/core/src/test/java/org/apache/calcite/test/ScannableTableTest.java b/core/src/test/java/org/apache/calcite/test/ScannableTableTest.java index 976f5abcd60f..fb0be08d2d54 100644 --- a/core/src/test/java/org/apache/calcite/test/ScannableTableTest.java +++ b/core/src/test/java/org/apache/calcite/test/ScannableTableTest.java @@ -45,7 +45,7 @@ import com.google.common.collect.ImmutableMap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.math.BigDecimal; diff --git a/core/src/test/java/org/apache/calcite/test/SqlHintsConverterTest.java b/core/src/test/java/org/apache/calcite/test/SqlHintsConverterTest.java index 89f006526909..47e2eca7a6ac 100644 --- a/core/src/test/java/org/apache/calcite/test/SqlHintsConverterTest.java +++ b/core/src/test/java/org/apache/calcite/test/SqlHintsConverterTest.java @@ -75,8 +75,8 @@ import org.apache.calcite.util.Litmus; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/core/src/test/java/org/apache/calcite/test/SqlTestGen.java b/core/src/test/java/org/apache/calcite/test/SqlTestGen.java index 0e7ef7dee2eb..6710a1a7f445 100644 --- a/core/src/test/java/org/apache/calcite/test/SqlTestGen.java +++ b/core/src/test/java/org/apache/calcite/test/SqlTestGen.java @@ -24,7 +24,7 @@ import org.apache.calcite.util.TestUtil; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.File; import java.io.PrintWriter; diff --git a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java index d56b7d54375b..f48454851db4 100644 --- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java +++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java @@ -60,7 +60,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; diff --git a/core/src/test/java/org/apache/calcite/test/SqlValidatorFeatureTest.java b/core/src/test/java/org/apache/calcite/test/SqlValidatorFeatureTest.java index 24cdf1935d1b..7efaf22dacd4 100644 --- a/core/src/test/java/org/apache/calcite/test/SqlValidatorFeatureTest.java +++ b/core/src/test/java/org/apache/calcite/test/SqlValidatorFeatureTest.java @@ -25,7 +25,7 @@ import org.apache.calcite.sql.validate.SqlValidatorCatalogReader; import org.apache.calcite.sql.validate.SqlValidatorImpl; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import static org.apache.calcite.util.Static.RESOURCE; diff --git a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java index 854a5ce8fff2..d97c78af61ea 100644 --- a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java +++ b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java @@ -81,7 +81,7 @@ import com.google.common.collect.Ordering; import com.google.common.collect.Sets; -import org.checkerframework.checker.nullness.qual.NonNull; +import org.jspecify.annotations.NonNull; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/core/src/test/java/org/apache/calcite/test/SqlXmlFunctionsTest.java b/core/src/test/java/org/apache/calcite/test/SqlXmlFunctionsTest.java index 046d93570591..03494835a190 100644 --- a/core/src/test/java/org/apache/calcite/test/SqlXmlFunctionsTest.java +++ b/core/src/test/java/org/apache/calcite/test/SqlXmlFunctionsTest.java @@ -21,8 +21,8 @@ import org.apache.calcite.runtime.XmlFunctions; import org.apache.calcite.util.BuiltInMethod; -import org.checkerframework.checker.nullness.qual.Nullable; import org.hamcrest.Matcher; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; diff --git a/core/src/test/java/org/apache/calcite/test/TCatalogReader.java b/core/src/test/java/org/apache/calcite/test/TCatalogReader.java index c6ebd03869dd..b63028e60bbc 100644 --- a/core/src/test/java/org/apache/calcite/test/TCatalogReader.java +++ b/core/src/test/java/org/apache/calcite/test/TCatalogReader.java @@ -19,7 +19,7 @@ import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.test.catalog.MockCatalogReader; -import org.checkerframework.checker.nullness.qual.NonNull; +import org.jspecify.annotations.NonNull; /** A catalog reader with tables "T1" and "T2" whose schema contains all * test data types. */ diff --git a/core/src/test/java/org/apache/calcite/test/TopDownOptTest.java b/core/src/test/java/org/apache/calcite/test/TopDownOptTest.java index 19b9d2063917..18606417063e 100644 --- a/core/src/test/java/org/apache/calcite/test/TopDownOptTest.java +++ b/core/src/test/java/org/apache/calcite/test/TopDownOptTest.java @@ -24,7 +24,7 @@ import org.apache.calcite.rel.rules.CoreRules; import org.apache.calcite.rel.rules.JoinPushThroughJoinRule; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Test; diff --git a/core/src/test/java/org/apache/calcite/test/TypeCoercionConverterTest.java b/core/src/test/java/org/apache/calcite/test/TypeCoercionConverterTest.java index a12a07d5e57b..2aba21cf7784 100644 --- a/core/src/test/java/org/apache/calcite/test/TypeCoercionConverterTest.java +++ b/core/src/test/java/org/apache/calcite/test/TypeCoercionConverterTest.java @@ -18,7 +18,7 @@ import org.apache.calcite.sql.validate.implicit.TypeCoercion; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Test; diff --git a/core/src/test/java/org/apache/calcite/test/TypeCoercionTest.java b/core/src/test/java/org/apache/calcite/test/TypeCoercionTest.java index 32db4091bfe6..392c34dba3a2 100644 --- a/core/src/test/java/org/apache/calcite/test/TypeCoercionTest.java +++ b/core/src/test/java/org/apache/calcite/test/TypeCoercionTest.java @@ -33,7 +33,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.util.List; diff --git a/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestCommandExecutor.java b/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestCommandExecutor.java index 5a514d451e7d..62c1d31cd8b1 100644 --- a/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestCommandExecutor.java +++ b/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestCommandExecutor.java @@ -18,7 +18,7 @@ import org.apache.calcite.util.Unsafe; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.PrintStream; import java.sql.Connection; diff --git a/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestCommandGenerator.java b/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestCommandGenerator.java index 6e146e1a7d5f..7a95a1ab4100 100644 --- a/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestCommandGenerator.java +++ b/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestCommandGenerator.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.io.PrintStream; import java.math.BigDecimal; diff --git a/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestCommandScript.java b/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestCommandScript.java index b61e145f477d..b2cc9d8a28be 100644 --- a/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestCommandScript.java +++ b/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestCommandScript.java @@ -21,7 +21,7 @@ import org.apache.calcite.util.Unsafe; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.BufferedReader; import java.io.BufferedWriter; diff --git a/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestPluginCommand.java b/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestPluginCommand.java index 4f49736d7f97..279f90b132d0 100644 --- a/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestPluginCommand.java +++ b/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestPluginCommand.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.test.concurrent; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.sql.Connection; import java.sql.Statement; diff --git a/core/src/test/java/org/apache/calcite/tools/FrameworksTest.java b/core/src/test/java/org/apache/calcite/tools/FrameworksTest.java index b413cc8b0125..cb6f3d040c2b 100644 --- a/core/src/test/java/org/apache/calcite/tools/FrameworksTest.java +++ b/core/src/test/java/org/apache/calcite/tools/FrameworksTest.java @@ -75,7 +75,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.lang.reflect.Type; diff --git a/core/src/test/java/org/apache/calcite/util/TestUnsafe.java b/core/src/test/java/org/apache/calcite/util/TestUnsafe.java index 71b4d83d5a63..e83b66bb328d 100644 --- a/core/src/test/java/org/apache/calcite/util/TestUnsafe.java +++ b/core/src/test/java/org/apache/calcite/util/TestUnsafe.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import java.io.BufferedInputStream; diff --git a/core/src/test/java/org/apache/calcite/util/UtilTest.java b/core/src/test/java/org/apache/calcite/util/UtilTest.java index c7cf33a66c0a..130a1949e0bf 100644 --- a/core/src/test/java/org/apache/calcite/util/UtilTest.java +++ b/core/src/test/java/org/apache/calcite/util/UtilTest.java @@ -49,13 +49,13 @@ import com.google.common.collect.Lists; import com.google.common.primitives.Ints; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; import org.hamcrest.Description; import org.hamcrest.FeatureMatcher; import org.hamcrest.Matcher; import org.hamcrest.StringDescription; import org.hamcrest.TypeSafeMatcher; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import org.locationtech.jts.util.Assert; diff --git a/core/src/test/java/org/apache/calcite/util/graph/DirectedGraphTest.java b/core/src/test/java/org/apache/calcite/util/graph/DirectedGraphTest.java index dae679bdadeb..355971ee382e 100644 --- a/core/src/test/java/org/apache/calcite/util/graph/DirectedGraphTest.java +++ b/core/src/test/java/org/apache/calcite/util/graph/DirectedGraphTest.java @@ -21,7 +21,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.util.ArrayList; diff --git a/druid/build.gradle.kts b/druid/build.gradle.kts index 34cae5bd05ef..8b7230586ef2 100644 --- a/druid/build.gradle.kts +++ b/druid/build.gradle.kts @@ -27,7 +27,7 @@ dependencies { api("com.fasterxml.jackson.core:jackson-core") api("joda-time:joda-time") api("org.apache.calcite.avatica:avatica-core") - api("org.checkerframework:checker-qual") + api("org.jspecify:jspecify") api("org.slf4j:slf4j-api") implementation("com.fasterxml.jackson.core:jackson-databind") diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/BinaryOperatorConversion.java b/druid/src/main/java/org/apache/calcite/adapter/druid/BinaryOperatorConversion.java index ca8a4c5ee345..8bcaa679dafd 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/BinaryOperatorConversion.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/BinaryOperatorConversion.java @@ -21,7 +21,7 @@ import org.apache.calcite.rex.RexNode; import org.apache.calcite.sql.SqlOperator; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/CeilOperatorConversion.java b/druid/src/main/java/org/apache/calcite/adapter/druid/CeilOperatorConversion.java index bece7eee8cb1..94cc4b37191c 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/CeilOperatorConversion.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/CeilOperatorConversion.java @@ -26,7 +26,7 @@ import org.apache.calcite.sql.fun.SqlStdOperatorTable; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.TimeZone; diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DefaultDimensionSpec.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DefaultDimensionSpec.java index e4be8c6d2722..d2c10fa5f676 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/DefaultDimensionSpec.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DefaultDimensionSpec.java @@ -18,7 +18,7 @@ import com.fasterxml.jackson.core.JsonGenerator; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.IOException; diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DimensionSpec.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DimensionSpec.java index 333c8768b1a4..10d702b2f7e0 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/DimensionSpec.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DimensionSpec.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.adapter.druid; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Interface for Druid DimensionSpec. diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DirectOperatorConversion.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DirectOperatorConversion.java index 8cc5964419e3..e0d76b4870a7 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/DirectOperatorConversion.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DirectOperatorConversion.java @@ -21,7 +21,7 @@ import org.apache.calcite.rex.RexNode; import org.apache.calcite.sql.SqlOperator; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidConnectionImpl.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidConnectionImpl.java index 5fb37199b726..8f3f287cc4b5 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidConnectionImpl.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidConnectionImpl.java @@ -38,8 +38,8 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import org.checkerframework.checker.nullness.qual.Nullable; import org.joda.time.Interval; +import org.jspecify.annotations.Nullable; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -97,7 +97,7 @@ class DruidConnectionImpl implements DruidConnection { * @param page Page definition (in/out) */ public void request(QueryType queryType, String data, Sink sink, - List fieldNames, List fieldTypes, + List fieldNames, List fieldTypes, Page page) { final String url = this.url + "/druid/v2/?pretty"; final Map requestHeaders = @@ -117,7 +117,7 @@ public void request(QueryType queryType, String data, Sink sink, /** Parses the output of a query, sending the results to a * {@link Sink}. */ private static void parse(QueryType queryType, InputStream in, Sink sink, - List fieldNames, List fieldTypes, Page page) { + List fieldNames, List fieldTypes, Page page) { final JsonFactory factory = new JsonFactory(); final Row.RowBuilder rowBuilder = Row.newBuilder(fieldNames.size()); @@ -296,19 +296,22 @@ private static void parse(QueryType queryType, InputStream in, Sink sink, } } - private static void parseFields(List fieldNames, List fieldTypes, + private static void parseFields(List fieldNames, + List fieldTypes, Row.RowBuilder rowBuilder, JsonParser parser) throws IOException { parseFields(fieldNames, fieldTypes, -1, rowBuilder, parser); } - private static void parseFields(List fieldNames, List fieldTypes, + private static void parseFields(List fieldNames, + List fieldTypes, int posTimestampField, Row.RowBuilder rowBuilder, JsonParser parser) throws IOException { while (parser.nextToken() == JsonToken.FIELD_NAME) { parseField(fieldNames, fieldTypes, posTimestampField, rowBuilder, parser); } } - private static void parseField(List fieldNames, List fieldTypes, + private static void parseField(List fieldNames, + List fieldTypes, int posTimestampField, Row.RowBuilder rowBuilder, JsonParser parser) throws IOException { final String fieldName = parser.currentName(); parseFieldForName(fieldNames, fieldTypes, posTimestampField, rowBuilder, parser, fieldName); @@ -316,7 +319,7 @@ private static void parseField(List fieldNames, List @SuppressWarnings("JavaUtilDate") private static void parseFieldForName(List fieldNames, - List fieldTypes, + List fieldTypes, int posTimestampField, Row.RowBuilder rowBuilder, JsonParser parser, String fieldName) throws IOException { // Move to next token, which is name's value @@ -554,7 +557,7 @@ public Enumerable enumerable(final QueryType queryType, @Override public void run() { try { final Page page = new Page(); - final List fieldTypes = + final List fieldTypes = Collections.nCopies(fieldNames.size(), null); request(queryType, request, this, fieldNames, fieldTypes, page); enumerator.done.set(true); @@ -572,7 +575,7 @@ public Enumerable enumerable(final QueryType queryType, /** Reads segment metadata, and populates a list of columns and metrics. */ void metadata(String dataSourceName, String timestampColumnName, - List intervals, + @Nullable List intervals, Map fieldBuilder, Set metricNameBuilder, Map> complexMetrics) { final String url = this.url + "/druid/v2/?pretty"; @@ -680,9 +683,9 @@ private interface RunnableQueueSink extends Sink, Runnable { private static class BlockingQueueEnumerator implements Enumerator { final BlockingQueue queue = new ArrayBlockingQueue<>(1000); final AtomicBoolean done = new AtomicBoolean(false); - final Holder throwableHolder = Holder.empty(); + final Holder<@Nullable Throwable> throwableHolder = Holder.empty(); - E next; + @Nullable E next; @Override public E current() { if (next == null) { @@ -727,30 +730,35 @@ static class Page { } /** Result of a "segmentMetadata" call, populated by Jackson. */ - @SuppressWarnings({ "WeakerAccess", "unused" }) + @SuppressWarnings({ "WeakerAccess", "unused", "NullAway.Init" }) private static class JsonSegmentMetadata { public String id; public List intervals; public Map columns; public long size; public long numRows; - public Map aggregators; + /** Present only when the query asked for the "aggregators" analysis type + * and the segment carries aggregator metadata. */ + public @Nullable Map aggregators; } /** Element of the "columns" collection in the result of a * "segmentMetadata" call, populated by Jackson. */ - @SuppressWarnings({ "WeakerAccess", "unused" }) + @SuppressWarnings({ "WeakerAccess", "unused", "NullAway.Init" }) private static class JsonColumn { public String type; public boolean hasMultipleValues; public int size; - public Integer cardinality; - public String errorMessage; + /** Present only when the query asked for the "cardinality" analysis + * type. */ + public @Nullable Integer cardinality; + /** Present only when Druid could not analyze the column. */ + public @Nullable String errorMessage; } /** Element of the "aggregators" collection in the result of a * "segmentMetadata" call, populated by Jackson. */ - @SuppressWarnings({ "WeakerAccess", "unused" }) + @SuppressWarnings({ "WeakerAccess", "unused", "NullAway.Init" }) private static class JsonAggregator { public String type; public String name; diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidDateTimeUtils.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidDateTimeUtils.java index e44b41702de0..e6b530b29e40 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidDateTimeUtils.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidDateTimeUtils.java @@ -37,10 +37,10 @@ import com.google.common.collect.Range; import com.google.common.collect.TreeRangeSet; -import org.checkerframework.checker.nullness.qual.Nullable; import org.joda.time.Interval; import org.joda.time.Period; import org.joda.time.chrono.ISOChronology; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import java.util.ArrayList; diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidExpressions.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidExpressions.java index cbdf146ea1d1..d0010e363164 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidExpressions.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidExpressions.java @@ -31,7 +31,7 @@ import com.google.common.io.BaseEncoding; import com.google.common.primitives.Chars; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.ArrayList; diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidJsonFilter.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidJsonFilter.java index 6d2dc814dd9b..7ff013681235 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidJsonFilter.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidJsonFilter.java @@ -32,7 +32,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.io.IOException; import java.text.SimpleDateFormat; @@ -99,10 +99,10 @@ abstract class DruidJsonFilter implements DruidJson { } final boolean isNumeric = refNode.getType().getFamily() == SqlTypeFamily.NUMERIC || rexLiteral.getType().getFamily() == SqlTypeFamily.NUMERIC; - final Pair druidColumn = + final Pair<@Nullable String, @Nullable ExtractionFunction> druidColumn = DruidQuery.toDruidColumn(refNode, rowType, druidQuery); - final String columnName = druidColumn.left; - final ExtractionFunction extractionFunction = druidColumn.right; + final @Nullable String columnName = druidColumn.left; + final @Nullable ExtractionFunction extractionFunction = druidColumn.right; if (columnName == null) { // no column name better bail out. return null; @@ -171,10 +171,10 @@ abstract class DruidJsonFilter implements DruidJson { } final boolean isNumeric = refNode.getType().getFamily() == SqlTypeFamily.NUMERIC || rexLiteral.getType().getFamily() == SqlTypeFamily.NUMERIC; - final Pair druidColumn = + final Pair<@Nullable String, @Nullable ExtractionFunction> druidColumn = DruidQuery.toDruidColumn(refNode, rowType, druidQuery); - final String columnName = druidColumn.left; - final ExtractionFunction extractionFunction = druidColumn.right; + final @Nullable String columnName = druidColumn.left; + final @Nullable ExtractionFunction extractionFunction = druidColumn.right; if (columnName == null) { // no column name better bail out. return null; @@ -253,10 +253,10 @@ abstract class DruidJsonFilter implements DruidJson { } final RexCall rexCall = (RexCall) rexNode; final RexNode refNode = rexCall.getOperands().get(0); - Pair druidColumn = DruidQuery + Pair<@Nullable String, @Nullable ExtractionFunction> druidColumn = DruidQuery .toDruidColumn(refNode, rowType, druidQuery); - final String columnName = druidColumn.left; - final ExtractionFunction extractionFunction = druidColumn.right; + final @Nullable String columnName = druidColumn.left; + final @Nullable ExtractionFunction extractionFunction = druidColumn.right; if (columnName == null) { return null; } @@ -287,11 +287,11 @@ abstract class DruidJsonFilter implements DruidJson { listBuilder.add(value); } } - Pair druidColumn = DruidQuery + Pair<@Nullable String, @Nullable ExtractionFunction> druidColumn = DruidQuery .toDruidColumn(((RexCall) e).getOperands().get(0), rowType, druidQuery); - final String columnName = druidColumn.left; - final ExtractionFunction extractionFunction = druidColumn.right; + final @Nullable String columnName = druidColumn.left; + final @Nullable ExtractionFunction extractionFunction = druidColumn.right; if (columnName == null) { return null; } @@ -303,7 +303,8 @@ abstract class DruidJsonFilter implements DruidJson { } } - protected static @Nullable DruidJsonFilter toNotDruidFilter(DruidJsonFilter druidJsonFilter) { + protected static @Nullable DruidJsonFilter toNotDruidFilter( + @Nullable DruidJsonFilter druidJsonFilter) { if (druidJsonFilter == null) { return null; } @@ -331,10 +332,10 @@ abstract class DruidJsonFilter implements DruidJson { } final boolean isNumeric = lhs.getType().getFamily() == SqlTypeFamily.NUMERIC || rhs.getType().getFamily() == SqlTypeFamily.NUMERIC; - final Pair druidColumn = DruidQuery + final Pair<@Nullable String, @Nullable ExtractionFunction> druidColumn = DruidQuery .toDruidColumn(refNode, rowType, query); - final String columnName = druidColumn.left; - final ExtractionFunction extractionFunction = druidColumn.right; + final @Nullable String columnName = druidColumn.left; + final @Nullable ExtractionFunction extractionFunction = druidColumn.right; if (columnName == null) { return null; @@ -494,12 +495,12 @@ private static JsonExpressionFilter alwaysFalse() { private static class JsonSelector extends DruidJsonFilter { private final String dimension; - private final String value; + private final @Nullable String value; - private final ExtractionFunction extractionFunction; + private final @Nullable ExtractionFunction extractionFunction; - private JsonSelector(String dimension, String value, - ExtractionFunction extractionFunction) { + private JsonSelector(String dimension, @Nullable String value, + @Nullable ExtractionFunction extractionFunction) { super(Type.SELECTOR); this.dimension = dimension; this.value = value; @@ -628,9 +629,8 @@ protected JsonInFilter(String dimension, List values, } } - public static DruidJsonFilter getSelectorFilter(String column, String value, - ExtractionFunction extractionFunction) { - requireNonNull(column, "column"); + public static DruidJsonFilter getSelectorFilter(String column, @Nullable String value, + @Nullable ExtractionFunction extractionFunction) { return new JsonSelector(column, value, extractionFunction); } diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java index e6aa27b6bdaf..29c44cdfc971 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java @@ -73,8 +73,8 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Maps; -import org.checkerframework.checker.nullness.qual.Nullable; import org.joda.time.Interval; +import org.jspecify.annotations.Nullable; import java.io.IOException; import java.io.StringWriter; @@ -237,7 +237,8 @@ private static DruidQuery create(RelOptCluster cluster, RelTraitSet traitSet, /** Extends a DruidQuery. */ public static DruidQuery extendQuery(DruidQuery query, RelNode r) { final ImmutableList.Builder builder = ImmutableList.builder(); - return DruidQuery.create(query.getCluster(), r.getTraitSet().replace(query.getConvention()), + return DruidQuery.create(query.getCluster(), + r.getTraitSet().replace(requireNonNull(query.getConvention(), "convention")), query.getTable(), query.druidTable, query.intervals, builder.addAll(query.rels).add(r).build(), query.getOperatorConversionMap()); } @@ -268,10 +269,10 @@ private static boolean needUtcTimeExtract(RexNode rexNode) { * the input ref, or {@code Pair.of(null, null)} when cannot translate to a * valid Druid column */ - protected static Pair toDruidColumn(RexNode rexNode, - RelDataType rowType, DruidQuery druidQuery) { - final String columnName; - final ExtractionFunction extractionFunction; + protected static Pair<@Nullable String, @Nullable ExtractionFunction> toDruidColumn( + RexNode rexNode, RelDataType rowType, DruidQuery druidQuery) { + final @Nullable String columnName; + final @Nullable ExtractionFunction extractionFunction; final Granularity granularity; switch (rexNode.getKind()) { case INPUT_REF: @@ -377,20 +378,21 @@ private static boolean isValidLeafCast(RexNode rexNode) { return false; } final SqlTypeName toTypeName = rexNode.getType().getSqlTypeName(); - if (toTypeName.getFamily() == SqlTypeFamily.CHARACTER) { + final SqlTypeFamily toFamily = toTypeName.getFamily(); + if (toFamily == SqlTypeFamily.CHARACTER) { // CAST of input to character type return true; } - if (toTypeName.getFamily() == SqlTypeFamily.NUMERIC) { + if (toFamily == SqlTypeFamily.NUMERIC) { // CAST of input to numeric type, it is part of a bounded comparison return true; } - if (toTypeName.getFamily() == SqlTypeFamily.TIMESTAMP - || toTypeName.getFamily() == SqlTypeFamily.DATETIME) { + if (toFamily == SqlTypeFamily.TIMESTAMP + || toFamily == SqlTypeFamily.DATETIME) { // CAST of literal to timestamp type return true; } - if (toTypeName.getFamily().contains(input.getType())) { + if (toFamily != null && toFamily.contains(input.getType())) { // same type it is okay to push it return true; } @@ -459,7 +461,7 @@ String signature() { return b.toString(); } - @Override public boolean isValid(Litmus litmus, Context context) { + @Override public boolean isValid(Litmus litmus, @Nullable Context context) { if (!super.isValid(litmus, context)) { return false; } @@ -594,7 +596,7 @@ public DruidTable getDruidTable() { // plan returning 2 columns. // A plan where all extra columns are pruned will be preferred. .multiplyBy( - RelMdUtil.linear(querySpec.fieldNames.size(), 2, 100, 1d, 2d)) + RelMdUtil.linear(getQuerySpec().fieldNames.size(), 2, 100, 1d, 2d)) .multiplyBy(getQueryTypeCostMultiplier()) // A Scan leaf filter is better than having filter spec if possible. .multiplyBy(rels.size() > 1 && rels.get(1) instanceof Filter ? 0.5 : 1.0) @@ -617,7 +619,7 @@ private double getIntervalCostMultiplier() { private double getQueryTypeCostMultiplier() { // Cost of Select > GroupBy > Timeseries > TopN - switch (querySpec.queryType) { + switch (getQuerySpec().queryType) { case SELECT: return .1; case GROUP_BY: @@ -782,7 +784,7 @@ protected CalciteConnectionConfig getConnectionConfig() { final ImmutableList.Builder projectedColumnsBuilder = ImmutableList.builder(); final List projects = projectRel.getProjects(); for (RexNode project : projects) { - Pair druidColumn = + Pair<@Nullable String, @Nullable ExtractionFunction> druidColumn = toDruidColumn(project, inputRowType, druidQuery); boolean needExtractForOperand = project instanceof RexCall && ((RexCall) project).getOperands().stream().anyMatch(DruidQuery::needUtcTimeExtract); @@ -854,7 +856,7 @@ protected CalciteConnectionConfig getConnectionConfig() { project = projectNode.getProjects().get(groupKey); } - Pair druidColumn = + Pair<@Nullable String, @Nullable ExtractionFunction> druidColumn = toDruidColumn(project, inputRowType, druidQuery); if (druidColumn.left != null && druidColumn.right == null) { // SIMPLE INPUT REF @@ -870,13 +872,15 @@ protected CalciteConnectionConfig getConnectionConfig() { if (project.getKind() == SqlKind.EXTRACT) { columnPrefix = EXTRACT_COLUMN_NAME_PREFIX + "_" + requireNonNull(DruidDateTimeUtils - .extractGranularity(project, druidQuery.getConnectionConfig().timeZone()) - .getType().lowerName); + .extractGranularity(project, druidQuery.getConnectionConfig().timeZone()), + "granularity") + .getType().lowerName; } else if (project.getKind() == SqlKind.FLOOR) { columnPrefix = FLOOR_COLUMN_NAME_PREFIX + "_" + requireNonNull(DruidDateTimeUtils - .extractGranularity(project, druidQuery.getConnectionConfig().timeZone()) - .getType().lowerName); + .extractGranularity(project, druidQuery.getConnectionConfig().timeZone()), + "granularity") + .getType().lowerName; } else { columnPrefix = "extract"; } @@ -998,7 +1002,7 @@ protected CalciteConnectionConfig getConnectionConfig() { return aggregations; } - protected QuerySpec getQuery(RelDataType rowType, Filter filter, + protected QuerySpec getQuery(RelDataType rowType, @Nullable Filter filter, @Nullable Project project, @Nullable ImmutableBitSet groupSet, @Nullable List aggCalls, @Nullable List aggNames, @Nullable List collationIndexes, @@ -1019,7 +1023,9 @@ protected QuerySpec getQuery(RelDataType rowType, Filter filter, if (project != null) { // project some fields only Pair, List> projectResult = - computeProjectAsScan(project, project.getInput().getRowType(), this); + requireNonNull( + computeProjectAsScan(project, project.getInput().getRowType(), this), + "computeProjectAsScan"); scanColumnNames = projectResult.left; virtualColumnList.addAll(projectResult.right); } else { @@ -1086,8 +1092,10 @@ protected QuerySpec getQuery(RelDataType rowType, Filter filter, .uniqueIndex(aggregateStageFieldNames, DruidExpressions::fromColumn); for (Pair pair : postProject.getNamedProjects()) { final RexNode postProjectRexNode = pair.left; - String expression = DruidExpressions - .toDruidExpression(postProjectRexNode, postAggInputRowType, this); + String expression = + requireNonNull( + DruidExpressions.toDruidExpression(postProjectRexNode, postAggInputRowType, + this), "expression"); final String existingFieldName = existingProjects.get(expression); if (existingFieldName != null) { // simple input ref or Druid runtime identity cast will skip it, since it is here already @@ -1274,9 +1282,10 @@ private static JsonLimit computeSort(@Nullable Integer fetch, } private @Nullable String planAsTopN(List groupByKeyDims, - DruidJsonFilter jsonFilter, + @Nullable DruidJsonFilter jsonFilter, List virtualColumnList, List aggregations, - List postAggregations, JsonLimit limit, DruidJsonFilter havingFilter) { + List postAggregations, JsonLimit limit, + @Nullable DruidJsonFilter havingFilter) { if (havingFilter != null) { return null; } @@ -1321,9 +1330,10 @@ private static JsonLimit computeSort(@Nullable Integer fetch, } private @Nullable String planAsGroupBy(List groupByKeyDims, - DruidJsonFilter jsonFilter, + @Nullable DruidJsonFilter jsonFilter, List virtualColumnList, List aggregations, - List postAggregations, JsonLimit limit, DruidJsonFilter havingFilter) { + List postAggregations, JsonLimit limit, + @Nullable DruidJsonFilter havingFilter) { final StringWriter sw = new StringWriter(); final JsonFactory factory = new JsonFactory(); try { @@ -1434,7 +1444,9 @@ public String toQuery() { } // Convert from a complex metric - ComplexMetric complexMetric = druidQuery.druidTable.resolveComplexMetric(fieldName, aggCall); + ComplexMetric complexMetric = + fieldName == null ? null + : druidQuery.druidTable.resolveComplexMetric(fieldName, aggCall); switch (aggCall.getAggregation().getKind()) { case COUNT: @@ -1443,7 +1455,7 @@ public String toQuery() { if (complexMetric == null) { aggregation = new JsonCardinalityAggregation("cardinality", name, - ImmutableList.of(fieldName)); + ImmutableList.of(requireNonNull(fieldName, "fieldName"))); } else { aggregation = new JsonAggregation(complexMetric.getMetricType(), name, @@ -1464,7 +1476,8 @@ public String toQuery() { matchNulls = DruidJsonFilter.getSelectorFilter(fieldName, null, null); } aggregation = - new JsonFilteredAggregation(DruidJsonFilter.toNotDruidFilter(matchNulls), + new JsonFilteredAggregation( + requireNonNull(DruidJsonFilter.toNotDruidFilter(matchNulls)), new JsonAggregation("count", name, fieldName, aggExpression)); } else if (!aggCall.isDistinct()) { aggregation = new JsonAggregation("count", name, fieldName, aggExpression); @@ -1555,7 +1568,7 @@ protected static void writeObject(JsonGenerator generator, Object o) /** Generates a JSON string to query metadata about a data source. */ static String metadataQuery(String dataSourceName, - List intervals) { + @Nullable List intervals) { final StringWriter sw = new StringWriter(); final JsonFactory factory = new JsonFactory(); try { @@ -1594,7 +1607,7 @@ public static class QuerySpec { return Objects.hash(queryType, queryString, fieldNames); } - @Override public boolean equals(Object obj) { + @Override public boolean equals(@Nullable Object obj) { return obj == this || obj instanceof QuerySpec && queryType == ((QuerySpec) obj).queryType @@ -1634,7 +1647,7 @@ private static class DruidQueryNode implements Node { } @Override public void run() { - final List fieldTypes = new ArrayList<>(); + final List fieldTypes = new ArrayList<>(); for (RelDataTypeField field : query.getRowType().getFieldList()) { fieldTypes.add(getPrimitive(field)); } @@ -1658,7 +1671,7 @@ private static boolean containsLimit(QuerySpec querySpec) { + DRUID_QUERY_FETCH + "\":true"); } - private static ColumnMetaData.Rep getPrimitive(RelDataTypeField field) { + private static ColumnMetaData.@Nullable Rep getPrimitive(RelDataTypeField field) { switch (field.getType().getSqlTypeName()) { case TIMESTAMP_WITH_LOCAL_TIME_ZONE: case TIMESTAMP: diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java index ff64d44ed2c1..05407be1c771 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java @@ -57,9 +57,9 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; import org.joda.time.Interval; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import java.util.ArrayList; @@ -409,13 +409,9 @@ protected DruidProjectRule(DruidProjectRuleConfig config) { cluster.getTypeFactory().builder(); final RelNode input = Util.last(query.rels); for (RexNode e : below) { - final String name; - if (e instanceof RexInputRef) { - name = input.getRowType().getFieldNames().get(((RexInputRef) e).getIndex()); - } else { - name = null; - } - builder.add(name, e.getType()); + // splitProjects puts nothing but input references below + final RexInputRef ref = (RexInputRef) e; + builder.add(input.getRowType().getFieldNames().get(ref.getIndex()), e.getType()); } final RelNode newProject = project.copy(project.getTraitSet(), input, below, builder.build()); @@ -668,7 +664,6 @@ private static Set getUniqueFilterRefs(List calls) { private static DruidQuery optimizeFilteredAggregations(RelOptRuleCall call, DruidQuery query, Project project, Aggregate aggregate) { - Filter filter = null; final RexBuilder builder = query.getCluster().getRexBuilder(); final RexExecutor executor = Util.first(query.getCluster().getPlanner().getExecutor(), @@ -679,12 +674,11 @@ private static DruidQuery optimizeFilteredAggregations(RelOptRuleCall call, final RexSimplify simplify = new RexSimplify(builder, predicates, executor); - // if the druid query originally contained a filter - boolean containsFilter = false; + // the filter the druid query originally contained, if it contained one + Filter oldFilter = null; for (RelNode node : query.rels) { if (node instanceof Filter) { - filter = (Filter) node; - containsFilter = true; + oldFilter = (Filter) node; break; } } @@ -720,9 +714,10 @@ private static DruidQuery optimizeFilteredAggregations(RelOptRuleCall call, aggregate.copy(aggregate.getTraitSet(), aggregate.getInput(), aggregate.getGroupSet(), aggregate.getGroupSets(), newCalls); - if (containsFilter) { + if (oldFilter != null) { // AND the current filterNode with the filter node inside filter - filterNode = builder.makeCall(SqlStdOperatorTable.AND, filterNode, filter.getCondition()); + filterNode = + builder.makeCall(SqlStdOperatorTable.AND, filterNode, oldFilter.getCondition()); } // Simplify the filter as much as possible @@ -741,19 +736,20 @@ private static DruidQuery optimizeFilteredAggregations(RelOptRuleCall call, filterNode = tempFilterNode; } - filter = LogicalFilter.create(scan, filterNode); + final Filter filter = LogicalFilter.create(scan, filterNode); boolean addNewFilter = !filter.getCondition().isAlwaysTrue() && allHaveFilters; // Assumes that Filter nodes are always right after // TableScan nodes (which are always present) - int startIndex = containsFilter && addNewFilter ? 2 : 1; + int startIndex = oldFilter != null && addNewFilter ? 2 : 1; List newNodes = constructNewNodes(query.rels, addNewFilter, startIndex, filter, project, aggregate); return DruidQuery.create(query.getCluster(), - aggregate.getTraitSet().replace(query.getConvention()), + aggregate.getTraitSet() + .replace(requireNonNull(query.getConvention(), "convention")), query.getTable(), query.druidTable, newNodes); } diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidSchema.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidSchema.java index 4174aff76ddb..a555f321667d 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidSchema.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidSchema.java @@ -26,7 +26,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.HashMap; import java.util.LinkedHashMap; diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidSqlCastConverter.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidSqlCastConverter.java index d33fff097727..fad069837b2e 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidSqlCastConverter.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidSqlCastConverter.java @@ -26,8 +26,8 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; import org.joda.time.Period; +import org.jspecify.annotations.Nullable; import java.util.TimeZone; @@ -53,7 +53,7 @@ public class DruidSqlCastConverter implements DruidSqlOperatorConverter { } final SqlTypeName fromType = operand.getType().getSqlTypeName(); - String fromTypeString = dateTimeFormatString(fromType); + @Nullable String fromTypeString = dateTimeFormatString(fromType); final SqlTypeName toType = rexNode.getType().getSqlTypeName(); final String timeZoneConf = druidQuery.getConnectionConfig().timeZone(); final TimeZone timeZone = TimeZone.getTimeZone(timeZoneConf); @@ -136,7 +136,7 @@ public class DruidSqlCastConverter implements DruidSqlOperatorConverter { private static String castCharToDateTime( TimeZone timeZone, String operand, - final SqlTypeName toType, String format) { + final SqlTypeName toType, @Nullable String format) { // Cast strings to date times by parsing them from SQL format. final String timestampExpression = DruidExpressions.functionCall("timestamp_parse", diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidSqlOperatorConverter.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidSqlOperatorConverter.java index f84a2ad63184..ac335bf85e23 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidSqlOperatorConverter.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidSqlOperatorConverter.java @@ -20,7 +20,7 @@ import org.apache.calcite.rex.RexNode; import org.apache.calcite.sql.SqlOperator; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Defines how to convert a {@link RexNode} with a given Calcite SQL operator to diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidTable.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidTable.java index 349e1132821a..d6183adc63ba 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidTable.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidTable.java @@ -41,10 +41,10 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import org.checkerframework.checker.nullness.qual.Nullable; import org.joda.time.DateTime; import org.joda.time.Interval; import org.joda.time.chrono.ISOChronology; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -122,11 +122,9 @@ public DruidTable(DruidSchema schema, String dataSource, * @return A table */ static Table create(DruidSchema druidSchema, String dataSourceName, - List intervals, Map fieldMap, + @Nullable List intervals, Map fieldMap, Set metricNameSet, String timestampColumnName, DruidConnectionImpl connection, Map> complexMetrics) { - requireNonNull(connection, "connection"); - connection.metadata(dataSourceName, timestampColumnName, intervals, fieldMap, metricNameSet, complexMetrics); @@ -202,10 +200,11 @@ && isCountDistinct(call)) && isValidParentKind(parent); } - private static boolean isValidParentKind(SqlNode node) { - return node.getKind() == SqlKind.SELECT + private static boolean isValidParentKind(@Nullable SqlNode node) { + return node != null + && (node.getKind() == SqlKind.SELECT || node.getKind() == SqlKind.FILTER - || isSupportedPostAggOperation(node.getKind()); + || isSupportedPostAggOperation(node.getKind())); } private static boolean isCountDistinct(SqlCall call) { @@ -239,7 +238,8 @@ public boolean isComplexMetric(String alias) { } @Override public RelDataType getRowType(RelDataTypeFactory typeFactory) { - final RelDataType rowType = protoRowType.apply(typeFactory); + final RelDataType rowType = + requireNonNull(protoRowType, "protoRowType").apply(typeFactory); final List fieldNames = rowType.getFieldNames(); checkArgument(fieldNames.contains(timestampFieldName)); checkArgument(fieldNames.containsAll(metricFieldNames)); diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidTableFactory.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidTableFactory.java index 20acc9a9eb27..b60b607cca87 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidTableFactory.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidTableFactory.java @@ -25,9 +25,9 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; import org.joda.time.Interval; import org.joda.time.chrono.ISOChronology; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.HashMap; @@ -53,7 +53,8 @@ private DruidTableFactory() {} // name that is also the same name as a complex metric @Override public Table create(SchemaPlus schema, String name, Map operand, @Nullable RelDataType rowType) { - final DruidSchema druidSchema = schema.unwrap(DruidSchema.class); + final DruidSchema druidSchema = + requireNonNull(schema.unwrap(DruidSchema.class), "druidSchema"); // If "dataSource" operand is present it overrides the table name. final String dataSource = (String) operand.get("dataSource"); final Set metricNameBuilder = new LinkedHashSet<>(); @@ -121,7 +122,7 @@ private DruidTableFactory() {} } metricName = (String) map2.get("name"); - final String type = (String) map2.get("type"); + final String type = requireNonNull((String) map2.get("type"), "type"); fieldName = (String) map2.get("fieldName"); druidType = DruidType.getTypeFromMetric(type); @@ -148,7 +149,7 @@ private DruidTableFactory() {} } } final Object interval = operand.get("interval"); - final List intervals; + final @Nullable List intervals; if (interval instanceof String) { intervals = ImmutableList.of( diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidType.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidType.java index b9b5737396a3..d7f35e73998b 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidType.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidType.java @@ -45,7 +45,6 @@ public boolean isComplex() { /** Returns a DruidType matching the given String type from a Druid metric. */ static DruidType getTypeFromMetric(String type) { - requireNonNull(type, "type"); if (type.equals("hyperUnique")) { return HYPER_UNIQUE; } else if (type.equals("thetaSketch")) { diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/ExtractOperatorConversion.java b/druid/src/main/java/org/apache/calcite/adapter/druid/ExtractOperatorConversion.java index 77fd833e5f48..777ff3a6e5a0 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/ExtractOperatorConversion.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/ExtractOperatorConversion.java @@ -28,7 +28,7 @@ import com.google.common.collect.ImmutableMap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Map; import java.util.TimeZone; diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/ExtractionDimensionSpec.java b/druid/src/main/java/org/apache/calcite/adapter/druid/ExtractionDimensionSpec.java index 8284eafb74a8..b5f5cb08e5c5 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/ExtractionDimensionSpec.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/ExtractionDimensionSpec.java @@ -18,7 +18,7 @@ import com.fasterxml.jackson.core.JsonGenerator; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.IOException; diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/FloorOperatorConversion.java b/druid/src/main/java/org/apache/calcite/adapter/druid/FloorOperatorConversion.java index 89240d61a64e..ba77be893422 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/FloorOperatorConversion.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/FloorOperatorConversion.java @@ -24,7 +24,7 @@ import org.apache.calcite.sql.fun.SqlStdOperatorTable; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.TimeZone; diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/NaryOperatorConverter.java b/druid/src/main/java/org/apache/calcite/adapter/druid/NaryOperatorConverter.java index 4de4067a31a6..405d9e93aa64 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/NaryOperatorConverter.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/NaryOperatorConverter.java @@ -21,7 +21,7 @@ import org.apache.calcite.rex.RexNode; import org.apache.calcite.sql.SqlOperator; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/SubstringOperatorConversion.java b/druid/src/main/java/org/apache/calcite/adapter/druid/SubstringOperatorConversion.java index 1675bddd79ba..81587fe269bb 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/SubstringOperatorConversion.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/SubstringOperatorConversion.java @@ -24,7 +24,7 @@ import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.fun.SqlStdOperatorTable; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Converts Calcite SUBSTRING call to Druid Expression when possible. diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/TimeExtractionFunction.java b/druid/src/main/java/org/apache/calcite/adapter/druid/TimeExtractionFunction.java index 5bb861948033..d4e3772071dd 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/TimeExtractionFunction.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/TimeExtractionFunction.java @@ -28,7 +28,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 java.io.IOException; import java.util.Locale; @@ -68,12 +68,12 @@ public class TimeExtractionFunction implements ExtractionFunction { TimeUnitRange.SECOND); private final String format; - private final Granularity granularity; + private final @Nullable Granularity granularity; private final String timeZone; - private final String local; + private final @Nullable String local; - public TimeExtractionFunction(String format, Granularity granularity, String timeZone, - String local) { + public TimeExtractionFunction(String format, @Nullable Granularity granularity, String timeZone, + @Nullable String local) { this.format = format; this.granularity = granularity; this.timeZone = timeZone; @@ -93,7 +93,7 @@ public TimeExtractionFunction(String format, Granularity granularity, String tim public String getFormat() { return format; } - public Granularity getGranularity() { + public @Nullable Granularity getGranularity() { return granularity; } @@ -202,7 +202,7 @@ public static boolean isValidTimeFloor(RexNode rexNode) { final RexCall rexCall = (RexCall) rexNode; final String castFormat = DruidSqlCastConverter .dateTimeFormatString(rexCall.getType().getSqlTypeName()); - final String timeZoneId = timeZone == null ? null : timeZone.getID(); + final String timeZoneId = timeZone.getID(); if (castFormat == null) { // unknown format return null; diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/UnaryPrefixOperatorConversion.java b/druid/src/main/java/org/apache/calcite/adapter/druid/UnaryPrefixOperatorConversion.java index 2f37eefe6671..a7c76ee5710d 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/UnaryPrefixOperatorConversion.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/UnaryPrefixOperatorConversion.java @@ -23,7 +23,7 @@ import com.google.common.collect.Iterables; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/UnarySuffixOperatorConversion.java b/druid/src/main/java/org/apache/calcite/adapter/druid/UnarySuffixOperatorConversion.java index 3d555eb6d097..4a5e0bc9de50 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/UnarySuffixOperatorConversion.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/UnarySuffixOperatorConversion.java @@ -23,7 +23,7 @@ import com.google.common.collect.Iterables; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/VirtualColumn.java b/druid/src/main/java/org/apache/calcite/adapter/druid/VirtualColumn.java index 44ce00aecf12..8f4b8e6d40cf 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/VirtualColumn.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/VirtualColumn.java @@ -18,6 +18,8 @@ import com.fasterxml.jackson.core.JsonGenerator; +import org.jspecify.annotations.Nullable; + import java.io.IOException; import java.util.Locale; @@ -36,9 +38,9 @@ public class VirtualColumn implements DruidJson { private final DruidType outputType; - public VirtualColumn(String name, String expression, DruidType outputType) { - this.name = requireNonNull(name, "name"); - this.expression = requireNonNull(expression, "expression"); + public VirtualColumn(String name, String expression, @Nullable DruidType outputType) { + this.name = name; + this.expression = expression; this.outputType = outputType == null ? DruidType.FLOAT : outputType; } @@ -67,11 +69,11 @@ public DruidType getOutputType() { * Virtual Column builder. */ public static class Builder { - private String name; + private @Nullable String name; - private String expression; + private @Nullable String expression; - private DruidType type; + private @Nullable DruidType type; public Builder withName(String name) { this.name = name; @@ -83,13 +85,14 @@ public Builder withExpression(String expression) { return this; } - public Builder withType(DruidType type) { + public Builder withType(@Nullable DruidType type) { this.type = type; return this; } public VirtualColumn build() { - return new VirtualColumn(name, expression, type); + return new VirtualColumn(requireNonNull(name, "name"), + requireNonNull(expression, "expression"), type); } } diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/package-info.java b/druid/src/main/java/org/apache/calcite/adapter/druid/package-info.java index 3cdc5b256e4b..5802b194bc7f 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/package-info.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/package-info.java @@ -18,4 +18,7 @@ /** * Query provider based on a Druid database. */ +@NullMarked package org.apache.calcite.adapter.druid; + +import org.jspecify.annotations.NullMarked; diff --git a/elasticsearch/build.gradle.kts b/elasticsearch/build.gradle.kts index 0ce6db032d23..5a544c2d57dd 100644 --- a/elasticsearch/build.gradle.kts +++ b/elasticsearch/build.gradle.kts @@ -33,7 +33,7 @@ dependencies { implementation("org.apache.httpcomponents:httpasyncclient") implementation("org.apache.httpcomponents:httpclient") implementation("org.apache.httpcomponents:httpcore") - implementation("org.checkerframework:checker-qual") + implementation("org.jspecify:jspecify") testImplementation("org.apache.logging.log4j:log4j-api") testImplementation("org.apache.logging.log4j:log4j-core") diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchAggregate.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchAggregate.java index 7d8ab37fe5f9..1c72946558de 100644 --- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchAggregate.java +++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchAggregate.java @@ -35,7 +35,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; 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.EnumSet; @@ -61,7 +61,7 @@ public class ElasticsearchAggregate extends Aggregate implements ElasticsearchRe RelTraitSet traitSet, RelNode input, ImmutableBitSet groupSet, - List groupSets, + @Nullable List groupSets, List aggCalls) throws InvalidRelException { super(cluster, traitSet, ImmutableList.of(), input, groupSet, groupSets, aggCalls); @@ -107,14 +107,14 @@ public class ElasticsearchAggregate extends Aggregate implements ElasticsearchRe RelNode input, boolean indicator, ImmutableBitSet groupSet, - List groupSets, + @Nullable List groupSets, List aggCalls) throws InvalidRelException { this(cluster, traitSet, input, groupSet, groupSets, aggCalls); checkIndicator(indicator); } @Override public Aggregate copy(RelTraitSet traitSet, RelNode input, - ImmutableBitSet groupSet, List groupSets, + ImmutableBitSet groupSet, @Nullable List groupSets, List aggCalls) { try { return new ElasticsearchAggregate(getCluster(), traitSet, input, @@ -155,7 +155,8 @@ public class ElasticsearchAggregate extends Aggregate implements ElasticsearchRe field.put("size", 1); } - implementor.addAggregation(aggCall.getName(), aggregation.toString()); + implementor.addAggregation( + requireNonNull(aggCall.getName(), "aggCall name"), aggregation.toString()); } } diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchEnumerators.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchEnumerators.java index 4adad00a6710..a258d8a4e75f 100644 --- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchEnumerators.java +++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchEnumerators.java @@ -20,6 +20,8 @@ import org.apache.calcite.linq4j.function.Function1; import org.apache.calcite.linq4j.tree.Primitive; +import org.jspecify.annotations.Nullable; + import java.util.Date; import java.util.List; import java.util.Map; @@ -40,7 +42,7 @@ private static Function1 mapGetter() { return ElasticsearchJson.SearchHit::sourceOrFields; } - private static Function1 singletonGetter( + private static Function1 singletonGetter( final String fieldName, final Class fieldClass, final Map mapping) { @@ -52,7 +54,7 @@ private static Function1 singletonGetter( key = mapping.getOrDefault(fieldName, fieldName); } - final Object value; + final @Nullable Object value; if (ElasticsearchConstants.ID.equals(key) || ElasticsearchConstants.ID.equals(mapping.getOrDefault(fieldName, fieldName))) { // is the original projection on _id field? @@ -72,10 +74,10 @@ private static Function1 singletonGetter( * * @return function that converts the search result into a generic array */ - private static Function1 listGetter( + private static Function1 listGetter( final List> fields, Map mapping) { return hit -> { - Object[] objects = new Object[fields.size()]; + final @Nullable Object[] objects = new Object[fields.size()]; for (int i = 0; i < fields.size(); i++) { final Map.Entry field = fields.get(i); final String key; @@ -85,7 +87,7 @@ private static Function1 listGetter( key = mapping.getOrDefault(field.getKey(), field.getKey()); } - final Object value; + final @Nullable Object value; if (ElasticsearchConstants.ID.equals(key) || ElasticsearchConstants.ID.equals(mapping.get(field.getKey())) || ElasticsearchConstants.ID.equals(field.getKey())) { @@ -102,7 +104,7 @@ private static Function1 listGetter( }; } - static Function1 getter( + static Function1 getter( List> fields, Map mapping) { requireNonNull(fields, "fields"); //noinspection unchecked @@ -120,13 +122,13 @@ static Function1 getter( } @SuppressWarnings("JavaUtilDate") - private static Object convert(Object o, Class clazz) { - if (o == null) { + private static @Nullable Object convert(@Nullable Object o, @Nullable Class clazz) { + if (o == null || clazz == null) { return null; } Primitive primitive = Primitive.of(clazz); if (primitive != null) { - clazz = primitive.boxClass; + clazz = requireNonNull(primitive.boxClass, "boxClass"); } else { primitive = Primitive.ofBox(clazz); } diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchFilter.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchFilter.java index 4383d6017c0e..0fa2dd721838 100644 --- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchFilter.java +++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchFilter.java @@ -30,7 +30,7 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.ObjectMapper; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.IOException; import java.io.StringWriter; @@ -99,9 +99,13 @@ String translateMatch(RexNode condition) throws IOException, } } if (disMax) { - QueryBuilders.disMaxQueryBuilder(PredicateAnalyzer.analyze(condition)).writeJson(generator); + QueryBuilders.disMaxQueryBuilder( + requireNonNull(PredicateAnalyzer.analyze(condition), "query")) + .writeJson(generator); } else { - QueryBuilders.constantScoreQuery(PredicateAnalyzer.analyze(condition)).writeJson(generator); + QueryBuilders.constantScoreQuery( + requireNonNull(PredicateAnalyzer.analyze(condition), "query")) + .writeJson(generator); } generator.flush(); generator.close(); diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchJson.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchJson.java index de0d36b98c8f..68c61bc15e78 100644 --- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchJson.java +++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchJson.java @@ -30,7 +30,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.collect.ImmutableSet; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.IOException; import java.time.Duration; @@ -49,7 +49,6 @@ import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Predicate; -import java.util.stream.StreamSupport; import static java.util.Collections.unmodifiableMap; import static java.util.Objects.requireNonNull; @@ -69,7 +68,7 @@ private ElasticsearchJson() {} * Visits leaves of the aggregation where all values are stored. */ static void visitValueNodes(Aggregations aggregations, - Consumer> consumer) { + Consumer> consumer) { requireNonNull(aggregations, "aggregations"); requireNonNull(consumer, "consumer"); @@ -81,12 +80,12 @@ static void visitValueNodes(Aggregations aggregations, rows.forEach((k, v) -> { if (v.stream().allMatch(val -> val instanceof GroupValue)) { v.forEach(tuple -> { - Map groupRow = new LinkedHashMap<>(k.keys); + Map groupRow = new LinkedHashMap<>(k.keys); groupRow.put(tuple.getName(), tuple.value()); consumer.accept(groupRow); }); } else { - Map row = new LinkedHashMap<>(k.keys); + Map row = new LinkedHashMap<>(k.keys); v.forEach(val -> row.put(val.getName(), val.value())); consumer.accept(row); } @@ -172,10 +171,10 @@ private static void visitMappingProperties(Deque path, * Identifies a Calcite row (as in relational algebra). */ private static class RowKey { - private final Map keys; + private final Map keys; private final int hashCode; - private RowKey(final Map keys) { + private RowKey(final Map keys) { this.keys = requireNonNull(keys, "keys"); this.hashCode = Objects.hashCode(keys); } @@ -184,14 +183,13 @@ private RowKey(List buckets) { this(toMap(buckets)); } - private static Map toMap(Iterable buckets) { - return StreamSupport.stream(buckets.spliterator(), false) - .collect(LinkedHashMap::new, - (m, v) -> m.put(v.getName(), v.key()), - LinkedHashMap::putAll); + private static Map toMap(Iterable buckets) { + final Map map = new LinkedHashMap<>(); + buckets.forEach(b -> map.put(b.getName(), b.key())); + return map; } - @Override public boolean equals(final Object o) { + @Override public boolean equals(final @Nullable Object o) { if (this == o) { return true; } @@ -368,13 +366,13 @@ static class SearchHit { * ID of the document (not available in aggregations). */ private final String id; - private final Map source; - private final Map fields; + private final @Nullable Map source; + private final @Nullable Map fields; @JsonCreator SearchHit(@JsonProperty(ElasticsearchConstants.ID) final String id, - @JsonProperty("_source") final Map source, - @JsonProperty("fields") final Map fields) { + @JsonProperty("_source") final @Nullable Map source, + @JsonProperty("fields") final @Nullable Map fields) { this.id = requireNonNull(id, "id"); // both can't be null @@ -406,7 +404,7 @@ public String id() { return id; } - Object valueOrNull(String name) { + @Nullable Object valueOrNull(String name) { requireNonNull(name, "name"); // for "select *" return whole document @@ -462,16 +460,16 @@ Object valueOrNull(String name) { return null; } - Map source() { + @Nullable Map source() { return source; } - Map fields() { + @Nullable Map fields() { return fields; } Map sourceOrFields() { - return source != null ? source : fields; + return source != null ? source : requireNonNull(fields, "fields"); } } @@ -483,7 +481,7 @@ Map sourceOrFields() { static class Aggregations implements Iterable { private final List aggregations; - private Map aggregationsAsMap; + private @Nullable Map aggregationsAsMap; Aggregations(List aggregations) { this.aggregations = requireNonNull(aggregations, "aggregations"); @@ -521,11 +519,11 @@ final Map asMap() { * Returns the aggregation that is associated with the specified name. */ @SuppressWarnings("unchecked") - public final A get(String name) { + public final @Nullable A get(String name) { return (A) asMap().get(name); } - @Override public final boolean equals(Object obj) { + @Override public final boolean equals(@Nullable Object obj) { if (obj == null || getClass() != obj.getClass()) { return false; } @@ -589,11 +587,11 @@ List buckets() { * by a key, and can potentially hold sub-aggregations computed over all documents in it. */ static class Bucket implements HasAggregations, Aggregation { - private final Object key; + private final @Nullable Object key; private final String name; private final Aggregations aggregations; - Bucket(final Object key, + Bucket(final @Nullable Object key, final String name, final Aggregations aggregations) { this.key = key; // key can be set after construction @@ -604,7 +602,7 @@ static class Bucket implements HasAggregations, Aggregation { /** * Returns the key associated with the bucket. */ - Object key() { + @Nullable Object key() { return key; } @@ -640,9 +638,9 @@ boolean hasNoAggregations() { */ static class MultiValue implements Aggregation { private final String name; - private final Map values; + private final Map values; - MultiValue(final String name, final Map values) { + MultiValue(final String name, final Map values) { this.name = requireNonNull(name, "name"); this.values = requireNonNull(values, "values"); } @@ -651,7 +649,7 @@ static class MultiValue implements Aggregation { return name; } - Map values() { + Map values() { return values; } @@ -678,15 +676,16 @@ Object value() { * In order that rows which have the same key can be put into result map. */ static class GroupValue extends MultiValue { - GroupValue(String name, Map values) { + GroupValue(String name, Map values) { super(name, values); } /** * Constructs a {@link GroupValue} instance with a single value. */ - static GroupValue of(String name, Object value) { - return new GroupValue(name, Collections.singletonMap("value", value)); + static GroupValue of(String name, @Nullable Object value) { + return new GroupValue(name, + Collections.singletonMap("value", value)); } } @@ -779,7 +778,7 @@ private static Bucket parseBucket(JsonParser parser, String name, ObjectNode nod } final JsonNode keyNode = node.get("key"); - final Object key; + final @Nullable Object key; if (isMissingBucket(keyNode) || keyNode.isNull()) { key = null; } else if (keyNode.isTextual()) { diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchMapping.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchMapping.java index 3bcac313055b..d5c3c3eca312 100644 --- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchMapping.java +++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchMapping.java @@ -20,7 +20,7 @@ import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.google.common.collect.ImmutableMap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.time.LocalDate; import java.time.ZoneOffset; @@ -112,7 +112,7 @@ static class Datatype { .collect(Collectors.toSet()); private final String name; - private final JsonNode missingValue; + private final @Nullable JsonNode missingValue; private Datatype(final String name) { this.name = requireNonNull(name, "name"); diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchProject.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchProject.java index 640b225434e6..093d0f1fdba3 100644 --- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchProject.java +++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchProject.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.ArrayList; import java.util.List; diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchRel.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchRel.java index 8cc4f524975b..6b12c03d1ba4 100644 --- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchRel.java +++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchRel.java @@ -23,6 +23,8 @@ import org.apache.calcite.sql.fun.SqlStdOperatorTable; import org.apache.calcite.util.Pair; +import org.jspecify.annotations.Nullable; + import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; @@ -91,16 +93,21 @@ class Implementor { * * @see From/Size */ - Long offset; + @Nullable Long offset; /** * Number of records to return. Equivalent to {@code size} in ES query. * * @see From/Size */ - Long fetch; + @Nullable Long fetch; + /** Set by {@code ElasticsearchTableScan.implement} before anything reads it. */ + @SuppressWarnings("NullAway.Init") RelOptTable table; + + /** Set by {@code ElasticsearchTableScan.implement} before anything reads it. */ + @SuppressWarnings("NullAway.Init") ElasticsearchTable elasticsearchTable; void add(String findOp) { diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchRules.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchRules.java index 3c44992b0a48..90dea1a52924 100644 --- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchRules.java +++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchRules.java @@ -44,7 +44,7 @@ import org.apache.calcite.sql.type.SqlTypeName; import org.apache.calcite.sql.validate.SqlValidatorUtil; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.AbstractList; import java.util.List; diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchSchema.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchSchema.java index ec41851c430a..5b22f4f44b91 100644 --- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchSchema.java +++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchSchema.java @@ -25,10 +25,10 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Sets; -import org.checkerframework.checker.nullness.qual.Nullable; import org.elasticsearch.client.Request; import org.elasticsearch.client.Response; import org.elasticsearch.client.RestClient; +import org.jspecify.annotations.Nullable; import java.io.IOException; import java.io.InputStream; diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchSchemaFactory.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchSchemaFactory.java index 84030378b8d6..f1154340e822 100644 --- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchSchemaFactory.java +++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchSchemaFactory.java @@ -39,6 +39,7 @@ import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -92,7 +93,7 @@ public class ElasticsearchSchemaFactory implements SchemaFactory { try { // Free resources allocated by this RestClient - notice.getValue().close(); + requireNonNull(notice.getValue(), "client").close(); } catch (IOException ex) { LOGGER.warn("Could not close RestClient {}", notice.getValue(), ex); } @@ -205,8 +206,10 @@ protected static List getSortedHost(List hosts) { * @return new or cached low-level rest http client for ES */ @SuppressWarnings({"java:S4830", "java:S5527"}) - private static RestClient connect(List hosts, String pathPrefix, - String username, String password, + private static RestClient connect(List hosts, + @Nullable String pathPrefix, + @Nullable String username, + @Nullable String password, boolean disableSSLVerification) { requireNonNull(hosts, "hosts or coordinates"); diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchSearchResult.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchSearchResult.java index 6611ba94f401..cae63898bf59 100644 --- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchSearchResult.java +++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchSearchResult.java @@ -20,6 +20,8 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import org.jspecify.annotations.Nullable; + import java.time.Duration; import java.util.Iterator; import java.util.List; @@ -135,7 +137,7 @@ public String id() { * @param name attribute name * @return value from result (_source or fields) */ - Object value(String name) { + @Nullable Object value(String name) { requireNonNull(name, "name"); if (!sourceOrFields().containsKey(name)) { diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchSort.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchSort.java index e7af28627978..44db02061f23 100644 --- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchSort.java +++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchSort.java @@ -29,7 +29,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/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchTable.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchTable.java index 29ad974fd572..c64bf1011111 100644 --- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchTable.java +++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchTable.java @@ -40,6 +40,8 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.collect.ImmutableMap; +import org.jspecify.annotations.Nullable; + import java.io.IOException; import java.io.UncheckedIOException; import java.util.ArrayList; @@ -108,7 +110,7 @@ String scriptedFieldPrefix() { * @param aggregations aggregation functions * @return Enumerator of results */ - private Enumerable find(List ops, + private Enumerable<@Nullable Object> find(List ops, List> fields, List> sort, List> nullsSort, @@ -149,7 +151,7 @@ private Enumerable find(List ops, query.put("size", fetch); } - final Function1 getter = + final Function1 getter = ElasticsearchEnumerators.getter(fields, ImmutableMap.copyOf(mappings)); Iterable iter; @@ -164,7 +166,7 @@ private Enumerable find(List ops, return Linq4j.asEnumerable(iter).select(getter); } - private Enumerable aggregate(List ops, + private Enumerable<@Nullable Object> aggregate(List ops, List> fields, List> sort, List groupBy, @@ -305,7 +307,7 @@ private Enumerable aggregate(List ops, } } - final Function1 getter = + final Function1 getter = ElasticsearchEnumerators.getter(fields, ImmutableMap.copyOf(mapping)); ElasticsearchJson.SearchHits hits = @@ -369,7 +371,7 @@ private ElasticsearchTable getTable() { * @return result as enumerable */ @SuppressWarnings("UnusedDeclaration") - public Enumerable find(List ops, + public Enumerable<@Nullable Object> find(List ops, List> fields, List> sort, List> nullsSort, diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchTableScan.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchTableScan.java index 43e1aff0f0b7..f2e7ce34702d 100644 --- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchTableScan.java +++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchTableScan.java @@ -30,7 +30,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/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchToEnumerableConverter.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchToEnumerableConverter.java index a2c2f5b6cedc..9a808256d1c3 100644 --- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchToEnumerableConverter.java +++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchToEnumerableConverter.java @@ -37,7 +37,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.util.AbstractList; import java.util.List; diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/MapProjectionFieldVisitor.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/MapProjectionFieldVisitor.java index 455bb3c8cabb..3db21db886a0 100644 --- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/MapProjectionFieldVisitor.java +++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/MapProjectionFieldVisitor.java @@ -21,10 +21,12 @@ import org.apache.calcite.rex.RexVisitorImpl; import org.apache.calcite.sql.fun.SqlStdOperatorTable; +import org.jspecify.annotations.Nullable; + /** * Visitor that extracts the actual field name from an item expression. */ -class MapProjectionFieldVisitor extends RexVisitorImpl { +class MapProjectionFieldVisitor extends RexVisitorImpl<@Nullable String> { static final MapProjectionFieldVisitor INSTANCE = new MapProjectionFieldVisitor(); @@ -32,7 +34,7 @@ private MapProjectionFieldVisitor() { super(true); } - @Override public String visitCall(RexCall call) { + @Override public @Nullable String visitCall(RexCall call) { if (call.op == SqlStdOperatorTable.ITEM) { return ((RexLiteral) call.getOperands().get(1)).getValueAs(String.class); } diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/PredicateAnalyzer.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/PredicateAnalyzer.java index de51a90013e1..a641c8e02ee0 100644 --- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/PredicateAnalyzer.java +++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/PredicateAnalyzer.java @@ -36,6 +36,8 @@ import com.google.common.collect.BoundType; import com.google.common.collect.Range; +import org.jspecify.annotations.Nullable; + import java.util.ArrayList; import java.util.GregorianCalendar; import java.util.LinkedHashMap; @@ -107,11 +109,12 @@ private PredicateAnalyzer() {} * @return search query which can be used to query ES cluster * @throws ExpressionNotAnalyzableException when expression can't processed by this analyzer */ - static QueryBuilder analyze(RexNode expression) throws ExpressionNotAnalyzableException { + static @Nullable QueryBuilder analyze(RexNode expression) + throws ExpressionNotAnalyzableException { requireNonNull(expression, "expression"); try { // visits expression tree - QueryExpression e = (QueryExpression) expression.accept(new Visitor()); + @Nullable QueryExpression e = (QueryExpression) expression.accept(new Visitor()); if (e != null && e.isPartial()) { throw new UnsupportedOperationException("Can't handle partial QueryExpression: " + e); @@ -383,7 +386,8 @@ private QueryExpression binary(RexCall call) { case LIKE: if (call.getOperands().size() == 3) { final Expression e = call.getOperands().get(2).accept(this); - LiteralExpression escape = expressAsLiteral(e); + LiteralExpression escape = + requireNonNull(expressAsLiteral(e), "escape"); return QueryExpression.create(pair.getKey()).like(pair.getValue(), escape); } return QueryExpression.create(pair.getKey()).like(pair.getValue()); @@ -545,7 +549,7 @@ private static NamedFieldExpression toNamedField(RexLiteral literal) { /** * Try to convert a generic expression into a literal expression. */ - private static LiteralExpression expressAsLiteral(Expression exp) { + private static @Nullable LiteralExpression expressAsLiteral(Expression exp) { if (exp instanceof LiteralExpression) { return (LiteralExpression) exp; @@ -785,7 +789,7 @@ private CompoundQueryExpression(boolean partial, BoolQueryBuilder builder) { static class SimpleQueryExpression extends QueryExpression { private final NamedFieldExpression rel; - private QueryBuilder builder; + private @Nullable QueryBuilder builder; private String getFieldReference() { return rel.getReference(); @@ -843,7 +847,7 @@ private SimpleQueryExpression(NamedFieldExpression rel) { } @Override public QueryExpression equals(LiteralExpression literal) { - Object value = literal.value(); + @Nullable Object value = literal.value(); if (value instanceof GregorianCalendar) { builder = boolQuery() .must(addFormatIfNecessary(literal, rangeQuery(getFieldReference()).gte(value))) @@ -855,7 +859,7 @@ private SimpleQueryExpression(NamedFieldExpression rel) { } @Override public QueryExpression notEquals(LiteralExpression literal) { - Object value = literal.value(); + @Nullable Object value = literal.value(); if (value instanceof GregorianCalendar) { builder = boolQuery() .should(addFormatIfNecessary(literal, rangeQuery(getFieldReference()).gt(value))) @@ -870,7 +874,7 @@ private SimpleQueryExpression(NamedFieldExpression rel) { } @Override public QueryExpression gt(LiteralExpression literal) { - Object value = literal.value(); + Object value = requireNonNull(literal.value(), "value"); builder = addFormatIfNecessary(literal, rangeQuery(getFieldReference()).gt(value)); @@ -878,19 +882,19 @@ private SimpleQueryExpression(NamedFieldExpression rel) { } @Override public QueryExpression gte(LiteralExpression literal) { - Object value = literal.value(); + Object value = requireNonNull(literal.value(), "value"); builder = addFormatIfNecessary(literal, rangeQuery(getFieldReference()).gte(value)); return this; } @Override public QueryExpression lt(LiteralExpression literal) { - Object value = literal.value(); + Object value = requireNonNull(literal.value(), "value"); builder = addFormatIfNecessary(literal, rangeQuery(getFieldReference()).lt(value)); return this; } @Override public QueryExpression lte(LiteralExpression literal) { - Object value = literal.value(); + Object value = requireNonNull(literal.value(), "value"); builder = addFormatIfNecessary(literal, rangeQuery(getFieldReference()).lte(value)); return this; } @@ -905,13 +909,15 @@ private SimpleQueryExpression(NamedFieldExpression rel) { } @Override public QueryExpression in(LiteralExpression literal) { - Iterable iterable = (Iterable) literal.value(); + Iterable iterable = + (Iterable) requireNonNull(literal.value(), "value"); builder = termsQuery(getFieldReference(), iterable); return this; } @Override public QueryExpression notIn(LiteralExpression literal) { - Iterable iterable = (Iterable) literal.value(); + Iterable iterable = + (Iterable) requireNonNull(literal.value(), "value"); builder = boolQuery().mustNot(termsQuery(getFieldReference(), iterable)); return this; } @@ -1036,21 +1042,21 @@ static boolean isCastExpression(Expression exp) { */ static final class NamedFieldExpression implements TerminalExpression { - private final String name; + private final @Nullable String name; private NamedFieldExpression() { this.name = null; } - private NamedFieldExpression(RexInputRef schemaField) { + private NamedFieldExpression(@Nullable RexInputRef schemaField) { this.name = schemaField == null ? null : schemaField.getName(); } - private NamedFieldExpression(RexLiteral literal) { + private NamedFieldExpression(@Nullable RexLiteral literal) { this.name = literal == null ? null : RexLiteral.stringValue(literal); } - String getRootName() { + @Nullable String getRootName() { return name; } @@ -1059,7 +1065,7 @@ boolean isMetaField() { } String getReference() { - return getRootName(); + return requireNonNull(getRootName(), "name"); } } @@ -1074,7 +1080,7 @@ static final class LiteralExpression implements TerminalExpression { this.literal = literal; } - Object value() { + @Nullable Object value() { if (isSarg()) { return sargValue(); @@ -1085,7 +1091,7 @@ Object value() { } else if (isBoolean()) { return booleanValue(); } else if (isString()) { - return RexLiteral.stringValue(literal); + return stringValue(); } else { return rawValue(); } @@ -1112,11 +1118,11 @@ public boolean isSarg() { } long longValue() { - return ((Number) literal.getValue()).longValue(); + return ((Number) requireNonNull(literal.getValue(), "value")).longValue(); } double doubleValue() { - return ((Number) literal.getValue()).doubleValue(); + return ((Number) requireNonNull(literal.getValue(), "value")).doubleValue(); } boolean booleanValue() { @@ -1124,7 +1130,7 @@ boolean booleanValue() { } String stringValue() { - return RexLiteral.stringValue(literal); + return requireNonNull(RexLiteral.stringValue(literal), "stringValue"); } List sargValue() { @@ -1154,7 +1160,7 @@ Object sargPointValue(Object point, SqlTypeName sqlTypeName) { } } - Object rawValue() { + @Nullable Object rawValue() { return literal.getValue(); } } diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/QueryBuilders.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/QueryBuilders.java index 17d289499ba6..5c5f67ced8b0 100644 --- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/QueryBuilders.java +++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/QueryBuilders.java @@ -18,6 +18,8 @@ import com.fasterxml.jackson.core.JsonGenerator; +import org.jspecify.annotations.Nullable; + import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; @@ -118,7 +120,7 @@ static TermQueryBuilder termQuery(String name, boolean value) { * @param name The name of the field * @param value The value of the term */ - static TermQueryBuilder termQuery(String name, Object value) { + static TermQueryBuilder termQuery(String name, @Nullable Object value) { return new TermQueryBuilder(name, value); } @@ -138,7 +140,7 @@ static MatchesQueryBuilder matchesQuery(String name, Iterable values) { * @param name The name of the field * @param value The value of the term */ - static MatchQueryBuilder matchQuery(String name, Object value) { + static MatchQueryBuilder matchQuery(String name, @Nullable Object value) { return new MatchQueryBuilder(name, value); } @@ -309,9 +311,9 @@ private static void writeJsonArray(String field, List clauses, Jso */ static class TermQueryBuilder extends QueryBuilder { private final String fieldName; - private final Object value; + private final @Nullable Object value; - private TermQueryBuilder(final String fieldName, final Object value) { + private TermQueryBuilder(final String fieldName, final @Nullable Object value) { this.fieldName = requireNonNull(fieldName, "fieldName"); this.value = requireNonNull(value, "value"); } @@ -361,9 +363,9 @@ private TermsQueryBuilder(final String fieldName, final Iterable values) { */ static class MatchQueryBuilder extends QueryBuilder { private final String fieldName; - private final Object value; + private final @Nullable Object value; - private MatchQueryBuilder(final String fieldName, final Object value) { + private MatchQueryBuilder(final String fieldName, final @Nullable Object value) { this.fieldName = requireNonNull(fieldName, "fieldName"); this.value = requireNonNull(value, "value"); } @@ -415,7 +417,8 @@ private MatchesQueryBuilder(final String fieldName, final Iterable values) { * @param value JSON value to write * @throws IOException if can't write to output */ - private static void writeObject(JsonGenerator generator, Object value) throws IOException { + private static void writeObject(JsonGenerator generator, @Nullable Object value) + throws IOException { generator.writeObject(value); } @@ -425,12 +428,12 @@ private static void writeObject(JsonGenerator generator, Object value) throws IO static class RangeQueryBuilder extends QueryBuilder { private final String fieldName; - private Object lt; + private @Nullable Object lt; private boolean lte; - private Object gt; + private @Nullable Object gt; private boolean gte; - private String format; + private @Nullable String format; private RangeQueryBuilder(final String fieldName) { this.fieldName = requireNonNull(fieldName, "fieldName"); @@ -537,8 +540,8 @@ public static String replaceWildcard(String value, Map kv, Strin String current = value.substring(index, index + 1); if (index == 0) { if (!current.equals(escape)) { - current = kv.keySet().contains(current) ? kv.get(current) : current; - ret.add(current); + final String replacement = kv.get(current); + ret.add(replacement != null ? replacement : current); } else { escapeCount++; } @@ -560,12 +563,13 @@ public static String replaceWildcard(String value, Map kv, Strin } String last = value.substring(index - 1, index); - if (kv.keySet().contains(current)) { + final String replacement = kv.get(current); + if (replacement != null) { if (!last.equals(escape)) { - ret.add(kv.get(current)); + ret.add(replacement); } else { if (escapeCount % 2 == 0) { - ret.add(kv.get(current)); + ret.add(replacement); } else { ret.add(current); } diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/Scrolling.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/Scrolling.java index 64b1d34681df..d6c440d8da50 100644 --- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/Scrolling.java +++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/Scrolling.java @@ -20,6 +20,8 @@ import com.google.common.collect.AbstractSequentialIterator; import com.google.common.collect.Iterators; +import org.jspecify.annotations.Nullable; + import java.util.Collections; import java.util.Iterator; import java.util.function.Consumer; @@ -103,7 +105,7 @@ private static class AutoClosingIterator implements Iterator delegate, @@ -155,7 +157,7 @@ private SequentialIterator(final ElasticsearchJson.Result first, this.limit = limit; } - @Override protected ElasticsearchJson.Result computeNext( + @Override protected ElasticsearchJson.@Nullable Result computeNext( final ElasticsearchJson.Result previous) { final int hits = previous.searchHits().hits().size(); if (hits == 0 || count >= limit) { diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/package-info.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/package-info.java index 485c65e5909a..5ddb06863569 100644 --- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/package-info.java +++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/package-info.java @@ -18,4 +18,7 @@ /** * Query provider based on an Elasticsearch2 DB. */ +@NullMarked package org.apache.calcite.adapter.elasticsearch; + +import org.jspecify.annotations.NullMarked; diff --git a/example/csv/build.gradle.kts b/example/csv/build.gradle.kts index 928f794ef058..09a931ff8af1 100644 --- a/example/csv/build.gradle.kts +++ b/example/csv/build.gradle.kts @@ -25,7 +25,7 @@ dependencies { api(project(":core")) api(project(":file")) api(project(":linq4j")) - api("org.checkerframework:checker-qual") + api("org.jspecify:jspecify") implementation("com.fasterxml.jackson.core:jackson-core") implementation("com.fasterxml.jackson.core:jackson-databind") diff --git a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvFilterableTable.java b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvFilterableTable.java index 212aff0ce5d1..e8be1b736538 100644 --- a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvFilterableTable.java +++ b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvFilterableTable.java @@ -33,7 +33,7 @@ import org.apache.calcite.util.ImmutableIntList; import org.apache.calcite.util.Source; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; diff --git a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvProjectTableScanRule.java b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvProjectTableScanRule.java index 4dcdf2e817a5..a3fa3932966a 100644 --- a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvProjectTableScanRule.java +++ b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvProjectTableScanRule.java @@ -22,8 +22,8 @@ import org.apache.calcite.rex.RexInputRef; import org.apache.calcite.rex.RexNode; -import org.checkerframework.checker.nullness.qual.Nullable; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -46,7 +46,7 @@ protected CsvProjectTableScanRule(Config config) { @Override public void onMatch(RelOptRuleCall call) { final LogicalProject project = call.rel(0); final CsvTableScan scan = call.rel(1); - @Nullable int[] fields = getProjectFields(project.getProjects()); + int @Nullable [] fields = getProjectFields(project.getProjects()); if (fields == null) { // Project contains expressions more complex than just field references. return; diff --git a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvScannableTable.java b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvScannableTable.java index 046825bd35db..3e45b911742c 100644 --- a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvScannableTable.java +++ b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvScannableTable.java @@ -28,7 +28,7 @@ import org.apache.calcite.util.ImmutableIntList; import org.apache.calcite.util.Source; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; diff --git a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvSchema.java b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvSchema.java index e612aa83e4a5..3153b31417b8 100644 --- a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvSchema.java +++ b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvSchema.java @@ -24,7 +24,7 @@ import com.google.common.collect.ImmutableMap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.File; import java.util.Map; diff --git a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvStreamScannableTable.java b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvStreamScannableTable.java index 98ab6a03bcbf..680e39b415eb 100644 --- a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvStreamScannableTable.java +++ b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvStreamScannableTable.java @@ -30,7 +30,7 @@ import org.apache.calcite.util.ImmutableIntList; import org.apache.calcite.util.Source; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; diff --git a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvStreamTableFactory.java b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvStreamTableFactory.java index cb524dcf3f95..615f91f20c3f 100644 --- a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvStreamTableFactory.java +++ b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvStreamTableFactory.java @@ -25,7 +25,7 @@ import org.apache.calcite.util.Source; import org.apache.calcite.util.Sources; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.File; import java.util.Map; diff --git a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTable.java b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTable.java index aac56bb38ce4..46f04b04c3ea 100644 --- a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTable.java +++ b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTable.java @@ -24,7 +24,7 @@ import org.apache.calcite.schema.impl.AbstractTable; import org.apache.calcite.util.Source; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; diff --git a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTableFactory.java b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTableFactory.java index fed7ddb338e6..d7efbe97e392 100644 --- a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTableFactory.java +++ b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTableFactory.java @@ -25,7 +25,7 @@ import org.apache.calcite.util.Source; import org.apache.calcite.util.Sources; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.File; import java.util.Map; diff --git a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTableScan.java b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTableScan.java index daa0a3070a78..aca9aeb3a42a 100644 --- a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTableScan.java +++ b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTableScan.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; diff --git a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTranslatableTable.java b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTranslatableTable.java index 1da1992b6b14..8382079cfa5a 100644 --- a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTranslatableTable.java +++ b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTranslatableTable.java @@ -35,7 +35,7 @@ import org.apache.calcite.util.ImmutableIntList; import org.apache.calcite.util.Source; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.util.concurrent.atomic.AtomicBoolean; diff --git a/example/csv/src/test/java/org/apache/calcite/test/CsvTest.java b/example/csv/src/test/java/org/apache/calcite/test/CsvTest.java index 2236345f06ab..aff26774d6f4 100644 --- a/example/csv/src/test/java/org/apache/calcite/test/CsvTest.java +++ b/example/csv/src/test/java/org/apache/calcite/test/CsvTest.java @@ -28,7 +28,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Ordering; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; diff --git a/example/function/build.gradle.kts b/example/function/build.gradle.kts index b030d0c8a657..f8489d914d18 100644 --- a/example/function/build.gradle.kts +++ b/example/function/build.gradle.kts @@ -17,7 +17,7 @@ dependencies { api(project(":core")) api(project(":linq4j")) - api("org.checkerframework:checker-qual") + api("org.jspecify:jspecify") testImplementation("sqlline:sqlline") testRuntimeOnly("org.apache.logging.log4j:log4j-slf4j-impl") diff --git a/example/function/src/main/java/org/apache/calcite/example/maze/MazeTable.java b/example/function/src/main/java/org/apache/calcite/example/maze/MazeTable.java index 1068bf25cbbf..d715666ea88d 100644 --- a/example/function/src/main/java/org/apache/calcite/example/maze/MazeTable.java +++ b/example/function/src/main/java/org/apache/calcite/example/maze/MazeTable.java @@ -28,7 +28,7 @@ import org.apache.calcite.sql.type.SqlTypeName; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.PrintWriter; import java.util.Random; diff --git a/file/build.gradle.kts b/file/build.gradle.kts index 04036a888eae..80f6ffad5100 100644 --- a/file/build.gradle.kts +++ b/file/build.gradle.kts @@ -24,7 +24,7 @@ plugins { dependencies { api(project(":core")) api(project(":linq4j")) - api("org.checkerframework:checker-qual") + api("org.jspecify:jspecify") implementation("com.google.guava:guava") implementation("com.joestelmach:natty") diff --git a/file/src/main/java/org/apache/calcite/adapter/file/CsvEnumerator.java b/file/src/main/java/org/apache/calcite/adapter/file/CsvEnumerator.java index 99951e85cdbe..f4444d4b45b3 100644 --- a/file/src/main/java/org/apache/calcite/adapter/file/CsvEnumerator.java +++ b/file/src/main/java/org/apache/calcite/adapter/file/CsvEnumerator.java @@ -31,7 +31,7 @@ import com.google.common.annotations.VisibleForTesting; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.LoggerFactory; import java.io.IOException; @@ -139,8 +139,8 @@ public CsvEnumerator(Source source, AtomicBoolean cancelFlag, boolean stream, } } - static RowConverter converter(List fieldTypes, - List fields) { + static RowConverter converter( + List fieldTypes, List fields) { if (fields.size() == 1) { final int field = fields.get(0); return new SingleColumnRowConverter(fieldTypes.get(field), field); @@ -179,8 +179,8 @@ public static RelDataType deduceRowType(JavaTypeFactory typeFactory, String typeString = string.substring(colon + 1); Matcher decimalMatcher = DECIMAL_TYPE_PATTERN.matcher(typeString); if (decimalMatcher.matches()) { - int precision = parseInt(decimalMatcher.group(1)); - int scale = parseInt(decimalMatcher.group(2)); + int precision = parseInt(requireNonNull(decimalMatcher.group(1), "precision")); + int scale = parseInt(requireNonNull(decimalMatcher.group(2), "scale")); fieldType = parseDecimalSqlType(typeFactory, precision, scale); } else { switch (typeString) { @@ -370,14 +370,14 @@ private static RelDataType toNullableRelDataType(JavaTypeFactory typeFactory, } /** Returns a field from a CSV row, or null if the row is too short. */ - private static @Nullable String field(String[] strings, int index) { + private static @Nullable String field(@Nullable String[] strings, int index) { return index < strings.length ? strings[index] : null; } /** Row converter. * * @param element type */ - abstract static class RowConverter { + abstract static class RowConverter { abstract E convertRow(@Nullable String[] rows); @Nullable RelDataType getFieldType(int index) { @@ -550,7 +550,7 @@ static class ArrayRowConverter extends RowConverter<@Nullable Object[]> { } /** Single column row converter. */ - private static class SingleColumnRowConverter extends RowConverter { + private static class SingleColumnRowConverter extends RowConverter<@Nullable Object> { private final RelDataType fieldType; private final int fieldIndex; diff --git a/file/src/main/java/org/apache/calcite/adapter/file/CsvProjectFilterTableScanRule.java b/file/src/main/java/org/apache/calcite/adapter/file/CsvProjectFilterTableScanRule.java index 3bbcb5037ffb..76c7eb61c962 100644 --- a/file/src/main/java/org/apache/calcite/adapter/file/CsvProjectFilterTableScanRule.java +++ b/file/src/main/java/org/apache/calcite/adapter/file/CsvProjectFilterTableScanRule.java @@ -26,6 +26,7 @@ import org.apache.calcite.rex.RexUtil; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -52,7 +53,7 @@ protected CsvProjectFilterTableScanRule(Config config) { // Find all input fields referenced by the project expressions final java.util.Set projectInputFields = new java.util.HashSet<>(); for (RexNode proj : project.getProjects()) { - proj.accept(new org.apache.calcite.rex.RexVisitorImpl(true) { + proj.accept(new org.apache.calcite.rex.RexVisitorImpl<@Nullable Void>(true) { @Override public Void visitInputRef(RexInputRef inputRef) { projectInputFields.add(inputRef.getIndex()); return null; @@ -62,7 +63,7 @@ protected CsvProjectFilterTableScanRule(Config config) { // Find all input fields referenced by the filter condition final java.util.Set filterInputFields = new java.util.HashSet<>(); - filter.getCondition().accept(new org.apache.calcite.rex.RexVisitorImpl(true) { + filter.getCondition().accept(new org.apache.calcite.rex.RexVisitorImpl<@Nullable Void>(true) { @Override public Void visitInputRef(RexInputRef inputRef) { filterInputFields.add(inputRef.getIndex()); return null; diff --git a/file/src/main/java/org/apache/calcite/adapter/file/CsvProjectTableScanRule.java b/file/src/main/java/org/apache/calcite/adapter/file/CsvProjectTableScanRule.java index 79ba80722e40..c1a4b5390bdc 100644 --- a/file/src/main/java/org/apache/calcite/adapter/file/CsvProjectTableScanRule.java +++ b/file/src/main/java/org/apache/calcite/adapter/file/CsvProjectTableScanRule.java @@ -23,6 +23,7 @@ import org.apache.calcite.rex.RexNode; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -71,7 +72,7 @@ protected CsvProjectTableScanRule(Config config) { scan.condition)); } - private static int[] getProjectFields(List exps) { + private static int @Nullable [] getProjectFields(List exps) { final int[] fields = new int[exps.size()]; for (int i = 0; i < exps.size(); i++) { final RexNode exp = exps.get(i); diff --git a/file/src/main/java/org/apache/calcite/adapter/file/CsvStreamReader.java b/file/src/main/java/org/apache/calcite/adapter/file/CsvStreamReader.java index e9113c7d1ac1..88796e524557 100644 --- a/file/src/main/java/org/apache/calcite/adapter/file/CsvStreamReader.java +++ b/file/src/main/java/org/apache/calcite/adapter/file/CsvStreamReader.java @@ -25,7 +25,7 @@ import au.com.bytecode.opencsv.CSVParser; import au.com.bytecode.opencsv.CSVReader; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.Closeable; import java.io.IOException; diff --git a/file/src/main/java/org/apache/calcite/adapter/file/CsvTable.java b/file/src/main/java/org/apache/calcite/adapter/file/CsvTable.java index 4b4c718d41a5..f325cc225518 100644 --- a/file/src/main/java/org/apache/calcite/adapter/file/CsvTable.java +++ b/file/src/main/java/org/apache/calcite/adapter/file/CsvTable.java @@ -23,7 +23,7 @@ import org.apache.calcite.schema.impl.AbstractTable; import org.apache.calcite.util.Source; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; diff --git a/file/src/main/java/org/apache/calcite/adapter/file/CsvTableFactory.java b/file/src/main/java/org/apache/calcite/adapter/file/CsvTableFactory.java index fa37d156532c..021a4424556c 100644 --- a/file/src/main/java/org/apache/calcite/adapter/file/CsvTableFactory.java +++ b/file/src/main/java/org/apache/calcite/adapter/file/CsvTableFactory.java @@ -27,11 +27,13 @@ import au.com.bytecode.opencsv.CSVParser; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.File; import java.util.Map; +import static java.util.Objects.requireNonNull; + /** * Factory that creates a {@link CsvTranslatableTable}. * @@ -46,7 +48,7 @@ public CsvTableFactory() { @Override public CsvTable create(SchemaPlus schema, String name, Map operand, @Nullable RelDataType rowType) { - String fileName = (String) operand.get("file"); + String fileName = requireNonNull((String) operand.get("file"), "file"); final File base = (File) operand.get(ModelHandler.ExtraOperand.BASE_DIRECTORY.camelName); final Source source = Sources.file(base, fileName); diff --git a/file/src/main/java/org/apache/calcite/adapter/file/CsvTableScan.java b/file/src/main/java/org/apache/calcite/adapter/file/CsvTableScan.java index 36b2ab332f34..941c315ac8fc 100644 --- a/file/src/main/java/org/apache/calcite/adapter/file/CsvTableScan.java +++ b/file/src/main/java/org/apache/calcite/adapter/file/CsvTableScan.java @@ -43,7 +43,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/file/src/main/java/org/apache/calcite/adapter/file/CsvTranslatableTable.java b/file/src/main/java/org/apache/calcite/adapter/file/CsvTranslatableTable.java index 7f81defebe01..ce4c7824caca 100644 --- a/file/src/main/java/org/apache/calcite/adapter/file/CsvTranslatableTable.java +++ b/file/src/main/java/org/apache/calcite/adapter/file/CsvTranslatableTable.java @@ -34,7 +34,7 @@ import org.apache.calcite.util.ImmutableIntList; import org.apache.calcite.util.Source; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.util.concurrent.atomic.AtomicBoolean; diff --git a/file/src/main/java/org/apache/calcite/adapter/file/FileEnumerator.java b/file/src/main/java/org/apache/calcite/adapter/file/FileEnumerator.java index 6aa480f9f332..dfd416b0fa72 100644 --- a/file/src/main/java/org/apache/calcite/adapter/file/FileEnumerator.java +++ b/file/src/main/java/org/apache/calcite/adapter/file/FileEnumerator.java @@ -18,11 +18,13 @@ import org.apache.calcite.linq4j.Enumerator; -import org.checkerframework.checker.nullness.qual.Nullable; import org.jsoup.select.Elements; +import org.jspecify.annotations.Nullable; import java.util.Iterator; +import static org.apache.calcite.linq4j.Nullness.castNonNull; + /** * Wraps {@link FileReader} and {@link FileRowConverter}, enumerates tr DOM * elements as table rows. @@ -48,7 +50,7 @@ class FileEnumerator implements Enumerator { if (current == null) { this.moveNext(); } - return current; + return castNonNull(current); } @Override public boolean moveNext() { diff --git a/file/src/main/java/org/apache/calcite/adapter/file/FileFieldType.java b/file/src/main/java/org/apache/calcite/adapter/file/FileFieldType.java index 64f50f4eb4c4..409a219785fc 100644 --- a/file/src/main/java/org/apache/calcite/adapter/file/FileFieldType.java +++ b/file/src/main/java/org/apache/calcite/adapter/file/FileFieldType.java @@ -22,7 +22,7 @@ import com.google.common.collect.ImmutableMap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Map; @@ -78,7 +78,7 @@ public RelDataType toType(JavaTypeFactory typeFactory) { return typeFactory.createJavaType(clazz); } - public static FileFieldType of(String typeString) { + public static @Nullable FileFieldType of(String typeString) { return MAP.get(typeString); } } diff --git a/file/src/main/java/org/apache/calcite/adapter/file/FileReader.java b/file/src/main/java/org/apache/calcite/adapter/file/FileReader.java index ca164852733d..388d6b5e6ccc 100644 --- a/file/src/main/java/org/apache/calcite/adapter/file/FileReader.java +++ b/file/src/main/java/org/apache/calcite/adapter/file/FileReader.java @@ -18,11 +18,11 @@ import org.apache.calcite.util.Source; -import org.checkerframework.checker.nullness.qual.Nullable; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; +import org.jspecify.annotations.Nullable; import java.io.IOException; import java.nio.charset.Charset; @@ -60,7 +60,7 @@ public FileReader(Source source) { this(source, null, null); } - private void getTable() throws FileReaderException { + private Element readTable() throws FileReaderException { final Document doc; try { String proto = source.protocol(); @@ -77,7 +77,7 @@ private void getTable() throws FileReaderException { throw new FileReaderException("Cannot read " + source, e); } - this.tableElement = (this.selector != null && !this.selector.isEmpty()) + return (this.selector != null && !this.selector.isEmpty()) ? getSelectedTable(doc, this.selector) : getBestTable(doc); } @@ -133,21 +133,24 @@ private static Element getBestTable(Document doc) throws FileReaderException { void refresh() throws FileReaderException { this.headings = null; - getTable(); + this.tableElement = readTable(); } Elements getHeadings() { - if (this.headings == null) { + Elements headings = this.headings; + if (headings == null) { this.iterator(); + headings = requireNonNull(this.headings, "headings"); } - return this.headings; + return headings; } @Override public FileReaderIterator iterator() { - if (this.tableElement == null) { + Element tableElement = this.tableElement; + if (tableElement == null) { try { - getTable(); + tableElement = this.tableElement = readTable(); } catch (RuntimeException | Error e) { throw e; } catch (Exception e) { @@ -156,7 +159,7 @@ Elements getHeadings() { } FileReaderIterator iterator = - new FileReaderIterator(this.tableElement.select("tr")); + new FileReaderIterator(tableElement.select("tr")); // if we haven't cached the headings, get them // TODO: this needs to be reworked to properly cache the headings @@ -166,7 +169,7 @@ Elements getHeadings() { // if not, generate some default column names if (headings.isEmpty()) { // rewind and peek at the first row of data - iterator = new FileReaderIterator(this.tableElement.select("tr")); + iterator = new FileReaderIterator(tableElement.select("tr")); Elements firstRow = iterator.next("td"); int i = 0; headings = new Elements(); @@ -177,7 +180,7 @@ Elements getHeadings() { headings.add(th); } // rewind, so queries see the first row - iterator = new FileReaderIterator(this.tableElement.select("tr")); + iterator = new FileReaderIterator(tableElement.select("tr")); } this.headings = headings; } diff --git a/file/src/main/java/org/apache/calcite/adapter/file/FileRowConverter.java b/file/src/main/java/org/apache/calcite/adapter/file/FileRowConverter.java index b4e3986e1534..01fbac323114 100644 --- a/file/src/main/java/org/apache/calcite/adapter/file/FileRowConverter.java +++ b/file/src/main/java/org/apache/calcite/adapter/file/FileRowConverter.java @@ -25,9 +25,9 @@ import com.joestelmach.natty.DateGroup; import com.joestelmach.natty.Parser; -import org.checkerframework.checker.nullness.qual.Nullable; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; +import org.jspecify.annotations.Nullable; import java.text.NumberFormat; import java.text.ParseException; @@ -42,6 +42,7 @@ import java.util.regex.Pattern; import static org.apache.calcite.util.Util.first; +import static org.apache.calcite.util.Util.firstNonNull; import static java.lang.Boolean.parseBoolean; import static java.lang.Byte.parseByte; @@ -72,7 +73,7 @@ class FileRowConverter { /** Creates a FileRowConverter. */ FileRowConverter(FileReader fileReader, - List> fieldConfigs) { + @Nullable List> fieldConfigs) { this.fileReader = fileReader; this.fieldConfigs = fieldConfigs; } @@ -106,14 +107,14 @@ private void initialize() { for (Map fieldConfig : this.fieldConfigs) { String thName = (String) fieldConfig.get("th"); + Integer sourceIx = thName == null ? null : headerMap.get(thName); + if (thName == null || sourceIx == null) { + throw new Exception("bad source column name: '" + thName + "'"); + } String name = thName; String newName; FileFieldType type = null; boolean skip = false; - - if (!headerMap.containsKey(thName)) { - throw new Exception("bad source column name: '" + thName + "'"); - } if ((newName = (String) fieldConfig.get("name")) != null) { name = newName; } @@ -131,7 +132,6 @@ private void initialize() { skip = parseBoolean(sSkip); } - Integer sourceIx = headerMap.get(thName); colNames.add(name); sources.add(thName); if (!skip) { @@ -170,7 +170,7 @@ private void addFieldDef(String name, @Nullable FileFieldType type, /** Converts a row of JSoup Elements to an array of java objects. */ Object toRow(Elements rowElements, int[] projection) { initialize(); - final Object[] objects = new Object[projection.length]; + final @Nullable Object[] objects = new @Nullable Object[projection.length]; for (int i = 0; i < projection.length; i++) { int field = projection[i]; @@ -224,11 +224,11 @@ private static class CellReader { CellReader(Map config) { final @Nullable String unusedType = (String) config.get("type"); - this.selector = first((String) config.get("selector"), "*"); + this.selector = firstNonNull((String) config.get("selector"), "*"); this.selectedElement = (Integer) config.get("selectedElement"); @Nullable String replace = (String) config.get("replace"); this.replacePattern = replace == null ? null : Pattern.compile(replace); - this.replaceWith = first((String) config.get("replaceWith"), ""); + this.replaceWith = firstNonNull((String) config.get("replaceWith"), ""); @Nullable String match = (String) config.get("match"); this.matchPattern = match == null ? null : Pattern.compile(match); this.matchSeq = first((Integer) config.get("matchSeq"), 0); @@ -262,7 +262,7 @@ private static class CellReader { List allMatches = new ArrayList<>(); Matcher m = this.matchPattern.matcher(cellString); while (m.find()) { - allMatches.add(m.group()); + allMatches.add(requireNonNull(m.group(), "m.group()")); } if (!allMatches.isEmpty()) { return allMatches.get(this.matchSeq); diff --git a/file/src/main/java/org/apache/calcite/adapter/file/FileSchema.java b/file/src/main/java/org/apache/calcite/adapter/file/FileSchema.java index f66effb4a32e..ff58d9818d2b 100644 --- a/file/src/main/java/org/apache/calcite/adapter/file/FileSchema.java +++ b/file/src/main/java/org/apache/calcite/adapter/file/FileSchema.java @@ -28,12 +28,14 @@ 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.io.File; import java.util.List; import java.util.Map; +import static java.util.Objects.requireNonNull; + /** * Schema mapped onto a set of URLs / HTML tables. Each table in the schema * is an HTML table on a URL. @@ -122,7 +124,7 @@ private static String trim(String s, String suffix) { private boolean addTable(ImmutableMap.Builder builder, Map tableDef) { final String tableName = (String) tableDef.get("name"); - final String url = (String) tableDef.get("url"); + final String url = requireNonNull((String) tableDef.get("url"), "url"); final Source source0 = Sources.url(url); final Source source; if (baseDirectory == null) { @@ -134,26 +136,27 @@ private boolean addTable(ImmutableMap.Builder builder, } private static boolean addTable(ImmutableMap.Builder builder, - Source source, String tableName, @Nullable Map tableDef) { + Source source, @Nullable String tableName, + @Nullable Map tableDef) { final Source sourceSansGz = source.trim(".gz"); final Source sourceSansJson = sourceSansGz.trimOrNull(".json"); if (sourceSansJson != null) { final Table table = new JsonScannableTable(source); - builder.put(Util.first(tableName, sourceSansJson.path()), table); + builder.put(Util.firstNonNull(tableName, sourceSansJson.path()), table); return true; } final Source sourceSansCsv = sourceSansGz.trimOrNull(".csv"); if (sourceSansCsv != null) { final Table table = new CsvTranslatableTable(source, null, CSVParser.DEFAULT_SEPARATOR); - builder.put(Util.first(tableName, sourceSansCsv.path()), table); + builder.put(Util.firstNonNull(tableName, sourceSansCsv.path()), table); return true; } if (tableDef != null) { try { FileTable table = FileTable.create(source, tableDef); - builder.put(Util.first(tableName, source.path()), table); + builder.put(Util.firstNonNull(tableName, source.path()), table); return true; } catch (Exception e) { throw new RuntimeException("Unable to instantiate table for: " diff --git a/file/src/main/java/org/apache/calcite/adapter/file/FileSchemaFactory.java b/file/src/main/java/org/apache/calcite/adapter/file/FileSchemaFactory.java index 43d952bbac51..3c1add1a16fb 100644 --- a/file/src/main/java/org/apache/calcite/adapter/file/FileSchemaFactory.java +++ b/file/src/main/java/org/apache/calcite/adapter/file/FileSchemaFactory.java @@ -50,14 +50,10 @@ private FileSchemaFactory() { final File baseDirectory = (File) operand.get(ModelHandler.ExtraOperand.BASE_DIRECTORY.camelName); final String directory = (String) operand.get("directory"); - File directoryFile = null; + File directoryFile = baseDirectory; if (directory != null) { directoryFile = new File(directory); - } - if (baseDirectory != null) { - if (directoryFile == null) { - directoryFile = baseDirectory; - } else if (!directoryFile.isAbsolute()) { + if (baseDirectory != null && !directoryFile.isAbsolute()) { directoryFile = new File(baseDirectory, directory); } } diff --git a/file/src/main/java/org/apache/calcite/adapter/file/FileTable.java b/file/src/main/java/org/apache/calcite/adapter/file/FileTable.java index ef3f959b81d9..35cf32f83d61 100644 --- a/file/src/main/java/org/apache/calcite/adapter/file/FileTable.java +++ b/file/src/main/java/org/apache/calcite/adapter/file/FileTable.java @@ -37,7 +37,7 @@ import org.apache.calcite.schema.impl.AbstractTableQueryable; import org.apache.calcite.util.Source; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Map; @@ -53,9 +53,9 @@ class FileTable extends AbstractQueryableTable private final FileRowConverter converter; /** Creates a FileTable. */ - private FileTable(Source source, String selector, Integer index, + private FileTable(Source source, @Nullable String selector, @Nullable Integer index, @Nullable RelProtoDataType protoRowType, - List> fieldConfigs) { + @Nullable List> fieldConfigs) { super(Object[].class); this.protoRowType = protoRowType; diff --git a/file/src/main/java/org/apache/calcite/adapter/file/JsonEnumerator.java b/file/src/main/java/org/apache/calcite/adapter/file/JsonEnumerator.java index 256c8e0f587c..12dbc1f2e38b 100644 --- a/file/src/main/java/org/apache/calcite/adapter/file/JsonEnumerator.java +++ b/file/src/main/java/org/apache/calcite/adapter/file/JsonEnumerator.java @@ -27,7 +27,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.exc.MismatchedInputException; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Arrays; @@ -82,7 +82,8 @@ static JsonDataConverter deduceRowType(RelDataTypeFactory typeFactory, Source so } } catch (MismatchedInputException e) { - if (!e.getMessage().contains("No content")) { + final String message = e.getMessage(); + if (message == null || !message.contains("No content")) { throw new RuntimeException("Couldn't read " + source, e); } } catch (Exception e) { @@ -121,7 +122,7 @@ static JsonDataConverter deduceRowType(RelDataTypeFactory typeFactory, Source so return new JsonDataConverter(relDataType, list); } - @Override public Object[] current() { + @Override public @Nullable Object[] current() { return enumerator.current(); } diff --git a/file/src/main/java/org/apache/calcite/adapter/file/JsonScannableTable.java b/file/src/main/java/org/apache/calcite/adapter/file/JsonScannableTable.java index f0f23739635d..6de4d5c07454 100644 --- a/file/src/main/java/org/apache/calcite/adapter/file/JsonScannableTable.java +++ b/file/src/main/java/org/apache/calcite/adapter/file/JsonScannableTable.java @@ -24,7 +24,7 @@ import org.apache.calcite.schema.ScannableTable; import org.apache.calcite.util.Source; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Table based on a JSON file. diff --git a/file/src/main/java/org/apache/calcite/adapter/file/JsonTable.java b/file/src/main/java/org/apache/calcite/adapter/file/JsonTable.java index e26f81d8c325..8d8084ed3eef 100644 --- a/file/src/main/java/org/apache/calcite/adapter/file/JsonTable.java +++ b/file/src/main/java/org/apache/calcite/adapter/file/JsonTable.java @@ -24,7 +24,7 @@ import org.apache.calcite.schema.impl.AbstractTable; import org.apache.calcite.util.Source; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; diff --git a/file/src/main/java/org/apache/calcite/adapter/file/package-info.java b/file/src/main/java/org/apache/calcite/adapter/file/package-info.java index 2a726e9f4d73..205115b35b37 100644 --- a/file/src/main/java/org/apache/calcite/adapter/file/package-info.java +++ b/file/src/main/java/org/apache/calcite/adapter/file/package-info.java @@ -22,4 +22,7 @@ * table appears as a table. Full select SQL operations are available on those * tables. */ +@NullMarked package org.apache.calcite.adapter.file; + +import org.jspecify.annotations.NullMarked; diff --git a/file/src/test/java/org/apache/calcite/adapter/file/FileAdapterTests.java b/file/src/test/java/org/apache/calcite/adapter/file/FileAdapterTests.java index 7caea64e9d84..c9a2ef2d5aa6 100644 --- a/file/src/test/java/org/apache/calcite/adapter/file/FileAdapterTests.java +++ b/file/src/test/java/org/apache/calcite/adapter/file/FileAdapterTests.java @@ -22,7 +22,7 @@ import com.google.common.collect.Ordering; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.PrintStream; import java.net.URL; diff --git a/geode/build.gradle.kts b/geode/build.gradle.kts index 0ef17741679e..8b892b37d3a4 100644 --- a/geode/build.gradle.kts +++ b/geode/build.gradle.kts @@ -25,7 +25,7 @@ dependencies { api(project(":core")) api(project(":linq4j")) api("org.apache.geode:geode-core") - api("org.checkerframework:checker-qual") + api("org.jspecify:jspecify") api("org.slf4j:slf4j-api") implementation("com.google.guava:guava") diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeAggregate.java b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeAggregate.java index baf850e0f707..80ba104512bc 100644 --- a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeAggregate.java +++ b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeAggregate.java @@ -32,7 +32,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.ArrayList; import java.util.List; @@ -51,7 +51,7 @@ public GeodeAggregate(RelOptCluster cluster, RelTraitSet traitSet, RelNode input, ImmutableBitSet groupSet, - List groupSets, + @Nullable List groupSets, List aggCalls) { super(cluster, traitSet, ImmutableList.of(), input, groupSet, groupSets, aggCalls); @@ -73,14 +73,14 @@ public GeodeAggregate(RelOptCluster cluster, RelNode input, boolean indicator, ImmutableBitSet groupSet, - List groupSets, + @Nullable List groupSets, List aggCalls) { this(cluster, traitSet, input, groupSet, groupSets, aggCalls); checkIndicator(indicator); } @Override public Aggregate copy(RelTraitSet traitSet, RelNode input, - ImmutableBitSet groupSet, List groupSets, + ImmutableBitSet groupSet, @Nullable List groupSets, List aggCalls) { return new GeodeAggregate(getCluster(), traitSet, input, groupSet, groupSets, aggCalls); @@ -125,7 +125,8 @@ public GeodeAggregate(RelOptCluster cluster, String oqlAggregateCall = Util.toString(aggCallFieldNames, functionName + "(", ", ", ")"); - aggregateFunctionMap.put(aggCall.getName(), oqlAggregateCall); + aggregateFunctionMap.put( + requireNonNull(aggCall.getName(), "aggCall name"), oqlAggregateCall); } geodeImplementContext.addAggregateFunctions(aggregateFunctionMap.build()); diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeEnumerator.java b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeEnumerator.java index b70d1e31528b..de56b8ccd6b6 100644 --- a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeEnumerator.java +++ b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeEnumerator.java @@ -25,7 +25,7 @@ import org.apache.geode.cache.query.SelectResults; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,7 +38,7 @@ /** * Enumerator that reads from a Geode Regions. */ -class GeodeEnumerator implements Enumerator { +class GeodeEnumerator implements Enumerator<@Nullable Object> { protected static final Logger LOGGER = LoggerFactory.getLogger(GeodeEnumerator.class.getName()); diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeFilter.java b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeFilter.java index 47d43728c620..31e1a74b46db 100644 --- a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeFilter.java +++ b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeFilter.java @@ -37,7 +37,7 @@ import org.apache.calcite.util.TimestampString; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; @@ -261,8 +261,8 @@ private List getLeftNodeDisjunctions(RexNode node, List disjun private String translateOr(List disjunctions) { List predicates = new ArrayList<>(); - List leftFieldNameList = new ArrayList<>(); - List inSetLeftFieldNameList = new ArrayList<>(); + List<@Nullable String> leftFieldNameList = new ArrayList<>(); + List<@Nullable String> inSetLeftFieldNameList = new ArrayList<>(); for (RexNode node : disjunctions) { final String leftNodeFieldName = getLeftNodeFieldNameForNode(node); diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeProject.java b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeProject.java index 9cdcfa3eaf49..800d3fd85de6 100644 --- a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeProject.java +++ b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeProject.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.LinkedHashMap; import java.util.List; diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeRel.java b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeRel.java index 01e18ca969f6..587e4bb07102 100644 --- a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeRel.java +++ b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeRel.java @@ -20,6 +20,8 @@ import org.apache.calcite.plan.RelOptTable; import org.apache.calcite.rel.RelNode; +import org.jspecify.annotations.Nullable; + import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; @@ -61,10 +63,14 @@ class GeodeImplementContext { final Map oqlAggregateFunctions = new LinkedHashMap<>(); - Long limitValue; + @Nullable Long limitValue; + /** Set by {@code GeodeTableScan.implement} before anything reads it. */ + @SuppressWarnings("NullAway.Init") RelOptTable table; + /** Set by {@code GeodeTableScan.implement} before anything reads it. */ + @SuppressWarnings("NullAway.Init") GeodeTable geodeTable; /** diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeRules.java b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeRules.java index b8beb854e0f6..e06d522b41fb 100644 --- a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeRules.java +++ b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeRules.java @@ -42,8 +42,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.ArrayList; import java.util.List; diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeSchema.java b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeSchema.java index 49457d538e71..a01fabd42096 100644 --- a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeSchema.java +++ b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeSchema.java @@ -26,6 +26,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import org.jspecify.annotations.Nullable; + import java.util.List; import java.util.Map; @@ -38,7 +40,7 @@ public class GeodeSchema extends AbstractSchema { final GemFireCache cache; private final List regionNames; - private ImmutableMap tableMap; + private @Nullable ImmutableMap tableMap; public GeodeSchema(final GemFireCache gemFireCache, final Iterable regionNames) { super(); diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeSchemaFactory.java b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeSchemaFactory.java index 5c1f5a679bd4..d5ff2de6b4f5 100644 --- a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeSchemaFactory.java +++ b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeSchemaFactory.java @@ -29,6 +29,9 @@ import static org.apache.calcite.adapter.geode.util.GeodeUtils.createClientCache; +import static java.lang.Integer.parseInt; +import static java.util.Objects.requireNonNull; + /** * Factory that creates a {@link GeodeSchema}. */ @@ -49,10 +52,16 @@ public GeodeSchemaFactory() { @Override public synchronized Schema create(SchemaPlus parentSchema, String name, Map operand) { Map map = (Map) operand; - String locatorHost = (String) map.get(LOCATOR_HOST); - int locatorPort = Integer.valueOf((String) map.get(LOCATOR_PORT)); - String[] regionNames = ((String) map.get(REGIONS)).split(COMMA_DELIMITER); - String pbxSerializablePackagePath = (String) map.get(PDX_SERIALIZABLE_PACKAGE_PATH); + String locatorHost = + requireNonNull((String) map.get(LOCATOR_HOST), "locatorHost"); + int locatorPort = + parseInt( + requireNonNull((String) map.get(LOCATOR_PORT), "locatorPort")); + String[] regionNames = + requireNonNull((String) map.get(REGIONS), "regions").split(COMMA_DELIMITER); + String pbxSerializablePackagePath = + requireNonNull((String) map.get(PDX_SERIALIZABLE_PACKAGE_PATH), + "pdxSerializablePackagePath"); boolean allowSpatialFunctions = true; if (map.containsKey(ALLOW_SPATIAL_FUNCTIONS)) { diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeSort.java b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeSort.java index c9b33252d980..8420f2f33d02 100644 --- a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeSort.java +++ b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeSort.java @@ -28,7 +28,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.ArrayList; import java.util.List; @@ -65,7 +65,8 @@ public class GeodeSort extends Sort implements GeodeRel { } @Override public Sort copy(RelTraitSet traitSet, RelNode input, - RelCollation newCollation, RexNode offset, RexNode fetch) { + RelCollation newCollation, @Nullable RexNode offset, + @Nullable RexNode fetch) { return new GeodeSort(getCluster(), traitSet, input, collation, fetch); } diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeTable.java b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeTable.java index 584b5cacaeb8..62a1c127e5b2 100644 --- a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeTable.java +++ b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeTable.java @@ -46,7 +46,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; @@ -87,7 +87,7 @@ public class GeodeTable extends AbstractQueryableTable implements TranslatableTa * @param predicates A list of predicates which should be used in the query * @return Enumerator of results */ - public Enumerable query(final GemFireCache clientCache, + public Enumerable<@Nullable Object> query(final GemFireCache clientCache, final List> fields, final List> selectFields, final List> aggregateFunctions, @@ -197,20 +197,35 @@ public Enumerable query(final GemFireCache clientCache, Hook.QUERY_PLAN.run(oqlQuery); LOGGER.info("OQL: " + oqlQuery); - return new AbstractEnumerable() { - @Override public Enumerator enumerator() { - final QueryService queryService = clientCache.getQueryService(); - try { - SelectResults results = (SelectResults) queryService.newQuery(oqlQuery).execute(); - return new GeodeEnumerator(results, resultRowType); - } catch (Exception e) { - String message = - String.format(Locale.ROOT, "Failed to execute query [%s] on %s", - oqlQuery, clientCache.getName()); - throw new RuntimeException(message, e); - } + return new GeodeQueryEnumerable(clientCache, oqlQuery, resultRowType); + } + + /** Enumerable over the results of an OQL query. */ + private static class GeodeQueryEnumerable + extends AbstractEnumerable<@Nullable Object> { + private final GemFireCache clientCache; + private final String oqlQuery; + private final RelProtoDataType resultRowType; + + GeodeQueryEnumerable(GemFireCache clientCache, String oqlQuery, + RelProtoDataType resultRowType) { + this.clientCache = clientCache; + this.oqlQuery = oqlQuery; + this.resultRowType = resultRowType; + } + + @Override public Enumerator<@Nullable Object> enumerator() { + final QueryService queryService = clientCache.getQueryService(); + try { + SelectResults results = (SelectResults) queryService.newQuery(oqlQuery).execute(); + return new GeodeEnumerator(results, resultRowType); + } catch (Exception e) { + String message = + String.format(Locale.ROOT, "Failed to execute query [%s] on %s", + oqlQuery, clientCache.getName()); + throw new RuntimeException(message, e); } - }; + } } @Override public Queryable asQueryable(QueryProvider queryProvider, @@ -262,7 +277,7 @@ private GemFireCache getClientCache() { * Called via code-generation. */ @SuppressWarnings("UnusedDeclaration") - public Enumerable query( + public Enumerable<@Nullable Object> query( List> fields, List> selectFields, List> aggregateFunctions, diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeTableScan.java b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeTableScan.java index 60650b17a739..f720a4a30d51 100644 --- a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeTableScan.java +++ b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeTableScan.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/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeToEnumerableConverter.java b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeToEnumerableConverter.java index 84af3ec4c0e8..ef8e3a445fcf 100644 --- a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeToEnumerableConverter.java +++ b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeToEnumerableConverter.java @@ -40,7 +40,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.lang.reflect.Method; import java.util.AbstractList; diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/package-info.java b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/package-info.java index c58923468d6d..d6b5fa6c318e 100644 --- a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/package-info.java +++ b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/package-info.java @@ -18,4 +18,7 @@ /** * Query provider based on Apache Geode (Gemfire) in-memory data grid. */ +@NullMarked package org.apache.calcite.adapter.geode.rel; + +import org.jspecify.annotations.NullMarked; diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/simple/GeodeSimpleEnumerator.java b/geode/src/main/java/org/apache/calcite/adapter/geode/simple/GeodeSimpleEnumerator.java index 6e24e71ef32d..b3b20ee8b830 100644 --- a/geode/src/main/java/org/apache/calcite/adapter/geode/simple/GeodeSimpleEnumerator.java +++ b/geode/src/main/java/org/apache/calcite/adapter/geode/simple/GeodeSimpleEnumerator.java @@ -22,20 +22,23 @@ import org.apache.geode.cache.query.QueryService; import org.apache.geode.cache.query.SelectResults; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Iterator; +import static org.apache.calcite.linq4j.Nullness.castNonNull; + /** * Geode Simple Enumerator. * * @param Element type */ -public abstract class GeodeSimpleEnumerator implements Enumerator { +public abstract class GeodeSimpleEnumerator + implements Enumerator { private @Nullable Iterator results; - private E current; + private @Nullable E current; protected GeodeSimpleEnumerator(ClientCache clientCache, String regionName) { QueryService queryService = clientCache.getQueryService(); @@ -49,7 +52,7 @@ protected GeodeSimpleEnumerator(ClientCache clientCache, String regionName) { } @Override public E current() { - return current; + return castNonNull(current); } @Override public boolean moveNext() { diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/simple/GeodeSimpleScannableTable.java b/geode/src/main/java/org/apache/calcite/adapter/geode/simple/GeodeSimpleScannableTable.java index 1594b30e27d3..a415ecfac57f 100644 --- a/geode/src/main/java/org/apache/calcite/adapter/geode/simple/GeodeSimpleScannableTable.java +++ b/geode/src/main/java/org/apache/calcite/adapter/geode/simple/GeodeSimpleScannableTable.java @@ -27,7 +27,7 @@ import org.apache.geode.cache.client.ClientCache; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static org.apache.calcite.adapter.geode.util.GeodeUtils.convertToRowValues; diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/simple/GeodeSimpleSchema.java b/geode/src/main/java/org/apache/calcite/adapter/geode/simple/GeodeSimpleSchema.java index 2c8c374ae8dc..d051612b1182 100644 --- a/geode/src/main/java/org/apache/calcite/adapter/geode/simple/GeodeSimpleSchema.java +++ b/geode/src/main/java/org/apache/calcite/adapter/geode/simple/GeodeSimpleSchema.java @@ -25,6 +25,8 @@ import com.google.common.collect.ImmutableMap; +import org.jspecify.annotations.Nullable; + import java.util.Map; import static org.apache.calcite.adapter.geode.util.GeodeUtils.autodetectRelTypeFromRegion; @@ -38,7 +40,7 @@ public class GeodeSimpleSchema extends AbstractSchema { private final String[] regionNames; @SuppressWarnings("unused") private final ClientCache clientCache; - private ImmutableMap tableMap; + private @Nullable ImmutableMap tableMap; public GeodeSimpleSchema(String locatorHost, int locatorPort, String[] regionNames, String pdxAutoSerializerPackageExp) { diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/simple/GeodeSimpleSchemaFactory.java b/geode/src/main/java/org/apache/calcite/adapter/geode/simple/GeodeSimpleSchemaFactory.java index 1a867d33a33c..5390e96879fc 100644 --- a/geode/src/main/java/org/apache/calcite/adapter/geode/simple/GeodeSimpleSchemaFactory.java +++ b/geode/src/main/java/org/apache/calcite/adapter/geode/simple/GeodeSimpleSchemaFactory.java @@ -22,6 +22,9 @@ import java.util.Map; +import static java.lang.Integer.parseInt; +import static java.util.Objects.requireNonNull; + /** * Geode Simple Table Schema Factory. */ @@ -41,10 +44,16 @@ public GeodeSimpleSchemaFactory() { String name, Map operand) { Map map = (Map) operand; - String locatorHost = (String) map.get(LOCATOR_HOST); - int locatorPort = Integer.valueOf((String) map.get(LOCATOR_PORT)); - String[] regionNames = ((String) map.get(REGIONS)).split(COMMA_DELIMITER); - String pdxSerializablePackagePath = (String) map.get(PDX_SERIALIZABLE_PACKAGE_PATH); + String locatorHost = + requireNonNull((String) map.get(LOCATOR_HOST), "locatorHost"); + int locatorPort = + parseInt( + requireNonNull((String) map.get(LOCATOR_PORT), "locatorPort")); + String[] regionNames = + requireNonNull((String) map.get(REGIONS), "regions").split(COMMA_DELIMITER); + String pdxSerializablePackagePath = + requireNonNull((String) map.get(PDX_SERIALIZABLE_PACKAGE_PATH), + "pdxSerializablePackagePath"); return new GeodeSimpleSchema(locatorHost, locatorPort, regionNames, pdxSerializablePackagePath); } diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/simple/package-info.java b/geode/src/main/java/org/apache/calcite/adapter/geode/simple/package-info.java index 48295dc3e30a..c3ba3ffc2a6c 100644 --- a/geode/src/main/java/org/apache/calcite/adapter/geode/simple/package-info.java +++ b/geode/src/main/java/org/apache/calcite/adapter/geode/simple/package-info.java @@ -18,4 +18,7 @@ /** * Query evaluation runtime for Apache Geode adapter. */ +@NullMarked package org.apache.calcite.adapter.geode.simple; + +import org.jspecify.annotations.NullMarked; diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/util/GeodeUtils.java b/geode/src/main/java/org/apache/calcite/adapter/geode/util/GeodeUtils.java index 2aa212dc5a92..5a5d80e50a99 100644 --- a/geode/src/main/java/org/apache/calcite/adapter/geode/util/GeodeUtils.java +++ b/geode/src/main/java/org/apache/calcite/adapter/geode/util/GeodeUtils.java @@ -33,7 +33,7 @@ import org.apache.geode.pdx.PdxInstance; import org.apache.geode.pdx.ReflectionBasedAutoSerializer; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -158,7 +158,7 @@ public static synchronized Region createRegion(GemFireCache cache, String region public static @Nullable Object convertToRowValues( List relDataTypeFields, Object geodeResultObject) { - Object values; + @Nullable Object values; if (geodeResultObject instanceof Struct) { values = handleStructEntry(relDataTypeFields, geodeResultObject); @@ -171,12 +171,12 @@ public static synchronized Region createRegion(GemFireCache cache, String region return values; } - private static Object handleStructEntry( + private static @Nullable Object handleStructEntry( List relDataTypeFields, Object obj) { Struct struct = (Struct) obj; - Object[] values = new Object[relDataTypeFields.size()]; + final @Nullable Object[] values = new Object[relDataTypeFields.size()]; int index = 0; for (RelDataTypeField relDataTypeField : relDataTypeFields) { @@ -199,12 +199,12 @@ private static Object handleStructEntry( return values; } - private static Object handlePdxInstanceEntry( + private static @Nullable Object handlePdxInstanceEntry( List relDataTypeFields, Object obj) { PdxInstance pdxEntry = (PdxInstance) obj; - Object[] values = new Object[relDataTypeFields.size()]; + final @Nullable Object[] values = new Object[relDataTypeFields.size()]; int index = 0; for (RelDataTypeField relDataTypeField : relDataTypeFields) { @@ -236,7 +236,7 @@ private static Object handlePdxInstanceEntry( return null; } - Object[] values = new Object[relDataTypeFields.size()]; + final @Nullable Object[] values = new Object[relDataTypeFields.size()]; int index = 0; for (RelDataTypeField relDataTypeField : relDataTypeFields) { @@ -252,7 +252,7 @@ private static Object handlePdxInstanceEntry( } @SuppressWarnings("JavaUtilDate") - private static Object convert(Object o, Class clazz) { + private static @Nullable Object convert(@Nullable Object o, Class clazz) { if (o == null) { return null; } @@ -293,7 +293,11 @@ public static RelDataType autodetectRelTypeFromRegion(Region region) { requireNonNull(region, "region"); // try to detect type using value constraints (if they exists) - final Class constraint = region.getAttributes().getValueConstraint(); + // The raw Class avoids the bytecode wildcard of Region's value type, whose + // upper bound reads as nullable and so is rejected where Class is + // expected. See https://github.com/uber/NullAway/issues/1732 + @SuppressWarnings("rawtypes") final @Nullable Class constraint = + region.getAttributes().getValueConstraint(); if (constraint != null && !PdxInstance.class.isAssignableFrom(constraint)) { return new JavaTypeFactoryExtImpl().createStructType(constraint); } @@ -313,7 +317,8 @@ public static RelDataType autodetectRelTypeFromRegion(Region region) { throw new IllegalStateException(message); } - final Object entry = region.get(iter.next()); + final Object entry = + requireNonNull(region.get(iter.next()), "region entry"); return createRelDataType(entry); } diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/util/package-info.java b/geode/src/main/java/org/apache/calcite/adapter/geode/util/package-info.java index a7a33b16bd4a..a2cca0871628 100644 --- a/geode/src/main/java/org/apache/calcite/adapter/geode/util/package-info.java +++ b/geode/src/main/java/org/apache/calcite/adapter/geode/util/package-info.java @@ -18,4 +18,7 @@ /** * Utilities for Apache Geode adapter. */ +@NullMarked package org.apache.calcite.adapter.geode.util; + +import org.jspecify.annotations.NullMarked; diff --git a/gradle.properties b/gradle.properties index 0c5e83c5038c..10f464bf832d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -42,7 +42,6 @@ calcite.avatica.version=1.28.0 # Plugins com.autonomousapps.dependency-analysis.version=0.71.0 -org.checkerframework.version=0.5.16 com.github.autostyle.version=3.2 com.github.johnrengelman.shadow.version=5.1.0 com.github.spotbugs.version=2.0.0 @@ -51,7 +50,7 @@ com.google.protobuf.version=0.8.10 de.thetaphi.forbiddenapis.version=3.10 jacoco.version=0.8.14 kotlin.version=2.3.20 -net.ltgt.errorprone.version=1.3.0 +net.ltgt.errorprone.version=5.1.0 me.champeau.jmh.version=0.7.2 org.jetbrains.gradle.plugin.idea-ext.version=1.4.1 org.nosphere.apache.rat.version=0.8.1 @@ -70,10 +69,10 @@ kotlin.stdlib.default.dependency=false # docker-maven-plugin.version=1.2.0 # Tools -checkerframework.version=3.10.0 checkstyle.version=8.28 spotbugs.version=3.1.11 -errorprone.version=2.5.1 +errorprone.version=2.50.0 +nullaway.version=0.14.0 # The property is used in https://github.com/wildfly/jandex regression testing, so avoid renaming jandex.version=3.5.3 @@ -134,6 +133,7 @@ joda-time.version=2.8.1 joou.version=0.9.5 json-path.version=2.10.0 json-smart.version=2.6.0 +jspecify.version=1.0.1 jsr305.version=3.0.2 jsoup.version=1.11.3 junit4.version=4.13.2 diff --git a/innodb/src/main/java/org/apache/calcite/adapter/innodb/IndexCondition.java b/innodb/src/main/java/org/apache/calcite/adapter/innodb/IndexCondition.java index 358790e64e23..5a2cadbcd401 100644 --- a/innodb/src/main/java/org/apache/calcite/adapter/innodb/IndexCondition.java +++ b/innodb/src/main/java/org/apache/calcite/adapter/innodb/IndexCondition.java @@ -25,7 +25,7 @@ import com.alibaba.innodb.java.reader.comparator.ComparisonOperator; 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/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbEnumerator.java b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbEnumerator.java index 4125466b367b..528f3ae3a6c8 100644 --- a/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbEnumerator.java +++ b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbEnumerator.java @@ -26,7 +26,7 @@ import com.alibaba.innodb.java.reader.page.index.GenericRecord; import com.alibaba.innodb.java.reader.util.Utils; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.sql.Date; import java.sql.Time; @@ -39,7 +39,7 @@ /** * Enumerator that reads from InnoDB data file. */ -class InnodbEnumerator implements Enumerator { +class InnodbEnumerator implements Enumerator<@Nullable Object> { private final Iterator iterator; private @Nullable GenericRecord current; private final List fieldTypes; @@ -61,13 +61,13 @@ class InnodbEnumerator 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(fieldTypes.get(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(fieldTypes.get(i)); } diff --git a/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbFilter.java b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbFilter.java index 37c5c57c8ced..a5a146b95cc4 100644 --- a/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbFilter.java +++ b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbFilter.java @@ -29,7 +29,7 @@ import com.alibaba.innodb.java.reader.schema.TableDef; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static java.util.Objects.requireNonNull; diff --git a/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbFilterTranslator.java b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbFilterTranslator.java index 72e7bc348355..16fe1b8c9f05 100644 --- a/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbFilterTranslator.java +++ b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbFilterTranslator.java @@ -37,7 +37,7 @@ import com.google.common.collect.Lists; 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; @@ -477,7 +477,11 @@ private boolean nonForceIndexOrMatchForceIndexName(IndexCondition indexCondition .map(indexCondition::nameMatch).orElse(true); } - /** Internal representation of a row expression. */ + /** Internal representation of a row expression. + * + *

    Every field is set as the translator walks the expression, which is why + * they are not initialized here. */ + @SuppressWarnings("NullAway.Init") private static class InternalRexNode { /** Relation expression node. */ RexNode node; diff --git a/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbProject.java b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbProject.java index f05c30091c76..acde92946419 100644 --- a/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbProject.java +++ b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbProject.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/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbRel.java b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbRel.java index 4cf1ca292d33..91297c598f38 100644 --- a/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbRel.java +++ b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbRel.java @@ -39,7 +39,11 @@ class Implementor { IndexCondition indexCondition = IndexCondition.EMPTY_CONDITION; boolean ascOrder = true; + /** Set by {@code InnodbTableScan.implement} before anything reads it. */ + @SuppressWarnings("NullAway.Init") RelOptTable table; + /** Set by {@code InnodbTableScan.implement} before anything reads it. */ + @SuppressWarnings("NullAway.Init") InnodbTable innodbTable; public void addSelectFields(Map fields) { diff --git a/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbSchemaFactory.java b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbSchemaFactory.java index 00b0b287ba00..a00ece5e1933 100644 --- a/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbSchemaFactory.java +++ b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbSchemaFactory.java @@ -23,6 +23,8 @@ import java.util.List; import java.util.Map; +import static java.util.Objects.requireNonNull; + /** * Factory that creates a {@link InnodbSchema}. */ @@ -32,8 +34,11 @@ public InnodbSchemaFactory() { @Override public Schema create(SchemaPlus parentSchema, String name, Map operand) { - final List sqlFilePathList = (List) operand.get("sqlFilePath"); - final String ibdDataFileBasePath = (String) operand.get("ibdDataFileBasePath"); + final List sqlFilePathList = + requireNonNull((List) operand.get("sqlFilePath"), "sqlFilePath"); + final String ibdDataFileBasePath = + requireNonNull((String) operand.get("ibdDataFileBasePath"), + "ibdDataFileBasePath"); final String timeZone = (String) operand.get("timeZone"); if (timeZone != null && !timeZone.isEmpty()) { System.setProperty("innodb.java.reader.server.timezone", timeZone); diff --git a/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbSort.java b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbSort.java index 44fa6da3fe8f..b95f8aa9e26a 100644 --- a/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbSort.java +++ b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbSort.java @@ -27,7 +27,7 @@ import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.calcite.rex.RexNode; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -59,7 +59,8 @@ public class InnodbSort extends Sort implements InnodbRel { } @Override public Sort copy(RelTraitSet traitSet, RelNode input, - RelCollation newCollation, RexNode offset, RexNode fetch) { + RelCollation newCollation, @Nullable RexNode offset, + @Nullable RexNode fetch) { return new InnodbSort(getCluster(), traitSet, input, collation); } diff --git a/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbTable.java b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbTable.java index 06ca97d2dc4f..9a2c76450c15 100644 --- a/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbTable.java +++ b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbTable.java @@ -49,6 +49,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -115,7 +116,7 @@ public Set getIndexesNameSet() { .build(); } - public Enumerable query(final TableReaderFactory tableReaderFactory) { + public Enumerable<@Nullable Object> query(final TableReaderFactory tableReaderFactory) { return query(tableReaderFactory, ImmutableList.of(), ImmutableList.of(), IndexCondition.EMPTY_CONDITION, true); } @@ -130,7 +131,7 @@ public Enumerable query(final TableReaderFactory tableReaderFactory) { * @param ascOrder if scan ordering is ascending * @return Enumerator of results */ - public Enumerable query( + public Enumerable<@Nullable Object> query( final TableReaderFactory tableReaderFactory, final List> fields, final List> selectFields, @@ -150,7 +151,7 @@ public Enumerable query( final RelDataTypeFactory.Builder fieldInfo = typeFactory.builder(); final RelDataType rowType = getRowType(typeFactory); - Function1 addField = fieldName -> { + Function1 addField = fieldName -> { final RelDataTypeField field = requireNonNull(rowType.getField(fieldName, true, false)); RelDataType relDataType = field.getType(); @@ -174,56 +175,10 @@ public Enumerable query( TableReader tableReader = tableReaderFactory.createTableReader(tableName); tableReader.open(); - return new AbstractEnumerable() { - @Override public Enumerator enumerator() { - Iterator resultIterator; - LOGGER.debug("Create query iterator, queryType={}, indexName={}, " - + "pointQueryKey={}, projection={}, rangeQueryKey={}{} AND {}{}, " - + "ascOrder={}", queryType, indexName, pointQueryKey, - selectedColumnNames, rangeQueryLowerKey, rangeQueryLowerOp, - rangeQueryUpperKey, rangeQueryUpperOp, ascOrder); - switch (queryType) { - case PK_POINT_QUERY: - resultIterator = - RecordIterator.create(tableReader - .queryByPrimaryKey(pointQueryKey, selectedColumnNames)); - break; - case PK_RANGE_QUERY: - resultIterator = - tableReader.getRangeQueryIterator(rangeQueryLowerKey, - rangeQueryLowerOp, rangeQueryUpperKey, rangeQueryUpperOp, - selectedColumnNames, ascOrder); - break; - case SK_POINT_QUERY: - resultIterator = - tableReader.getRecordIteratorBySk(indexName, pointQueryKey, - ComparisonOperator.GTE, pointQueryKey, - ComparisonOperator.LTE, selectedColumnNames, ascOrder); - break; - case SK_RANGE_QUERY: - case SK_FULL_SCAN: - resultIterator = - tableReader.getRecordIteratorBySk(indexName, rangeQueryLowerKey, - rangeQueryLowerOp, rangeQueryUpperKey, rangeQueryUpperOp, - selectedColumnNames, ascOrder); - break; - case PK_FULL_SCAN: - resultIterator = - tableReader.getQueryAllIterator(selectedColumnNames, ascOrder); - break; - default: - throw new AssertionError("query type is invalid"); - } - - RelDataType rowType = resultRowType.apply(typeFactory); - return new InnodbEnumerator(resultIterator, rowType) { - @Override public void close() { - super.close(); - tableReader.close(); - } - }; - } - }; + return new InnodbEnumerable(tableReader, queryType, indexName, pointQueryKey, + selectedColumnNames, rangeQueryLowerKey, rangeQueryLowerOp, + rangeQueryUpperKey, rangeQueryUpperOp, ascOrder, resultRowType, + typeFactory); } @Override public Queryable asQueryable(QueryProvider queryProvider, @@ -273,11 +228,97 @@ private TableReaderFactory getTableReaderFactory() { * @see org.apache.calcite.adapter.innodb.InnodbMethod#INNODB_QUERYABLE_QUERY */ @SuppressWarnings("UnusedDeclaration") - public Enumerable query(List> fields, + public Enumerable<@Nullable Object> query(List> fields, List> selectFields, IndexCondition condition, Boolean ascOrder) { return getTable().query(getTableReaderFactory(), fields, selectFields, condition, ascOrder); } } + + /** Enumerable over the records an InnoDB query reads. */ + private static class InnodbEnumerable extends AbstractEnumerable<@Nullable Object> { + private final TableReader tableReader; + private final QueryType queryType; + private final String indexName; + private final List pointQueryKey; + private final List selectedColumnNames; + private final List rangeQueryLowerKey; + private final ComparisonOperator rangeQueryLowerOp; + private final List rangeQueryUpperKey; + private final ComparisonOperator rangeQueryUpperOp; + private final Boolean ascOrder; + private final RelProtoDataType resultRowType; + private final RelDataTypeFactory typeFactory; + + InnodbEnumerable(TableReader tableReader, QueryType queryType, + String indexName, List pointQueryKey, + List selectedColumnNames, List rangeQueryLowerKey, + ComparisonOperator rangeQueryLowerOp, List rangeQueryUpperKey, + ComparisonOperator rangeQueryUpperOp, Boolean ascOrder, + RelProtoDataType resultRowType, RelDataTypeFactory typeFactory) { + this.tableReader = tableReader; + this.queryType = queryType; + this.indexName = indexName; + this.pointQueryKey = pointQueryKey; + this.selectedColumnNames = selectedColumnNames; + this.rangeQueryLowerKey = rangeQueryLowerKey; + this.rangeQueryLowerOp = rangeQueryLowerOp; + this.rangeQueryUpperKey = rangeQueryUpperKey; + this.rangeQueryUpperOp = rangeQueryUpperOp; + this.ascOrder = ascOrder; + this.resultRowType = resultRowType; + this.typeFactory = typeFactory; + } + + @Override public Enumerator<@Nullable Object> enumerator() { + Iterator resultIterator; + LOGGER.debug("Create query iterator, queryType={}, indexName={}, " + + "pointQueryKey={}, projection={}, rangeQueryKey={}{} AND {}{}, " + + "ascOrder={}", queryType, indexName, pointQueryKey, + selectedColumnNames, rangeQueryLowerKey, rangeQueryLowerOp, + rangeQueryUpperKey, rangeQueryUpperOp, ascOrder); + switch (queryType) { + case PK_POINT_QUERY: + resultIterator = + RecordIterator.create(tableReader + .queryByPrimaryKey(pointQueryKey, selectedColumnNames)); + break; + case PK_RANGE_QUERY: + resultIterator = + tableReader.getRangeQueryIterator(rangeQueryLowerKey, + rangeQueryLowerOp, rangeQueryUpperKey, rangeQueryUpperOp, + selectedColumnNames, ascOrder); + break; + case SK_POINT_QUERY: + resultIterator = + tableReader.getRecordIteratorBySk(indexName, pointQueryKey, + ComparisonOperator.GTE, pointQueryKey, + ComparisonOperator.LTE, selectedColumnNames, ascOrder); + break; + case SK_RANGE_QUERY: + case SK_FULL_SCAN: + resultIterator = + tableReader.getRecordIteratorBySk(indexName, rangeQueryLowerKey, + rangeQueryLowerOp, rangeQueryUpperKey, rangeQueryUpperOp, + selectedColumnNames, ascOrder); + break; + case PK_FULL_SCAN: + resultIterator = + tableReader.getQueryAllIterator(selectedColumnNames, ascOrder); + break; + default: + throw new AssertionError("query type is invalid"); + } + + RelDataType rowType = resultRowType.apply(typeFactory); + return new InnodbEnumerator(resultIterator, rowType) { + @Override public void close() { + super.close(); + tableReader.close(); + } + }; + } + } + } diff --git a/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbTableScan.java b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbTableScan.java index 5b38e2eb4c48..f1d5390993fd 100644 --- a/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbTableScan.java +++ b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbTableScan.java @@ -33,7 +33,7 @@ import com.alibaba.innodb.java.reader.Constants; import com.alibaba.innodb.java.reader.schema.KeyMeta; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Optional; diff --git a/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbToEnumerableConverter.java b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbToEnumerableConverter.java index a30273ac41ca..92d798a6453c 100644 --- a/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbToEnumerableConverter.java +++ b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbToEnumerableConverter.java @@ -42,7 +42,7 @@ import com.alibaba.innodb.java.reader.comparator.ComparisonOperator; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.AbstractList; import java.util.Collections; diff --git a/innodb/src/main/java/org/apache/calcite/adapter/innodb/package-info.java b/innodb/src/main/java/org/apache/calcite/adapter/innodb/package-info.java index 298f95846df8..27cb2df5eb77 100644 --- a/innodb/src/main/java/org/apache/calcite/adapter/innodb/package-info.java +++ b/innodb/src/main/java/org/apache/calcite/adapter/innodb/package-info.java @@ -18,4 +18,7 @@ /** * InnoDB query provider. */ +@NullMarked package org.apache.calcite.adapter.innodb; + +import org.jspecify.annotations.NullMarked; diff --git a/innodb/src/test/java/org/apache/calcite/adapter/innodb/InnodbAdapterTest.java b/innodb/src/test/java/org/apache/calcite/adapter/innodb/InnodbAdapterTest.java index f7a1f484fd2c..0b8c04338d2e 100644 --- a/innodb/src/test/java/org/apache/calcite/adapter/innodb/InnodbAdapterTest.java +++ b/innodb/src/test/java/org/apache/calcite/adapter/innodb/InnodbAdapterTest.java @@ -30,7 +30,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/kafka/build.gradle.kts b/kafka/build.gradle.kts index 16abc9aab00a..f227739c04ac 100644 --- a/kafka/build.gradle.kts +++ b/kafka/build.gradle.kts @@ -18,7 +18,7 @@ dependencies { api(project(":core")) api(project(":linq4j")) api("org.apache.kafka:kafka-clients") - api("org.checkerframework:checker-qual") + api("org.jspecify:jspecify") implementation("com.google.guava:guava") diff --git a/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaMessageEnumerator.java b/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaMessageEnumerator.java index adfd999bdfa3..f33c85e4a51c 100644 --- a/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaMessageEnumerator.java +++ b/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaMessageEnumerator.java @@ -23,7 +23,7 @@ import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.ConsumerRecords; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.time.Duration; import java.util.ArrayDeque; diff --git a/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaRowConverter.java b/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaRowConverter.java index e209536ae260..9b577ee807d7 100644 --- a/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaRowConverter.java +++ b/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaRowConverter.java @@ -21,6 +21,8 @@ import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.jspecify.annotations.Nullable; + /** * Interface to handle formatting between Kafka message and Calcite row. * @@ -35,10 +37,11 @@ public interface KafkaRowConverter { /** * Generates the row type for a given Kafka topic. * - * @param topicName Kafka topic name + * @param topicName Kafka topic name, or null if the table reads from a + * consumer that subscribed on its own * @return row type */ - RelDataType rowDataType(String topicName); + RelDataType rowDataType(@Nullable String topicName); /** * Parses and reformats a Kafka message from the consumer, diff --git a/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaRowConverterImpl.java b/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaRowConverterImpl.java index 36f673f3908d..b55b84e6dde1 100644 --- a/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaRowConverterImpl.java +++ b/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaRowConverterImpl.java @@ -24,6 +24,8 @@ import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.jspecify.annotations.Nullable; + /** * Default implementation of {@link KafkaRowConverter}, both key and value are byte[]. */ @@ -34,7 +36,7 @@ public class KafkaRowConverterImpl implements KafkaRowConverter * @param topicName Kafka topic name * @return row type */ - @Override public RelDataType rowDataType(final String topicName) { + @Override public RelDataType rowDataType(final @Nullable String topicName) { final RelDataTypeFactory typeFactory = new SqlTypeFactoryImpl(RelDataTypeSystem.DEFAULT); final RelDataTypeFactory.Builder fieldInfo = typeFactory.builder(); diff --git a/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaStreamTable.java b/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaStreamTable.java index f73941c9418a..e5e4e434e566 100644 --- a/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaStreamTable.java +++ b/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaStreamTable.java @@ -39,12 +39,14 @@ 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.Properties; import java.util.concurrent.atomic.AtomicBoolean; +import static java.util.Objects.requireNonNull; + /** * A table that maps to an Apache Kafka topic. * @@ -79,7 +81,8 @@ private class KafkaStreamTableEnumerable extends AbstractEnumerable<@Nullable Ob Properties consumerConfig = new Properties(); consumerConfig.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, - tableOptions.getBootstrapServers()); + requireNonNull(tableOptions.getBootstrapServers(), + KafkaTableConstants.SCHEMA_BOOTSTRAP_SERVERS)); // by default it's consumerConfig.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.ByteArrayDeserializer"); diff --git a/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaTableFactory.java b/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaTableFactory.java index f6cbce53539c..825fe3dc54dd 100644 --- a/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaTableFactory.java +++ b/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaTableFactory.java @@ -23,7 +23,7 @@ import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.consumer.OffsetResetStrategy; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.InvocationTargetException; import java.util.Locale; @@ -44,9 +44,9 @@ public KafkaTableFactory() { final KafkaTableOptions tableOptionBuilder = new KafkaTableOptions(); tableOptionBuilder.setBootstrapServers( - (String) operand.getOrDefault(KafkaTableConstants.SCHEMA_BOOTSTRAP_SERVERS, null)); + (String) operand.get(KafkaTableConstants.SCHEMA_BOOTSTRAP_SERVERS)); tableOptionBuilder.setTopicName( - (String) operand.getOrDefault(KafkaTableConstants.SCHEMA_TOPIC_NAME, null)); + (String) operand.get(KafkaTableConstants.SCHEMA_TOPIC_NAME)); final KafkaRowConverter rowConverter; if (operand.containsKey(KafkaTableConstants.SCHEMA_ROW_CONVERTER)) { diff --git a/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaTableOptions.java b/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaTableOptions.java index f54e7831509a..28de0f043a38 100644 --- a/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaTableOptions.java +++ b/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaTableOptions.java @@ -18,33 +18,38 @@ import org.apache.kafka.clients.consumer.Consumer; +import org.jspecify.annotations.Nullable; + import java.util.Map; /** * Available options for {@link KafkaStreamTable}. */ public final class KafkaTableOptions { - private String bootstrapServers; - private String topicName; + private @Nullable String bootstrapServers; + private @Nullable String topicName; + /** Set by {@link KafkaTableFactory} right after construction, which is why + * it is not initialized here. */ + @SuppressWarnings("NullAway.Init") private KafkaRowConverter rowConverter; - private Map consumerParams; + private @Nullable Map consumerParams; // added to inject MockConsumer for testing. - private Consumer consumer; + private @Nullable Consumer consumer; - public String getBootstrapServers() { + public @Nullable String getBootstrapServers() { return bootstrapServers; } - public KafkaTableOptions setBootstrapServers(final String bootstrapServers) { + public KafkaTableOptions setBootstrapServers(final @Nullable String bootstrapServers) { this.bootstrapServers = bootstrapServers; return this; } - public String getTopicName() { + public @Nullable String getTopicName() { return topicName; } - public KafkaTableOptions setTopicName(final String topicName) { + public KafkaTableOptions setTopicName(final @Nullable String topicName) { this.topicName = topicName; return this; } @@ -59,20 +64,21 @@ public KafkaTableOptions setRowConverter( return this; } - public Map getConsumerParams() { + public @Nullable Map getConsumerParams() { return consumerParams; } - public KafkaTableOptions setConsumerParams(final Map consumerParams) { + public KafkaTableOptions setConsumerParams( + final @Nullable Map consumerParams) { this.consumerParams = consumerParams; return this; } - public Consumer getConsumer() { + public @Nullable Consumer getConsumer() { return consumer; } - public KafkaTableOptions setConsumer(final Consumer consumer) { + public KafkaTableOptions setConsumer(final @Nullable Consumer consumer) { this.consumer = consumer; return this; } diff --git a/kafka/src/main/java/org/apache/calcite/adapter/kafka/package-info.java b/kafka/src/main/java/org/apache/calcite/adapter/kafka/package-info.java index 3524be916282..68681d2c8ebe 100644 --- a/kafka/src/main/java/org/apache/calcite/adapter/kafka/package-info.java +++ b/kafka/src/main/java/org/apache/calcite/adapter/kafka/package-info.java @@ -20,4 +20,7 @@ * *

    One Kafka topic is mapping to one STREAM table. */ +@NullMarked package org.apache.calcite.adapter.kafka; + +import org.jspecify.annotations.NullMarked; diff --git a/linq4j/build.gradle.kts b/linq4j/build.gradle.kts index fd11eb7379bc..db097ad9deb9 100644 --- a/linq4j/build.gradle.kts +++ b/linq4j/build.gradle.kts @@ -16,7 +16,10 @@ */ dependencies { api("org.apiguardian:apiguardian-api") - api("org.checkerframework:checker-qual") + api("org.jspecify:jspecify") + + // The annotations are not retained at run time and the artifact never ships with Calcite, + // so its Java 11 bytecode is fine even though Calcite itself targets Java 8 implementation("com.google.guava:guava") implementation("org.apache.calcite.avatica:avatica-core") diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/AbstractEnumerable.java b/linq4j/src/main/java/org/apache/calcite/linq4j/AbstractEnumerable.java index 1a798704d12d..ac9629b1ef25 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/AbstractEnumerable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/AbstractEnumerable.java @@ -16,6 +16,8 @@ */ package org.apache.calcite.linq4j; +import org.jspecify.annotations.Nullable; + import java.util.Iterator; /** @@ -28,7 +30,8 @@ * * @param Element type */ -public abstract class AbstractEnumerable extends DefaultEnumerable { +public abstract class AbstractEnumerable + extends DefaultEnumerable { @Override public Iterator iterator() { return Linq4j.enumeratorIterator(enumerator()); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/BaseQueryable.java b/linq4j/src/main/java/org/apache/calcite/linq4j/BaseQueryable.java index b707fad12d45..37b5cbdca775 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/BaseQueryable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/BaseQueryable.java @@ -18,7 +18,7 @@ import org.apache.calcite.linq4j.tree.Expression; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.util.Iterator; diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultEnumerable.java b/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultEnumerable.java index c02001b346d4..e3b9e8f3637b 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultEnumerable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultEnumerable.java @@ -34,8 +34,7 @@ import org.apache.calcite.linq4j.function.Predicate1; import org.apache.calcite.linq4j.function.Predicate2; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.PolyNull; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.Collection; @@ -55,7 +54,8 @@ * * @param Element type */ -public abstract class DefaultEnumerable implements OrderedEnumerable { +public abstract class DefaultEnumerable + implements OrderedEnumerable { /** * Derived classes might wish to override this method to return the "outer" @@ -97,8 +97,8 @@ protected OrderedQueryable asOrderedQueryable() { return EnumerableDefaults.aggregate(getThis(), func); } - @Override public @PolyNull TAccumulate aggregate(@PolyNull TAccumulate seed, - Function2<@PolyNull TAccumulate, T, @PolyNull TAccumulate> func) { + @Override public @Nullable TAccumulate aggregate(@Nullable TAccumulate seed, + Function2<@Nullable TAccumulate, T, @Nullable TAccumulate> func) { return EnumerableDefaults.aggregate(getThis(), seed, func); } @@ -199,7 +199,7 @@ protected OrderedQueryable asOrderedQueryable() { return EnumerableDefaults.defaultIfEmpty(getThis()); } - @Override public Enumerable<@PolyNull T> defaultIfEmpty(@PolyNull T value) { + @Override public Enumerable<@Nullable T> defaultIfEmpty(@Nullable T value) { return EnumerableDefaults.defaultIfEmpty(getThis(), value); } @@ -473,7 +473,7 @@ protected OrderedQueryable asOrderedQueryable() { @Override public Enumerable correlateJoin( JoinType joinType, Function1> inner, - Function2 resultSelector) { + Function2 resultSelector) { return EnumerableDefaults.correlateJoin(joinType, getThis(), inner, resultSelector); } @@ -602,7 +602,8 @@ protected OrderedQueryable asOrderedQueryable() { return EnumerableDefaults.min(getThis(), selector); } - @Override public Enumerable ofType(Class clazz) { + @Override public + Enumerable ofType(Class clazz) { return EnumerableDefaults.ofType(getThis(), clazz); } @@ -631,21 +632,22 @@ protected OrderedQueryable asOrderedQueryable() { return EnumerableDefaults.reverse(getThis()); } - @Override public Enumerable select(Function1 selector) { + @Override public + Enumerable select(Function1 selector) { return EnumerableDefaults.select(getThis(), selector); } - @Override public Enumerable select( + @Override public Enumerable select( Function2 selector) { return EnumerableDefaults.select(getThis(), selector); } - @Override public Enumerable selectMany( + @Override public Enumerable selectMany( Function1> selector) { return EnumerableDefaults.selectMany(getThis(), selector); } - @Override public Enumerable selectMany( + @Override public Enumerable selectMany( Function2> selector) { return EnumerableDefaults.selectMany(getThis(), selector); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultQueryable.java b/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultQueryable.java index 65c79bacb553..24eadff4af92 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultQueryable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultQueryable.java @@ -33,7 +33,7 @@ import org.apache.calcite.linq4j.function.Predicate2; import org.apache.calcite.linq4j.tree.FunctionExpression; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.Comparator; @@ -146,7 +146,8 @@ protected OrderedQueryable getThisOrderedQueryable() { return factory.distinct(getThis(), comparer); } - @Override public Queryable ofType(Class clazz) { + @Override public + Queryable ofType(Class clazz) { return factory.ofType(getThis(), clazz); } @@ -386,22 +387,22 @@ protected OrderedQueryable getThisOrderedQueryable() { return factory.orderByDescending(getThis(), keySelector, comparator); } - @Override public Queryable select( + @Override public Queryable select( FunctionExpression> selector) { return factory.select(getThis(), selector); } - @Override public Queryable selectN( + @Override public Queryable selectN( FunctionExpression> selector) { return factory.selectN(getThis(), selector); } - @Override public Queryable selectMany( + @Override public Queryable selectMany( FunctionExpression>> selector) { return factory.selectMany(getThis(), selector); } - @Override public Queryable selectManyN( + @Override public Queryable selectManyN( FunctionExpression>> selector) { return factory.selectManyN(getThis(), selector); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/Enumerable.java b/linq4j/src/main/java/org/apache/calcite/linq4j/Enumerable.java index 4af96280dd20..8c816e42f09a 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/Enumerable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/Enumerable.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j; -import org.checkerframework.framework.qual.Covariant; +import org.jspecify.annotations.Nullable; /** * Exposes the enumerator, which supports a simple iteration over a collection. @@ -28,8 +28,7 @@ * * @param Element type */ -@Covariant(0) -public interface Enumerable +public interface Enumerable extends RawEnumerable, Iterable, ExtendedEnumerable { /** * Converts this Enumerable to a Queryable. diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java b/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java index 0eca4b6d5283..b42286a2d569 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java @@ -41,11 +41,7 @@ import com.google.common.collect.Sets; import org.apiguardian.api.API; -import org.checkerframework.checker.nullness.qual.KeyFor; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.PolyNull; -import org.checkerframework.dataflow.qual.Pure; -import org.checkerframework.framework.qual.HasQualifierParameter; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.math.RoundingMode; @@ -106,9 +102,14 @@ public abstract class EnumerableDefaults { * sequence. The specified seed value is used as the initial * accumulator value. */ - public static TAccumulate aggregate( + // NullAway treats the result of a call returning `? extends TAccumulate` as @Nullable + // once it is assigned to a TAccumulate local, even though TAccumulate is the local's own + // type. The wildcard is what lets a reducer with a non-null result feed a nullable seed. + // https://github.com/uber/NullAway/issues/1727 + @SuppressWarnings("NullAway") + public static TAccumulate aggregate( Enumerable source, TAccumulate seed, - Function2 func) { + Function2 func) { TAccumulate result = seed; try (Enumerator os = source.enumerator()) { while (os.moveNext()) { @@ -125,9 +126,15 @@ public static TAccumulate aggregate( * accumulator value, and the specified function is used to select * the result value. */ - public static TResult aggregate( + // NullAway treats the result of a call returning `? extends TAccumulate` as @Nullable + // once it is assigned to a TAccumulate local, even though TAccumulate is the local's own + // type. The wildcard is what lets a reducer with a non-null result feed a nullable seed. + // https://github.com/uber/NullAway/issues/1727 + @SuppressWarnings("NullAway") + public static TResult aggregate( Enumerable source, TAccumulate seed, - Function2 func, + Function2 func, Function1 selector) { TAccumulate accumulate = seed; try (Enumerator os = source.enumerator()) { @@ -417,10 +424,10 @@ public static int count(Enumerable enumerable, * *

    If {@code value} is not null, the result is never null. */ - @SuppressWarnings("return.type.incompatible") - public static Enumerable<@PolyNull TSource> defaultIfEmpty( + @SuppressWarnings("NullAway") + public static Enumerable<@Nullable TSource> defaultIfEmpty( Enumerable enumerable, - @PolyNull TSource value) { + @Nullable TSource value) { try (Enumerator os = enumerable.enumerator()) { if (os.moveNext()) { return Linq4j.asEnumerable(() -> new Iterator() { @@ -569,7 +576,7 @@ public static Enumerable except( try (Enumerator os = source1.enumerator()) { while (os.moveNext()) { TSource o = os.current(); - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") boolean unused = collection.remove(o); } return Linq4j.asEnumerable(collection); @@ -1025,7 +1032,7 @@ public static Enumerable asofJoin( left = new Linq4j.IterableEnumerator<>(value); List<@Nullable TInner> rightList = requireNonNull(rightIndex.get(key)); - right = new Linq4j.IterableEnumerator<>(rightList); + right = new Linq4j.IterableEnumerator<@Nullable TInner>(rightList); } else { // Done with the data, start emitting records with null keys emittingNullKeys = true; @@ -1120,18 +1127,18 @@ private static class SortedAggregateEnumerator Enumerable groupBy while (os.moveNext()) { TSource o = os.current(); TKey key = keySelector.apply(o); - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") TAccumulate accumulator = map.get(key); if (accumulator == null) { accumulator = accumulatorInitializer.apply(); @@ -1197,7 +1204,7 @@ private static Enumerable groupBy for (Function1 keySelector : keySelectors) { TSource o = os.current(); TKey key = keySelector.apply(o); - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") TAccumulate accumulator = map.get(key); if (accumulator == null) { accumulator = accumulatorInitializer.apply(); @@ -1251,7 +1258,7 @@ public static Enumerable groupJoin( return new Enumerator() { @Override public TResult current() { final Map.Entry entry = entries.current(); - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") final Enumerable inners = innerLookup.get(entry.getKey()); return resultSelector.apply(entry.getValue(), inners == null ? Linq4j.emptyEnumerable() : inners); @@ -1293,7 +1300,7 @@ public static Enumerable groupJoin( return new Enumerator() { @Override public TResult current() { final Map.Entry entry = entries.current(); - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") final Enumerable inners = innerLookup.get(entry.getKey()); return resultSelector.apply(entry.getValue(), inners == null ? Linq4j.emptyEnumerable() : inners); @@ -1338,7 +1345,7 @@ public static Enumerable intersect( try (Enumerator os = source0.enumerator()) { while (os.moveNext()) { TSource o = os.current(); - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") boolean removed = set1.remove(o); if (removed) { resultCollection.add(o); @@ -1529,7 +1536,7 @@ private static Enumerable hashEquiJoin // not the left. List list = new ArrayList<>(); for (TKey key : unmatchedKeys) { - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") Enumerable innerValues = requireNonNull(innerLookup.get(key)); for (TInner tInner : innerValues) { list.add(tInner); @@ -2236,7 +2243,7 @@ public static Enumerable correlateBatchJoin( int i = -1; // outer position int j = -1; // inner position - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") @Override public TResult current() { return resultSelector.apply(outerValue, innerValue); } @@ -2286,7 +2293,7 @@ public static Enumerable correlateBatchJoin( outerValue = outerValues.get(i); // get current outer value nextInnerValue(); // Compare current block row to current inner value - if (predicate.apply(castNonNull(outerValue), castNonNull(innerValue))) { + if (predicate.apply(outerValue, castNonNull(innerValue))) { atLeastOneResult = true; // Skip the rest of inner values in case of // ANTI and SEMI when a match is found @@ -2482,7 +2489,7 @@ private static Enumerable semiJoinWithPredicate final Predicate1 predicate = v0 -> { TKey key = outerKeySelector.apply(v0); - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") Enumerable innersOfKey = key == null ? null : innerLookup.get().get(key); if (innersOfKey == null) { return anti; @@ -2946,7 +2953,7 @@ public static long longCount(Enumerable enumerable, * Returns the maximum value in a generic * sequence. */ - public static > TSource max( + public static @Nullable > TSource max( Enumerable source) { return aggregate(source, maxFunction()); } @@ -2955,7 +2962,7 @@ public static > TSource max( * Invokes a transform function on each element of a * sequence and returns the maximum Decimal value. */ - public static BigDecimal max(Enumerable source, + public static @Nullable BigDecimal max(Enumerable source, BigDecimalFunction1 selector) { return aggregate(source.select(selector), maxFunction()); } @@ -2965,7 +2972,7 @@ public static BigDecimal max(Enumerable source, * sequence and returns the maximum nullable Decimal * value. */ - public static BigDecimal max(Enumerable source, + public static @Nullable BigDecimal max(Enumerable source, NullableBigDecimalFunction1 selector) { return aggregate(source.select(selector), maxFunction()); } @@ -2984,7 +2991,7 @@ public static double max(Enumerable source, * sequence and returns the maximum nullable Double * value. */ - public static Double max(Enumerable source, + public static @Nullable Double max(Enumerable source, NullableDoubleFunction1 selector) { return aggregate(source.select(selector), Extensions.DOUBLE_MAX); } @@ -3003,7 +3010,7 @@ public static int max(Enumerable source, * sequence and returns the maximum nullable int value. (Defined * by Enumerable.) */ - public static Integer max(Enumerable source, + public static @Nullable Integer max(Enumerable source, NullableIntegerFunction1 selector) { return aggregate(source.select(selector), Extensions.INTEGER_MAX); } @@ -3066,24 +3073,24 @@ public static float max(Enumerable source, } @SuppressWarnings("unchecked") - private static > Function2 - minFunction() { - return (Function2) (Function2) Extensions.COMPARABLE_MIN; + private static > + Function2<@Nullable TSource, TSource, TSource> minFunction() { + return (Function2<@Nullable TSource, TSource, TSource>) (Function2) Extensions.COMPARABLE_MIN; } @SuppressWarnings("unchecked") - private static > Function2 - maxFunction() { - return (Function2) (Function2) Extensions.COMPARABLE_MAX; + private static > + Function2<@Nullable TSource, TSource, TSource> maxFunction() { + return (Function2<@Nullable TSource, TSource, TSource>) (Function2) Extensions.COMPARABLE_MAX; } /** * Invokes a transform function on each element of a * sequence and returns the minimum Decimal value. */ - public static BigDecimal min(Enumerable source, + public static @Nullable BigDecimal min(Enumerable source, BigDecimalFunction1 selector) { - Function2 min = minFunction(); + Function2<@Nullable BigDecimal, BigDecimal, BigDecimal> min = minFunction(); return aggregate(source.select(selector), null, min); } @@ -3092,7 +3099,7 @@ public static BigDecimal min(Enumerable source, * sequence and returns the minimum nullable Decimal * value. */ - public static BigDecimal min(Enumerable source, + public static @Nullable BigDecimal min(Enumerable source, NullableBigDecimalFunction1 selector) { return aggregate(source.select(selector), minFunction()); } @@ -3111,7 +3118,7 @@ public static double min(Enumerable source, * sequence and returns the minimum nullable Double * value. */ - public static Double min(Enumerable source, + public static @Nullable Double min(Enumerable source, NullableDoubleFunction1 selector) { return aggregate(source.select(selector), Extensions.DOUBLE_MIN); } @@ -3130,7 +3137,7 @@ public static int min(Enumerable source, * sequence and returns the minimum nullable int value. (Defined * by Enumerable.) */ - public static Integer min(Enumerable source, + public static @Nullable Integer min(Enumerable source, NullableIntegerFunction1 selector) { return aggregate(source.select(selector), null, Extensions.INTEGER_MIN); } @@ -3141,7 +3148,8 @@ public static Integer min(Enumerable source, */ public static long min(Enumerable source, LongFunction1 selector) { - return aggregate(source.select(adapt(selector)), null, Extensions.LONG_MIN); + return requireNonNull( + aggregate(source.select(adapt(selector)), null, Extensions.LONG_MIN)); } /** @@ -3149,7 +3157,7 @@ public static long min(Enumerable source, * sequence and returns the minimum nullable long value. (Defined * by Enumerable.) */ - public static Long min(Enumerable source, + public static @Nullable Long min(Enumerable source, NullableLongFunction1 selector) { return aggregate(source.select(selector), null, Extensions.LONG_MIN); } @@ -3160,8 +3168,8 @@ public static Long min(Enumerable source, */ public static float min(Enumerable source, FloatFunction1 selector) { - return aggregate(source.select(adapt(selector)), null, - Extensions.FLOAT_MIN); + return requireNonNull( + aggregate(source.select(adapt(selector)), null, Extensions.FLOAT_MIN)); } /** @@ -3169,7 +3177,7 @@ public static float min(Enumerable source, * sequence and returns the minimum nullable Float * value. */ - public static Float min(Enumerable source, + public static @Nullable Float min(Enumerable source, NullableFloatFunction1 selector) { return aggregate(source.select(selector), null, Extensions.FLOAT_MIN); } @@ -3181,7 +3189,7 @@ public static Float min(Enumerable source, */ public static > @Nullable TResult min( Enumerable source, Function1 selector) { - Function2 min = minFunction(); + Function2<@Nullable TResult, TResult, TResult> min = minFunction(); return aggregate(source.select(selector), null, min); } @@ -3196,7 +3204,7 @@ public static Float min(Enumerable source, * * @return Collection of T2 */ - public static Enumerable ofType( + public static Enumerable ofType( Enumerable enumerable, Class clazz) { //noinspection unchecked return (Enumerable) where(enumerable, @@ -3283,13 +3291,12 @@ public static Enumerable orderBy( TKey key = keySelector.apply(o); if (needed.signum() >= 0 && size.compareTo(needed) >= 0) { // the current row will never appear in the output, so just skip it - @KeyFor("map") TKey lastKey = map.lastKey(); + TKey lastKey = map.lastKey(); if (comparator.compare(key, lastKey) >= 0) { continue; } // remove last entry from tree map, so that we keep at most 'needed' rows - @SuppressWarnings("argument.type.incompatible") - List l = map.get(lastKey); + List l = requireNonNull(map.get(lastKey), "map.get(lastKey)"); if (l.size() == 1) { map.remove(lastKey); } else { @@ -3394,7 +3401,7 @@ public static Enumerable reverse( /** * Projects each element of a sequence into a new form. */ - public static Enumerable select( + public static Enumerable select( final Enumerable source, final Function1 selector) { if (selector == Functions.identitySelector()) { @@ -3430,7 +3437,7 @@ public static Enumerable select( * Projects each element of a sequence into a new * form by incorporating the element's index. */ - public static Enumerable select( + public static Enumerable select( final Enumerable source, final Function2 selector) { return new AbstractEnumerable() { @@ -3469,7 +3476,7 @@ public static Enumerable select( * {@code Enumerable} and flattens the resulting sequences into one * sequence. */ - public static Enumerable selectMany( + public static Enumerable selectMany( final Enumerable source, final Function1> selector) { return new AbstractEnumerable() { @@ -3515,7 +3522,7 @@ public static Enumerable selectMany( * sequence. The index of each source element is used in the * projected form of that element. */ - public static Enumerable selectMany( + public static Enumerable selectMany( final Enumerable source, final Function2> selector) { return new AbstractEnumerable() { @@ -4806,8 +4813,7 @@ static class SkipWhileBigDecimalEnumerator implements Enumerator source element type * @param element type */ - @HasQualifierParameter(Nullable.class) - static class CastingEnumerator + static class CastingEnumerator implements Enumerator { private final Enumerator enumerator; private final Class clazz; @@ -4878,13 +4884,13 @@ protected WrapMap(Function0, V>> mapProvider, EqualityComparer this.comparer = comparer; } - @Override public Set> entrySet() { + @Override public Set> entrySet() { return new WrapMapEntrySet(); } /** EntrySet for {@link WrapMap}. */ - private class WrapMapEntrySet extends AbstractSet> { - @SuppressWarnings("override.return.invalid") + private class WrapMapEntrySet extends AbstractSet> { + @SuppressWarnings("NullAway") @Override public Iterator> iterator() { final Iterator, V>> iterator = map.entrySet().iterator(); @@ -4910,25 +4916,28 @@ private class WrapMapEntrySet extends AbstractSet> { } } - @SuppressWarnings("contracts.conditional.postcondition.not.satisfied") + @SuppressWarnings("NullAway") @Override public boolean containsKey(@Nullable Object key) { return map.containsKey(wrap((K) key)); } - @Pure private Wrapped wrap(K key) { return Wrapped.upAs(comparer, key); } + // Map.get and Map.remove take a nullable key, and wrapping one throws, which is what + // this map did before it was annotated + @SuppressWarnings("NullAway") @Override public @Nullable V get(@Nullable Object key) { return map.get(wrap((K) key)); } - @SuppressWarnings("contracts.postcondition.not.satisfied") + @SuppressWarnings("NullAway") @Override public @Nullable V put(K key, V value) { return map.put(wrap(key), value); } + @SuppressWarnings("NullAway") @Override public @Nullable V remove(@Nullable Object key) { return map.remove(wrap((K) key)); } @@ -5010,7 +5019,7 @@ private static class MergeJoinEnumerator leftEnumerable, Enumerable rightEnumerable, Function1 outerKeySelector, @@ -5153,7 +5162,8 @@ private boolean advance() { results = new CartesianProductJoinEnumerator<>(resultSelector, Linq4j.enumerator(lefts), - Linq4j.enumerator(Collections.singletonList(null))); + Linq4j.<@Nullable TInner>enumerator( + Collections.singletonList(null))); return true; } if (!getLeftEnumerator().moveNext()) { @@ -5208,10 +5218,17 @@ private boolean advance() { : new CartesianProductJoinEnumerator<>(resultSelector, Linq4j.enumerator(lefts), Linq4j.enumerator(rights)); } else { - // we must verify the non equi-join predicate, use nested loop join for that + // we must verify the non equi-join predicate, use nested loop join for that. + // nestedLoopJoin serves right and full joins too, so its result selector has to + // accept a null left row; merge join rejects those join types up front, so + // widening this one is sound + @SuppressWarnings("unchecked") final + Function2<@Nullable TSource, @Nullable TInner, TResult> nullTolerant = + (Function2<@Nullable TSource, @Nullable TInner, TResult>) resultSelector; results = - nestedLoopJoin(Linq4j.asEnumerable(lefts), - Linq4j.asEnumerable(rights), extraPredicate, resultSelector, + EnumerableDefaults.nestedLoopJoin( + Linq4j.asEnumerable(lefts), + Linq4j.asEnumerable(rights), extraPredicate, nullTolerant, joinType).enumerator(); } return true; @@ -5373,7 +5390,7 @@ private static class CartesianProductJoinEnumerator @SuppressWarnings("unchecked") CartesianProductJoinEnumerator(Function2 resultSelector, - Enumerator outer, Enumerator inner) { + Enumerator outer, Enumerator inner) { super(ImmutableList.of((Enumerator) outer, (Enumerator) inner)); this.resultSelector = resultSelector; } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableOrderedQueryable.java b/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableOrderedQueryable.java index 2684c0246d78..53b1dbf762d2 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableOrderedQueryable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableOrderedQueryable.java @@ -20,7 +20,7 @@ import org.apache.calcite.linq4j.tree.Expression; import org.apache.calcite.linq4j.tree.FunctionExpression; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Comparator; diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableQueryable.java b/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableQueryable.java index 7a37a57c5f04..e0ec59f7c328 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableQueryable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableQueryable.java @@ -34,7 +34,7 @@ import org.apache.calcite.linq4j.tree.Expression; import org.apache.calcite.linq4j.tree.FunctionExpression; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.math.BigDecimal; @@ -151,7 +151,8 @@ protected Queryable queryable() { return EnumerableDefaults.distinct(getThis(), comparer).asQueryable(); } - @Override public Queryable ofType(Class clazz) { + @Override public + Queryable ofType(Class clazz) { return EnumerableDefaults.ofType(getThis(), clazz).asQueryable(); } @@ -423,25 +424,25 @@ protected Queryable queryable() { keySelector.getFunction(), comparator)); } - @Override public Queryable select( + @Override public Queryable select( FunctionExpression> selector) { return EnumerableDefaults.select(getThis(), selector.getFunction()) .asQueryable(); } - @Override public Queryable selectN( + @Override public Queryable selectN( FunctionExpression> selector) { return EnumerableDefaults.select(getThis(), selector.getFunction()) .asQueryable(); } - @Override public Queryable selectMany( + @Override public Queryable selectMany( FunctionExpression>> selector) { return EnumerableDefaults.selectMany(getThis(), selector.getFunction()) .asQueryable(); } - @Override public Queryable selectManyN( + @Override public Queryable selectManyN( FunctionExpression>> selector) { return EnumerableDefaults.selectMany(getThis(), selector.getFunction()) .asQueryable(); diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/Enumerator.java b/linq4j/src/main/java/org/apache/calcite/linq4j/Enumerator.java index e026ed33022d..bb49d210b169 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/Enumerator.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/Enumerator.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j; -import org.checkerframework.framework.qual.Covariant; +import org.jspecify.annotations.Nullable; /** * Supports a simple iteration over a collection. @@ -28,8 +28,7 @@ * * @param Element type */ -@Covariant(0) -public interface Enumerator extends AutoCloseable { +public interface Enumerator extends AutoCloseable { /** * Gets the current element in the collection. * diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedEnumerable.java b/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedEnumerable.java index 362372464ac4..be0169e35571 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedEnumerable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedEnumerable.java @@ -16,6 +16,7 @@ */ package org.apache.calcite.linq4j; +import org.apache.calcite.linq4j.annotations.Contract; import org.apache.calcite.linq4j.function.BigDecimalFunction1; import org.apache.calcite.linq4j.function.DoubleFunction1; import org.apache.calcite.linq4j.function.EqualityComparer; @@ -34,9 +35,7 @@ import org.apache.calcite.linq4j.function.Predicate1; import org.apache.calcite.linq4j.function.Predicate2; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.PolyNull; -import org.checkerframework.framework.qual.Covariant; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.Collection; @@ -49,8 +48,7 @@ * * @param Element type */ -@Covariant(0) -public interface ExtendedEnumerable { +public interface ExtendedEnumerable { /** * Performs an operation for each member of this enumeration. @@ -76,8 +74,9 @@ public interface ExtendedEnumerable { * *

    If {@code seed} is not null, the result is never null. */ - @PolyNull TAccumulate aggregate(@PolyNull TAccumulate seed, - Function2<@PolyNull TAccumulate, TSource, @PolyNull TAccumulate> func); + @Contract("!null, !null -> !null") + @Nullable TAccumulate aggregate(@Nullable TAccumulate seed, + Function2<@Nullable TAccumulate, TSource, @Nullable TAccumulate> func); /** * Applies an accumulator function over a @@ -280,7 +279,7 @@ TResult aggregate(TAccumulate seed, * *

    If {@code value} is not null, the result is never null. */ - Enumerable<@PolyNull TSource> defaultIfEmpty(@PolyNull TSource value); + Enumerable<@Nullable TSource> defaultIfEmpty(@Nullable TSource value); /** * Returns distinct elements from a sequence by using @@ -749,7 +748,7 @@ Enumerable correlateLeftMarkJoin( */ Enumerable correlateJoin( JoinType joinType, Function1> inner, - Function2 resultSelector); + Function2 resultSelector); /** * Returns the last element of a sequence. (Defined @@ -957,7 +956,7 @@ Enumerable correlateJoin( * * @return Collection of T2 */ - Enumerable ofType(Class clazz); + Enumerable ofType(Class clazz); /** * Sorts the elements of a sequence in ascending @@ -997,13 +996,14 @@ Enumerable orderByDescending( * Projects each element of a sequence into a new * form. */ - Enumerable select(Function1 selector); + + Enumerable select(Function1 selector); /** * Projects each element of a sequence into a new * form by incorporating the element's index. */ - Enumerable select( + Enumerable select( Function2 selector); /** @@ -1011,7 +1011,7 @@ Enumerable select( * {@code Enumerable} and flattens the resulting sequences into one * sequence. */ - Enumerable selectMany( + Enumerable selectMany( Function1> selector); /** @@ -1020,7 +1020,7 @@ Enumerable selectMany( * sequence. The index of each source element is used in the * projected form of that element. */ - Enumerable selectMany( + Enumerable selectMany( Function2> selector); /** diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedOrderedEnumerable.java b/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedOrderedEnumerable.java index 852b8c671c59..cb6ec685bf67 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedOrderedEnumerable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedOrderedEnumerable.java @@ -18,6 +18,8 @@ import org.apache.calcite.linq4j.function.Function1; +import org.jspecify.annotations.Nullable; + import java.util.Comparator; /** @@ -25,7 +27,8 @@ * * @param Element type */ -public interface ExtendedOrderedEnumerable extends Enumerable { +public interface ExtendedOrderedEnumerable + extends Enumerable { /** * Performs a subsequent ordering of the elements in an * {@link OrderedEnumerable} according to a key, using a specified diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedQueryable.java b/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedQueryable.java index f30b22482b8a..7fb59d19bda3 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedQueryable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedQueryable.java @@ -33,8 +33,7 @@ import org.apache.calcite.linq4j.function.Predicate2; import org.apache.calcite.linq4j.tree.FunctionExpression; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.framework.qual.Covariant; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.Comparator; @@ -44,7 +43,6 @@ * * @param Element type */ -@Covariant(0) interface ExtendedQueryable extends ExtendedEnumerable { /** @@ -447,7 +445,7 @@ Queryable join(Enumerable inner, *

    NOTE: clazz parameter not present in C# LINQ; necessary because of * Java type erasure. */ - @Override Queryable ofType(Class clazz); + @Override Queryable ofType(Class clazz); @Override Queryable cast(Class clazz); @@ -490,7 +488,7 @@ OrderedQueryable orderByDescending( /** * Projects each element of a sequence into a new form. */ - Queryable select( + Queryable select( FunctionExpression> selector); /** @@ -500,7 +498,7 @@ Queryable select( *

    NOTE: Renamed from {@code select} because had same erasure as * {@link #select(org.apache.calcite.linq4j.tree.FunctionExpression)}. */ - Queryable selectN( + Queryable selectN( FunctionExpression> selector); @@ -509,7 +507,7 @@ Queryable selectN( * {@code Enumerable} and combines the resulting sequences into one * sequence. */ - Queryable selectMany( + Queryable selectMany( FunctionExpression>> selector); /** @@ -521,7 +519,7 @@ Queryable selectMany( *

    NOTE: Renamed from {@code selectMany} because had same erasure as * {@link #selectMany(org.apache.calcite.linq4j.tree.FunctionExpression)}. */ - Queryable selectManyN( + Queryable selectManyN( FunctionExpression>> selector); diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/Extensions.java b/linq4j/src/main/java/org/apache/calcite/linq4j/Extensions.java index e7434a252c75..184d52013758 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/Extensions.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/Extensions.java @@ -18,6 +18,8 @@ import org.apache.calcite.linq4j.function.Function2; +import org.jspecify.annotations.Nullable; + import java.math.BigDecimal; import java.util.Comparator; import java.util.Map; @@ -126,35 +128,35 @@ private Extensions() {} (v1, v2) -> v1 + v2; @SuppressWarnings("unchecked") - static final Function2 COMPARABLE_MIN = + static final Function2<@Nullable Comparable, Comparable, Comparable> COMPARABLE_MIN = (v1, v2) -> v1 == null || v1.compareTo(v2) > 0 ? v2 : v1; @SuppressWarnings("unchecked") - static final Function2 COMPARABLE_MAX = + static final Function2<@Nullable Comparable, Comparable, Comparable> COMPARABLE_MAX = (v1, v2) -> v1 == null || v1.compareTo(v2) < 0 ? v2 : v1; - static final Function2 FLOAT_MIN = + static final Function2<@Nullable Float, Float, Float> FLOAT_MIN = (v1, v2) -> v1 == null || v1.compareTo(v2) > 0 ? v2 : v1; - static final Function2 FLOAT_MAX = + static final Function2<@Nullable Float, Float, Float> FLOAT_MAX = (v1, v2) -> v1 == null || v1.compareTo(v2) < 0 ? v2 : v1; - static final Function2 DOUBLE_MIN = + static final Function2<@Nullable Double, Double, Double> DOUBLE_MIN = (v1, v2) -> v1 == null || v1.compareTo(v2) > 0 ? v2 : v1; - static final Function2 DOUBLE_MAX = + static final Function2<@Nullable Double, Double, Double> DOUBLE_MAX = (v1, v2) -> v1 == null || v1.compareTo(v2) < 0 ? v2 : v1; - static final Function2 INTEGER_MIN = + static final Function2<@Nullable Integer, Integer, Integer> INTEGER_MIN = (v1, v2) -> v1 == null || v1.compareTo(v2) > 0 ? v2 : v1; - static final Function2 INTEGER_MAX = + static final Function2<@Nullable Integer, Integer, Integer> INTEGER_MAX = (v1, v2) -> v1 == null || v1.compareTo(v2) < 0 ? v2 : v1; - static final Function2 LONG_MIN = + static final Function2<@Nullable Long, Long, Long> LONG_MIN = (v1, v2) -> v1 == null || v1.compareTo(v2) > 0 ? v2 : v1; - static final Function2 LONG_MAX = + static final Function2<@Nullable Long, Long, Long> LONG_MAX = (v1, v2) -> v1 == null || v1.compareTo(v2) < 0 ? v2 : v1; // flags a piece of code we're yet to implement diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/Grouping.java b/linq4j/src/main/java/org/apache/calcite/linq4j/Grouping.java index aede1d0254f9..f3091afc27dc 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/Grouping.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/Grouping.java @@ -16,15 +16,12 @@ */ package org.apache.calcite.linq4j; -import org.checkerframework.framework.qual.Covariant; - /** * Represents a collection of objects that have a common key. * * @param Key type * @param Element type */ -@Covariant(0) public interface Grouping extends Enumerable { /** * Gets the key of this Grouping. diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/GroupingImpl.java b/linq4j/src/main/java/org/apache/calcite/linq4j/GroupingImpl.java index f294bc2c4036..1a869883ba2c 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/GroupingImpl.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/GroupingImpl.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Map; @@ -29,8 +29,8 @@ * @param Key type * @param Value type */ -@SuppressWarnings("type.argument.type.incompatible") -class GroupingImpl extends AbstractEnumerable +@SuppressWarnings("NullAway") +class GroupingImpl extends AbstractEnumerable implements Grouping, Map.Entry> { private final K key; private final List values; diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/Linq4j.java b/linq4j/src/main/java/org/apache/calcite/linq4j/Linq4j.java index c59303d4fdc0..67dbdc9ade9b 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/Linq4j.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/Linq4j.java @@ -18,7 +18,7 @@ import org.apache.calcite.linq4j.function.Function1; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Method; import java.math.BigDecimal; @@ -127,7 +127,7 @@ public static Enumerator iterableEnumerator( * * @return enumerable */ - public static Enumerable asEnumerable(final List list) { + public static Enumerable asEnumerable(final List list) { return new ListEnumerable<>(list); } @@ -142,7 +142,8 @@ public static Enumerable asEnumerable(final List list) { * * @return enumerable */ - public static Enumerable asEnumerable(final Collection collection) { + public static + Enumerable asEnumerable(final Collection collection) { if (collection instanceof List) { //noinspection unchecked return asEnumerable((List) collection); @@ -161,7 +162,8 @@ public static Enumerable asEnumerable(final Collection collection) { * * @return enumerable */ - public static Enumerable asEnumerable(final Iterable iterable) { + public static + Enumerable asEnumerable(final Iterable iterable) { if (iterable instanceof Collection) { //noinspection unchecked return asEnumerable((Collection) iterable); @@ -177,7 +179,7 @@ public static Enumerable asEnumerable(final Iterable iterable) { * * @return enumerable */ - public static Enumerable asEnumerable(final T[] ts) { + public static Enumerable asEnumerable(final T[] ts) { return new ListEnumerable<>(Arrays.asList(ts)); } @@ -189,7 +191,8 @@ public static Enumerable asEnumerable(final T[] ts) { * * @return Enumerator over the collection */ - public static Enumerator enumerator(Collection values) { + public static Enumerator enumerator( + Collection values) { if (values instanceof List && values instanceof RandomAccess) { //noinspection unchecked return listEnumerator((List) values); @@ -248,7 +251,7 @@ public static Enumerator transform(Enumerator enumerator, * @see #ofType * @see #asEnumerable(Iterable) */ - public static Enumerable cast( + public static Enumerable cast( Iterable source, Class clazz) { return asEnumerable(source).cast(clazz); } @@ -284,7 +287,7 @@ public static Enumerable cast( * @see Enumerable#cast(Class) * @see #cast */ - public static Enumerable ofType( + public static Enumerable ofType( Iterable source, Class clazz) { return asEnumerable(source).ofType(clazz); } @@ -385,13 +388,13 @@ public static Enumerable concat( * * @return Enumerator over the cartesian product */ - public static Enumerator> product( + public static Enumerator> product( List> enumerators) { return new CartesianProductListEnumerator<>(enumerators); } /** Returns the cartesian product of an iterable of iterables. */ - public static Iterable> product( + public static Iterable> product( final Iterable> iterables) { return () -> { final List> enumerators = new ArrayList<>(); @@ -430,7 +433,7 @@ private static void closeIterator(@Nullable Iterator iterator) * * @param element type */ @SuppressWarnings("unchecked") - static class IterableEnumerator implements Enumerator { + static class IterableEnumerator implements Enumerator { private final Iterable iterable; @Nullable Iterator iterator; T current; @@ -448,6 +451,9 @@ static class IterableEnumerator implements Enumerator { return current; } + // NullAway treats the result of `Iterator.next()` as @Nullable once it is + // assigned to a T field, even though T is the field's own type + @SuppressWarnings("NullAway") @Override public boolean moveNext() { if (requireNonNull(iterator, "iterator").hasNext()) { current = iterator.next(); @@ -555,7 +561,7 @@ protected Collection getCollection() { return getCollection().size(); } - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") @Override public boolean contains(T element) { return getCollection().contains(element); } @@ -664,7 +670,9 @@ private static class SingletonEnumerator implements Enumerator { /** Enumerator that returns one null element. * * @param element type */ - private static class SingletonNullEnumerator<@Nullable E> implements Enumerator { + @SuppressWarnings("NullAway") // only meaningful when E is instantiated nullable + private static class SingletonNullEnumerator + implements Enumerator { int i = 0; @Override public E current() { diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/Lookup.java b/linq4j/src/main/java/org/apache/calcite/linq4j/Lookup.java index 1ab339a76731..47fcf1928c88 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/Lookup.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/Lookup.java @@ -18,6 +18,8 @@ import org.apache.calcite.linq4j.function.Function2; +import org.jspecify.annotations.Nullable; + import java.util.Map; /** @@ -37,6 +39,6 @@ public interface Lookup * * @return Enumerable over results */ - Enumerable applyResultSelector( + Enumerable applyResultSelector( Function2, TResult> resultSelector); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/LookupImpl.java b/linq4j/src/main/java/org/apache/calcite/linq4j/LookupImpl.java index 7d2a83821389..3e3c5a841bdd 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/LookupImpl.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/LookupImpl.java @@ -18,8 +18,7 @@ import org.apache.calcite.linq4j.function.Function2; -import org.checkerframework.checker.nullness.qual.KeyFor; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.AbstractCollection; import java.util.AbstractMap; @@ -84,7 +83,7 @@ class LookupImpl extends AbstractEnumerable> return map.isEmpty(); } - @SuppressWarnings("contracts.conditional.postcondition.not.satisfied") + @SuppressWarnings("NullAway") @Override public boolean containsKey(@Nullable Object key) { return map.containsKey(key); } @@ -100,7 +99,7 @@ class LookupImpl extends AbstractEnumerable> return list == null ? null : Linq4j.asEnumerable(list); } - @SuppressWarnings("contracts.postcondition.not.satisfied") + @SuppressWarnings("NullAway") @Override public @Nullable Enumerable put(K key, Enumerable value) { final List list = map.put(key, value.toList()); return list == null ? null : Linq4j.asEnumerable(list); @@ -121,8 +120,8 @@ class LookupImpl extends AbstractEnumerable> map.clear(); } - @SuppressWarnings("return.type.incompatible") - @Override public Set<@KeyFor("this") K> keySet() { + @SuppressWarnings("NullAway") + @Override public Set keySet() { return map.keySet(); } @@ -153,9 +152,9 @@ class LookupImpl extends AbstractEnumerable> }; } - @SuppressWarnings("return.type.incompatible") - @Override public Set>> entrySet() { - final Set>> entries = map.entrySet(); + @SuppressWarnings("NullAway") + @Override public Set>> entrySet() { + final Set>> entries = map.entrySet(); return new AbstractSet>>() { @Override public Iterator>> iterator() { final Iterator>> iterator = entries.iterator(); @@ -182,7 +181,7 @@ class LookupImpl extends AbstractEnumerable> }; } - @Override public Enumerable applyResultSelector( + @Override public Enumerable applyResultSelector( final Function2, TResult> resultSelector) { return new AbstractEnumerable() { @Override public Enumerator enumerator() { diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/MemoryEnumerator.java b/linq4j/src/main/java/org/apache/calcite/linq4j/MemoryEnumerator.java index c09661cde38b..feaafd5371e4 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/MemoryEnumerator.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/MemoryEnumerator.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.concurrent.atomic.AtomicInteger; @@ -25,7 +25,8 @@ * * @param Row value */ -public class MemoryEnumerator<@Nullable E> implements Enumerator> { +public class MemoryEnumerator + implements Enumerator> { private final Enumerator enumerator; private final MemoryFactory memoryFactory; private final AtomicInteger prevCounter; diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/MemoryFactory.java b/linq4j/src/main/java/org/apache/calcite/linq4j/MemoryFactory.java index 421a52a98d7b..f6e759e4d958 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/MemoryFactory.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/MemoryFactory.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Arrays; @@ -26,7 +26,7 @@ * * @param Type of the base Object */ -public class MemoryFactory { +public class MemoryFactory { private final int history; private final int future; @@ -42,7 +42,7 @@ public MemoryFactory(int history, int future) { this.offset = new ModularInteger(0, history + future + 1); } - public void add(E current) { + public void add(@Nullable E current) { values[offset.get()] = current; this.offset = offset.plus(1); } @@ -61,7 +61,7 @@ public Memory create() { * * @param Row type */ - public static class Memory { + public static class Memory { private final int history; private final int future; private final ModularInteger offset; @@ -79,11 +79,11 @@ public Memory(int history, int future, return Arrays.toString(this.values); } - public E get() { + public @Nullable E get() { return get(0); } - public E get(int position) { + public @Nullable E get(int position) { if (position < 0 && position < -1 * history) { throw new IllegalArgumentException("History can only go back " + history + " points in time, you wanted " + Math.abs(position)); diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/MergeUnionEnumerator.java b/linq4j/src/main/java/org/apache/calcite/linq4j/MergeUnionEnumerator.java index d708f67858c3..fc320e96237d 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/MergeUnionEnumerator.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/MergeUnionEnumerator.java @@ -19,9 +19,7 @@ import org.apache.calcite.linq4j.function.EqualityComparer; import org.apache.calcite.linq4j.function.Function1; -import org.checkerframework.checker.initialization.qual.UnknownInitialization; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.RequiresNonNull; +import org.jspecify.annotations.Nullable; import java.util.Comparator; import java.util.HashSet; @@ -87,9 +85,7 @@ final class MergeUnionEnumerator implements Enumerator { initEnumerators(); } - @RequiresNonNull("inputs") - @SuppressWarnings("method.invocation.invalid") - private void initEnumerators(@UnknownInitialization MergeUnionEnumerator this) { + private void initEnumerators() { for (int i = 0; i < inputs.length; i++) { moveEnumerator(i); } @@ -114,7 +110,7 @@ private boolean checkNotDuplicated(TSource value) { } // check duplicates - @SuppressWarnings("dereference.of.nullable") + @SuppressWarnings("NullAway") final EnumerableDefaults.Wrapped wrapped = wrapper.apply(value); if (!processed.contains(wrapped)) { final TKey key = sortKeySelector.apply(value); @@ -122,7 +118,7 @@ private boolean checkNotDuplicated(TSource value) { // Since inputs are sorted, we do not need to keep in the set all the items that we // have previously returned, just the ones with the same key, as soon as we see a new // key, we can clear the set containing the items belonging to the previous key - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") final int sortComparison = sortComparator.compare(key, currentKeyInProcessedSet); if (sortComparison != 0) { processed.clear(); diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/ModularInteger.java b/linq4j/src/main/java/org/apache/calcite/linq4j/ModularInteger.java index 638b1f5f913c..1bc7d02260d5 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/ModularInteger.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/ModularInteger.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static com.google.common.base.Preconditions.checkArgument; diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/Nullness.java b/linq4j/src/main/java/org/apache/calcite/linq4j/Nullness.java index 55cf8c4f694c..b3f7f6ee07d8 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/Nullness.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/Nullness.java @@ -16,11 +16,8 @@ */ package org.apache.calcite.linq4j; -import org.checkerframework.checker.initialization.qual.UnderInitialization; -import org.checkerframework.checker.nullness.qual.EnsuresNonNull; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.dataflow.qual.Pure; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -28,10 +25,11 @@ * The methods in this class allow to cast nullable reference to a non-nullable one. * This is an internal class, and it is not meant to be used as a public API. * - *

    The class enables to remove checker-qual runtime dependency, and helps IDEs to see - * the resulting types of {@code castNonNull} better. + *

    The class keeps the nullness annotations out of the runtime dependencies, and helps IDEs + * to see the resulting types of {@code castNonNull} better. NullAway is configured to treat + * {@code castNonNull} as its {@code CastToNonNullMethod}, so it reports a call whose argument is + * already non-null. */ -@SuppressWarnings({"cast.unsafe", "RedundantCast", "contracts.postcondition.not.satisfied"}) public class Nullness { private Nullness() { } @@ -56,8 +54,8 @@ private Nullness() { * T get() { return value; } * * - *

    The issue is checkerframework does not permit that because {@code T} - * has unknown nullability, so the following needs to be used: + *

    The issue is that {@code T} has unknown nullability, so the following needs to be + * used: * *

    
        * T get() { return castNonNull(value); }
    @@ -68,10 +66,8 @@ private Nullness() {
        *
        * @return the argument, cast to have the type qualifier @NonNull
        */
    -  @Pure
    -  public static @EnsuresNonNull("#1")
    -   @NonNull T castNonNull(
    -      @Nullable T ref) {
    +  @SuppressWarnings({"NullAway", "RedundantCast"})
    +  public static  @NonNull T castNonNull(@Nullable T ref) {
         //noinspection ConstantConditions
         return (@NonNull T) ref;
       }
    @@ -85,8 +81,7 @@ private Nullness() {
        * @return the argument, cast so that elements are @NonNull
        */
       @SuppressWarnings({"unchecked", "ConstantConditions"})
    -  @Pure
    -  public static  @NonNull T[] castNonNullArray(
    +  public static  @NonNull T[] castNonNullArray(
           @Nullable T[] ts) {
         return (@NonNull T []) (Object) ts;
       }
    @@ -100,26 +95,23 @@ private Nullness() {
        * @return the argument, cast so that elements are @NonNull
        */
       @SuppressWarnings({"unchecked", "rawtypes"})
    -  @Pure
    -  public static  List<@NonNull T> castNonNullList(
    +  public static  List<@NonNull T> castNonNullList(
           List ts) {
         return (List) (Object) ts;
       }
     
       /**
    -   * Allows you to treat an uninitialized or under-initialization object as
    -   * initialized with no assertions.
    +   * Allows you to pass a partly constructed object where a fully constructed one is expected.
        *
        * @param      The type of the reference
    -   * @param ref     A reference that was @Uninitialized at some point but is
    -   *                now fully initialized
    +   * @param ref     A reference that is still under construction but is fully initialized by the
    +   *                time the callee uses it
        *
    -   * @return the argument, cast to have type qualifier @Initialized
    +   * @return the argument
        */
       @SuppressWarnings({"unchecked"})
    -  @Pure
    -  public static  T castToInitialized(@UnderInitialization T ref) {
    -    // To throw CheckerFramework off the scent, we put the object into an array,
    +  public static  T castToInitialized(T ref) {
    +    // To throw the nullness checker off the scent, we put the object into an array,
         // cast the array to an Object, and cast back to an array.
         Object src = new Object[] {ref};
         Object[] dest = (Object[]) src;
    diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/Ord.java b/linq4j/src/main/java/org/apache/calcite/linq4j/Ord.java
    index f30c7ba25643..1428cc239965 100644
    --- a/linq4j/src/main/java/org/apache/calcite/linq4j/Ord.java
    +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/Ord.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.AbstractList;
     import java.util.Iterator;
    @@ -33,7 +33,7 @@
      *
      * @param  Element type
      */
    -public class Ord implements Map.Entry {
    +public class Ord implements Map.Entry {
       public final int i;
       public final E e;
     
    @@ -48,7 +48,7 @@ public Ord(int i, E e) {
       /**
        * Creates an Ord.
        */
    -  public static  Ord of(int n, E e) {
    +  public static  Ord of(int n, E e) {
         return new Ord<>(n, e);
       }
     
    @@ -66,14 +66,16 @@ public static  Ord of(int n, E e) {
       /**
        * Creates an iterable of {@code Ord}s over an iterable.
        */
    -  public static  Iterable> zip(final Iterable iterable) {
    +  public static 
    +      Iterable> zip(final Iterable iterable) {
         return () -> zip(iterable.iterator());
       }
     
       /**
        * Creates an iterator of {@code Ord}s over an iterator.
        */
    -  public static  Iterator> zip(final Iterator iterator) {
    +  public static 
    +      Iterator> zip(final Iterator iterator) {
         return new Iterator>() {
           int n = 0;
     
    @@ -81,6 +83,9 @@ public static  Iterator> zip(final Iterator iterator) {
             return iterator.hasNext();
           }
     
    +      // next() on an Iterator reads as @Nullable E when E has a nullable
    +      // upper bound. https://github.com/uber/NullAway/issues/1727
    +      @SuppressWarnings("NullAway")
           @Override public Ord next() {
             return Ord.of(n++, iterator.next());
           }
    @@ -94,14 +99,14 @@ public static  Iterator> zip(final Iterator iterator) {
       /**
        * Returns a numbered list based on an array.
        */
    -  public static  List> zip(final E[] elements) {
    +  public static  List> zip(final E[] elements) {
         return new OrdArrayList<>(elements);
       }
     
       /**
        * Returns a numbered list.
        */
    -  public static  List> zip(final List elements) {
    +  public static  List> zip(final List elements) {
         return elements instanceof RandomAccess
             ? new OrdRandomAccessList<>(elements)
             : new OrdList<>(elements);
    @@ -114,7 +119,7 @@ public static  List> zip(final List elements) {
        * (0, "a").
        */
       @SafeVarargs // heap pollution is not possible because we only read
    -  public static  Iterable> reverse(E... elements) {
    +  public static  Iterable> reverse(E... elements) {
         return reverse(ImmutableList.copyOf(elements));
       }
     
    @@ -124,7 +129,8 @@ public static  Iterable> reverse(E... elements) {
        * 

    Given the list ["a", "b", "c"], returns (2, "c") then (1, "b") then * (0, "a"). */ - public static Iterable> reverse(Iterable elements) { + public static + Iterable> reverse(Iterable elements) { final ImmutableList elementList = ImmutableList.copyOf(elements); return () -> new Iterator>() { int i = elementList.size() - 1; diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/OrderedEnumerable.java b/linq4j/src/main/java/org/apache/calcite/linq4j/OrderedEnumerable.java index 1634f23412d0..03cd06c7ef39 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/OrderedEnumerable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/OrderedEnumerable.java @@ -16,12 +16,14 @@ */ package org.apache.calcite.linq4j; +import org.jspecify.annotations.Nullable; + /** * Represents the result of applying a sorting operation to an * {@link org.apache.calcite.linq4j.Enumerable}. * * @param element type */ -public interface OrderedEnumerable +public interface OrderedEnumerable extends Enumerable, ExtendedOrderedEnumerable { } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/Queryable.java b/linq4j/src/main/java/org/apache/calcite/linq4j/Queryable.java index a1eb8f4c16b4..b49833140ec8 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/Queryable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/Queryable.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j; -import org.checkerframework.framework.qual.Covariant; +import org.jspecify.annotations.Nullable; /** * Provides functionality to evaluate queries against a specific data source @@ -26,6 +26,6 @@ * * @param Element type */ -@Covariant(0) -public interface Queryable extends RawQueryable, ExtendedQueryable { +public interface Queryable + extends RawQueryable, ExtendedQueryable { } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/QueryableDefaults.java b/linq4j/src/main/java/org/apache/calcite/linq4j/QueryableDefaults.java index e3d96a3aec62..d35de9c3b056 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/QueryableDefaults.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/QueryableDefaults.java @@ -36,7 +36,7 @@ import org.apache.calcite.linq4j.tree.Expressions; import org.apache.calcite.linq4j.tree.FunctionExpression; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.math.BigDecimal; @@ -685,7 +685,7 @@ public static TResult min(Queryable queryable, *

    NOTE: clazz parameter not present in C# LINQ; necessary because of * Java type erasure. */ - public static Queryable ofType(Queryable queryable, + public static Queryable ofType(Queryable queryable, Class clazz) { throw Extensions.todo(); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/QueryableFactory.java b/linq4j/src/main/java/org/apache/calcite/linq4j/QueryableFactory.java index 2207c64db34f..27357d88fded 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/QueryableFactory.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/QueryableFactory.java @@ -33,9 +33,7 @@ import org.apache.calcite.linq4j.function.Predicate2; import org.apache.calcite.linq4j.tree.FunctionExpression; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.PolyNull; -import org.checkerframework.framework.qual.Covariant; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.Comparator; @@ -45,7 +43,6 @@ * * @param Element type */ -@Covariant(0) public interface QueryableFactory { /** @@ -215,7 +212,7 @@ boolean contains(Queryable source, T element, * *

    If {@code value} is not null, the result is never null. */ - Queryable<@PolyNull T> defaultIfEmpty(Queryable source, @PolyNull T value); + Queryable<@Nullable T> defaultIfEmpty(Queryable source, @Nullable T value); /** * Returns distinct elements from a sequence by using @@ -526,7 +523,7 @@ > TResult min(Queryable source, * Filters the elements of an IQueryable based on a * specified type. */ - Queryable ofType(Queryable source, + Queryable ofType(Queryable source, Class clazz); Queryable cast(Queryable source, Class clazz); @@ -569,14 +566,14 @@ OrderedQueryable orderByDescending(Queryable source, /** * Projects each element of a sequence into a new form. */ - Queryable select(Queryable source, + Queryable select(Queryable source, FunctionExpression> selector); /** * Projects each element of a sequence into a new * form by incorporating the element's index. */ - Queryable selectN(Queryable source, + Queryable selectN(Queryable source, FunctionExpression> selector); @@ -585,7 +582,7 @@ Queryable selectN(Queryable source, * {@code Enumerable} and combines the resulting sequences into one * sequence. */ - Queryable selectMany(Queryable source, + Queryable selectMany(Queryable source, FunctionExpression>> selector); /** @@ -594,7 +591,7 @@ Queryable selectMany(Queryable source, * sequence. The index of each source element is used in the * projected form of that element. */ - Queryable selectManyN(Queryable source, + Queryable selectManyN(Queryable source, FunctionExpression>> selector); /** diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/QueryableRecorder.java b/linq4j/src/main/java/org/apache/calcite/linq4j/QueryableRecorder.java index 8e0dd8f3a33e..c3b7cb615e97 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/QueryableRecorder.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/QueryableRecorder.java @@ -33,9 +33,7 @@ import org.apache.calcite.linq4j.function.Predicate2; import org.apache.calcite.linq4j.tree.FunctionExpression; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.PolyNull; -import org.checkerframework.framework.qual.Covariant; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.math.BigDecimal; @@ -53,7 +51,6 @@ * * @param Element type */ -@Covariant(0) public class QueryableRecorder implements QueryableFactory { private static final QueryableRecorder INSTANCE = new QueryableRecorder(); @@ -260,6 +257,7 @@ public static QueryableRecorder instance() { }.castSingle(); // CHECKSTYLE: IGNORE 0 } + @SuppressWarnings("NullAway") @Override public Queryable<@Nullable T> defaultIfEmpty(final Queryable source) { return new NonLeafReplayableQueryable(source) { @Override public void replay(QueryableFactory factory) { @@ -268,9 +266,9 @@ public static QueryableRecorder instance() { }; } - @SuppressWarnings("return.type.incompatible") - @Override public Queryable<@PolyNull T> defaultIfEmpty(final Queryable source, - final @PolyNull T value) { + @SuppressWarnings("NullAway") + @Override public Queryable<@Nullable T> defaultIfEmpty(final Queryable source, + final @Nullable T value) { return new NonLeafReplayableQueryable(source) { @Override public void replay(QueryableFactory factory) { factory.defaultIfEmpty(source, value); @@ -632,7 +630,8 @@ public static QueryableRecorder instance() { }.castSingle(); // CHECKSTYLE: IGNORE 0 } - @Override public Queryable ofType(final Queryable source, + @Override public + Queryable ofType(final Queryable source, final Class clazz) { return new NonLeafReplayableQueryable(source) { @Override public void replay(QueryableFactory factory) { @@ -689,7 +688,8 @@ public static QueryableRecorder instance() { }; } - @Override public Queryable select(final Queryable source, + @Override public + Queryable select(final Queryable source, final FunctionExpression> selector) { return new NonLeafReplayableQueryable(source) { @Override public void replay(QueryableFactory factory) { @@ -702,7 +702,8 @@ public static QueryableRecorder instance() { }.castQueryable(); // CHECKSTYLE: IGNORE 0 } - @Override public Queryable selectN(final Queryable source, + @Override public + Queryable selectN(final Queryable source, final FunctionExpression> selector) { return new NonLeafReplayableQueryable(source) { @Override public void replay(QueryableFactory factory) { @@ -711,7 +712,8 @@ public static QueryableRecorder instance() { }.castQueryable(); // CHECKSTYLE: IGNORE 0 } - @Override public Queryable selectMany(final Queryable source, + @Override public + Queryable selectMany(final Queryable source, final FunctionExpression>> selector) { return new NonLeafReplayableQueryable(source) { @Override public void replay(QueryableFactory factory) { @@ -720,7 +722,8 @@ public static QueryableRecorder instance() { }.castQueryable(); // CHECKSTYLE: IGNORE 0 } - @Override public Queryable selectManyN(final Queryable source, + @Override public + Queryable selectManyN(final Queryable source, final FunctionExpression>> selector) { return new NonLeafReplayableQueryable(source) { diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/RawEnumerable.java b/linq4j/src/main/java/org/apache/calcite/linq4j/RawEnumerable.java index b77a0f179838..9f83e9eab29f 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/RawEnumerable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/RawEnumerable.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j; -import org.checkerframework.framework.qual.Covariant; +import org.jspecify.annotations.Nullable; /** * Exposes the enumerator, which supports a simple iteration over a collection, @@ -31,8 +31,7 @@ * @param Element type * @see Enumerable */ -@Covariant(0) -public interface RawEnumerable { +public interface RawEnumerable { /** * Returns an enumerator that iterates through a collection. */ diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/RawQueryable.java b/linq4j/src/main/java/org/apache/calcite/linq4j/RawQueryable.java index 05ecf85692aa..107c85529196 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/RawQueryable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/RawQueryable.java @@ -18,8 +18,7 @@ import org.apache.calcite.linq4j.tree.Expression; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.framework.qual.Covariant; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; @@ -32,7 +31,6 @@ * * @param Element type */ -@Covariant(0) public interface RawQueryable extends Enumerable { /** * Gets the type of the element(s) that are returned when the expression diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/annotations/Contract.java b/linq4j/src/main/java/org/apache/calcite/linq4j/annotations/Contract.java new file mode 100644 index 000000000000..6dcf274db197 --- /dev/null +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/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.linq4j.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/Ordering.astub b/linq4j/src/main/java/org/apache/calcite/linq4j/annotations/EnsuresNonNull.java similarity index 51% rename from src/main/config/checkerframework/guava/Ordering.astub rename to linq4j/src/main/java/org/apache/calcite/linq4j/annotations/EnsuresNonNull.java index 820a66856bb5..2a59fa83a2bc 100644 --- a/src/main/config/checkerframework/guava/Ordering.astub +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/annotations/EnsuresNonNull.java @@ -14,19 +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.linq4j.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 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 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/linq4j/src/main/java/org/apache/calcite/linq4j/annotations/EnsuresNonNullIf.java b/linq4j/src/main/java/org/apache/calcite/linq4j/annotations/EnsuresNonNullIf.java new file mode 100644 index 000000000000..024432d532ed --- /dev/null +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/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.linq4j.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/Iterables.astub b/linq4j/src/main/java/org/apache/calcite/linq4j/annotations/MonotonicNonNull.java similarity index 53% rename from src/main/config/checkerframework/guava/Iterables.astub rename to linq4j/src/main/java/org/apache/calcite/linq4j/annotations/MonotonicNonNull.java index db302664618d..63452b3fe7ac 100644 --- a/src/main/config/checkerframework/guava/Iterables.astub +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/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.collect; +package org.apache.calcite.linq4j.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 class Iterables { - public static T[] toArray(Iterable iterable, Class type); +@Documented +@Retention(RetentionPolicy.CLASS) +@Target({ElementType.FIELD, ElementType.TYPE_USE}) +public @interface MonotonicNonNull { } diff --git a/src/main/config/checkerframework/guava/Predicate.astub b/linq4j/src/main/java/org/apache/calcite/linq4j/annotations/RequiresNonNull.java similarity index 50% rename from src/main/config/checkerframework/guava/Predicate.astub rename to linq4j/src/main/java/org/apache/calcite/linq4j/annotations/RequiresNonNull.java index 577f270e38b5..22e33f2e0ca7 100644 --- a/src/main/config/checkerframework/guava/Predicate.astub +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/annotations/RequiresNonNull.java @@ -14,16 +14,27 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.common.base; +package org.apache.calcite.linq4j.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 + *

    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 interface Predicate { - boolean apply(T input); +@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/linq4j/src/main/java/org/apache/calcite/linq4j/annotations/package-info.java b/linq4j/src/main/java/org/apache/calcite/linq4j/annotations/package-info.java new file mode 100644 index 000000000000..09597c86bed9 --- /dev/null +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/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.linq4j.annotations; + +import org.jspecify.annotations.NullMarked; diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/function/EqualityComparer.java b/linq4j/src/main/java/org/apache/calcite/linq4j/function/EqualityComparer.java index 11a91672e05e..5581f25e7874 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/function/EqualityComparer.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/function/EqualityComparer.java @@ -16,12 +16,14 @@ */ package org.apache.calcite.linq4j.function; +import org.jspecify.annotations.Nullable; + /** * Compares values for equality. * * @param Value type */ -public interface EqualityComparer { +public interface EqualityComparer { boolean equal(T v1, T v2); int hashCode(T t); diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/function/Function0.java b/linq4j/src/main/java/org/apache/calcite/linq4j/function/Function0.java index 2385a7637592..59c70c188d5f 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/function/Function0.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/function/Function0.java @@ -16,11 +16,13 @@ */ package org.apache.calcite.linq4j.function; +import org.jspecify.annotations.Nullable; + /** * Function with no parameters. * * @param Result type */ -public interface Function0 extends Function { +public interface Function0 extends Function { R apply(); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/function/Function1.java b/linq4j/src/main/java/org/apache/calcite/linq4j/function/Function1.java index e76d430be3e4..641494fc7759 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/function/Function1.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/function/Function1.java @@ -16,13 +16,16 @@ */ package org.apache.calcite.linq4j.function; +import org.jspecify.annotations.Nullable; + /** * Function with one parameter. * * @param Result type * @param Type of parameter 0 */ -public interface Function1 extends Function { +public interface Function1 + extends Function { /** * The identity function. * diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/function/Function2.java b/linq4j/src/main/java/org/apache/calcite/linq4j/function/Function2.java index a2ab26ac2f4b..623a18c91f19 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/function/Function2.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/function/Function2.java @@ -16,6 +16,8 @@ */ package org.apache.calcite.linq4j.function; +import org.jspecify.annotations.Nullable; + /** * Function with two parameters. * @@ -23,6 +25,7 @@ * @param Type of argument #0 * @param Type of argument #1 */ -public interface Function2 extends Function { +public interface Function2 extends Function { R apply(T0 v0, T1 v1); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/function/Functions.java b/linq4j/src/main/java/org/apache/calcite/linq4j/function/Functions.java index 89ee4699e1e4..c1088f8b170e 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/function/Functions.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/function/Functions.java @@ -16,9 +16,7 @@ */ package org.apache.calcite.linq4j.function; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.framework.qual.DefaultQualifier; -import org.checkerframework.framework.qual.TypeUseLocation; +import org.jspecify.annotations.Nullable; import java.io.Serializable; import java.lang.reflect.Type; @@ -376,7 +374,7 @@ public static boolean all(List list, /** Returns a list generated by applying a function to each index between * 0 and {@code size} - 1. */ - public static List generate(final int size, + public static List generate(final int size, final IntFunction fn) { if (size < 0) { throw new IllegalArgumentException(); @@ -415,7 +413,8 @@ public static Function1 ignore1() { * @param Type of parameter 1 * @return Function that does nothing. */ - public static Function2 ignore2() { + public static Function2 ignore2() { //noinspection unchecked return Ignore.INSTANCE; } @@ -716,7 +715,8 @@ private static class NullsFirstReverseComparator } } - public static int compareLists(List b0, List b1) { + public static int compareLists(List b0, + List b1) { if (b0 == b1) { return 0; } @@ -737,7 +737,8 @@ public static int compareLists(List b0, List b1) { * *

    Entries are compared in a canonical order, sorted by key and then by value. */ - public static int compareMaps(Map b0, Map b1) { + public static int compareMaps(Map b0, + Map b1) { if (b0 == b1) { return 0; } @@ -859,7 +860,8 @@ private static class NullsLastReverseComparator * @param result type * @param first argument type * @param second argument type */ - private static final class Ignore<@Nullable R, T0, T1> + @SuppressWarnings("NullAway") // only meaningful when R is instantiated nullable + private static final class Ignore implements Function0, Function1, Function2 { @Override public R apply() { return null; @@ -873,12 +875,6 @@ private static final class Ignore<@Nullable R, T0, T1> return null; } - @DefaultQualifier( - value = Nullable.class, - locations = { - TypeUseLocation.LOWER_BOUND, - TypeUseLocation.UPPER_BOUND, - }) static final Ignore INSTANCE = new Ignore<>(); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/function/package-info.java b/linq4j/src/main/java/org/apache/calcite/linq4j/function/package-info.java index eff40384c80b..4736e21bb0d8 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/function/package-info.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/function/package-info.java @@ -18,4 +18,7 @@ /** * Contains definitions of functions and predicates. */ +@NullMarked package org.apache.calcite.linq4j.function; + +import org.jspecify.annotations.NullMarked; diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/package-info.java b/linq4j/src/main/java/org/apache/calcite/linq4j/package-info.java index 726df9815271..7c62e2bc2468 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/package-info.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/package-info.java @@ -18,11 +18,7 @@ /** * Language-integrated query for Java (linq4j) main package. */ -@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.linq4j; -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/linq4j/src/main/java/org/apache/calcite/linq4j/tree/AbstractNode.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/AbstractNode.java index a60241123862..348a9d556e23 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/AbstractNode.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/AbstractNode.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.util.Objects; diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ArrayLengthRecordField.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ArrayLengthRecordField.java index 5780054c4eb2..adeb36e1eeaa 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ArrayLengthRecordField.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ArrayLengthRecordField.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Array; import java.lang.reflect.Type; diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/BinaryExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/BinaryExpression.java index 495ef3517953..67c14f8202d5 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/BinaryExpression.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/BinaryExpression.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.util.Objects; @@ -46,7 +46,7 @@ public class BinaryExpression extends Expression { return visitor.visit(this, expression0, expression1); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/BlockBuilder.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/BlockBuilder.java index 5d811ea68c02..0ed4846a3cd3 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/BlockBuilder.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/BlockBuilder.java @@ -16,8 +16,9 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.PolyNull; +import org.apache.calcite.linq4j.annotations.Contract; + +import org.jspecify.annotations.Nullable; import java.lang.reflect.Modifier; import java.lang.reflect.Type; @@ -201,7 +202,8 @@ public Expression append(String name, Expression expression) { * Appends an expression to a list of statements if it is not null, * and returns the expression. */ - public @PolyNull Expression appendIfNotNull(String name, @PolyNull Expression expression) { + @Contract("_, !null -> !null") + public @Nullable Expression appendIfNotNull(String name, @Nullable Expression expression) { if (expression == null) { return null; } @@ -604,7 +606,7 @@ private static class InlineVariableVisitor extends SubstituteVariableVisitor { } /** Use counter. */ - private static class UseCounter extends VisitorImpl { + private static class UseCounter extends VisitorImpl<@Nullable Void> { /** Map each parameter to information about how it is used. */ private final IdentityHashMap map = new IdentityHashMap<>(); /** Whether the node being visited is evaluated only if some other diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/BlockStatement.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/BlockStatement.java index b55908ec00bf..d8cf6abe7567 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/BlockStatement.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/BlockStatement.java @@ -16,8 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.initialization.qual.UnderInitialization; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.util.HashSet; @@ -43,7 +42,6 @@ public class BlockStatement extends Statement { } private boolean distinctVariables( - @UnderInitialization(BlockStatement.class) BlockStatement this, boolean fail) { Set names = new HashSet<>(); for (Statement statement : statements) { @@ -65,7 +63,7 @@ private boolean distinctVariables( return shuttle.visit(this, newStatements); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/CatchBlock.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/CatchBlock.java index 21aff57d96f7..08430d1ed11f 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/CatchBlock.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/CatchBlock.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Objects; diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ClassDeclaration.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ClassDeclaration.java index 184961e354f1..02ff51b05cd2 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ClassDeclaration.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ClassDeclaration.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Modifier; import java.lang.reflect.Type; @@ -69,7 +69,7 @@ public ClassDeclaration(int modifier, String name, @Nullable Type extended, return shuttle.visit(this, members1); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ClassDeclarationFinder.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ClassDeclarationFinder.java index b95253477292..7c725686b808 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ClassDeclarationFinder.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ClassDeclarationFinder.java @@ -18,7 +18,7 @@ import org.apache.calcite.linq4j.function.Function1; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConditionalExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConditionalExpression.java index 6fbcc1ef1f3e..34993a8739d3 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConditionalExpression.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConditionalExpression.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.util.List; @@ -43,7 +43,7 @@ public ConditionalExpression(List expressionList, Type type) { this.expressionList = requireNonNull(expressionList, "expressionList"); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConditionalStatement.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConditionalStatement.java index c061c4fbe3a6..cb25ab1a65b9 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConditionalStatement.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConditionalStatement.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Objects; @@ -48,7 +48,7 @@ public ConditionalStatement(List expressionList) { return shuttle.visit(this, list); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConstantExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConstantExpression.java index 73002c0e1432..6bfe8677f4c4 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConstantExpression.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConstantExpression.java @@ -18,7 +18,7 @@ import org.apache.calcite.linq4j.util.Compatible; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Constructor; import java.lang.reflect.Field; @@ -69,7 +69,7 @@ public ConstantExpression(Type type, @Nullable Object value) { return shuttle.visit(this); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } @@ -227,7 +227,7 @@ private static ExpressionWriter write(ExpressionWriter writer, writer.append("new ").append(value.getClass()); list(writer, Arrays.stream(classFields) - // <@Nullable Object> is needed for CheckerFramework + // the witness keeps the element type nullable; getFieldValue may return null .<@Nullable Object>map(field -> getFieldValue(value, field)) .collect(Collectors.toList()), "(\n", ",\n", ")"); diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConstantUntypedNull.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConstantUntypedNull.java index 204f82d8e901..d435ae839b3a 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConstantUntypedNull.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConstantUntypedNull.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Represents a constant null of unknown type diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConstructorDeclaration.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConstructorDeclaration.java index 10d61963c2eb..61298d1e61f4 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConstructorDeclaration.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConstructorDeclaration.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Modifier; import java.lang.reflect.Type; @@ -52,7 +52,7 @@ public ConstructorDeclaration(int modifier, Type declaredAgainst, return shuttle.visit(this, body); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/DeclarationStatement.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/DeclarationStatement.java index 3795df638658..82598c00ecfa 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/DeclarationStatement.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/DeclarationStatement.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Modifier; import java.util.Objects; @@ -48,7 +48,7 @@ public DeclarationStatement(int modifiers, ParameterExpression parameter, return shuttle.visit(this, initializer); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/DefaultExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/DefaultExpression.java index 93fca6aad6dd..05c44100f48a 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/DefaultExpression.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/DefaultExpression.java @@ -16,6 +16,8 @@ */ package org.apache.calcite.linq4j.tree; +import org.jspecify.annotations.Nullable; + /** * Represents the default value of a type or an empty expression. */ @@ -28,7 +30,7 @@ public DefaultExpression(Class type) { return shuttle.visit(this); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/DeterministicCodeOptimizer.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/DeterministicCodeOptimizer.java index 453fa69addec..b182ee968a9f 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/DeterministicCodeOptimizer.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/DeterministicCodeOptimizer.java @@ -21,7 +21,7 @@ import com.google.common.collect.ImmutableSet; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Constructor; import java.lang.reflect.Method; diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/DynamicExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/DynamicExpression.java index 1bba6b3a3978..4c1ef5f8b1c4 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/DynamicExpression.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/DynamicExpression.java @@ -16,6 +16,8 @@ */ package org.apache.calcite.linq4j.tree; +import org.jspecify.annotations.Nullable; + /** * Represents a dynamic operation. */ @@ -28,7 +30,7 @@ public DynamicExpression(Class type) { return shuttle.visit(this); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Evaluator.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Evaluator.java index f6cc41b7dd2c..164a3531fdb2 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Evaluator.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Evaluator.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ExpressionType.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ExpressionType.java index bcc87c480af5..7b0668f3978b 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ExpressionType.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ExpressionType.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** Analogous to LINQ's System.Linq.Expressions.ExpressionType. */ public enum ExpressionType { diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ExpressionWriter.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ExpressionWriter.java index 8bc640bac6e4..616814ba6408 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ExpressionWriter.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ExpressionWriter.java @@ -18,7 +18,7 @@ import org.apache.calcite.avatica.util.Spacer; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.util.Iterator; diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Expressions.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Expressions.java index 5ba55093b651..6bdb4d30e8f5 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Expressions.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Expressions.java @@ -26,7 +26,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.Field; @@ -2754,7 +2754,7 @@ public static BinaryExpression subtractChecked(Expression left, * Creates a SwitchExpression that represents a switch statement * without a default case. */ - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") public static SwitchStatement switch_(Expression switchValue, SwitchCase... cases) { return switch_(switchValue, null, null, toList(cases)); @@ -2764,7 +2764,7 @@ public static SwitchStatement switch_(Expression switchValue, * Creates a SwitchExpression that represents a switch statement * that has a default case. */ - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") public static SwitchStatement switch_(Expression switchValue, Expression defaultBody, SwitchCase... cases) { return switch_(switchValue, defaultBody, null, toList(cases)); @@ -3105,21 +3105,21 @@ public static Expression foldOr(List conditions) { /** * Creates an empty fluent list. */ - public static FluentList list() { + public static FluentList list() { return new FluentArrayList<>(); } /** * Creates a fluent list with given elements. */ - @SafeVarargs public static FluentList list(T... ts) { + @SafeVarargs public static FluentList list(T... ts) { return new FluentArrayList<>(Arrays.asList(ts)); } /** * Creates a fluent list with elements from the given collection. */ - public static FluentList list(Iterable ts) { + public static FluentList list(Iterable ts) { return new FluentArrayList<>(toList(ts)); } @@ -3262,7 +3262,7 @@ static List acceptExpressions(List expressions, return expressions1; } - static @Nullable R acceptNodes(@Nullable List nodes, + static @Nullable R acceptNodes(@Nullable List nodes, Visitor visitor) { R r = null; if (nodes != null) { diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/FieldDeclaration.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/FieldDeclaration.java index f0813af67cd8..4665560dc6f6 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/FieldDeclaration.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/FieldDeclaration.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Modifier; import java.util.Objects; @@ -46,7 +46,7 @@ public FieldDeclaration(int modifier, ParameterExpression parameter, return shuttle.visit(this, initializer); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ForEachStatement.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ForEachStatement.java index eeb286a7a32e..82dcac7c264c 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ForEachStatement.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ForEachStatement.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Objects; @@ -48,7 +48,7 @@ public ForEachStatement(ParameterExpression parameter, Expression iterable, return shuttle.visit(this, parameter, iterable1, body1); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ForStatement.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ForStatement.java index 987f37da2863..81ec947078cc 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ForStatement.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ForStatement.java @@ -18,7 +18,7 @@ import org.apache.calcite.linq4j.Ord; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Objects; @@ -58,7 +58,7 @@ public ForStatement(List declarations, return shuttle.visit(this, decls1, condition1, post1, body1); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/FunctionExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/FunctionExpression.java index 932b904b6a8f..f95f78041f59 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/FunctionExpression.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/FunctionExpression.java @@ -22,7 +22,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Method; import java.lang.reflect.Proxy; @@ -78,7 +78,7 @@ public FunctionExpression(Class type, BlockStatement body, return shuttle.visit(this, body); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } @@ -104,7 +104,8 @@ public F getFunction() { dynamicFunction = (F) Proxy.newProxyInstance(classLoader, new Class[]{Types.toClass(type)}, - (proxy, method, args) -> x.dynamicInvoke(args)); + (proxy, method, args) -> + x.dynamicInvoke(args == null ? new Object[0] : args)); } return dynamicFunction; } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/GotoStatement.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/GotoStatement.java index 32c660136240..1f87eee8a3f2 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/GotoStatement.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/GotoStatement.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Objects; @@ -68,7 +68,7 @@ public class GotoStatement extends Statement { return shuttle.visit(this, expression1); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/IndexExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/IndexExpression.java index 75dc90e23a5b..d945e729b912 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/IndexExpression.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/IndexExpression.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Objects; @@ -51,7 +51,7 @@ public IndexExpression(Expression array, List indexExpressions) { return shuttle.visit(this, array, indexExpressions); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/InvocationExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/InvocationExpression.java index dc91a62072da..1b6e3ec63720 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/InvocationExpression.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/InvocationExpression.java @@ -16,6 +16,8 @@ */ package org.apache.calcite.linq4j.tree; +import org.jspecify.annotations.Nullable; + /** * Represents an expression that applies a delegate or lambda expression to a * list of argument expressions. @@ -29,7 +31,7 @@ public InvocationExpression(ExpressionType nodeType, Class type) { return shuttle.visit(this); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/LabelStatement.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/LabelStatement.java index f861325b37bb..4a4bac7095a8 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/LabelStatement.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/LabelStatement.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Objects; @@ -39,7 +39,7 @@ public LabelStatement(Expression defaultValue, ExpressionType nodeType) { return shuttle.visit(this); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/LabelTarget.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/LabelTarget.java index 16679ab02343..a82b075c2577 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/LabelTarget.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/LabelTarget.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Objects; diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/LambdaExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/LambdaExpression.java index dddafee40f44..4daf713b8791 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/LambdaExpression.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/LambdaExpression.java @@ -16,6 +16,8 @@ */ package org.apache.calcite.linq4j.tree; +import org.jspecify.annotations.Nullable; + /** * Describes a lambda expression. This captures a block of code that is similar * to a Java method body. @@ -29,7 +31,7 @@ public LambdaExpression(ExpressionType nodeType, Class type) { return shuttle.visit(this); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ListInitExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ListInitExpression.java index cf69b932d8e2..609b1f8162e6 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ListInitExpression.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ListInitExpression.java @@ -16,6 +16,8 @@ */ package org.apache.calcite.linq4j.tree; +import org.jspecify.annotations.Nullable; + /** * Represents a constructor call that has a collection initializer. */ @@ -28,7 +30,7 @@ public ListInitExpression(ExpressionType nodeType, Class type) { return shuttle.visit(this); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/MemberExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/MemberExpression.java index 54d0d7361815..d7867b0f45dc 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/MemberExpression.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/MemberExpression.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Field; import java.lang.reflect.Modifier; @@ -58,7 +58,7 @@ public MemberExpression(@Nullable Expression expression, PseudoField field) { return shuttle.visit(this, expression1); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/MemberInitExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/MemberInitExpression.java index 749a75ee1246..fe942da9c7af 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/MemberInitExpression.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/MemberInitExpression.java @@ -16,6 +16,8 @@ */ package org.apache.calcite.linq4j.tree; +import org.jspecify.annotations.Nullable; + /** * Represents calling a constructor and initializing one or more members of the * new object. @@ -29,7 +31,7 @@ public MemberInitExpression() { return shuttle.visit(this); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/MethodCallExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/MethodCallExpression.java index 8115934458d4..2f5a14607012 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/MethodCallExpression.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/MethodCallExpression.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -70,7 +70,7 @@ public class MethodCallExpression extends Expression { return shuttle.visit(this, targetExpression, expressions); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/MethodDeclaration.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/MethodDeclaration.java index 444da129d5a6..4de5d91e870f 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/MethodDeclaration.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/MethodDeclaration.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Modifier; import java.lang.reflect.Type; @@ -52,7 +52,7 @@ public MethodDeclaration(int modifier, String name, Type resultType, return shuttle.visit(this, body); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/NewArrayExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/NewArrayExpression.java index b8a920ff2a37..be19ef79eede 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/NewArrayExpression.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/NewArrayExpression.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.util.List; @@ -54,7 +54,7 @@ public NewArrayExpression(Type type, int dimension, @Nullable Expression bound, return shuttle.visit(this, dimension, bound, expressions); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/NewExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/NewExpression.java index 5cbe06824c43..e09176b61059 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/NewExpression.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/NewExpression.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.util.List; @@ -56,7 +56,7 @@ public NewExpression(Type type, List arguments, return shuttle.visit(this, arguments, memberDeclarations); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Node.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Node.java index 6cbe9e508597..940583fc4205 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Node.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Node.java @@ -16,9 +16,11 @@ */ package org.apache.calcite.linq4j.tree; +import org.jspecify.annotations.Nullable; + /** Parse tree node. */ public interface Node { - R accept(Visitor visitor); + @Nullable R accept(Visitor visitor); Node accept(Shuttle shuttle); diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/OptimizeShuttle.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/OptimizeShuttle.java index a5f04cdc3541..0de70567d898 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/OptimizeShuttle.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/OptimizeShuttle.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -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/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ParameterExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ParameterExpression.java index 9e3c05d982ae..9054cbbc4e0c 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ParameterExpression.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ParameterExpression.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Modifier; import java.lang.reflect.Type; @@ -52,7 +52,7 @@ public ParameterExpression(int modifier, Type type, String name) { return shuttle.visit(this); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Primitive.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Primitive.java index a35fba35a015..c3b109bcfa98 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Primitive.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Primitive.java @@ -17,11 +17,11 @@ package org.apache.calcite.linq4j.tree; import org.apiguardian.api.API; -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.Array; import java.lang.reflect.Field; @@ -37,6 +37,8 @@ import java.util.List; import java.util.Map; +import static org.apache.calcite.linq4j.Nullness.castNonNull; + import static java.util.Objects.requireNonNull; /** @@ -291,7 +293,7 @@ public static List asList(final Object array) { // REVIEW: A per-type list might be more efficient. (Or might not.) return new AbstractList() { @Override public Object get(int index) { - return Array.get(array, index); + return castNonNull(Array.get(array, index)); } @Override public int size() { @@ -1010,7 +1012,7 @@ public void send(Field field, Object o, Sink sink) /** * Reads value from a source into an array. */ - @SuppressWarnings("argument.type.incompatible") + @SuppressWarnings("NullAway") public void arrayItem(Source source, Object dataSet, int ordinal) { switch (this) { case DOUBLE: diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/PseudoField.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/PseudoField.java index 93f781954a7d..d41c8840b8a8 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/PseudoField.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/PseudoField.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ReflectedPseudoField.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ReflectedPseudoField.java index 8bfde58e2f1c..4699924fdc12 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ReflectedPseudoField.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ReflectedPseudoField.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -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/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Shuttle.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Shuttle.java index 8e5533c81936..ca8134a6b9ba 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Shuttle.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Shuttle.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Objects; diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/SwitchStatement.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/SwitchStatement.java index 62265ebb262b..84973096d2a9 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/SwitchStatement.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/SwitchStatement.java @@ -16,6 +16,8 @@ */ package org.apache.calcite.linq4j.tree; +import org.jspecify.annotations.Nullable; + /** * Represents a control expression that handles multiple selections by passing * control to {@link SwitchCase}. @@ -29,7 +31,7 @@ public SwitchStatement(ExpressionType nodeType) { return shuttle.visit(this); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/TernaryExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/TernaryExpression.java index a05504c73231..b726e043c432 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/TernaryExpression.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/TernaryExpression.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.util.Objects; @@ -47,7 +47,7 @@ public class TernaryExpression extends Expression { return shuttle.visit(this, expression0, expression1, expression2); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ThrowStatement.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ThrowStatement.java index b9298824efb2..f503b42c35ed 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ThrowStatement.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ThrowStatement.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Objects; @@ -37,7 +37,7 @@ public ThrowStatement(Expression expression) { return shuttle.visit(this, expression); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/TryStatement.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/TryStatement.java index 95c06f5abf05..c937c8304b3d 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/TryStatement.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/TryStatement.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -54,7 +54,7 @@ public TryStatement(Statement body, List catchBlocks, return shuttle.visit(this, body1, catchBlocks1, fynally1); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/TypeBinaryExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/TypeBinaryExpression.java index 9e2e44e27713..5fface4c4665 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/TypeBinaryExpression.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/TypeBinaryExpression.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.util.Objects; @@ -44,7 +44,7 @@ public TypeBinaryExpression(ExpressionType nodeType, Expression expression, return shuttle.visit(this, expression); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Types.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Types.java index e3a2a8390ac9..aaddfde1fe73 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Types.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Types.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.lang.reflect.Array; import java.lang.reflect.Constructor; @@ -276,7 +276,7 @@ public static boolean allAssignable(boolean varArgs, * * @return Whether parameter can be assigned from argument */ - @SuppressWarnings("nullness") + @SuppressWarnings("NullAway") private static boolean assignableFrom(Class parameter, Class argument) { return parameter.isAssignableFrom(argument) || parameter.isPrimitive() diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/UnaryExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/UnaryExpression.java index 6c04bf73c0c4..75fcdf920f28 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/UnaryExpression.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/UnaryExpression.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.util.Objects; @@ -40,7 +40,7 @@ public class UnaryExpression extends Expression { return shuttle.visit(this, expression); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/UnsignedType.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/UnsignedType.java index 32622315f770..08fc8862276c 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/UnsignedType.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/UnsignedType.java @@ -16,12 +16,12 @@ */ package org.apache.calcite.linq4j.tree; -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.joou.Unsigned; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.math.BigDecimal; diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Visitor.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Visitor.java index 6063983227f4..f4c4103da8eb 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Visitor.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Visitor.java @@ -16,44 +16,46 @@ */ package org.apache.calcite.linq4j.tree; +import org.jspecify.annotations.Nullable; + /** * Node visitor. * * @param Return type */ -public interface Visitor { - R visit(BinaryExpression binaryExpression); - R visit(BlockStatement blockStatement); - R visit(ClassDeclaration classDeclaration); - R visit(ConditionalExpression conditionalExpression); - R visit(ConditionalStatement conditionalStatement); - R visit(ConstantExpression constantExpression); - R visit(ConstructorDeclaration constructorDeclaration); - R visit(DeclarationStatement declarationStatement); - R visit(DefaultExpression defaultExpression); - R visit(DynamicExpression dynamicExpression); - R visit(FieldDeclaration fieldDeclaration); - R visit(ForStatement forStatement); - R visit(ForEachStatement forEachStatement); - R visit(FunctionExpression functionExpression); - R visit(GotoStatement gotoStatement); - R visit(IndexExpression indexExpression); - R visit(InvocationExpression invocationExpression); - R visit(LabelStatement labelStatement); - R visit(LambdaExpression lambdaExpression); - R visit(ListInitExpression listInitExpression); - R visit(MemberExpression memberExpression); - R visit(MemberInitExpression memberInitExpression); - R visit(MethodCallExpression methodCallExpression); - R visit(MethodDeclaration methodDeclaration); - R visit(NewArrayExpression newArrayExpression); - R visit(NewExpression newExpression); - R visit(ParameterExpression parameterExpression); - R visit(SwitchStatement switchStatement); - R visit(TernaryExpression ternaryExpression); - R visit(ThrowStatement throwStatement); - R visit(TryStatement tryStatement); - R visit(TypeBinaryExpression typeBinaryExpression); - R visit(UnaryExpression unaryExpression); - R visit(WhileStatement whileStatement); +public interface Visitor { + @Nullable R visit(BinaryExpression binaryExpression); + @Nullable R visit(BlockStatement blockStatement); + @Nullable R visit(ClassDeclaration classDeclaration); + @Nullable R visit(ConditionalExpression conditionalExpression); + @Nullable R visit(ConditionalStatement conditionalStatement); + @Nullable R visit(ConstantExpression constantExpression); + @Nullable R visit(ConstructorDeclaration constructorDeclaration); + @Nullable R visit(DeclarationStatement declarationStatement); + @Nullable R visit(DefaultExpression defaultExpression); + @Nullable R visit(DynamicExpression dynamicExpression); + @Nullable R visit(FieldDeclaration fieldDeclaration); + @Nullable R visit(ForStatement forStatement); + @Nullable R visit(ForEachStatement forEachStatement); + @Nullable R visit(FunctionExpression functionExpression); + @Nullable R visit(GotoStatement gotoStatement); + @Nullable R visit(IndexExpression indexExpression); + @Nullable R visit(InvocationExpression invocationExpression); + @Nullable R visit(LabelStatement labelStatement); + @Nullable R visit(LambdaExpression lambdaExpression); + @Nullable R visit(ListInitExpression listInitExpression); + @Nullable R visit(MemberExpression memberExpression); + @Nullable R visit(MemberInitExpression memberInitExpression); + @Nullable R visit(MethodCallExpression methodCallExpression); + @Nullable R visit(MethodDeclaration methodDeclaration); + @Nullable R visit(NewArrayExpression newArrayExpression); + @Nullable R visit(NewExpression newExpression); + @Nullable R visit(ParameterExpression parameterExpression); + @Nullable R visit(SwitchStatement switchStatement); + @Nullable R visit(TernaryExpression ternaryExpression); + @Nullable R visit(ThrowStatement throwStatement); + @Nullable R visit(TryStatement tryStatement); + @Nullable R visit(TypeBinaryExpression typeBinaryExpression); + @Nullable R visit(UnaryExpression unaryExpression); + @Nullable R visit(WhileStatement whileStatement); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/VisitorImpl.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/VisitorImpl.java index 18025e3c791f..0ac0a34ea6aa 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/VisitorImpl.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/VisitorImpl.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -27,43 +27,43 @@ * @param Return type */ @SuppressWarnings("unused") -public class VisitorImpl<@Nullable R> implements Visitor { +public class VisitorImpl implements Visitor { public VisitorImpl() { super(); } - @Override public R visit(BinaryExpression binaryExpression) { + @Override public @Nullable R visit(BinaryExpression binaryExpression) { R r0 = binaryExpression.expression0.accept(this); R r1 = binaryExpression.expression1.accept(this); return r1; } - @Override public R visit(BlockStatement blockStatement) { + @Override public @Nullable R visit(BlockStatement blockStatement) { return Expressions.acceptNodes(blockStatement.statements, this); } - @Override public R visit(ClassDeclaration classDeclaration) { + @Override public @Nullable R visit(ClassDeclaration classDeclaration) { return Expressions.acceptNodes(classDeclaration.memberDeclarations, this); } - @Override public R visit(ConditionalExpression conditionalExpression) { + @Override public @Nullable R visit(ConditionalExpression conditionalExpression) { return Expressions.acceptNodes(conditionalExpression.expressionList, this); } - @Override public R visit(ConditionalStatement conditionalStatement) { + @Override public @Nullable R visit(ConditionalStatement conditionalStatement) { return Expressions.acceptNodes(conditionalStatement.expressionList, this); } - @Override public R visit(ConstantExpression constantExpression) { + @Override public @Nullable R visit(ConstantExpression constantExpression) { return null; } - @Override public R visit(ConstructorDeclaration constructorDeclaration) { + @Override public @Nullable R visit(ConstructorDeclaration constructorDeclaration) { R r0 = Expressions.acceptNodes(constructorDeclaration.parameters, this); return constructorDeclaration.body.accept(this); } - @Override public R visit(DeclarationStatement declarationStatement) { + @Override public @Nullable R visit(DeclarationStatement declarationStatement) { R r = declarationStatement.parameter.accept(this); if (declarationStatement.initializer != null) { r = declarationStatement.initializer.accept(this); @@ -71,67 +71,67 @@ public VisitorImpl() { return r; } - @Override public R visit(DefaultExpression defaultExpression) { + @Override public @Nullable R visit(DefaultExpression defaultExpression) { return null; } - @Override public R visit(DynamicExpression dynamicExpression) { + @Override public @Nullable R visit(DynamicExpression dynamicExpression) { return null; } - @Override public R visit(FieldDeclaration fieldDeclaration) { + @Override public @Nullable R visit(FieldDeclaration fieldDeclaration) { R r0 = fieldDeclaration.parameter.accept(this); return fieldDeclaration.initializer == null ? null : fieldDeclaration.initializer.accept(this); } - @Override public R visit(ForStatement forStatement) { + @Override public @Nullable R visit(ForStatement forStatement) { R r0 = Expressions.acceptNodes(forStatement.declarations, this); R r1 = forStatement.condition == null ? null : forStatement.condition.accept(this); R r2 = forStatement.post == null ? null : forStatement.post.accept(this); return forStatement.body.accept(this); } - @Override public R visit(ForEachStatement forEachStatement) { + @Override public @Nullable R visit(ForEachStatement forEachStatement) { R r0 = forEachStatement.parameter.accept(this); R r1 = forEachStatement.iterable.accept(this); return forEachStatement.body.accept(this); } - @Override public R visit(FunctionExpression functionExpression) { + @Override public @Nullable R visit(FunctionExpression functionExpression) { @SuppressWarnings("unchecked") final List parameterList = functionExpression.parameterList; R r0 = Expressions.acceptNodes(parameterList, this); return functionExpression.body == null ? null : functionExpression.body.accept(this); } - @Override public R visit(GotoStatement gotoStatement) { + @Override public @Nullable R visit(GotoStatement gotoStatement) { return gotoStatement.expression == null ? null : gotoStatement.expression.accept(this); } - @Override public R visit(IndexExpression indexExpression) { + @Override public @Nullable R visit(IndexExpression indexExpression) { R r0 = indexExpression.array.accept(this); return Expressions.acceptNodes(indexExpression.indexExpressions, this); } - @Override public R visit(InvocationExpression invocationExpression) { + @Override public @Nullable R visit(InvocationExpression invocationExpression) { return null; } - @Override public R visit(LabelStatement labelStatement) { + @Override public @Nullable R visit(LabelStatement labelStatement) { return labelStatement.defaultValue.accept(this); } - @Override public R visit(LambdaExpression lambdaExpression) { + @Override public @Nullable R visit(LambdaExpression lambdaExpression) { return null; } - @Override public R visit(ListInitExpression listInitExpression) { + @Override public @Nullable R visit(ListInitExpression listInitExpression) { return null; } - @Override public R visit(MemberExpression memberExpression) { + @Override public @Nullable R visit(MemberExpression memberExpression) { R r = null; if (memberExpression.expression != null) { r = memberExpression.expression.accept(this); @@ -139,11 +139,11 @@ public VisitorImpl() { return r; } - @Override public R visit(MemberInitExpression memberInitExpression) { + @Override public @Nullable R visit(MemberInitExpression memberInitExpression) { return null; } - @Override public R visit(MethodCallExpression methodCallExpression) { + @Override public @Nullable R visit(MethodCallExpression methodCallExpression) { R r = null; if (methodCallExpression.targetExpression != null) { r = methodCallExpression.targetExpression.accept(this); @@ -151,12 +151,12 @@ public VisitorImpl() { return Expressions.acceptNodes(methodCallExpression.expressions, this); } - @Override public R visit(MethodDeclaration methodDeclaration) { + @Override public @Nullable R visit(MethodDeclaration methodDeclaration) { R r0 = Expressions.acceptNodes(methodDeclaration.parameters, this); return methodDeclaration.body.accept(this); } - @Override public R visit(NewArrayExpression newArrayExpression) { + @Override public @Nullable R visit(NewArrayExpression newArrayExpression) { R r = null; if (newArrayExpression.bound != null) { r = newArrayExpression.bound.accept(this); @@ -164,30 +164,30 @@ public VisitorImpl() { return Expressions.acceptNodes(newArrayExpression.expressions, this); } - @Override public R visit(NewExpression newExpression) { + @Override public @Nullable R visit(NewExpression newExpression) { R r0 = Expressions.acceptNodes(newExpression.arguments, this); return Expressions.acceptNodes(newExpression.memberDeclarations, this); } - @Override public R visit(ParameterExpression parameterExpression) { + @Override public @Nullable R visit(ParameterExpression parameterExpression) { return null; } - @Override public R visit(SwitchStatement switchStatement) { + @Override public @Nullable R visit(SwitchStatement switchStatement) { return null; } - @Override public R visit(TernaryExpression ternaryExpression) { + @Override public @Nullable R visit(TernaryExpression ternaryExpression) { R r0 = ternaryExpression.expression0.accept(this); R r1 = ternaryExpression.expression1.accept(this); return ternaryExpression.expression2.accept(this); } - @Override public R visit(ThrowStatement throwStatement) { + @Override public @Nullable R visit(ThrowStatement throwStatement) { return throwStatement.expression.accept(this); } - @Override public R visit(TryStatement tryStatement) { + @Override public @Nullable R visit(TryStatement tryStatement) { R r = tryStatement.body.accept(this); for (CatchBlock catchBlock : tryStatement.catchBlocks) { r = catchBlock.parameter.accept(this); @@ -199,15 +199,15 @@ public VisitorImpl() { return r; } - @Override public R visit(TypeBinaryExpression typeBinaryExpression) { + @Override public @Nullable R visit(TypeBinaryExpression typeBinaryExpression) { return typeBinaryExpression.expression.accept(this); } - @Override public R visit(UnaryExpression unaryExpression) { + @Override public @Nullable R visit(UnaryExpression unaryExpression) { return unaryExpression.expression.accept(this); } - @Override public R visit(WhileStatement whileStatement) { + @Override public @Nullable R visit(WhileStatement whileStatement) { R r0 = whileStatement.condition.accept(this); return whileStatement.body.accept(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/WhileStatement.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/WhileStatement.java index e828a1aa5bb3..e968e3b98673 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/WhileStatement.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/WhileStatement.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Objects; @@ -42,7 +42,7 @@ public WhileStatement(Expression condition, Statement body) { return shuttle.visit(this, condition1, body1); } - @Override public R accept(Visitor visitor) { + @Override public @Nullable R accept(Visitor visitor) { return visitor.visit(this); } diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/package-info.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/package-info.java index 9c1eeda04dc5..6d1eb6fa9d6d 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/package-info.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/package-info.java @@ -25,4 +25,7 @@ * efficiency; for example, it may attempt to push down filters to the * source SQL system. */ +@NullMarked package org.apache.calcite.linq4j.tree; + +import org.jspecify.annotations.NullMarked; diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/util/Compatible.java b/linq4j/src/main/java/org/apache/calcite/linq4j/util/Compatible.java index 63781e0641ca..d84ea7cccf86 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/util/Compatible.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/util/Compatible.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; @@ -48,7 +48,7 @@ Compatible create() { new Class[]{Compatible.class}, (proxy, method, args) -> { if ("isRecord".equals(method.getName())) { - return isRecord(requireNonNull(args[0], "args[0]")); + return isRecord(requireNonNull(requireNonNull(args, "args")[0], "args[0]")); } return null; }); diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/util/package-info.java b/linq4j/src/main/java/org/apache/calcite/linq4j/util/package-info.java index d1f427e9adcb..7636d26ab5aa 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/util/package-info.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/util/package-info.java @@ -18,4 +18,7 @@ /** * Provides utility classes. */ +@NullMarked package org.apache.calcite.linq4j.util; + +import org.jspecify.annotations.NullMarked; diff --git a/linq4j/src/test/java/org/apache/calcite/linq4j/test/BlockBuilderTest.java b/linq4j/src/test/java/org/apache/calcite/linq4j/test/BlockBuilderTest.java index 5cc772c0b545..09a5e46a0661 100644 --- a/linq4j/src/test/java/org/apache/calcite/linq4j/test/BlockBuilderTest.java +++ b/linq4j/src/test/java/org/apache/calcite/linq4j/test/BlockBuilderTest.java @@ -25,7 +25,7 @@ import org.apache.calcite.linq4j.tree.ParameterExpression; import org.apache.calcite.linq4j.tree.Shuttle; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/linq4j/src/test/java/org/apache/calcite/linq4j/test/ExpressionTest.java b/linq4j/src/test/java/org/apache/calcite/linq4j/test/ExpressionTest.java index 3482e2b86797..50e9012d40c7 100644 --- a/linq4j/src/test/java/org/apache/calcite/linq4j/test/ExpressionTest.java +++ b/linq4j/src/test/java/org/apache/calcite/linq4j/test/ExpressionTest.java @@ -38,7 +38,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.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; diff --git a/linq4j/src/test/java/org/apache/calcite/linq4j/test/JoinPreserveOrderTest.java b/linq4j/src/test/java/org/apache/calcite/linq4j/test/JoinPreserveOrderTest.java index 0ec28abd4a9f..00af6ec08fa9 100644 --- a/linq4j/src/test/java/org/apache/calcite/linq4j/test/JoinPreserveOrderTest.java +++ b/linq4j/src/test/java/org/apache/calcite/linq4j/test/JoinPreserveOrderTest.java @@ -23,7 +23,7 @@ import org.apache.calcite.linq4j.function.Function1; import org.apache.calcite.linq4j.function.Function2; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; diff --git a/linq4j/src/test/java/org/apache/calcite/linq4j/test/LimitSortTest.java b/linq4j/src/test/java/org/apache/calcite/linq4j/test/LimitSortTest.java index 77e0eb8ca81a..05df73225eae 100644 --- a/linq4j/src/test/java/org/apache/calcite/linq4j/test/LimitSortTest.java +++ b/linq4j/src/test/java/org/apache/calcite/linq4j/test/LimitSortTest.java @@ -21,7 +21,7 @@ import org.apache.calcite.linq4j.Linq4j; import org.apache.calcite.linq4j.function.Function1; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.util.Comparator; diff --git a/linq4j/src/test/java/org/apache/calcite/linq4j/tree/IdentifierValidationTest.java b/linq4j/src/test/java/org/apache/calcite/linq4j/tree/IdentifierValidationTest.java index 3040e00f0638..062ff63e7f68 100644 --- a/linq4j/src/test/java/org/apache/calcite/linq4j/tree/IdentifierValidationTest.java +++ b/linq4j/src/test/java/org/apache/calcite/linq4j/tree/IdentifierValidationTest.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.lang.reflect.Modifier; diff --git a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoAggregate.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoAggregate.java index 4e368607de52..0388e0770f47 100644 --- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoAggregate.java +++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoAggregate.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.AbstractList; import java.util.ArrayList; diff --git a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoEnumerator.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoEnumerator.java index b654364b3be4..d86bdfcb168a 100644 --- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoEnumerator.java +++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoEnumerator.java @@ -28,7 +28,7 @@ import org.bson.Document; import org.bson.types.Binary; import org.bson.types.Decimal128; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.Date; @@ -38,11 +38,12 @@ import java.util.Map; import static java.lang.String.format; +import static java.util.Objects.requireNonNull; /** Enumerator that reads from a MongoDB collection. */ -class MongoEnumerator implements Enumerator { +class MongoEnumerator implements Enumerator<@Nullable Object> { private final Iterator cursor; - private final Function1 getter; + private final Function1 getter; private @Nullable Object current; /** Creates a MongoEnumerator. @@ -51,7 +52,7 @@ class MongoEnumerator implements Enumerator { * @param getter Converts an object into a list of fields */ MongoEnumerator(Iterator cursor, - Function1 getter) { + Function1 getter) { this.cursor = cursor; this.getter = getter; } @@ -95,7 +96,7 @@ static Function1 mapGetter() { } /** Returns a function that projects a single field. */ - static Function1 singletonGetter(final String fieldName, + static Function1 singletonGetter(final String fieldName, final Class fieldClass) { return a0 -> convert(fieldName, a0.get(fieldName), fieldClass); } @@ -104,10 +105,10 @@ static Function1 singletonGetter(final String fieldName, * * @param fields List of fields to project; or null to return map */ - static Function1 listGetter( + static Function1 listGetter( final List> fields) { return a0 -> { - Object[] objects = new Object[fields.size()]; + final @Nullable Object[] objects = new Object[fields.size()]; for (int i = 0; i < fields.size(); i++) { final Map.Entry field = fields.get(i); final String name = field.getKey(); @@ -117,8 +118,8 @@ static Function1 listGetter( }; } - static Function1 getter( - List> fields) { + static Function1 getter( + @Nullable List> fields) { //noinspection unchecked return fields == null ? (Function1) mapGetter() @@ -162,13 +163,14 @@ static Function1 getter( * */ @SuppressWarnings("JavaUtilDate") - private static Object convert(String fieldName, Object o, Class clazz) { - if (o == null) { + private static @Nullable Object convert(String fieldName, @Nullable Object o, + @Nullable Class clazz) { + if (o == null || clazz == null) { return null; } Primitive primitive = Primitive.of(clazz); if (primitive != null) { - clazz = primitive.boxClass; + clazz = requireNonNull(primitive.boxClass, "boxClass"); } else { primitive = Primitive.ofBox(clazz); } diff --git a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoFilter.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoFilter.java index 93f96d79b079..8e5154a6c326 100644 --- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoFilter.java +++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoFilter.java @@ -40,7 +40,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.ArrayList; import java.util.Collection; @@ -48,6 +48,8 @@ import java.util.List; import java.util.Map; +import static java.util.Objects.requireNonNull; + /** * Implementation of a {@link org.apache.calcite.rel.core.Filter} * relational expression in MongoDB. @@ -65,7 +67,7 @@ public MongoFilter( @Override public @Nullable RelOptCost computeSelfCost(RelOptPlanner planner, RelMetadataQuery mq) { - return super.computeSelfCost(planner, mq).multiplyBy(0.1); + return requireNonNull(super.computeSelfCost(planner, mq)).multiplyBy(0.1); } @Override public MongoFilter copy(RelTraitSet traitSet, RelNode input, @@ -94,16 +96,16 @@ static class Translator { } private String translateMatch(RexNode condition) { - Map map = builder.map(); + Map map = builder.map(); map.put("$match", translateOr(condition)); return builder.toJsonString(map); } - private Map translateOr(RexNode condition) { + private Map translateOr(RexNode condition) { final RexNode condition2 = RexUtil.expandSearch(rexBuilder, null, condition); - List> list = new ArrayList<>(); + List> list = new ArrayList<>(); for (RexNode node : RelOptUtil.disjunctions(condition2)) { list.add(translateAnd(node)); } @@ -111,7 +113,7 @@ private Map translateOr(RexNode condition) { case 1: return list.get(0); default: - Map map = builder.map(); + Map map = builder.map(); map.put("$or", list); return map; } @@ -119,34 +121,34 @@ private Map translateOr(RexNode condition) { /** Translates a condition that may be an AND of other conditions. Gathers * together conditions that apply to the same field. */ - private Map translateAnd(RexNode node0) { + private Map translateAnd(RexNode node0) { final Multimap> multimap = HashMultimap.create(); final Map eqMap = new LinkedHashMap<>(); - final List> orMapList = new ArrayList<>(); + final List> orMapList = new ArrayList<>(); for (RexNode node : RelOptUtil.conjunctions(node0)) { translateMatch2(node, orMapList, multimap, eqMap); } - Map map = builder.map(); + Map map = builder.map(); for (Map.Entry entry : eqMap.entrySet()) { multimap.removeAll(entry.getKey()); map.put(entry.getKey(), literalValue(entry.getValue())); } for (Map.Entry>> entry : multimap.asMap().entrySet()) { - Map map2 = builder.map(); + Map map2 = builder.map(); for (Pair s : entry.getValue()) { String op = s.left; if ("$ne".equals(op)) { if (map2.containsKey("$nin")) { map2.computeIfPresent("$nin", (k, v) -> { - ((List) v).add(literalValue(s.right)); + ((List<@Nullable Object>) v).add(literalValue(s.right)); return v; }); } else if (map2.containsKey(op)) { // if two $ne conditions, translate to $nin op - List ninList = builder.list(); + List<@Nullable Object> ninList = builder.list(); ninList.add(map2.remove(op)); ninList.add(literalValue(s.right)); map2.put("$nin", ninList); @@ -161,7 +163,7 @@ private Map translateAnd(RexNode node0) { map.put(entry.getKey(), map2); } if (!orMapList.isEmpty()) { - Map andMap = builder.map(); + Map andMap = builder.map(); if (!map.isEmpty()) { orMapList.add(map); } @@ -171,7 +173,8 @@ private Map translateAnd(RexNode node0) { return map; } - private static void addPredicate(Map map, String op, Object v) { + private static void addPredicate(Map map, String op, + @Nullable Object v) { if (map.containsKey(op) && stronger(op, map.get(op), v)) { return; } @@ -184,7 +187,7 @@ private static void addPredicate(Map map, String op, Object v) { *

    For example, {@code stronger("$lt", 100, 200)} returns true, because * "< 100" is a more powerful condition than "< 200". */ - private static boolean stronger(String key, Object v0, Object v1) { + private static boolean stronger(String key, @Nullable Object v0, @Nullable Object v1) { if (key.equals("$lt") || key.equals("$lte")) { if (v0 instanceof Number && v1 instanceof Number) { return ((Number) v0).doubleValue() < ((Number) v1).doubleValue(); @@ -199,11 +202,11 @@ private static boolean stronger(String key, Object v0, Object v1) { return false; } - private static Object literalValue(RexLiteral literal) { + private static @Nullable Object literalValue(RexLiteral literal) { return literal.getValue2(); } - private Void translateMatch2(RexNode node, List> orMapList, + private Void translateMatch2(RexNode node, List> orMapList, Multimap> multimap, Map eqMap) { switch (node.getKind()) { case EQUALS: @@ -233,15 +236,15 @@ private Void translateMatch2(RexNode node, List> orMapList, } } - private Void translateOrAddToList(RexNode node, List> orMapList) { - Map or = translateOr(node); + private Void translateOrAddToList(RexNode node, List> orMapList) { + Map or = translateOr(node); orMapList.add(or); return null; } /** Translates a call to a binary operator, reversing arguments if * necessary. */ - private Void translateBinary(String op, String rop, RexCall call, + private @Nullable Void translateBinary(@Nullable String op, @Nullable String rop, RexCall call, Multimap> multimap, Map eqMap) { final RexNode left = call.operands.get(0); final RexNode right = call.operands.get(1); @@ -257,7 +260,7 @@ private Void translateBinary(String op, String rop, RexCall call, } /** Translates a call to a binary operator. Returns whether successful. */ - private boolean translateBinary2(String op, RexNode left, RexNode right, + private boolean translateBinary2(@Nullable String op, RexNode left, RexNode right, Multimap> multimap, Map eqMap) { switch (right.getKind()) { case LITERAL: @@ -286,7 +289,7 @@ private boolean translateBinary2(String op, RexNode left, RexNode right, } } - private static void translateOp2(String op, String name, RexLiteral right, + private static void translateOp2(@Nullable String op, String name, RexLiteral right, Multimap> multimap, Map eqMap) { if (op == null) { // E.g.: {deptno: 100} @@ -320,7 +323,8 @@ private Void translateLike(RexCall call, throw new AssertionError("cannot translate LIKE with non-literal pattern: " + call); } final RexLiteral patternLiteral = (RexLiteral) right; - final String sqlPattern = patternLiteral.getValue2().toString(); + final String sqlPattern = + requireNonNull(patternLiteral.getValue2(), "pattern").toString(); final @Nullable String escapeStr = escapeStr(call); final String finalRegex = Like.sqlToRegexAnchored(sqlPattern, escapeStr); @@ -344,7 +348,7 @@ private Void translateLike(RexCall call, } /** Translates NOT to a MongoDB $nor expression. */ - private Void translateNot(RexCall call, List> orMapList) { + private Void translateNot(RexCall call, List> orMapList) { final RexNode operand = call.operands.get(0); switch (operand.getKind()) { case LIKE: @@ -355,7 +359,7 @@ private Void translateNot(RexCall call, List> orMapList) { } /** Translates NOT LIKE to {$nor: [{field: {$regex: ...}}]}. */ - private Void translateNotLike(RexCall call, List> orMapList) { + private Void translateNotLike(RexCall call, List> orMapList) { final RexNode left = stripCast(call.operands.get(0)); final RexNode right = call.operands.get(1); @@ -363,7 +367,8 @@ private Void translateNotLike(RexCall call, List> orMapList) throw new AssertionError("cannot translate NOT LIKE with non-literal pattern: " + call); } final RexLiteral patternLiteral = (RexLiteral) right; - final String sqlPattern = patternLiteral.getValue2().toString(); + final String sqlPattern = + requireNonNull(patternLiteral.getValue2(), "pattern").toString(); final @Nullable String escapeStr = escapeStr(call); final String finalRegex = Like.sqlToRegexAnchored(sqlPattern, escapeStr); @@ -385,13 +390,13 @@ private Void translateNotLike(RexCall call, List> orMapList) throw new AssertionError("cannot translate NOT LIKE " + call); } - Map regexMap = builder.map(); - Map regexOp = builder.map(); + Map regexMap = builder.map(); + Map regexOp = builder.map(); regexOp.put("$regex", finalRegex); regexMap.put(name, regexOp); - List norList = builder.list(); + List<@Nullable Object> norList = builder.list(); norList.add(regexMap); - Map norMap = builder.map(); + Map norMap = builder.map(); norMap.put("$nor", norList); orMapList.add(norMap); return null; @@ -414,7 +419,8 @@ private static RexNode stripCast(RexNode node) { if (escapeNode.getKind() != SqlKind.LITERAL) { throw new AssertionError("cannot translate LIKE with non-literal escape: " + call); } - final String escape = ((RexLiteral) escapeNode).getValue2().toString(); + final String escape = + requireNonNull(((RexLiteral) escapeNode).getValue2(), "escape").toString(); if (escape.length() != 1) { throw new AssertionError("cannot translate LIKE with multi-character escape: " + call); } diff --git a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoProject.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoProject.java index a0d795aa0d8f..9917d4e7f823 100644 --- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoProject.java +++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoProject.java @@ -32,11 +32,13 @@ 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; +import static java.util.Objects.requireNonNull; + /** * Implementation of {@link org.apache.calcite.rel.core.Project} * relational expression in MongoDB. @@ -64,7 +66,7 @@ public MongoProject(RelOptCluster cluster, RelTraitSet traitSet, @Override public @Nullable RelOptCost computeSelfCost(RelOptPlanner planner, RelMetadataQuery mq) { - return super.computeSelfCost(planner, mq).multiplyBy(0.1); + return requireNonNull(super.computeSelfCost(planner, mq)).multiplyBy(0.1); } @Override public void implement(Implementor implementor) { diff --git a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRel.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRel.java index 68a86daf0c6e..c05f1d718815 100644 --- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRel.java +++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRel.java @@ -22,7 +22,7 @@ import org.apache.calcite.rex.RexBuilder; import org.apache.calcite.runtime.PairList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Relational expression that uses Mongo calling convention. diff --git a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRules.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRules.java index fe7c65db1059..d43a7f67a025 100644 --- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRules.java +++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRules.java @@ -46,6 +46,7 @@ import org.apache.calcite.util.Util; import org.apache.calcite.util.trace.CalciteTrace; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import java.util.AbstractList; @@ -72,7 +73,7 @@ private MongoRules() {} }; /** Returns 'string' if it is a call to item['string'], null otherwise. */ - static String isItem(RexCall call) { + static @Nullable String isItem(RexCall call) { if (call.getOperator() != SqlStdOperatorTable.ITEM) { return null; } @@ -514,7 +515,7 @@ private static class MongoAggregateRule extends MongoConverterRule { super(config); } - @Override public RelNode convert(RelNode rel) { + @Override public @Nullable RelNode convert(RelNode rel) { final LogicalAggregate agg = (LogicalAggregate) rel; final RelTraitSet traitSet = agg.getTraitSet().replace(out); diff --git a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoSchemaFactory.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoSchemaFactory.java index b581d1d396fa..8fc451b8edd8 100644 --- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoSchemaFactory.java +++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoSchemaFactory.java @@ -27,6 +27,8 @@ import java.util.Map; +import static java.util.Objects.requireNonNull; + /** * Factory that creates a {@link MongoSchema}. * @@ -40,7 +42,7 @@ public MongoSchemaFactory() { @Override public Schema create(SchemaPlus parentSchema, String name, Map operand) { final String host = (String) operand.get("host"); - final String database = (String) operand.get("database"); + final String database = requireNonNull((String) operand.get("database"), "database"); final String authMechanismName = (String) operand.get("authMechanism"); final MongoClientSettings.Builder settings = @@ -61,7 +63,7 @@ private static MongoCredential createCredential(Map map) { AuthenticationMechanism.fromMechanismName(authMechanismName); final String username = (String) map.get("username"); final String authDatabase = (String) map.get("authDatabase"); - final String password = (String) map.get("password"); + final String password = requireNonNull((String) map.get("password"), "password"); switch (authenticationMechanism) { case PLAIN: diff --git a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoSort.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoSort.java index fd79235c4aba..c9c4d5a16e2a 100644 --- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoSort.java +++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoSort.java @@ -30,18 +30,21 @@ import org.apache.calcite.rex.RexNode; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; +import static java.util.Objects.requireNonNull; + /** * Implementation of {@link org.apache.calcite.rel.core.Sort} * relational expression in MongoDB. */ public class MongoSort extends Sort implements MongoRel { public MongoSort(RelOptCluster cluster, RelTraitSet traitSet, - RelNode child, RelCollation collation, RexNode offset, RexNode fetch) { + RelNode child, RelCollation collation, @Nullable RexNode offset, + @Nullable RexNode fetch) { super(cluster, traitSet, child, collation, offset, fetch); assert getConvention() == MongoRel.CONVENTION; assert getConvention() == child.getConvention(); @@ -49,11 +52,12 @@ public MongoSort(RelOptCluster cluster, RelTraitSet traitSet, @Override public @Nullable RelOptCost computeSelfCost(RelOptPlanner planner, RelMetadataQuery mq) { - return super.computeSelfCost(planner, mq).multiplyBy(0.05); + return requireNonNull(super.computeSelfCost(planner, mq)).multiplyBy(0.05); } @Override public Sort copy(RelTraitSet traitSet, RelNode input, - RelCollation newCollation, RexNode offset, RexNode fetch) { + RelCollation newCollation, @Nullable RexNode offset, + @Nullable RexNode fetch) { return new MongoSort(getCluster(), traitSet, input, collation, offset, fetch); } diff --git a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoTable.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoTable.java index 4a5694279bc0..35462016cd8a 100644 --- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoTable.java +++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoTable.java @@ -41,12 +41,15 @@ import org.bson.BsonDocument; import org.bson.Document; import org.bson.conversions.Bson; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; +import static java.util.Objects.requireNonNull; + /** * Table based on a MongoDB collection. */ @@ -97,22 +100,41 @@ public class MongoTable extends AbstractQueryableTable * @param fields List of fields to project; or null to return map * @return Enumerator of results */ - private Enumerable find(MongoDatabase mongoDb, String filterJson, - String projectJson, List> fields) { + private Enumerable<@Nullable Object> find(MongoDatabase mongoDb, + @Nullable String filterJson, @Nullable String projectJson, + @Nullable List> fields) { final MongoCollection collection = mongoDb.getCollection(collectionName); final Bson filter = filterJson == null ? null : BsonDocument.parse(filterJson); final Bson project = projectJson == null ? null : BsonDocument.parse(projectJson); - final Function1 getter = MongoEnumerator.getter(fields); - return new AbstractEnumerable() { - @Override public Enumerator enumerator() { - @SuppressWarnings("unchecked") final FindIterable cursor = - collection.find(filter).projection(project); - return new MongoEnumerator(cursor.iterator(), getter); - } - }; + final Function1 getter = + MongoEnumerator.getter(fields); + return new FindEnumerable(collection, filter, project, getter); + } + + /** Enumerable over the results of a "find" operation. */ + private static class FindEnumerable + extends AbstractEnumerable<@Nullable Object> { + private final MongoCollection collection; + private final @Nullable Bson filter; + private final @Nullable Bson project; + private final Function1 getter; + + FindEnumerable(MongoCollection collection, @Nullable Bson filter, + @Nullable Bson project, Function1 getter) { + this.collection = collection; + this.filter = filter; + this.project = project; + this.getter = getter; + } + + @Override public Enumerator<@Nullable Object> enumerator() { + @SuppressWarnings("unchecked") final FindIterable cursor = + collection.find(filter).projection(project); + return new MongoEnumerator(cursor.iterator(), getter); + } } /** Executes an "aggregate" operation on the underlying collection. @@ -128,28 +150,44 @@ private Enumerable find(MongoDatabase mongoDb, String filterJson, * @param operations One or more JSON strings * @return Enumerator of results */ - private Enumerable aggregate(final MongoDatabase mongoDb, - final List> fields, + private Enumerable<@Nullable Object> aggregate(final MongoDatabase mongoDb, + final @Nullable List> fields, final List operations) { final List list = new ArrayList<>(); for (String operation : operations) { list.add(BsonDocument.parse(operation)); } - final Function1 getter = + final Function1 getter = MongoEnumerator.getter(fields); - return new AbstractEnumerable() { - @Override public Enumerator enumerator() { - final Iterator resultIterator; - try { - resultIterator = mongoDb.getCollection(collectionName) - .aggregate(list).iterator(); - } catch (Exception e) { - throw new RuntimeException("While running MongoDB query " - + Util.toString(operations, "[", ",\n", "]"), e); - } - return new MongoEnumerator(resultIterator, getter); + return new AggregateEnumerable(mongoDb, list, operations, getter); + } + + /** Enumerable over the results of an "aggregate" operation. */ + private class AggregateEnumerable extends AbstractEnumerable<@Nullable Object> { + private final MongoDatabase mongoDb; + private final List list; + private final List operations; + private final Function1 getter; + + AggregateEnumerable(MongoDatabase mongoDb, List list, + List operations, Function1 getter) { + this.mongoDb = mongoDb; + this.list = list; + this.operations = operations; + this.getter = getter; + } + + @Override public Enumerator<@Nullable Object> enumerator() { + final Iterator resultIterator; + try { + resultIterator = mongoDb.getCollection(collectionName) + .aggregate(list).iterator(); + } catch (Exception e) { + throw new RuntimeException("While running MongoDB query " + + Util.toString(operations, "[", ",\n", "]"), e); } - }; + return new MongoEnumerator(resultIterator, getter); + } } /** Implementation of {@link org.apache.calcite.linq4j.Queryable} based on @@ -170,7 +208,7 @@ public static class MongoQueryable extends AbstractTableQueryable { } private MongoDatabase getMongoDb() { - return schema.unwrap(MongoSchema.class).mongoDb; + return requireNonNull(schema.unwrap(MongoSchema.class), "mongoSchema").mongoDb; } private MongoTable getTable() { @@ -182,7 +220,8 @@ private MongoTable getTable() { * @see org.apache.calcite.adapter.mongodb.MongoMethod#MONGO_QUERYABLE_AGGREGATE */ @SuppressWarnings("UnusedDeclaration") - public Enumerable aggregate(List> fields, + public Enumerable<@Nullable Object> aggregate( + @Nullable List> fields, List operations) { return getTable().aggregate(getMongoDb(), fields, operations); } @@ -197,8 +236,9 @@ public Enumerable aggregate(List> fields, * @see org.apache.calcite.adapter.mongodb.MongoMethod#MONGO_QUERYABLE_FIND */ @SuppressWarnings("UnusedDeclaration") - public Enumerable find(String filterJson, - String projectJson, List> fields) { + public Enumerable<@Nullable Object> find(@Nullable String filterJson, + @Nullable String projectJson, + @Nullable List> fields) { return getTable().find(getMongoDb(), filterJson, projectJson, fields); } } diff --git a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoTableScan.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoTableScan.java index f8bff5a0f692..ffffe6a9f578 100644 --- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoTableScan.java +++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoTableScan.java @@ -29,7 +29,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/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoToEnumerableConverter.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoToEnumerableConverter.java index 116bd6e5dd1c..577e1e58f2e7 100644 --- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoToEnumerableConverter.java +++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoToEnumerableConverter.java @@ -40,11 +40,13 @@ 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.List; +import static java.util.Objects.requireNonNull; + /** * Relational expression representing a scan of a table in a Mongo data source. */ @@ -65,7 +67,7 @@ protected MongoToEnumerableConverter( @Override public @Nullable RelOptCost computeSelfCost(RelOptPlanner planner, RelMetadataQuery mq) { - return super.computeSelfCost(planner, mq).multiplyBy(.1); + return requireNonNull(super.computeSelfCost(planner, mq)).multiplyBy(.1); } @Override public Result implement(EnumerableRelImplementor implementor, Prefer pref) { @@ -104,8 +106,10 @@ protected MongoToEnumerableConverter( Pair.class)); final Expression table = list.append("table", - mongoImplementor.table.getExpression( - MongoTable.MongoQueryable.class)); + requireNonNull( + requireNonNull(mongoImplementor.table, "table") + .getExpression(MongoTable.MongoQueryable.class), + "table expression")); List opList = mongoImplementor.list.rightList(); final Expression ops = list.append("ops", diff --git a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/package-info.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/package-info.java index bb18a6935bed..28166576dc36 100644 --- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/package-info.java +++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/package-info.java @@ -18,4 +18,7 @@ /** * Query provider based on a MongoDB database. */ +@NullMarked package org.apache.calcite.adapter.mongodb; + +import org.jspecify.annotations.NullMarked; diff --git a/pig/src/main/java/org/apache/calcite/adapter/pig/PigAggregate.java b/pig/src/main/java/org/apache/calcite/adapter/pig/PigAggregate.java index 742c82816b5f..69a70da2ea6e 100644 --- a/pig/src/main/java/org/apache/calcite/adapter/pig/PigAggregate.java +++ b/pig/src/main/java/org/apache/calcite/adapter/pig/PigAggregate.java @@ -29,6 +29,8 @@ import com.google.common.collect.ImmutableList; +import org.jspecify.annotations.Nullable; + import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -43,7 +45,7 @@ public class PigAggregate extends Aggregate implements PigRel { /** Creates a PigAggregate. */ public PigAggregate(RelOptCluster cluster, RelTraitSet traitSet, RelNode input, ImmutableBitSet groupSet, - List groupSets, List aggCalls) { + @Nullable List groupSets, List aggCalls) { super(cluster, traitSet, ImmutableList.of(), input, groupSet, groupSets, aggCalls); assert getConvention() == PigRel.CONVENTION; } @@ -51,13 +53,13 @@ public PigAggregate(RelOptCluster cluster, RelTraitSet traitSet, @Deprecated // to be removed before 2.0 public PigAggregate(RelOptCluster cluster, RelTraitSet traitSet, RelNode input, boolean indicator, ImmutableBitSet groupSet, - List groupSets, List aggCalls) { + @Nullable List groupSets, List aggCalls) { this(cluster, traitSet, input, groupSet, groupSets, aggCalls); checkIndicator(indicator); } @Override public Aggregate copy(RelTraitSet traitSet, RelNode input, - ImmutableBitSet groupSet, List groupSets, + ImmutableBitSet groupSet, @Nullable List groupSets, List aggCalls) { return new PigAggregate(input.getCluster(), traitSet, input, groupSet, groupSets, aggCalls); @@ -86,7 +88,7 @@ private String getPigAggregateStatement(Implementor implementor) { * Override this method so it looks down the tree to find the table this node * is acting on. */ - @Override public RelOptTable getTable() { + @Override public @Nullable RelOptTable getTable() { return getInput().getTable(); } diff --git a/pig/src/main/java/org/apache/calcite/adapter/pig/PigFilter.java b/pig/src/main/java/org/apache/calcite/adapter/pig/PigFilter.java index cc6a8a8c0f07..7c7d4a6eee77 100644 --- a/pig/src/main/java/org/apache/calcite/adapter/pig/PigFilter.java +++ b/pig/src/main/java/org/apache/calcite/adapter/pig/PigFilter.java @@ -27,6 +27,8 @@ import org.apache.calcite.rex.RexLiteral; import org.apache.calcite.rex.RexNode; +import org.jspecify.annotations.Nullable; + import java.util.ArrayList; import java.util.List; @@ -58,7 +60,7 @@ public PigFilter(RelOptCluster cluster, RelTraitSet traitSet, RelNode input, Rex * Override this method so it looks down the tree to find the table this node * is acting on. */ - @Override public RelOptTable getTable() { + @Override public @Nullable RelOptTable getTable() { return getInput().getTable(); } diff --git a/pig/src/main/java/org/apache/calcite/adapter/pig/PigJoin.java b/pig/src/main/java/org/apache/calcite/adapter/pig/PigJoin.java index 948ae3f3bb95..997522ff9a69 100644 --- a/pig/src/main/java/org/apache/calcite/adapter/pig/PigJoin.java +++ b/pig/src/main/java/org/apache/calcite/adapter/pig/PigJoin.java @@ -30,6 +30,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import org.jspecify.annotations.Nullable; + import java.util.ArrayList; import java.util.List; @@ -60,7 +62,7 @@ public PigJoin(RelOptCluster cluster, RelTraitSet traitSet, RelNode left, RelNod * The Pig alias of the joined relation will have the same name as one from * the left side of the join. */ - @Override public RelOptTable getTable() { + @Override public @Nullable RelOptTable getTable() { return getLeft().getTable(); } diff --git a/pig/src/main/java/org/apache/calcite/adapter/pig/PigProject.java b/pig/src/main/java/org/apache/calcite/adapter/pig/PigProject.java index e62c9106a7cc..c43bfdad3985 100644 --- a/pig/src/main/java/org/apache/calcite/adapter/pig/PigProject.java +++ b/pig/src/main/java/org/apache/calcite/adapter/pig/PigProject.java @@ -27,6 +27,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import org.jspecify.annotations.Nullable; + import java.util.List; /** Implementation of {@link org.apache.calcite.rel.core.Project} in @@ -53,7 +55,7 @@ public PigProject(RelOptCluster cluster, RelTraitSet traitSet, RelNode input, * Override this method so it looks down the tree to find the table this node * is acting on. */ - @Override public RelOptTable getTable() { + @Override public @Nullable RelOptTable getTable() { return getInput().getTable(); } } diff --git a/pig/src/main/java/org/apache/calcite/adapter/pig/PigRel.java b/pig/src/main/java/org/apache/calcite/adapter/pig/PigRel.java index 6776b47a7040..530bb06c5ace 100644 --- a/pig/src/main/java/org/apache/calcite/adapter/pig/PigRel.java +++ b/pig/src/main/java/org/apache/calcite/adapter/pig/PigRel.java @@ -22,6 +22,8 @@ import java.util.ArrayList; import java.util.List; +import static java.util.Objects.requireNonNull; + /** * Relational expression that uses the Pig calling convention. */ @@ -55,7 +57,8 @@ class Implementor { private final List statements = new ArrayList<>(); public String getTableName(RelNode input) { - final List qualifiedName = input.getTable().getQualifiedName(); + final List qualifiedName = + requireNonNull(input.getTable(), "table").getQualifiedName(); return qualifiedName.get(qualifiedName.size() - 1); } diff --git a/pig/src/main/java/org/apache/calcite/adapter/pig/PigTableFactory.java b/pig/src/main/java/org/apache/calcite/adapter/pig/PigTableFactory.java index 6ebf30f0ad4c..0f3a2f24b762 100644 --- a/pig/src/main/java/org/apache/calcite/adapter/pig/PigTableFactory.java +++ b/pig/src/main/java/org/apache/calcite/adapter/pig/PigTableFactory.java @@ -21,12 +21,14 @@ import org.apache.calcite.schema.SchemaPlus; import org.apache.calcite.schema.TableFactory; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.File; import java.util.List; import java.util.Map; +import static java.util.Objects.requireNonNull; + /** * Factory that creates a {@link PigTable}. * @@ -40,16 +42,18 @@ public PigTableFactory() { @SuppressWarnings("unchecked") @Override public PigTable create(SchemaPlus schema, String name, Map operand, @Nullable RelDataType rowType) { - String fileName = (String) operand.get("file"); + String fileName = requireNonNull((String) operand.get("file"), "file"); File file = new File(fileName); final File base = (File) operand.get(ModelHandler.ExtraOperand.BASE_DIRECTORY.camelName); if (base != null && !file.isAbsolute()) { file = new File(base, fileName); } - final List fieldNames = (List) operand.get("columns"); + final List fieldNames = + requireNonNull((List) operand.get("columns"), "columns"); final PigTable result = new PigTable(file.getAbsolutePath(), fieldNames.toArray(new String[0])); - schema.unwrap(PigSchema.class).registerTable(name, result); + requireNonNull(schema.unwrap(PigSchema.class), "pigSchema") + .registerTable(name, result); return result; } } diff --git a/pig/src/main/java/org/apache/calcite/adapter/pig/PigToEnumerableConverter.java b/pig/src/main/java/org/apache/calcite/adapter/pig/PigToEnumerableConverter.java index 4a6fe1b74f07..b4f3eed3d397 100644 --- a/pig/src/main/java/org/apache/calcite/adapter/pig/PigToEnumerableConverter.java +++ b/pig/src/main/java/org/apache/calcite/adapter/pig/PigToEnumerableConverter.java @@ -68,7 +68,7 @@ protected PigToEnumerableConverter( @Override public Result implement(EnumerableRelImplementor implementor, Prefer pref) { final BlockBuilder list = new BlockBuilder(); final PhysType physType = - PhysTypeImpl.of(implementor.getTypeFactory(), rowType, + PhysTypeImpl.of(implementor.getTypeFactory(), getRowType(), pref.prefer(JavaRowFormat.ARRAY)); PigRel.Implementor impl = new PigRel.Implementor(); impl.visitChild(0, getInput()); diff --git a/pig/src/main/java/org/apache/calcite/adapter/pig/package-info.java b/pig/src/main/java/org/apache/calcite/adapter/pig/package-info.java index 89e965be72cb..5c30dfacf7eb 100644 --- a/pig/src/main/java/org/apache/calcite/adapter/pig/package-info.java +++ b/pig/src/main/java/org/apache/calcite/adapter/pig/package-info.java @@ -19,4 +19,7 @@ * Pig query provider. * */ +@NullMarked package org.apache.calcite.adapter.pig; + +import org.jspecify.annotations.NullMarked; diff --git a/piglet/build.gradle.kts b/piglet/build.gradle.kts index 148c8777d9ee..820aa4f08b6f 100644 --- a/piglet/build.gradle.kts +++ b/piglet/build.gradle.kts @@ -31,7 +31,7 @@ dependencies { implementation("org.apache.calcite.avatica:avatica-core") implementation("org.apache.hadoop:hadoop-common") - implementation("org.checkerframework:checker-qual") + implementation("org.jspecify:jspecify") implementation("org.slf4j:slf4j-api") testImplementation(project(":testkit")) diff --git a/piglet/src/main/java/org/apache/calcite/piglet/DynamicTupleRecordType.java b/piglet/src/main/java/org/apache/calcite/piglet/DynamicTupleRecordType.java index 86c370089b6e..8555d4281449 100644 --- a/piglet/src/main/java/org/apache/calcite/piglet/DynamicTupleRecordType.java +++ b/piglet/src/main/java/org/apache/calcite/piglet/DynamicTupleRecordType.java @@ -20,10 +20,13 @@ import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.rel.type.RelDataTypeField; +import org.jspecify.annotations.Nullable; + import java.util.regex.Matcher; import java.util.regex.Pattern; import static java.lang.Integer.parseInt; +import static java.util.Objects.requireNonNull; /** * Represents Pig Tuples with unknown fields. The tuple field @@ -37,7 +40,7 @@ public class DynamicTupleRecordType extends DynamicRecordTypeImpl { super(typeFactory); } - @Override public RelDataTypeField getField(String fieldName, + @Override public @Nullable RelDataTypeField getField(String fieldName, boolean caseSensitive, boolean elideRecord) { final int index = nameToIndex(fieldName); if (index >= 0) { @@ -70,7 +73,7 @@ void resize(int size) { private static int nameToIndex(String fieldName) { Matcher matcher = INDEX_PATTERN.matcher(fieldName); if (matcher.find()) { - return parseInt(matcher.group(1)); + return parseInt(requireNonNull(matcher.group(1), "index")); } return -1; } diff --git a/piglet/src/main/java/org/apache/calcite/piglet/Handler.java b/piglet/src/main/java/org/apache/calcite/piglet/Handler.java index d8acf8432a79..6dd03aeba116 100644 --- a/piglet/src/main/java/org/apache/calcite/piglet/Handler.java +++ b/piglet/src/main/java/org/apache/calcite/piglet/Handler.java @@ -37,6 +37,8 @@ import java.util.List; import java.util.Map; +import static java.util.Objects.requireNonNull; + /** * Walks over a Piglet AST and calls the corresponding methods in a * {@link PigRelBuilder}. @@ -49,6 +51,17 @@ public Handler(PigRelBuilder builder) { this.builder = builder; } + /** Returns the relational expression registered under a name. + * + * @throws IllegalArgumentException if no relation has that name */ + private RelNode get(String name) { + final RelNode relNode = map.get(name); + if (relNode == null) { + throw new IllegalArgumentException("unknown relation '" + name + "'"); + } + return relNode; + } + /** Creates relational expressions for a given AST node. */ public Handler handle(Ast.Node node) { final RelNode input; @@ -68,7 +81,7 @@ public Handler handle(Ast.Node node) { case FOREACH: final Ast.ForeachStmt foreach = (Ast.ForeachStmt) node; builder.clear(); - input = map.get(foreach.source.value); + input = get(foreach.source.value); builder.push(input); rexNodes = new ArrayList<>(); for (Ast.Node exp : foreach.expList) { @@ -80,7 +93,7 @@ public Handler handle(Ast.Node node) { case FOREACH_NESTED: final Ast.ForeachNestedStmt foreachNested = (Ast.ForeachNestedStmt) node; builder.clear(); - input = map.get(foreachNested.source.value); + input = get(foreachNested.source.value); builder.push(input); System.out.println(input.getRowType()); for (RelDataTypeField field : input.getRowType().getFieldList()) { @@ -105,7 +118,7 @@ public Handler handle(Ast.Node node) { case FILTER: final Ast.FilterStmt filter = (Ast.FilterStmt) node; builder.clear(); - input = map.get(filter.source.value); + input = get(filter.source.value); builder.push(input); RexNode rexNode = toRex(filter.condition); if (rexNode.getType().getSqlTypeName() != SqlTypeName.BOOLEAN) { @@ -118,7 +131,7 @@ public Handler handle(Ast.Node node) { case DISTINCT: final Ast.DistinctStmt distinct = (Ast.DistinctStmt) node; builder.clear(); - input = map.get(distinct.source.value); + input = get(distinct.source.value); builder.push(input); builder.distinct(null, -1); register(distinct.target.value); @@ -126,7 +139,7 @@ public Handler handle(Ast.Node node) { case ORDER: final Ast.OrderStmt order = (Ast.OrderStmt) node; builder.clear(); - input = map.get(order.source.value); + input = get(order.source.value); builder.push(input); final List nodes = new ArrayList<>(); for (Pair field : order.fields) { @@ -138,7 +151,7 @@ public Handler handle(Ast.Node node) { case LIMIT: final Ast.LimitStmt limit = (Ast.LimitStmt) node; builder.clear(); - input = map.get(limit.source.value); + input = get(limit.source.value); final int count = ((Number) limit.count.value).intValue(); builder.push(input); builder.limit(0, count); @@ -147,7 +160,7 @@ public Handler handle(Ast.Node node) { case GROUP: final Ast.GroupStmt group = (Ast.GroupStmt) node; builder.clear(); - input = map.get(group.source.value); + input = get(group.source.value); builder.push(input).as(group.source.value); final List groupKeys = new ArrayList<>(); final List keys = new ArrayList<>(); @@ -168,7 +181,7 @@ public Handler handle(Ast.Node node) { return this; case DUMP: final Ast.DumpStmt dump = (Ast.DumpStmt) node; - final RelNode relNode = map.get(dump.relation.value); + final RelNode relNode = get(dump.relation.value); dump(relNode); return this; // nothing to do; contains no algebra default: @@ -213,7 +226,8 @@ private ImmutableList bag(List nodeList, final ImmutableList.Builder listBuilder = ImmutableList.builder(); for (Ast.Node node : nodeList) { - listBuilder.add(item(node, type.getComponentType())); + listBuilder.add( + item(node, requireNonNull(type.getComponentType(), "componentType"))); } return listBuilder.build(); } diff --git a/piglet/src/main/java/org/apache/calcite/piglet/PigRelBuilder.java b/piglet/src/main/java/org/apache/calcite/piglet/PigRelBuilder.java index 87c467209b01..a6b2b5d099f5 100644 --- a/piglet/src/main/java/org/apache/calcite/piglet/PigRelBuilder.java +++ b/piglet/src/main/java/org/apache/calcite/piglet/PigRelBuilder.java @@ -52,6 +52,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import org.jspecify.annotations.Nullable; + import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -88,7 +90,7 @@ public static PigRelBuilder create(FrameworkConfig config) { return new PigRelBuilder( transform(config.getContext(), c -> c.withBloat(-1)), relBuilder.getCluster(), - relBuilder.getRelOptSchema()); + requireNonNull(relBuilder.getRelOptSchema(), "relOptSchema")); } private static Context transform(Context context, @@ -98,19 +100,19 @@ private static Context transform(Context context, return Contexts.of(transform.apply(config), context); } - public RelNode getRel(String alias) { + public @Nullable RelNode getRel(String alias) { return aliasMap.get(alias); } - public RelNode getRel(Operator pig) { + public @Nullable RelNode getRel(Operator pig) { return pigRelMap.get(pig); } - Operator getPig(RelNode rel) { + @Nullable Operator getPig(RelNode rel) { return relPigMap.get(rel); } - String getAlias(RelNode rel) { + @Nullable String getAlias(RelNode rel) { return reverseAliasMap.get(rel); } @@ -123,7 +125,7 @@ CorrelationId nextCorrelId() { return new CorrelationId(nextCorrelId++); } - public String getAlias() { + public @Nullable String getAlias() { final RelNode input = peek(); if (reverseAliasMap.containsKey(input)) { return reverseAliasMap.get(input); @@ -165,7 +167,8 @@ public boolean checkMap(LogicalRelationalOperator pigOp) { * @param alias the alias * @param updatePigRelMap whether to update the PigRelMap */ - public void updateAlias(Operator pigOp, String alias, boolean updatePigRelMap) { + public void updateAlias(Operator pigOp, String alias, + boolean updatePigRelMap) { final RelNode rel = peek(); if (updatePigRelMap) { pigRelMap.put(pigOp, rel); @@ -233,7 +236,7 @@ void replaceTop(RelNode newRel) { * @param tableNames The names of the table to scan * @return This builder */ - public RelBuilder scan(RelOptTable userSchema, String... tableNames) { + public RelBuilder scan(@Nullable RelOptTable userSchema, String... tableNames) { // First, look up the database schema to find the table schema with the given names final List names = ImmutableList.copyOf(tableNames); requireNonNull(relOptSchema, "relOptSchema"); @@ -294,7 +297,9 @@ public RelBuilder scan(RelDataType rowType, String... tableNames) { */ public RelBuilder scan(RelDataType rowType, List tableNames) { final RelOptTable relOptTable = - PigTable.createRelOptTable(getRelOptSchema(), rowType, tableNames); + PigTable.createRelOptTable( + requireNonNull(getRelOptSchema(), "relOptSchema"), rowType, + tableNames); return scan(relOptTable); } @@ -486,7 +491,9 @@ public RelBuilder multiSetFlatten(List flattenCols, List flatte for (int i = 0; i < colCount; i++) { if (flattenCols.indexOf(i) >= 0) { // The original multiset columns to be flattened, select new flattened columns instead - RelDataType componentType = inputFields.get(i).getType().getComponentType(); + RelDataType componentType = + requireNonNull(inputFields.get(i).getType().getComponentType(), + "componentType"); final int numSubFields = componentType.isStruct() ? componentType.getFieldCount() : 1; for (int j = 0; j < numSubFields; j++) { finnalCols.add(field(colCount + flattenCount)); @@ -554,7 +561,8 @@ public RelBuilder collect() { project(ImmutableList.of(literal("all"), row)); // Update the alias map for the new projected rel. - updateAlias(getPig(inputRel), getAlias(inputRel), false); + updateAlias(requireNonNull(getPig(inputRel), "pigOp"), + requireNonNull(getAlias(inputRel), "alias"), false); // Build a single group for all rows cogroup(ImmutableList.of(groupKey(ImmutableList.of(field(0))))); @@ -609,7 +617,7 @@ RelBuilder store(String storeAlias) { * Gets all relational plans corresponding to Pig Store operators. * */ - public List getRelsForStores() { + public @Nullable List getRelsForStores() { if (storeMap.isEmpty()) { return null; } diff --git a/piglet/src/main/java/org/apache/calcite/piglet/PigRelExVisitor.java b/piglet/src/main/java/org/apache/calcite/piglet/PigRelExVisitor.java index 49a748e5b22d..8b5aaacf274d 100644 --- a/piglet/src/main/java/org/apache/calcite/piglet/PigRelExVisitor.java +++ b/piglet/src/main/java/org/apache/calcite/piglet/PigRelExVisitor.java @@ -236,7 +236,7 @@ private ImmutableList buildBinaryOperands() { pigRelOp.getPlan().getPredecessors(pigRelOp).get(op.getInputNum()); if (builder.checkMap(childOp)) { // Inner plan that has been processed before (nested foreach or flatten) - builder.push(builder.getRel(childOp)); + builder.push(requireNonNull(builder.getRel(childOp), "rel")); final List fields = builder.getFields(inputCount, inputOrdinal, op.getColNum()); for (int i = fields.size() - 1; i >= 0; i--) { @@ -364,7 +364,8 @@ private static RexNode replacePatternIfPossible(RexNode rexNode) { builder, op.getFuncSpec(), buildOperands(numAgrs), returnType)); String className = op.getFuncSpec().getClassName(); - SqlOperator sqlOp = ((RexCall) stack.peek()).getOperator(); + SqlOperator sqlOp = + ((RexCall) requireNonNull(stack.peek(), "stack.peek()")).getOperator(); if (sqlOp instanceof SqlUserDefinedFunction) { ScalarFunctionImpl sqlFunc = (ScalarFunctionImpl) ((SqlUserDefinedFunction) sqlOp).getFunction(); @@ -450,9 +451,11 @@ private static int optSize(List list) { final int index = ((BigDecimal) ((RexLiteral) operand2).getValue()).intValue(); RelNode referencedRel = - builder.getRel( - ((LogicalRelationalOperator) op.getImplicitReferencedOperator()) - .getAlias()); + requireNonNull( + builder.getRel( + ((LogicalRelationalOperator) op.getImplicitReferencedOperator()) + .getAlias()), + "referencedRel"); builder.push(referencedRel); List projectCol = Lists.newArrayList(builder.field(index)); builder.project(projectCol); diff --git a/piglet/src/main/java/org/apache/calcite/piglet/PigRelOpInnerVisitor.java b/piglet/src/main/java/org/apache/calcite/piglet/PigRelOpInnerVisitor.java index f890283a1153..d1a0d4fcd4fe 100644 --- a/piglet/src/main/java/org/apache/calcite/piglet/PigRelOpInnerVisitor.java +++ b/piglet/src/main/java/org/apache/calcite/piglet/PigRelOpInnerVisitor.java @@ -41,6 +41,8 @@ import com.google.common.collect.ImmutableSet; +import org.jspecify.annotations.Nullable; + import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Deque; @@ -141,7 +143,7 @@ private void doGenerateWithoutMultisetFlatten(LOGenerate gen, List mult List flattenOutputAliases) throws FrontendException { final List pigProjections = gen.getOutputPlans(); final List innerCols = new ArrayList<>(); // For projection expressions - final List fieldAlias = new ArrayList<>(); // For projection names/alias + final List<@Nullable String> fieldAlias = new ArrayList<>(); // For projection names/alias if (gen.getOutputPlanSchemas() == null) { throw new IllegalArgumentException( @@ -189,7 +191,7 @@ private void doGenerateWithoutMultisetFlatten(LOGenerate gen, List mult } } else { innerCols.add(rexNode); - String alias = null; + @Nullable String alias = null; if (outputFieldSchema.size() == 1) { // If simple type, take user alias if available alias = outputFieldSchema.getField(0).alias; diff --git a/piglet/src/main/java/org/apache/calcite/piglet/PigRelOpVisitor.java b/piglet/src/main/java/org/apache/calcite/piglet/PigRelOpVisitor.java index e1c90e25cc2e..49e5c3534e9b 100644 --- a/piglet/src/main/java/org/apache/calcite/piglet/PigRelOpVisitor.java +++ b/piglet/src/main/java/org/apache/calcite/piglet/PigRelOpVisitor.java @@ -69,6 +69,8 @@ import com.google.common.collect.ImmutableList; +import org.jspecify.annotations.Nullable; + import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; @@ -78,6 +80,8 @@ import java.util.List; import java.util.Set; +import static java.util.Objects.requireNonNull; + /** * Visits Pig logical operators and converts them into corresponding relational * algebra plans. @@ -85,7 +89,7 @@ class PigRelOpVisitor extends PigRelOpWalker.PlanPreVisitor { // The relational algebra builder customized for Pig protected final PigRelBuilder builder; - private Operator currentRoot; + private @Nullable Operator currentRoot; /** Type of Pig groups. */ private enum GroupType { @@ -112,7 +116,7 @@ private enum GroupType { this.currentRoot = null; } - Operator getCurrentRoot() { + @Nullable Operator getCurrentRoot() { return currentRoot; } @@ -142,7 +146,9 @@ List translate() throws FrontendException { String fullName = load.getSchemaFile(); if (fullName.contains("file://")) { // load from database catalog. Pig will see it as a file in the working directory - fullName = Paths.get(load.getSchemaFile()).getFileName().toString(); + fullName = + requireNonNull(Paths.get(load.getSchemaFile()).getFileName(), + "fileName").toString(); } String[] tableNames; if (fullName.startsWith("/")) { @@ -154,7 +160,7 @@ List translate() throws FrontendException { tableNames = fullName.split("\\."); } final LogicalSchema pigSchema = load.getSchema(); - final RelOptTable pigRelOptTable; + final @Nullable RelOptTable pigRelOptTable; if (pigSchema == null) { pigRelOptTable = null; } else { @@ -162,8 +168,9 @@ List translate() throws FrontendException { // relational row type final RelDataType rowType = PigTypes.convertSchema(pigSchema); pigRelOptTable = - PigTable.createRelOptTable(builder.getRelOptSchema(), rowType, - Arrays.asList(tableNames)); + PigTable.createRelOptTable( + requireNonNull(builder.getRelOptSchema(), "relOptSchema"), + rowType, Arrays.asList(tableNames)); } builder.scan(pigRelOptTable, tableNames); builder.register(load); @@ -367,7 +374,9 @@ private void preprocessCogroup(LOCogroup loCogroup, boolean isCubeRollup) getGroupRowOperands(fieldRels, isCubeRollup)); fieldRels.add(row); builder.project(fieldRels); - builder.updateAlias(builder.getPig(originalRel), builder.getAlias(originalRel), false); + builder.updateAlias( + requireNonNull(builder.getPig(originalRel), "pigOp"), + requireNonNull(builder.getAlias(originalRel), "alias"), false); } } diff --git a/piglet/src/main/java/org/apache/calcite/piglet/PigRelOpWalker.java b/piglet/src/main/java/org/apache/calcite/piglet/PigRelOpWalker.java index 841024160a14..5ca47d8f7eb0 100644 --- a/piglet/src/main/java/org/apache/calcite/piglet/PigRelOpWalker.java +++ b/piglet/src/main/java/org/apache/calcite/piglet/PigRelOpWalker.java @@ -25,6 +25,8 @@ import org.apache.pig.newplan.logical.relational.LogicalRelationalNodesVisitor; import org.apache.pig.newplan.logical.relational.LogicalRelationalOperator; +import org.jspecify.annotations.Nullable; + import java.util.Collection; /** @@ -69,7 +71,8 @@ abstract static class PlanPreVisitor extends LogicalRelationalNodesVisitor { * @param visitor The visitor of each Pig logical operator node * @throws FrontendException Exception during processing Pig operator */ - private void postOrderWalk(Operator root, PlanPreVisitor visitor) throws FrontendException { + private void postOrderWalk(@Nullable Operator root, PlanPreVisitor visitor) + throws FrontendException { if (root == null || visitor.preVisit((LogicalRelationalOperator) root)) { return; } diff --git a/piglet/src/main/java/org/apache/calcite/piglet/PigRelSqlUdfs.java b/piglet/src/main/java/org/apache/calcite/piglet/PigRelSqlUdfs.java index 3018929d511a..1c75d19238cb 100644 --- a/piglet/src/main/java/org/apache/calcite/piglet/PigRelSqlUdfs.java +++ b/piglet/src/main/java/org/apache/calcite/piglet/PigRelSqlUdfs.java @@ -56,6 +56,8 @@ import static org.apache.calcite.piglet.PigTypes.TYPE_FACTORY; +import static java.util.Objects.requireNonNull; + /** * User-defined functions ({@link SqlUserDefinedFunction UDFs}) * needed for Pig-to-{@link RelNode} translation. @@ -66,11 +68,17 @@ private PigRelSqlUdfs() { // Defines ScalarFunc from their implementations private static final ScalarFunction PIG_TUPLE_FUNC = - ScalarFunctionImpl.create(PigRelSqlUdfs.class, "buildTuple"); + requireNonNull( + ScalarFunctionImpl.create(PigRelSqlUdfs.class, "buildTuple"), + "buildTuple"); private static final ScalarFunction PIG_BAG_FUNC = - ScalarFunctionImpl.create(PigRelSqlUdfs.class, "buildBag"); + requireNonNull( + ScalarFunctionImpl.create(PigRelSqlUdfs.class, "buildBag"), + "buildBag"); private static final ScalarFunction MULTISET_PROJECTION_FUNC = - ScalarFunctionImpl.create(PigRelSqlUdfs.class, "projectMultiset"); + requireNonNull( + ScalarFunctionImpl.create(PigRelSqlUdfs.class, "projectMultiset"), + "projectMultiset"); /** * Multiset projection projects a subset of columns from the component type @@ -149,7 +157,9 @@ private static SqlReturnTypeInference multisetProjectionInfer() { final List fields = source.getComponentType().getFieldList(); // Project a multiset of single column if (opBinding.getOperandCount() == 2) { - final int fieldNo = opBinding.getOperandLiteralValue(1, Integer.class); + final int fieldNo = + requireNonNull(opBinding.getOperandLiteralValue(1, Integer.class), + "fieldNo"); if (fields.size() == 1) { // Corner case: source with only single column, nothing to do. assert fieldNo == 0; @@ -162,7 +172,9 @@ private static SqlReturnTypeInference multisetProjectionInfer() { final List destNames = new ArrayList<>(); final List destTypes = new ArrayList<>(); for (int i = 1; i < opBinding.getOperandCount(); i++) { - final int fieldNo = opBinding.getOperandLiteralValue(i, Integer.class); + final int fieldNo = + requireNonNull(opBinding.getOperandLiteralValue(i, Integer.class), + "fieldNo"); destNames.add(fields.get(fieldNo).getName()); destTypes.add(fields.get(fieldNo).getType()); } @@ -203,7 +215,8 @@ private static SqlOperandMetadata multisetProjectionCheck() { return false; } final int fieldNo = - callBinding.getOperandLiteralValue(i, Integer.class); + requireNonNull(callBinding.getOperandLiteralValue(i, Integer.class), + "fieldNo"); // Field number should between 0 and maxFieldNo if (fieldNo < 0 || fieldNo > maxFieldNo) { return false; diff --git a/piglet/src/main/java/org/apache/calcite/piglet/PigRelUdfConverter.java b/piglet/src/main/java/org/apache/calcite/piglet/PigRelUdfConverter.java index b378002e0aa0..bba18c789d76 100644 --- a/piglet/src/main/java/org/apache/calcite/piglet/PigRelUdfConverter.java +++ b/piglet/src/main/java/org/apache/calcite/piglet/PigRelUdfConverter.java @@ -32,6 +32,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import org.jspecify.annotations.Nullable; + import java.lang.reflect.Method; import java.util.Map; @@ -169,7 +171,7 @@ static RexNode convertPigFunction(PigRelBuilder builder, FuncSpec pigFunc, * * @param call Pig aggregate UDF call */ - static SqlAggFunction getSqlAggFuncForPigUdf(RexCall call) { + static @Nullable SqlAggFunction getSqlAggFuncForPigUdf(RexCall call) { if (!(call.getOperator() instanceof PigUserDefinedFunction)) { return null; } diff --git a/piglet/src/main/java/org/apache/calcite/piglet/PigTable.java b/piglet/src/main/java/org/apache/calcite/piglet/PigTable.java index 94a8f7427f5a..9c3648e67878 100644 --- a/piglet/src/main/java/org/apache/calcite/piglet/PigTable.java +++ b/piglet/src/main/java/org/apache/calcite/piglet/PigTable.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.List; @@ -71,6 +71,6 @@ public static RelOptTable createRelOptTable(RelOptSchema schema, } @Override public Enumerable<@Nullable Object[]> scan(final DataContext root) { - return null; + throw new UnsupportedOperationException("PigTable cannot be scanned"); } } diff --git a/piglet/src/main/java/org/apache/calcite/piglet/PigToSqlAggregateRule.java b/piglet/src/main/java/org/apache/calcite/piglet/PigToSqlAggregateRule.java index 71f206d09afc..ff1787cdd2c8 100644 --- a/piglet/src/main/java/org/apache/calcite/piglet/PigToSqlAggregateRule.java +++ b/piglet/src/main/java/org/apache/calcite/piglet/PigToSqlAggregateRule.java @@ -36,6 +36,7 @@ import org.apache.calcite.tools.RelBuilder; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.ArrayList; @@ -45,6 +46,8 @@ import static org.apache.calcite.piglet.PigTypes.TYPE_FACTORY; +import static java.util.Objects.requireNonNull; + /** * Planner rule that converts Pig aggregate UDF calls to built-in SQL * aggregates. @@ -80,7 +83,7 @@ protected PigToSqlAggregateRule(Config config) { * projection called in an expression and also whether a column is * referred in that expression. */ - private static class PigAggUdfFinder extends RexVisitorImpl { + private static class PigAggUdfFinder extends RexVisitorImpl<@Nullable Void> { // Index of the column private final int projectCol; // List of all Pig aggregate UDFs found in the expression @@ -126,10 +129,10 @@ private static class RexCallReplacer extends RexShuttle { private final Map replacementMap; private final RexBuilder builder; private final int oldProjectCol; - private final RexNode newProjectCol; + private final @Nullable RexNode newProjectCol; RexCallReplacer(RexBuilder builder, Map replacementMap, - int oldProjectCol, RexNode newProjectCol) { + int oldProjectCol, @Nullable RexNode newProjectCol) { this.replacementMap = replacementMap; this.builder = builder; this.oldProjectCol = oldProjectCol; @@ -268,7 +271,7 @@ private static class RexCallReplacer extends RexShuttle { } for (RexCall rexCall : pigAggUdfs) { final List aggOperands = new ArrayList<>(); - for (int i : aggCallColumns.get(rexCall)) { + for (int i : requireNonNull(aggCallColumns.get(rexCall), "aggCallColumns")) { aggOperands.add(relBuilder.field(i)); } if (isMultisetProjection(rexCall)) { @@ -289,7 +292,8 @@ private static class RexCallReplacer extends RexShuttle { } } else { final SqlAggFunction udf = - PigRelUdfConverter.getSqlAggFuncForPigUdf(rexCall); + requireNonNull(PigRelUdfConverter.getSqlAggFuncForPigUdf(rexCall), + "udf"); aggCalls.add(relBuilder.aggregateCall(udf, aggOperands)); } } @@ -402,7 +406,9 @@ private static List getColsFromMultisetProjection(RexCall multisetProje for (int i = 1; i < multisetProjection.getOperands().size(); i++) { final RexLiteral indexLiteral = (RexLiteral) multisetProjection.getOperands().get(i); - columns.add(((BigDecimal) indexLiteral.getValue()).intValue()); + columns.add( + ((BigDecimal) requireNonNull(indexLiteral.getValue(), "index")) + .intValue()); } return columns; } diff --git a/piglet/src/main/java/org/apache/calcite/piglet/PigUdfFinder.java b/piglet/src/main/java/org/apache/calcite/piglet/PigUdfFinder.java index 45f07c605afe..d345068db9b1 100644 --- a/piglet/src/main/java/org/apache/calcite/piglet/PigUdfFinder.java +++ b/piglet/src/main/java/org/apache/calcite/piglet/PigUdfFinder.java @@ -18,6 +18,8 @@ import com.google.common.collect.ImmutableMap; +import org.jspecify.annotations.Nullable; + import java.lang.reflect.Method; import java.util.HashMap; import java.util.Locale; @@ -88,12 +90,12 @@ Method findPigUdfImplementationMethod(Class clazz) { /** * Finds "exec" method from a given array of methods. */ - private static Method findExecMethod(Method[] methods) { + private static @Nullable Method findExecMethod(Method @Nullable [] methods) { if (methods == null) { return null; } - Method returnedMethod = null; + @Nullable Method returnedMethod = null; for (Method method : methods) { if (method.getName().equals("exec")) { // There may be two methods named "exec", one of them just returns a diff --git a/piglet/src/main/java/org/apache/calcite/piglet/PigUserDefinedFunction.java b/piglet/src/main/java/org/apache/calcite/piglet/PigUserDefinedFunction.java index 2a33b87b2019..97c731a70930 100644 --- a/piglet/src/main/java/org/apache/calcite/piglet/PigUserDefinedFunction.java +++ b/piglet/src/main/java/org/apache/calcite/piglet/PigUserDefinedFunction.java @@ -31,16 +31,18 @@ import com.google.common.collect.ImmutableList; +import org.jspecify.annotations.Nullable; + /** Pig user-defined function. */ public class PigUserDefinedFunction extends SqlUserDefinedFunction { - public final FuncSpec funcSpec; + public final @Nullable FuncSpec funcSpec; private PigUserDefinedFunction(SqlIdentifier opName, SqlReturnTypeInference returnTypeInference, - SqlOperandTypeInference operandTypeInference, + @Nullable SqlOperandTypeInference operandTypeInference, SqlOperandMetadata operandMetadata, Function function, - FuncSpec funcSpec) { + @Nullable FuncSpec funcSpec) { super(opName, SqlKind.OTHER_FUNCTION, returnTypeInference, operandTypeInference, operandMetadata, function, SqlFunctionCategory.USER_DEFINED_CONSTRUCTOR, SqlSyntax.FUNCTION); @@ -50,7 +52,7 @@ private PigUserDefinedFunction(SqlIdentifier opName, public PigUserDefinedFunction(String name, SqlReturnTypeInference returnTypeInference, SqlOperandMetadata operandMetadata, Function function, - FuncSpec funcSpec) { + @Nullable FuncSpec funcSpec) { this(new SqlIdentifier(ImmutableList.of(name), SqlParserPos.ZERO), returnTypeInference, null, operandMetadata, function, funcSpec); } diff --git a/piglet/src/main/java/org/apache/calcite/piglet/package-info.java b/piglet/src/main/java/org/apache/calcite/piglet/package-info.java index e54e6a13dc8b..c23a16dc81ad 100644 --- a/piglet/src/main/java/org/apache/calcite/piglet/package-info.java +++ b/piglet/src/main/java/org/apache/calcite/piglet/package-info.java @@ -16,4 +16,7 @@ */ /** Piglet, a Pig-like language. */ +@NullMarked package org.apache.calcite.piglet; + +import org.jspecify.annotations.NullMarked; diff --git a/plus/build.gradle.kts b/plus/build.gradle.kts index 63fa9fcabd3e..2b84aac48763 100644 --- a/plus/build.gradle.kts +++ b/plus/build.gradle.kts @@ -19,7 +19,7 @@ dependencies { api(project(":linq4j")) api("net.hydromatic:quidem") api("org.apache.calcite.avatica:avatica-core") - api("org.checkerframework:checker-qual") + api("org.jspecify:jspecify") implementation("com.google.guava:guava") implementation("com.teradata.tpcds:tpcds") diff --git a/plus/src/main/java/org/apache/calcite/adapter/os/AbstractBaseScannableTable.java b/plus/src/main/java/org/apache/calcite/adapter/os/AbstractBaseScannableTable.java index 9f1bb186b1d2..4a3465606e17 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/os/AbstractBaseScannableTable.java +++ b/plus/src/main/java/org/apache/calcite/adapter/os/AbstractBaseScannableTable.java @@ -27,7 +27,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Abstract base class for implementations of OS table functions. diff --git a/plus/src/main/java/org/apache/calcite/adapter/os/CpuInfoTableFunction.java b/plus/src/main/java/org/apache/calcite/adapter/os/CpuInfoTableFunction.java index a42d897a39df..8238c203fdbc 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/os/CpuInfoTableFunction.java +++ b/plus/src/main/java/org/apache/calcite/adapter/os/CpuInfoTableFunction.java @@ -17,15 +17,13 @@ package org.apache.calcite.adapter.os; import org.apache.calcite.DataContext; -import org.apache.calcite.linq4j.AbstractEnumerable; import org.apache.calcite.linq4j.Enumerable; -import org.apache.calcite.linq4j.Enumerator; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.schema.ScannableTable; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Table function that executes the OS "cpu_info". @@ -37,11 +35,7 @@ private CpuInfoTableFunction() { public static ScannableTable eval(boolean b) { return new AbstractBaseScannableTable() { @Override public Enumerable<@Nullable Object[]> scan(DataContext root) { - return new AbstractEnumerable() { - @Override public Enumerator enumerator() { - return new OsQuery("cpu_info"); - } - }; + return new OsQueryEnumerable("cpu_info"); } @Override public RelDataType getRowType(RelDataTypeFactory typeFactory) { diff --git a/plus/src/main/java/org/apache/calcite/adapter/os/CpuTimeTableFunction.java b/plus/src/main/java/org/apache/calcite/adapter/os/CpuTimeTableFunction.java index e76ececcaf53..e33af84a8393 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/os/CpuTimeTableFunction.java +++ b/plus/src/main/java/org/apache/calcite/adapter/os/CpuTimeTableFunction.java @@ -17,15 +17,13 @@ package org.apache.calcite.adapter.os; import org.apache.calcite.DataContext; -import org.apache.calcite.linq4j.AbstractEnumerable; import org.apache.calcite.linq4j.Enumerable; -import org.apache.calcite.linq4j.Enumerator; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.schema.ScannableTable; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Table function that executes the OS "cpu_info". @@ -37,11 +35,7 @@ private CpuTimeTableFunction() { public static ScannableTable eval(boolean b) { return new AbstractBaseScannableTable() { @Override public Enumerable<@Nullable Object[]> scan(DataContext root) { - return new AbstractEnumerable() { - @Override public Enumerator enumerator() { - return new OsQuery("cpu_time"); - } - }; + return new OsQueryEnumerable("cpu_time"); } @Override public RelDataType getRowType(RelDataTypeFactory typeFactory) { diff --git a/plus/src/main/java/org/apache/calcite/adapter/os/DuTableFunction.java b/plus/src/main/java/org/apache/calcite/adapter/os/DuTableFunction.java index f1847bfab75b..80f6995a13bd 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/os/DuTableFunction.java +++ b/plus/src/main/java/org/apache/calcite/adapter/os/DuTableFunction.java @@ -23,7 +23,7 @@ import org.apache.calcite.schema.ScannableTable; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Table function that executes the OS "du" ("disk usage") command diff --git a/plus/src/main/java/org/apache/calcite/adapter/os/FilesTableFunction.java b/plus/src/main/java/org/apache/calcite/adapter/os/FilesTableFunction.java index cd7ca9e8b8d1..ecd31bdf7845 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/os/FilesTableFunction.java +++ b/plus/src/main/java/org/apache/calcite/adapter/os/FilesTableFunction.java @@ -29,7 +29,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.Arrays; @@ -205,7 +205,8 @@ private boolean isGnuStat() { final RelDataType rowType = getRowType(typeFactory); final List fieldNames = ImmutableList.copyOf(rowType.getFieldNames()); - final String osName = System.getProperty("os.name"); + final String osName = + requireNonNull(System.getProperty("os.name"), "os.name"); final String osVersion = System.getProperty("os.version"); Util.discard(osVersion); final Enumerable enumerable; @@ -255,7 +256,7 @@ private static class FilesTableFunctionEnumerator implements Enumerator<@Nullabl this.osName = osName; } - @Override public Object[] current() { + @Override public @Nullable Object[] current() { return requireNonNull(current, "current"); } diff --git a/plus/src/main/java/org/apache/calcite/adapter/os/GitCommitsTableFunction.java b/plus/src/main/java/org/apache/calcite/adapter/os/GitCommitsTableFunction.java index 2e589572914b..a56dced2b0fc 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/os/GitCommitsTableFunction.java +++ b/plus/src/main/java/org/apache/calcite/adapter/os/GitCommitsTableFunction.java @@ -25,7 +25,7 @@ import org.apache.calcite.schema.ScannableTable; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.NoSuchElementException; diff --git a/plus/src/main/java/org/apache/calcite/adapter/os/InterfaceAddressesTableFunction.java b/plus/src/main/java/org/apache/calcite/adapter/os/InterfaceAddressesTableFunction.java index 6c566fc34ec9..31c922b0f7c1 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/os/InterfaceAddressesTableFunction.java +++ b/plus/src/main/java/org/apache/calcite/adapter/os/InterfaceAddressesTableFunction.java @@ -17,15 +17,13 @@ package org.apache.calcite.adapter.os; import org.apache.calcite.DataContext; -import org.apache.calcite.linq4j.AbstractEnumerable; import org.apache.calcite.linq4j.Enumerable; -import org.apache.calcite.linq4j.Enumerator; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.schema.ScannableTable; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Table function that executes the OS "interface_addresses". @@ -37,11 +35,7 @@ private InterfaceAddressesTableFunction() { public static ScannableTable eval(boolean b) { return new AbstractBaseScannableTable() { @Override public Enumerable<@Nullable Object[]> scan(DataContext root) { - return new AbstractEnumerable() { - @Override public Enumerator enumerator() { - return new OsQuery("interface_addresses"); - } - }; + return new OsQueryEnumerable("interface_addresses"); } @Override public RelDataType getRowType(RelDataTypeFactory typeFactory) { diff --git a/plus/src/main/java/org/apache/calcite/adapter/os/InterfaceDetailsTableFunction.java b/plus/src/main/java/org/apache/calcite/adapter/os/InterfaceDetailsTableFunction.java index 507e8ab2c9db..d193e7b567f5 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/os/InterfaceDetailsTableFunction.java +++ b/plus/src/main/java/org/apache/calcite/adapter/os/InterfaceDetailsTableFunction.java @@ -17,15 +17,13 @@ package org.apache.calcite.adapter.os; import org.apache.calcite.DataContext; -import org.apache.calcite.linq4j.AbstractEnumerable; import org.apache.calcite.linq4j.Enumerable; -import org.apache.calcite.linq4j.Enumerator; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.schema.ScannableTable; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Table function that executes the OS "interface_details". @@ -37,11 +35,7 @@ private InterfaceDetailsTableFunction() { public static ScannableTable eval(boolean b) { return new AbstractBaseScannableTable() { @Override public Enumerable<@Nullable Object[]> scan(DataContext root) { - return new AbstractEnumerable() { - @Override public Enumerator enumerator() { - return new OsQuery("interface_details"); - } - }; + return new OsQueryEnumerable("interface_details"); } @Override public RelDataType getRowType(RelDataTypeFactory typeFactory) { diff --git a/plus/src/main/java/org/apache/calcite/adapter/os/JavaInfoTableFunction.java b/plus/src/main/java/org/apache/calcite/adapter/os/JavaInfoTableFunction.java index adacb0b5c3c6..86a893f06642 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/os/JavaInfoTableFunction.java +++ b/plus/src/main/java/org/apache/calcite/adapter/os/JavaInfoTableFunction.java @@ -17,15 +17,13 @@ package org.apache.calcite.adapter.os; import org.apache.calcite.DataContext; -import org.apache.calcite.linq4j.AbstractEnumerable; import org.apache.calcite.linq4j.Enumerable; -import org.apache.calcite.linq4j.Enumerator; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.schema.ScannableTable; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Table function that executes the OS "java_info". @@ -37,11 +35,7 @@ private JavaInfoTableFunction() { public static ScannableTable eval(boolean b) { return new AbstractBaseScannableTable() { @Override public Enumerable<@Nullable Object[]> scan(DataContext root) { - return new AbstractEnumerable() { - @Override public Enumerator enumerator() { - return new OsQuery("java_info"); - } - }; + return new OsQueryEnumerable("java_info"); } @Override public RelDataType getRowType(RelDataTypeFactory typeFactory) { diff --git a/plus/src/main/java/org/apache/calcite/adapter/os/JpsTableFunction.java b/plus/src/main/java/org/apache/calcite/adapter/os/JpsTableFunction.java index 1d4ae1c2c5ec..bc1a03a042a2 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/os/JpsTableFunction.java +++ b/plus/src/main/java/org/apache/calcite/adapter/os/JpsTableFunction.java @@ -23,7 +23,7 @@ import org.apache.calcite.schema.ScannableTable; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Table function that executes the OS "jps" ("Java Virtual Machine Process diff --git a/plus/src/main/java/org/apache/calcite/adapter/os/MemoryInfoTableFunction.java b/plus/src/main/java/org/apache/calcite/adapter/os/MemoryInfoTableFunction.java index 5047f3f885f2..f13bdd5dff89 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/os/MemoryInfoTableFunction.java +++ b/plus/src/main/java/org/apache/calcite/adapter/os/MemoryInfoTableFunction.java @@ -17,15 +17,13 @@ package org.apache.calcite.adapter.os; import org.apache.calcite.DataContext; -import org.apache.calcite.linq4j.AbstractEnumerable; import org.apache.calcite.linq4j.Enumerable; -import org.apache.calcite.linq4j.Enumerator; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.schema.ScannableTable; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Table function that executes the OS "memory_info". @@ -37,11 +35,7 @@ private MemoryInfoTableFunction() { public static ScannableTable eval(boolean b) { return new AbstractBaseScannableTable() { @Override public Enumerable<@Nullable Object[]> scan(DataContext root) { - return new AbstractEnumerable() { - @Override public Enumerator enumerator() { - return new OsQuery("memory_info"); - } - }; + return new OsQueryEnumerable("memory_info"); } @Override public RelDataType getRowType(RelDataTypeFactory typeFactory) { diff --git a/plus/src/main/java/org/apache/calcite/adapter/os/MountsTableFunction.java b/plus/src/main/java/org/apache/calcite/adapter/os/MountsTableFunction.java index 3beb4b230e41..7467ef8eaefa 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/os/MountsTableFunction.java +++ b/plus/src/main/java/org/apache/calcite/adapter/os/MountsTableFunction.java @@ -17,15 +17,13 @@ package org.apache.calcite.adapter.os; import org.apache.calcite.DataContext; -import org.apache.calcite.linq4j.AbstractEnumerable; import org.apache.calcite.linq4j.Enumerable; -import org.apache.calcite.linq4j.Enumerator; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.schema.ScannableTable; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Table function that executes the OS "mounts". @@ -37,11 +35,7 @@ private MountsTableFunction() { public static ScannableTable eval(boolean b) { return new AbstractBaseScannableTable() { @Override public Enumerable<@Nullable Object[]> scan(DataContext root) { - return new AbstractEnumerable() { - @Override public Enumerator enumerator() { - return new OsQuery("mounts"); - } - }; + return new OsQueryEnumerable("mounts"); } @Override public RelDataType getRowType(RelDataTypeFactory typeFactory) { diff --git a/plus/src/main/java/org/apache/calcite/adapter/os/OsQuery.java b/plus/src/main/java/org/apache/calcite/adapter/os/OsQuery.java index 83c01811df68..78dc9d22a0b1 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/os/OsQuery.java +++ b/plus/src/main/java/org/apache/calcite/adapter/os/OsQuery.java @@ -20,6 +20,7 @@ import org.apache.calcite.linq4j.Linq4j; import org.apache.calcite.util.trace.CalciteTrace; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import java.util.ArrayList; @@ -29,20 +30,20 @@ /** * Enumerator that reads from OS's System. */ -public class OsQuery implements Enumerator { +public class OsQuery implements Enumerator<@Nullable Object[]> { private static final Logger LOGGER = CalciteTrace.getParserTracer(); - private final Enumerator enumerator; + private final Enumerator<@Nullable Object[]> enumerator; public OsQuery(String type) { this.enumerator = Linq4j.enumerator(eval(type)); } - public Enumerator getEnumerator() { + public Enumerator<@Nullable Object[]> getEnumerator() { return enumerator; } - @Override public Object[] current() { + @Override public @Nullable Object[] current() { return enumerator.current(); } diff --git a/src/main/config/checkerframework/guava/Function.astub b/plus/src/main/java/org/apache/calcite/adapter/os/OsQueryEnumerable.java similarity index 60% rename from src/main/config/checkerframework/guava/Function.astub rename to plus/src/main/java/org/apache/calcite/adapter/os/OsQueryEnumerable.java index 76f9d0aea34d..141dab2ce56a 100644 --- a/src/main/config/checkerframework/guava/Function.astub +++ b/plus/src/main/java/org/apache/calcite/adapter/os/OsQueryEnumerable.java @@ -14,17 +14,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.common.base; +package org.apache.calcite.adapter.os; -import org.checkerframework.checker.nullness.qual.*; +import org.apache.calcite.linq4j.AbstractEnumerable; +import org.apache.calcite.linq4j.Enumerator; + +import org.jspecify.annotations.Nullable; /** - * Guava has {@code Nullable} argument and return value by default. - * Checkerframework cna infer nullability from the actual generic types. - * - * @param argument type - * @param return type + * Enumerable over the rows that an {@code osquery} query returns. */ -public interface Function { - T apply(F input); +class OsQueryEnumerable extends AbstractEnumerable<@Nullable Object[]> { + private final String tableName; + + OsQueryEnumerable(String tableName) { + this.tableName = tableName; + } + + @Override public Enumerator<@Nullable Object[]> enumerator() { + return new OsQuery(tableName); + } } diff --git a/plus/src/main/java/org/apache/calcite/adapter/os/OsVersionTableFunction.java b/plus/src/main/java/org/apache/calcite/adapter/os/OsVersionTableFunction.java index 961e89597b79..6a57cbfcd16f 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/os/OsVersionTableFunction.java +++ b/plus/src/main/java/org/apache/calcite/adapter/os/OsVersionTableFunction.java @@ -17,15 +17,13 @@ package org.apache.calcite.adapter.os; import org.apache.calcite.DataContext; -import org.apache.calcite.linq4j.AbstractEnumerable; import org.apache.calcite.linq4j.Enumerable; -import org.apache.calcite.linq4j.Enumerator; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.schema.ScannableTable; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Table function that executes the OS "os_version". @@ -37,11 +35,7 @@ private OsVersionTableFunction() { public static ScannableTable eval(boolean b) { return new AbstractBaseScannableTable() { @Override public Enumerable<@Nullable Object[]> scan(DataContext root) { - return new AbstractEnumerable() { - @Override public Enumerator enumerator() { - return new OsQuery("os_version"); - } - }; + return new OsQueryEnumerable("os_version"); } @Override public RelDataType getRowType(RelDataTypeFactory typeFactory) { diff --git a/plus/src/main/java/org/apache/calcite/adapter/os/Processes.java b/plus/src/main/java/org/apache/calcite/adapter/os/Processes.java index bb38ebba3f04..d9c1f8e361df 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/os/Processes.java +++ b/plus/src/main/java/org/apache/calcite/adapter/os/Processes.java @@ -20,6 +20,8 @@ import org.apache.calcite.linq4j.Enumerable; import org.apache.calcite.linq4j.Enumerator; +import org.jspecify.annotations.Nullable; + import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; @@ -88,10 +90,10 @@ private static class ProcessLinesEnumerator new InputStreamReader(bis, StandardCharsets.UTF_8); final BufferedReader br = new BufferedReader(isr); return new Enumerator() { - private String line; + private @Nullable String line; @Override public String current() { - return line; + return requireNonNull(line, "line"); } @Override public boolean moveNext() { @@ -140,10 +142,10 @@ private static class SeparatedLinesEnumerable final BufferedReader br = new BufferedReader(isr); return new Enumerator() { private final StringBuilder b = new StringBuilder(); - private String line; + private @Nullable String line; @Override public String current() { - return line; + return requireNonNull(line, "line"); } @Override public boolean moveNext() { diff --git a/plus/src/main/java/org/apache/calcite/adapter/os/PsTableFunction.java b/plus/src/main/java/org/apache/calcite/adapter/os/PsTableFunction.java index 635b55100da5..f6c41747b8a9 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/os/PsTableFunction.java +++ b/plus/src/main/java/org/apache/calcite/adapter/os/PsTableFunction.java @@ -30,7 +30,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.List; import java.util.regex.Matcher; @@ -39,6 +39,7 @@ import static java.lang.Float.parseFloat; import static java.lang.Long.parseLong; +import static java.util.Objects.requireNonNull; /** * Table function that executes the OS "ps" command @@ -87,9 +88,9 @@ private PsTableFunction() { * predefined list of parameters. */ @VisibleForTesting - protected static class LineParser implements Function1 { + protected static class LineParser implements Function1 { - @Override public Object[] apply(String line) { + @Override public @Nullable Object[] apply(String line) { final String[] tokens = line.trim().split(" +"); final Object[] values = new Object[PS_FIELD_NAMES.size()]; @@ -156,17 +157,18 @@ private static Object field(String field, String value) { final Matcher m1 = MINUTE_SECOND_MILLIS_PATTERN.matcher(value); if (m1.matches()) { - final long h = parseLong(m1.group(1)); - final long m = parseLong(m1.group(2)); - final long s = parseLong(m1.group(3)); + final long h = parseLong(requireNonNull(m1.group(1), "group")); + final long m = parseLong(requireNonNull(m1.group(2), "group")); + final long s = parseLong(requireNonNull(m1.group(3), "group")); return h * 3600000L + m * 60000L + s * 1000L; } final Matcher m2 = HOUR_MINUTE_SECOND_PATTERN.matcher(value); if (m2.matches()) { - final long m = parseLong(m2.group(1)); - final long s = parseLong(m2.group(2)); - StringBuilder g3 = new StringBuilder(m2.group(3)); + final long m = parseLong(requireNonNull(m2.group(1), "group")); + final long s = parseLong(requireNonNull(m2.group(2), "group")); + StringBuilder g3 = + new StringBuilder(requireNonNull(m2.group(3), "group")); while (g3.length() < 3) { g3.append("0"); } @@ -190,7 +192,8 @@ public static ScannableTable eval(boolean b) { final RelDataType rowType = getRowType(root.getTypeFactory()); final List fieldNames = ImmutableList.copyOf(rowType.getFieldNames()); final String[] args; - final String osName = System.getProperty("os.name"); + final String osName = + requireNonNull(System.getProperty("os.name"), "os.name"); final String osVersion = System.getProperty("os.version"); Util.discard(osVersion); switch (osName) { diff --git a/plus/src/main/java/org/apache/calcite/adapter/os/SqlShell.java b/plus/src/main/java/org/apache/calcite/adapter/os/SqlShell.java index 20c3fac5a9ca..cd451a319939 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/os/SqlShell.java +++ b/plus/src/main/java/org/apache/calcite/adapter/os/SqlShell.java @@ -23,6 +23,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Maps; +import org.jspecify.annotations.Nullable; + import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; @@ -274,7 +276,7 @@ enum Format { } } - private void value(StringBuilder b, String s) { + private void value(StringBuilder b, @Nullable String s) { if (s == null) { // do nothing - unfortunately same as empty string } else if (s.contains("\"")) { @@ -312,7 +314,8 @@ private void value(StringBuilder b, String s) { json.append(b, 0, Maps.asMap(fields, columnLabel -> { try { - final int i1 = fieldOrdinals.get(columnLabel); + final int i1 = + requireNonNull(fieldOrdinals.get(columnLabel), columnLabel); switch (m.getColumnType(i1)) { case Types.BOOLEAN: final boolean b1 = r.getBoolean(i1); @@ -358,7 +361,7 @@ private void value(StringBuilder b, String s) { final ResultSetMetaData m = r.getMetaData(); final int n = m.getColumnCount(); - final List values = new ArrayList<>(); + final List<@Nullable String> values = new ArrayList<>(); final int[] lengths = new int[n]; final boolean[] rights = new boolean[n]; for (int i = 0; i < n; i++) { @@ -435,7 +438,7 @@ private void value(StringBuilder b, String s) { out.println(); } - private void value(StringBuilder b, String value, int length, + private void value(StringBuilder b, @Nullable String value, int length, boolean right) { if (value == null) { pad(b, length, ' '); diff --git a/plus/src/main/java/org/apache/calcite/adapter/os/StdinTableFunction.java b/plus/src/main/java/org/apache/calcite/adapter/os/StdinTableFunction.java index 493bccbe99d7..64fbe23cef93 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/os/StdinTableFunction.java +++ b/plus/src/main/java/org/apache/calcite/adapter/os/StdinTableFunction.java @@ -25,7 +25,7 @@ import org.apache.calcite.schema.ScannableTable; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.BufferedReader; import java.io.IOException; @@ -46,47 +46,7 @@ public static ScannableTable eval(boolean b) { return new AbstractBaseScannableTable() { @Override public Enumerable<@Nullable Object[]> scan(DataContext root) { final InputStream is = DataContext.Variable.STDIN.get(root); - return new AbstractEnumerable() { - final InputStreamReader in = - new InputStreamReader(is, StandardCharsets.UTF_8); - final BufferedReader br = new BufferedReader(in); - - @Override public Enumerator enumerator() { - return new Enumerator() { - @Nullable String line; - int i; - - @Override public Object[] current() { - if (line == null) { - throw new NoSuchElementException(); - } - return new Object[] {i, line}; - } - - @Override public boolean moveNext() { - try { - line = br.readLine(); - ++i; - return line != null; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override public void reset() { - throw new UnsupportedOperationException(); - } - - @Override public void close() { - try { - br.close(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - }; - } - }; + return new StdinEnumerable(is); } @Override public RelDataType getRowType(RelDataTypeFactory typeFactory) { @@ -97,4 +57,59 @@ public static ScannableTable eval(boolean b) { } }; } + + /** Enumerable over the lines of standard input. */ + private static class StdinEnumerable + extends AbstractEnumerable<@Nullable Object[]> { + private final BufferedReader br; + + StdinEnumerable(InputStream is) { + this.br = + new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); + } + + @Override public Enumerator<@Nullable Object[]> enumerator() { + return new StdinEnumerator(br); + } + + /** Enumerator over the lines of standard input. */ + private static class StdinEnumerator implements Enumerator<@Nullable Object[]> { + private final BufferedReader br; + private @Nullable String line; + private int i; + + StdinEnumerator(BufferedReader br) { + this.br = br; + } + + @Override public @Nullable Object[] current() { + if (line == null) { + throw new NoSuchElementException(); + } + return new Object[] {i, line}; + } + + @Override public boolean moveNext() { + try { + line = br.readLine(); + ++i; + return line != null; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override public void reset() { + throw new UnsupportedOperationException(); + } + + @Override public void close() { + try { + br.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + } } diff --git a/plus/src/main/java/org/apache/calcite/adapter/os/SystemInfoTableFunction.java b/plus/src/main/java/org/apache/calcite/adapter/os/SystemInfoTableFunction.java index 36e406454882..dd75b53bca60 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/os/SystemInfoTableFunction.java +++ b/plus/src/main/java/org/apache/calcite/adapter/os/SystemInfoTableFunction.java @@ -17,15 +17,13 @@ package org.apache.calcite.adapter.os; import org.apache.calcite.DataContext; -import org.apache.calcite.linq4j.AbstractEnumerable; import org.apache.calcite.linq4j.Enumerable; -import org.apache.calcite.linq4j.Enumerator; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.schema.ScannableTable; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Table function that executes the OS "system_info". @@ -37,11 +35,7 @@ private SystemInfoTableFunction() { public static ScannableTable eval(boolean b) { return new AbstractBaseScannableTable() { @Override public Enumerable<@Nullable Object[]> scan(DataContext root) { - return new AbstractEnumerable() { - @Override public Enumerator enumerator() { - return new OsQuery("system_info"); - } - }; + return new OsQueryEnumerable("system_info"); } @Override public RelDataType getRowType(RelDataTypeFactory typeFactory) { diff --git a/plus/src/main/java/org/apache/calcite/adapter/os/VmstatTableFunction.java b/plus/src/main/java/org/apache/calcite/adapter/os/VmstatTableFunction.java index 2a8f5e8ae196..0f043d6a87f5 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/os/VmstatTableFunction.java +++ b/plus/src/main/java/org/apache/calcite/adapter/os/VmstatTableFunction.java @@ -27,11 +27,12 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import static java.lang.Long.parseLong; +import static java.util.Objects.requireNonNull; /** * Table function that executes the OS "vmstat" command @@ -48,7 +49,8 @@ public static ScannableTable eval(boolean b) { final List fieldNames = ImmutableList.copyOf(rowType.getFieldNames()); final String[] args; - final String osName = System.getProperty("os.name"); + final String osName = + requireNonNull(System.getProperty("os.name"), "os.name"); final String osVersion = System.getProperty("os.version"); Util.discard(osVersion); // Fork out to a shell so that we can get normal text-munging support. @@ -63,39 +65,12 @@ public static ScannableTable eval(boolean b) { default: args = new String[]{"/bin/sh", "-c", "vmstat -n | tail -n +3"}; } - return Processes.processLines(args) - .select( - new Function1() { - @Override public Object[] apply(String line) { - final String[] fields = line.trim().split("\\s+"); - final Object[] values = new Object[fieldNames.size()]; - for (int i = 0; i < values.length; i++) { - try { - values[i] = field(fieldNames.get(i), fields[i]); - } catch (RuntimeException e) { - e.printStackTrace(System.out); - throw new RuntimeException("while parsing value [" - + fields[i] + "] of field [" + fieldNames.get(i) - + "] in line [" + line + "]"); - } - } - return values; - } - - private Object field(@SuppressWarnings("unused") String field, String value) { - if (value.isEmpty()) { - return 0; - } - if (value.endsWith(".")) { - return parseLong(value); - } - return parseLong(value); - } - }); + return Processes.processLines(args).select(new LineParser(fieldNames)); } @Override public RelDataType getRowType(RelDataTypeFactory typeFactory) { - final String osName = System.getProperty("os.name"); + final String osName = + requireNonNull(System.getProperty("os.name"), "os.name"); final RelDataTypeFactory.Builder builder = typeFactory.builder(); switch (osName) { case "Mac OS X": @@ -147,4 +122,38 @@ private Object field(@SuppressWarnings("unused") String field, String value) { } }; } + + /** Parses one line of vmstat output into a row. */ + private static class LineParser implements Function1 { + private final List fieldNames; + + LineParser(List fieldNames) { + this.fieldNames = fieldNames; + } + + @Override public @Nullable Object[] apply(String line) { + final String[] fields = line.trim().split("\\s+"); + final @Nullable Object[] values = new Object[fieldNames.size()]; + for (int i = 0; i < values.length; i++) { + try { + values[i] = field(fieldNames.get(i), fields[i]); + } catch (RuntimeException e) { + e.printStackTrace(System.out); + throw new RuntimeException("while parsing value [" + + fields[i] + "] of field [" + fieldNames.get(i) + + "] in line [" + line + "]"); + } + } + return values; + } + + private static Object field(@SuppressWarnings("unused") String field, + String value) { + if (value.isEmpty()) { + return 0; + } + return parseLong(value); + } + } + } diff --git a/plus/src/main/java/org/apache/calcite/adapter/os/package-info.java b/plus/src/main/java/org/apache/calcite/adapter/os/package-info.java index 9ec1e4679a64..d3073f4a1c23 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/os/package-info.java +++ b/plus/src/main/java/org/apache/calcite/adapter/os/package-info.java @@ -19,4 +19,7 @@ * The OS adapter contains various table functions that let you query data * sources in your operating system and environment. */ +@NullMarked package org.apache.calcite.adapter.os; + +import org.jspecify.annotations.NullMarked; diff --git a/plus/src/main/java/org/apache/calcite/adapter/tpcds/TpcdsSchema.java b/plus/src/main/java/org/apache/calcite/adapter/tpcds/TpcdsSchema.java index 20ae7d314521..acd2426179de 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/tpcds/TpcdsSchema.java +++ b/plus/src/main/java/org/apache/calcite/adapter/tpcds/TpcdsSchema.java @@ -43,7 +43,7 @@ import com.teradata.tpcds.column.Column; import com.teradata.tpcds.column.ColumnType; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.ArrayList; @@ -182,13 +182,13 @@ private class TpcdsSchemaQueryable extends AbstractTableQueryable<@Nullable Obje /** Selector for {@link TpcdsSchema}. */ private class TpcdsSchemaSelector - implements Function1>, Enumerable<@Nullable Object[]>> { + implements Function1>, Enumerable<@Nullable Object[]>> { final Column[] columns = tpcdsTable.getColumns(); @Override public Enumerable<@Nullable Object[]> apply( - List> inRows) { + List> inRows) { final List<@Nullable Object[]> rows = new ArrayList<>(); - for (List<@Nullable String> strings : inRows) { + for (List strings : inRows) { final @Nullable Object[] values = new Object[columns.length]; for (int i = 0; i < strings.size(); i++) { values[i] = convert(strings.get(i), columns[i]); diff --git a/plus/src/main/java/org/apache/calcite/adapter/tpcds/package-info.java b/plus/src/main/java/org/apache/calcite/adapter/tpcds/package-info.java index 0bfb52c6adc4..4749dcc6d0d4 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/tpcds/package-info.java +++ b/plus/src/main/java/org/apache/calcite/adapter/tpcds/package-info.java @@ -18,4 +18,7 @@ /** * TPC-DS schema. */ +@NullMarked package org.apache.calcite.adapter.tpcds; + +import org.jspecify.annotations.NullMarked; diff --git a/plus/src/main/java/org/apache/calcite/adapter/tpch/package-info.java b/plus/src/main/java/org/apache/calcite/adapter/tpch/package-info.java index c76dfe13fb83..3f92405009cd 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/tpch/package-info.java +++ b/plus/src/main/java/org/apache/calcite/adapter/tpch/package-info.java @@ -18,4 +18,7 @@ /** * TPC-H schema. */ +@NullMarked package org.apache.calcite.adapter.tpch; + +import org.jspecify.annotations.NullMarked; diff --git a/plus/src/main/java/org/apache/calcite/adapter/utils/package-info.java b/plus/src/main/java/org/apache/calcite/adapter/utils/package-info.java index 619fdc2c2d9a..4d162f69334c 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/utils/package-info.java +++ b/plus/src/main/java/org/apache/calcite/adapter/utils/package-info.java @@ -18,4 +18,7 @@ /** * Used to put OS adapter related util classes. */ +@NullMarked package org.apache.calcite.adapter.utils; + +import org.jspecify.annotations.NullMarked; diff --git a/plus/src/main/java/org/apache/calcite/chinook/ChinookAvaticaServer.java b/plus/src/main/java/org/apache/calcite/chinook/ChinookAvaticaServer.java index 4bcb00540d40..df71789eab35 100644 --- a/plus/src/main/java/org/apache/calcite/chinook/ChinookAvaticaServer.java +++ b/plus/src/main/java/org/apache/calcite/chinook/ChinookAvaticaServer.java @@ -25,6 +25,8 @@ import net.hydromatic.chinook.data.hsqldb.ChinookHsqldb; +import org.jspecify.annotations.Nullable; + import java.io.IOException; import java.sql.SQLException; import java.util.List; @@ -34,6 +36,8 @@ * between Avatica JDBC transport and Calcite. */ public class ChinookAvaticaServer { + /** Set by {@link #startWithCalcite} or {@link #startWithRaw}. */ + @SuppressWarnings("NullAway.Init") private HttpServer server; public void startWithCalcite() throws Exception { @@ -62,7 +66,7 @@ public static class CalciteChinookMetaFactory implements Meta.Factory { private static final CalciteConnectionProvider CONNECTION_PROVIDER = new CalciteConnectionProvider(); - private static volatile JdbcMeta instance = null; + private static volatile @Nullable JdbcMeta instance = null; private static JdbcMeta getInstance() { if (instance == null) { @@ -88,7 +92,7 @@ private static JdbcMeta getInstance() { * Factory for Chinook Calcite database wrapped in meta for Avatica. */ public static class RawChinookMetaFactory implements Meta.Factory { - private static volatile JdbcMeta instance = null; + private static volatile @Nullable JdbcMeta instance = null; private static JdbcMeta getInstance() { if (instance == null) { diff --git a/plus/src/main/java/org/apache/calcite/chinook/PreferredAlbumsTableFactory.java b/plus/src/main/java/org/apache/calcite/chinook/PreferredAlbumsTableFactory.java index cb9086a7403c..d49d6805ef92 100644 --- a/plus/src/main/java/org/apache/calcite/chinook/PreferredAlbumsTableFactory.java +++ b/plus/src/main/java/org/apache/calcite/chinook/PreferredAlbumsTableFactory.java @@ -30,7 +30,7 @@ import com.google.common.collect.DiscreteDomain; import com.google.common.collect.Range; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Map; diff --git a/plus/src/main/java/org/apache/calcite/chinook/PreferredGenresTableFactory.java b/plus/src/main/java/org/apache/calcite/chinook/PreferredGenresTableFactory.java index abfada547f71..f7a8a317d44e 100644 --- a/plus/src/main/java/org/apache/calcite/chinook/PreferredGenresTableFactory.java +++ b/plus/src/main/java/org/apache/calcite/chinook/PreferredGenresTableFactory.java @@ -30,7 +30,7 @@ import com.google.common.collect.DiscreteDomain; import com.google.common.collect.Range; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Map; diff --git a/plus/src/main/java/org/apache/calcite/chinook/package-info.java b/plus/src/main/java/org/apache/calcite/chinook/package-info.java index 3ce1f9feb3cd..6bcc23f81f9e 100644 --- a/plus/src/main/java/org/apache/calcite/chinook/package-info.java +++ b/plus/src/main/java/org/apache/calcite/chinook/package-info.java @@ -18,4 +18,7 @@ /** * End to end tests. */ +@NullMarked package org.apache.calcite.chinook; + +import org.jspecify.annotations.NullMarked; diff --git a/plus/src/test/java/org/apache/calcite/adapter/tpcds/TpcdsTest.java b/plus/src/test/java/org/apache/calcite/adapter/tpcds/TpcdsTest.java index 096e5e582c69..54654907811e 100644 --- a/plus/src/test/java/org/apache/calcite/adapter/tpcds/TpcdsTest.java +++ b/plus/src/test/java/org/apache/calcite/adapter/tpcds/TpcdsTest.java @@ -32,7 +32,7 @@ import net.hydromatic.tpcds.query.Query; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; diff --git a/redis/src/main/java/org/apache/calcite/adapter/redis/RedisConfig.java b/redis/src/main/java/org/apache/calcite/adapter/redis/RedisConfig.java index 7ca72a12eb0f..954132f891c0 100644 --- a/redis/src/main/java/org/apache/calcite/adapter/redis/RedisConfig.java +++ b/redis/src/main/java/org/apache/calcite/adapter/redis/RedisConfig.java @@ -16,6 +16,8 @@ */ package org.apache.calcite.adapter.redis; +import org.jspecify.annotations.Nullable; + /** * Set the redis config. */ @@ -23,9 +25,9 @@ public class RedisConfig { private final String host; private final int port; private final int database; - private final String password; + private final @Nullable String password; - public RedisConfig(String host, int port, int database, String password) { + public RedisConfig(String host, int port, int database, @Nullable String password) { this.host = host; this.port = port; this.database = database; @@ -44,7 +46,7 @@ public int getDatabase() { return database; } - public String getPassword() { + public @Nullable String getPassword() { return password; } } diff --git a/redis/src/main/java/org/apache/calcite/adapter/redis/RedisDataFormat.java b/redis/src/main/java/org/apache/calcite/adapter/redis/RedisDataFormat.java index 2dc3a0ccd2d9..c3178d92be0b 100644 --- a/redis/src/main/java/org/apache/calcite/adapter/redis/RedisDataFormat.java +++ b/redis/src/main/java/org/apache/calcite/adapter/redis/RedisDataFormat.java @@ -16,6 +16,8 @@ */ package org.apache.calcite.adapter.redis; +import org.jspecify.annotations.Nullable; + /** * Define the data processing type of redis. */ @@ -43,7 +45,7 @@ public enum RedisDataFormat { this.typeName = typeName; } - public static RedisDataFormat fromTypeName(String typeName) { + public static @Nullable RedisDataFormat fromTypeName(String typeName) { for (RedisDataFormat type : RedisDataFormat.values()) { if (type.getTypeName().equals(typeName)) { return type; diff --git a/redis/src/main/java/org/apache/calcite/adapter/redis/RedisDataProcess.java b/redis/src/main/java/org/apache/calcite/adapter/redis/RedisDataProcess.java index 024a0e7df91f..398859b3adbd 100644 --- a/redis/src/main/java/org/apache/calcite/adapter/redis/RedisDataProcess.java +++ b/redis/src/main/java/org/apache/calcite/adapter/redis/RedisDataProcess.java @@ -85,7 +85,7 @@ private Object[] parseJson(String value) { if (obj == null) { arr[i] = ""; } else { - arr[i] = jsonNode.findValue(fields.get(i).get("mapping").toString()); + arr[i] = jsonNode.findValue(obj.toString()); } } } catch (Exception e) { diff --git a/redis/src/main/java/org/apache/calcite/adapter/redis/RedisDataType.java b/redis/src/main/java/org/apache/calcite/adapter/redis/RedisDataType.java index 1e19d6b7f049..5a789ae64067 100644 --- a/redis/src/main/java/org/apache/calcite/adapter/redis/RedisDataType.java +++ b/redis/src/main/java/org/apache/calcite/adapter/redis/RedisDataType.java @@ -16,6 +16,8 @@ */ package org.apache.calcite.adapter.redis; +import org.jspecify.annotations.Nullable; + /** * All available data type for Redis. */ @@ -74,7 +76,7 @@ public enum RedisDataType { this.typeName = typeName; } - public static RedisDataType fromTypeName(String typeName) { + public static @Nullable RedisDataType fromTypeName(String typeName) { for (RedisDataType type : RedisDataType.values()) { if (type.getTypeName().equals(typeName)) { return type; diff --git a/redis/src/main/java/org/apache/calcite/adapter/redis/RedisEnumerator.java b/redis/src/main/java/org/apache/calcite/adapter/redis/RedisEnumerator.java index dede17cd48f0..9a6c874858da 100644 --- a/redis/src/main/java/org/apache/calcite/adapter/redis/RedisEnumerator.java +++ b/redis/src/main/java/org/apache/calcite/adapter/redis/RedisEnumerator.java @@ -19,6 +19,8 @@ import org.apache.calcite.linq4j.Enumerator; import org.apache.calcite.linq4j.Linq4j; +import org.jspecify.annotations.Nullable; + import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -30,8 +32,8 @@ /** * Implementation of {@link RedisEnumerator}. */ -class RedisEnumerator implements Enumerator { - private final Enumerator enumerator; +class RedisEnumerator implements Enumerator<@Nullable Object[]> { + private final Enumerator<@Nullable Object[]> enumerator; RedisEnumerator(RedisConfig redisConfig, RedisSchema schema, String tableName) { RedisTableFieldInfo tableFieldInfo = schema.getTableFieldInfo(tableName); @@ -60,13 +62,14 @@ static Map deduceRowType(RedisTableFieldInfo tableFieldInfo) { fieldBuilder.put("key", "key"); } else { for (LinkedHashMap field : tableFieldInfo.getFields()) { - fieldBuilder.put(field.get("name").toString(), field.get("type").toString()); + fieldBuilder.put(requireNonNull(field.get("name"), "name").toString(), + requireNonNull(field.get("type"), "type").toString()); } } return fieldBuilder; } - @Override public Object[] current() { + @Override public @Nullable Object[] current() { return enumerator.current(); } diff --git a/redis/src/main/java/org/apache/calcite/adapter/redis/RedisJedisManager.java b/redis/src/main/java/org/apache/calcite/adapter/redis/RedisJedisManager.java index 226af4b7b779..a1a55b7fdcbe 100644 --- a/redis/src/main/java/org/apache/calcite/adapter/redis/RedisJedisManager.java +++ b/redis/src/main/java/org/apache/calcite/adapter/redis/RedisJedisManager.java @@ -26,6 +26,7 @@ import com.google.common.cache.RemovalListener; import com.google.common.cache.RemovalNotification; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import redis.clients.jedis.Jedis; @@ -44,11 +45,12 @@ public class RedisJedisManager implements AutoCloseable { private final JedisPoolConfig jedisPoolConfig; private final String host; - private final String password; + private final @Nullable String password; private final int port; private final int database; - public RedisJedisManager(String host, int port, int database, String password) { + public RedisJedisManager(String host, int port, int database, + @Nullable String password) { JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxTotal(GenericObjectPoolConfig.DEFAULT_MAX_TOTAL); jedisPoolConfig.setMaxIdle(GenericObjectPoolConfig.DEFAULT_MAX_IDLE); @@ -73,7 +75,7 @@ public Jedis getResource() { } private JedisPool createConsumer() { - String pwd = password; + @Nullable String pwd = password; if (pwd == null || pwd.isEmpty()) { pwd = null; } diff --git a/redis/src/main/java/org/apache/calcite/adapter/redis/RedisSchema.java b/redis/src/main/java/org/apache/calcite/adapter/redis/RedisSchema.java index 42c623895bc8..4ed12728d641 100644 --- a/redis/src/main/java/org/apache/calcite/adapter/redis/RedisSchema.java +++ b/redis/src/main/java/org/apache/calcite/adapter/redis/RedisSchema.java @@ -25,7 +25,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Arrays; @@ -52,13 +52,13 @@ class RedisSchema extends AbstractSchema { public final String host; public final int port; public final int database; - public final String password; + public final @Nullable String password; public final List> tables; RedisSchema(String host, int port, int database, - String password, + @Nullable String password, List> tables) { this.host = host; this.port = port; @@ -93,21 +93,21 @@ public RedisTableFieldInfo getTableFieldInfo(String tableName) { if (jsonCustomTable.name.equals(tableName)) { Map map = requireNonNull(jsonCustomTable.operand, OPERAND); - if (isEmptyObject(map.get(DATA_FORMAT))) { + final Object dataFormatValue = map.get(DATA_FORMAT); + if (dataFormatValue == null + || isEmptyObject(dataFormatValue) + || RedisDataFormat.fromTypeName(dataFormatValue.toString()) == null) { throw new RuntimeException("dataFormat is invalid, it must be raw, csv or json"); } - RedisDataFormat dataFormatEnum = - RedisDataFormat.fromTypeName(map.get(DATA_FORMAT).toString()); - if (dataFormatEnum == null) { - throw new RuntimeException("dataFormat is invalid, it must be raw, csv or json"); - } - if (isEmptyObject(map.get(FIELDS))) { + final Object fieldsValue = map.get(FIELDS); + if (fieldsValue == null || isEmptyObject(fieldsValue)) { throw new RuntimeException("fields is null"); } - dataFormat = map.get(DATA_FORMAT).toString(); - fields = (List>) map.get(FIELDS); - if (map.get(KEY_DELIMITER) != null) { - keyDelimiter = map.get(KEY_DELIMITER).toString(); + dataFormat = dataFormatValue.toString(); + fields = (List>) fieldsValue; + final Object keyDelimiterValue = map.get(KEY_DELIMITER); + if (keyDelimiterValue != null) { + keyDelimiter = keyDelimiterValue.toString(); } break; } diff --git a/redis/src/main/java/org/apache/calcite/adapter/redis/RedisSchemaFactory.java b/redis/src/main/java/org/apache/calcite/adapter/redis/RedisSchemaFactory.java index 90787b0e541f..8c0962108aa6 100644 --- a/redis/src/main/java/org/apache/calcite/adapter/redis/RedisSchemaFactory.java +++ b/redis/src/main/java/org/apache/calcite/adapter/redis/RedisSchemaFactory.java @@ -26,6 +26,7 @@ import static com.google.common.base.Preconditions.checkArgument; import static java.lang.Integer.parseInt; +import static java.util.Objects.requireNonNull; /** * Factory that creates a {@link RedisSchema}. @@ -52,11 +53,11 @@ public RedisSchemaFactory() { @SuppressWarnings("unchecked") List> tables = (List) operand.get("tables"); - String host = operand.get("host").toString(); + String host = requireNonNull(operand.get("host")).toString(); int port = (int) operand.get("port"); - int database = parseInt(operand.get("database").toString()); - String password = operand.get("password") == null ? null - : operand.get("password").toString(); + int database = parseInt(requireNonNull(operand.get("database")).toString()); + final Object passwordValue = operand.get("password"); + String password = passwordValue == null ? null : passwordValue.toString(); return new RedisSchema(host, port, database, password, tables); } } diff --git a/redis/src/main/java/org/apache/calcite/adapter/redis/RedisTable.java b/redis/src/main/java/org/apache/calcite/adapter/redis/RedisTable.java index 30f57a0d4549..9c7d3288bad8 100644 --- a/redis/src/main/java/org/apache/calcite/adapter/redis/RedisTable.java +++ b/redis/src/main/java/org/apache/calcite/adapter/redis/RedisTable.java @@ -30,7 +30,7 @@ import com.google.common.collect.ImmutableMap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -44,16 +44,15 @@ public class RedisTable extends AbstractTable final RedisSchema schema; final String tableName; - final RelProtoDataType protoRowType; + final @Nullable RelProtoDataType protoRowType; final ImmutableMap allFields; final String dataFormat; final RedisConfig redisConfig; - RedisEnumerator redisEnumerator; public RedisTable( RedisSchema schema, String tableName, - RelProtoDataType protoRowType, + @Nullable RelProtoDataType protoRowType, Map allFields, String dataFormat, RedisConfig redisConfig) { @@ -86,7 +85,7 @@ static Table create( RedisSchema schema, String tableName, RedisConfig redisConfig, - RelProtoDataType protoRowType) { + @Nullable RelProtoDataType protoRowType) { RedisTableFieldInfo tableFieldInfo = schema.getTableFieldInfo(tableName); Map allFields = RedisEnumerator.deduceRowType(tableFieldInfo); return new RedisTable(schema, tableName, protoRowType, @@ -97,7 +96,7 @@ static Table create( RedisSchema schema, String tableName, Map operand, - RelProtoDataType protoRowType) { + @Nullable RelProtoDataType protoRowType) { RedisConfig redisConfig = new RedisConfig(schema.host, schema.port, schema.database, schema.password); @@ -105,10 +104,13 @@ static Table create( } @Override public Enumerable<@Nullable Object[]> scan(DataContext root) { - return new AbstractEnumerable() { - @Override public Enumerator enumerator() { - return new RedisEnumerator(redisConfig, schema, tableName); - } - }; + return new RedisEnumerable(); + } + + /** Enumerable that reads the table's rows from Redis. */ + private class RedisEnumerable extends AbstractEnumerable<@Nullable Object[]> { + @Override public Enumerator<@Nullable Object[]> enumerator() { + return new RedisEnumerator(redisConfig, schema, tableName); + } } } diff --git a/redis/src/main/java/org/apache/calcite/adapter/redis/RedisTableFactory.java b/redis/src/main/java/org/apache/calcite/adapter/redis/RedisTableFactory.java index de4042c71c60..ad26a62fc2de 100644 --- a/redis/src/main/java/org/apache/calcite/adapter/redis/RedisTableFactory.java +++ b/redis/src/main/java/org/apache/calcite/adapter/redis/RedisTableFactory.java @@ -23,10 +23,12 @@ import org.apache.calcite.schema.Table; import org.apache.calcite.schema.TableFactory; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Map; +import static java.util.Objects.requireNonNull; + /** * Implementation of {@link TableFactory} for Redis. * @@ -42,7 +44,8 @@ private RedisTableFactory() { // name that is also the same name as a complex metric @Override public Table create(SchemaPlus schema, String tableName, Map operand, @Nullable RelDataType rowType) { - final RedisSchema redisSchema = schema.unwrap(RedisSchema.class); + final RedisSchema redisSchema = + requireNonNull(schema.unwrap(RedisSchema.class), "redisSchema"); final RelProtoDataType protoRowType = rowType != null ? RelDataTypeImpl.proto(rowType) : null; return RedisTable.create(redisSchema, tableName, operand, protoRowType); diff --git a/redis/src/main/java/org/apache/calcite/adapter/redis/RedisTableFieldInfo.java b/redis/src/main/java/org/apache/calcite/adapter/redis/RedisTableFieldInfo.java index 1a6d247f167b..3fa7cb967e97 100644 --- a/redis/src/main/java/org/apache/calcite/adapter/redis/RedisTableFieldInfo.java +++ b/redis/src/main/java/org/apache/calcite/adapter/redis/RedisTableFieldInfo.java @@ -21,7 +21,11 @@ /** * get the redis table's field info. + * + *

    {@link RedisSchema#getTableFieldInfo} sets every field right after + * construction, which is why they are not initialized here. */ +@SuppressWarnings("NullAway.Init") public class RedisTableFieldInfo { private String tableName; private String dataFormat; diff --git a/redis/src/main/java/org/apache/calcite/adapter/redis/package-info.java b/redis/src/main/java/org/apache/calcite/adapter/redis/package-info.java index 4fbe0b1c39af..04594e255ac0 100644 --- a/redis/src/main/java/org/apache/calcite/adapter/redis/package-info.java +++ b/redis/src/main/java/org/apache/calcite/adapter/redis/package-info.java @@ -18,4 +18,7 @@ /** * Redis adapter. */ +@NullMarked package org.apache.calcite.adapter.redis; + +import org.jspecify.annotations.NullMarked; diff --git a/redis/src/main/java/redis/embedded/util/package-info.java b/redis/src/main/java/redis/embedded/util/package-info.java index 5e31ad3901b5..e2852387b66d 100644 --- a/redis/src/main/java/redis/embedded/util/package-info.java +++ b/redis/src/main/java/redis/embedded/util/package-info.java @@ -18,4 +18,7 @@ /** * Utility classes for embedded Redis. */ +@NullMarked package redis.embedded.util; + +import org.jspecify.annotations.NullMarked; diff --git a/server/src/main/java/org/apache/calcite/server/AbstractModifiableTable.java b/server/src/main/java/org/apache/calcite/server/AbstractModifiableTable.java index 7677eba4efa5..dbb066142286 100644 --- a/server/src/main/java/org/apache/calcite/server/AbstractModifiableTable.java +++ b/server/src/main/java/org/apache/calcite/server/AbstractModifiableTable.java @@ -26,7 +26,7 @@ import org.apache.calcite.schema.ModifiableTable; import org.apache.calcite.schema.impl.AbstractTable; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; diff --git a/server/src/main/java/org/apache/calcite/server/MaterializedViewTable.java b/server/src/main/java/org/apache/calcite/server/MaterializedViewTable.java index fe72308a9d69..d17398127155 100644 --- a/server/src/main/java/org/apache/calcite/server/MaterializedViewTable.java +++ b/server/src/main/java/org/apache/calcite/server/MaterializedViewTable.java @@ -21,7 +21,7 @@ import org.apache.calcite.schema.Schema; import org.apache.calcite.sql2rel.NullInitializerExpressionFactory; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** A table that implements a materialized view. */ class MaterializedViewTable @@ -39,7 +39,7 @@ class MaterializedViewTable return Schema.TableType.MATERIALIZED_VIEW; } - @Override public @Nullable C unwrap(Class aClass) { + @Override public @Nullable C unwrap(Class aClass) { if (MaterializationKey.class.isAssignableFrom(aClass) && aClass.isInstance(key)) { return aClass.cast(key); diff --git a/server/src/main/java/org/apache/calcite/server/MutableArrayTable.java b/server/src/main/java/org/apache/calcite/server/MutableArrayTable.java index b022ce3120eb..4bb876bfb9e6 100644 --- a/server/src/main/java/org/apache/calcite/server/MutableArrayTable.java +++ b/server/src/main/java/org/apache/calcite/server/MutableArrayTable.java @@ -30,7 +30,7 @@ import org.apache.calcite.schema.impl.AbstractTableQueryable; import org.apache.calcite.sql2rel.InitializerExpressionFactory; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.util.ArrayList; @@ -94,7 +94,7 @@ class MutableArrayTable extends AbstractModifiableTable return protoRowType.apply(typeFactory); } - @Override public @Nullable C unwrap(Class aClass) { + @Override public @Nullable C unwrap(Class aClass) { if (aClass.isInstance(initializerExpressionFactory)) { return aClass.cast(initializerExpressionFactory); } diff --git a/server/src/main/java/org/apache/calcite/server/ServerDdlExecutor.java b/server/src/main/java/org/apache/calcite/server/ServerDdlExecutor.java index 8bd55b91519f..0235f0e4a699 100644 --- a/server/src/main/java/org/apache/calcite/server/ServerDdlExecutor.java +++ b/server/src/main/java/org/apache/calcite/server/ServerDdlExecutor.java @@ -90,7 +90,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.Reader; import java.sql.PreparedStatement; diff --git a/server/src/test/java/org/apache/calcite/test/ServerParserTest.java b/server/src/test/java/org/apache/calcite/test/ServerParserTest.java index 99fa4f37d664..6316b7fe06a0 100644 --- a/server/src/test/java/org/apache/calcite/test/ServerParserTest.java +++ b/server/src/test/java/org/apache/calcite/test/ServerParserTest.java @@ -36,7 +36,7 @@ import org.apache.calcite.sql.parser.ddl.SqlDdlParserImpl; import org.apache.calcite.sql.util.SqlShuttle; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.util.function.BiConsumer; diff --git a/settings.gradle.kts b/settings.gradle.kts index fbc3502a7c29..cf0b390e6c24 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -22,7 +22,6 @@ pluginManagement { idv("com.gradle.develocity") idv("com.gradle.common-custom-user-data-gradle-plugin") idv("com.autonomousapps.dependency-analysis") - idv("org.checkerframework") idv("com.github.autostyle") idv("com.github.johnrengelman.shadow") idv("com.github.spotbugs") diff --git a/site/develop/index.md b/site/develop/index.md index de3221609a3c..bb01fd9e867f 100644 --- a/site/develop/index.md +++ b/site/develop/index.md @@ -229,29 +229,51 @@ push it. ## Null safety -Apache Calcite uses the Checker Framework to avoid unexpected `NullPointerExceptions`. -You might find a detailed documentation at https://checkerframework.org/ +Apache Calcite annotates its code with [JSpecify](https://jspecify.dev/) and verifies it with +[NullAway](https://github.com/uber/NullAway) to avoid unexpected `NullPointerExceptions`. -Note: only main code is verified for now, so nullness annotation is not enforced in test code. +Only the main code of `calcite-linq4j` and `calcite-core` is verified for now. Every package in +those two declares `@NullMarked` in its `package-info.java`, which makes types non-nullable unless +they are annotated `@Nullable`. The other modules and all test code stay unmarked: `@NullMarked` +claims that a package is fully annotated, and nothing checks that claim there yet. -To execute the Checker Framework locally please use the following command: +NullAway skips a package that is not `@NullMarked`, so a missing annotation costs coverage without +saying a word. `LintTest.testLintNullMarked` fails when a package under one of the verified source +roots has no `package-info.java`, or has one that does not declare `@NullMarked`. - ./gradlew -PenableCheckerframework :linq4j:classes :core:classes +To verify one more module, add it to `nullawayProjects` in the root `build.gradle.kts` and to +`LintTest.NULL_MARKED_ROOTS`. + +To execute NullAway locally please use the following command: + + ./gradlew -PenableErrorprone :linq4j:classes :core:classes Here's a small introduction to null-safe programming: * By default, parameters, return values and fields are non-nullable, so refrain from using `@NonNull` * Local variables infer nullness from the expression, so you can write `Object v = ...` instead of `@Nullable Object v = ...` * Avoid the use of `javax.annotation.*` annotations. The annotations from `jsr305` do not support cases like `List<@Nullable String>` -so it is better to stick with `org.checkerframework.checker.nullness.qual.Nullable`. - Unfortunately, Guava (as of `29-jre`) has **both** `jsr305` and `checker-qual` dependencies at the same time, - so you might want to configure your IDE to exclude `javax.annotation.*` annotations from code completion. - -* The Checker Framework verifies code method by method. That means, it can't account for method execution order. +so it is better to stick with `org.jspecify.annotations.Nullable`. + You might want to configure your IDE to exclude `javax.annotation.*` annotations from code completion. + +* A type variable is non-nullable unless it is declared with a nullable bound. Write + `` for a type variable that a caller may instantiate with a nullable + type. + +* For a method that returns null exactly when an argument is null, annotate it + `@Contract("!null, _ -> !null")` from `org.apache.calcite.linq4j.annotations`. The clause lists one entry + per parameter, `!null` for the ones the result depends on and `_` for the rest. NullAway verifies + the clause against the body, and a caller that passes a non-null argument gets a non-null result. + The annotation does not apply to a receiver parameter, to a varargs method, or to a type argument + such as `Enumerable<@Nullable T>`. A clause whose length does not match the call crashes + NullAway ([#1726](https://github.com/uber/NullAway/issues/1726)). + +* NullAway verifies code method by method. That means, it can't account for method execution order. That is why `@Nullable` fields should be verified in each method where they are used. If you split logic into multiple methods, you might want verify null once, then pass it via non-nullable parameters. - For fields that start as null and become non-null later, use `@MonotonicNonNull`. - For fields that have already been checked against null, use `@RequiresNonNull`. + For fields that start as null and become non-null later, use `org.apache.calcite.linq4j.annotations.MonotonicNonNull`. + For fields that have already been checked against null, use `org.apache.calcite.linq4j.annotations.RequiresNonNull`. + Those annotations are `compileOnly` dependencies and are not retained at run time. * If you are absolutely sure the value is non-null, you might use `org.apache.calcite.linq4j.Nullness.castNonNull(T)`. The intention behind `castNonNull` is like `trustMeThisIsNeverNullHoweverTheVerifierCantTellYet(...)` @@ -259,9 +281,9 @@ so it is better to stick with `org.checkerframework.checker.nullness.qual.Nullab * If the expression is nullable, however, you need to pass it to a non-null method, use `Objects.requireNonNull`. It allows to have a better error message that includes context information. -* The Checker Framework comes with an annotated JDK, however, there might be invalid annotations. - In that cases, stub files can be placed to `/src/main/config/checkerframework` to override the annotations. - It is important the files have `.astub` extension otherwise they will be ignored. +* NullAway ships nullness models for the JDK and for popular libraries, so Calcite needs no stub + files of its own. When a third-party signature is modelled wrongly, add a + [library model](https://github.com/uber/NullAway/wiki/Library-Models) rather than a suppression. * In array types, a type annotation appears immediately before the type component (either the array or the array component) it refers to. This is explained in the [Java Language Specification](https://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.7.4). diff --git a/spark/src/main/java/org/apache/calcite/adapter/spark/EnumerableToSparkConverter.java b/spark/src/main/java/org/apache/calcite/adapter/spark/EnumerableToSparkConverter.java index 60f48db8e9b3..36952c2329ec 100644 --- a/spark/src/main/java/org/apache/calcite/adapter/spark/EnumerableToSparkConverter.java +++ b/spark/src/main/java/org/apache/calcite/adapter/spark/EnumerableToSparkConverter.java @@ -17,12 +17,6 @@ package org.apache.calcite.adapter.spark; import org.apache.calcite.adapter.enumerable.EnumerableConvention; -import org.apache.calcite.adapter.enumerable.JavaRowFormat; -import org.apache.calcite.adapter.enumerable.PhysType; -import org.apache.calcite.adapter.enumerable.PhysTypeImpl; -import org.apache.calcite.linq4j.tree.BlockBuilder; -import org.apache.calcite.linq4j.tree.Expression; -import org.apache.calcite.linq4j.tree.Expressions; import org.apache.calcite.plan.ConventionTraitDef; import org.apache.calcite.plan.RelOptCluster; import org.apache.calcite.plan.RelOptCost; @@ -32,7 +26,7 @@ import org.apache.calcite.rel.convert.ConverterImpl; import org.apache.calcite.rel.metadata.RelMetadataQuery; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -69,28 +63,6 @@ protected EnumerableToSparkConverter(RelOptCluster cluster, // Generate: // Enumerable source = ...; // return SparkRuntime.createRdd(sparkContext, source); - if (true) { - throw new RuntimeException("EnumerableToSparkConverter is not implemented"); - } - final BlockBuilder list = new BlockBuilder(); - final PhysType physType = - PhysTypeImpl.of( - implementor.getTypeFactory(), getRowType(), - JavaRowFormat.CUSTOM); - final Expression source = null; // TODO: - final Expression sparkContext = - Expressions.call( - SparkMethod.GET_SPARK_CONTEXT.method, - implementor.getRootExpression()); - final Expression rdd = - list.append( - "rdd", - Expressions.call( - SparkMethod.CREATE_RDD.method, - sparkContext, - source)); - list.add( - Expressions.return_(null, rdd)); - return implementor.result(physType, list.toBlock()); + throw new RuntimeException("EnumerableToSparkConverter is not implemented"); } } diff --git a/spark/src/main/java/org/apache/calcite/adapter/spark/HttpServer.java b/spark/src/main/java/org/apache/calcite/adapter/spark/HttpServer.java index aa0c5cb41ce3..1e8031d0ed64 100644 --- a/spark/src/main/java/org/apache/calcite/adapter/spark/HttpServer.java +++ b/spark/src/main/java/org/apache/calcite/adapter/spark/HttpServer.java @@ -16,7 +16,6 @@ */ package org.apache.calcite.adapter.spark; -import org.checkerframework.checker.nullness.qual.Nullable; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Server; @@ -25,6 +24,7 @@ import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.ResourceHandler; import org.eclipse.jetty.util.thread.QueuedThreadPool; +import org.jspecify.annotations.Nullable; import java.io.File; import java.io.IOException; @@ -40,7 +40,7 @@ *

    Based on Spark HttpServer, wraps a Jetty server. */ class HttpServer { - private static String localIpAddress; + private static @Nullable String localIpAddress; private final File resourceBase; diff --git a/spark/src/main/java/org/apache/calcite/adapter/spark/JdbcToSparkConverter.java b/spark/src/main/java/org/apache/calcite/adapter/spark/JdbcToSparkConverter.java index aef790879335..fe8bff1986bf 100644 --- a/spark/src/main/java/org/apache/calcite/adapter/spark/JdbcToSparkConverter.java +++ b/spark/src/main/java/org/apache/calcite/adapter/spark/JdbcToSparkConverter.java @@ -40,7 +40,7 @@ import org.apache.calcite.sql.SqlDialect; import org.apache.calcite.util.BuiltInMethod; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; diff --git a/spark/src/main/java/org/apache/calcite/adapter/spark/SparkMethod.java b/spark/src/main/java/org/apache/calcite/adapter/spark/SparkMethod.java index b1448e43ef91..449290abaab4 100644 --- a/spark/src/main/java/org/apache/calcite/adapter/spark/SparkMethod.java +++ b/spark/src/main/java/org/apache/calcite/adapter/spark/SparkMethod.java @@ -24,6 +24,8 @@ import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.api.java.function.FlatMapFunction; +import org.jspecify.annotations.Nullable; + import java.lang.reflect.Method; import java.util.HashMap; @@ -57,7 +59,7 @@ public enum SparkMethod { this.method = Types.lookupMethod(clazz, methodName, argumentTypes); } - public static SparkMethod lookup(Method method) { + public static @Nullable SparkMethod lookup(Method method) { return MAP.get(method); } } diff --git a/spark/src/main/java/org/apache/calcite/adapter/spark/SparkRules.java b/spark/src/main/java/org/apache/calcite/adapter/spark/SparkRules.java index eb38a6dc17f2..fe899d83dbf1 100644 --- a/spark/src/main/java/org/apache/calcite/adapter/spark/SparkRules.java +++ b/spark/src/main/java/org/apache/calcite/adapter/spark/SparkRules.java @@ -66,7 +66,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 scala.Tuple2; @@ -194,7 +194,7 @@ public static class SparkValues extends Values implements SparkRel { RelTraitSet traitSet, List inputs) { assert inputs.isEmpty(); return new SparkValues( - getCluster(), rowType, tuples, traitSet); + getCluster(), getRowType(), tuples, traitSet); } @Override public Result implementSpark(Implementor implementor) { @@ -215,7 +215,7 @@ public static class SparkValues extends Values implements SparkRel { final Type rowClass = physType.getJavaRowType(); final List expressions = new ArrayList<>(); - final List fields = rowType.getFieldList(); + final List fields = getRowType().getFieldList(); for (List tuple : tuples) { final List literals = new ArrayList<>(); for (Pair pair @@ -257,7 +257,7 @@ private static class SparkCalcRule extends ConverterRule { super(config); } - @Override public RelNode convert(RelNode rel) { + @Override public @Nullable RelNode convert(RelNode rel) { final LogicalCalc calc = (LogicalCalc) rel; // If there's a multiset, let FarragoMultisetSplitter work on it diff --git a/spark/src/main/java/org/apache/calcite/adapter/spark/SparkToEnumerableConverter.java b/spark/src/main/java/org/apache/calcite/adapter/spark/SparkToEnumerableConverter.java index cfdc180ebaad..24fd5203aae3 100644 --- a/spark/src/main/java/org/apache/calcite/adapter/spark/SparkToEnumerableConverter.java +++ b/spark/src/main/java/org/apache/calcite/adapter/spark/SparkToEnumerableConverter.java @@ -36,10 +36,12 @@ import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.calcite.sql.validate.SqlConformance; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; +import static java.util.Objects.requireNonNull; + /** * Relational expression that converts input of * {@link org.apache.calcite.adapter.spark.SparkRel#CONVENTION Spark convention} @@ -65,7 +67,7 @@ protected SparkToEnumerableConverter(RelOptCluster cluster, @Override public @Nullable RelOptCost computeSelfCost(RelOptPlanner planner, RelMetadataQuery mq) { - return super.computeSelfCost(planner, mq).multiplyBy(.01); + return requireNonNull(super.computeSelfCost(planner, mq)).multiplyBy(.01); } @Override public Result implement(EnumerableRelImplementor implementor, Prefer pref) { diff --git a/spark/src/main/java/org/apache/calcite/adapter/spark/package-info.java b/spark/src/main/java/org/apache/calcite/adapter/spark/package-info.java index 9180bbdd2b8e..8c1f48fe721a 100644 --- a/spark/src/main/java/org/apache/calcite/adapter/spark/package-info.java +++ b/spark/src/main/java/org/apache/calcite/adapter/spark/package-info.java @@ -18,4 +18,7 @@ /** * Adapter based on the Apache Spark data management system. */ +@NullMarked package org.apache.calcite.adapter.spark; + +import org.jspecify.annotations.NullMarked; diff --git a/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkDriver.java b/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkDriver.java index 765e94c40e7a..26df5e6f2244 100644 --- a/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkDriver.java +++ b/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkDriver.java @@ -24,7 +24,7 @@ import org.apache.calcite.linq4j.Enumerator; import org.apache.calcite.schema.SchemaPlus; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.net.URI; import java.net.URL; diff --git a/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkPushDownRule.java b/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkPushDownRule.java index 44400635ebb2..af514dfd1199 100644 --- a/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkPushDownRule.java +++ b/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkPushDownRule.java @@ -43,12 +43,15 @@ import com.google.common.collect.ImmutableSet; import org.immutables.value.Value; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import java.util.ArrayList; import java.util.List; import java.util.Set; +import static java.util.Objects.requireNonNull; + /** * Planner rule to push filters and projections to Splunk. */ @@ -210,10 +213,10 @@ protected SplunkPushDownRule(RelOptRuleOperand operand, protected RelNode appendSearchString( String toAppend, SplunkTableScan splunkRel, - LogicalProject topProj, - LogicalProject bottomProj, - RelDataType topRow, - RelDataType bottomRow) { + @Nullable LogicalProject topProj, + @Nullable LogicalProject bottomProj, + @Nullable RelDataType topRow, + @Nullable RelDataType bottomRow) { final RelOptCluster cluster = splunkRel.getCluster(); StringBuilder updateSearchStr = new StringBuilder(splunkRel.search); @@ -252,6 +255,7 @@ protected RelNode appendSearchString( // handle top projection (ie reordering and renaming) List newFields = bottomFields; if (topProj != null) { + requireNonNull(topFields, "topFields"); LOGGER.debug("topProj: {}", topProj.getPermutation()); newFields = new ArrayList<>(); int i = 0; @@ -415,13 +419,13 @@ public static String searchEscape(String str) { return str; } - private static String toString(boolean like, RexLiteral literal) { + private static @Nullable String toString(boolean like, RexLiteral literal) { String value = null; SqlTypeName litSqlType = literal.getTypeName(); if (SqlTypeName.NUMERIC_TYPES.contains(litSqlType)) { - value = literal.getValue().toString(); + value = requireNonNull(literal.getValue(), "literal value").toString(); } else if (litSqlType == SqlTypeName.CHAR) { - value = ((NlsString) literal.getValue()).getValue(); + value = ((NlsString) requireNonNull(literal.getValue(), "literal value")).getValue(); if (like) { value = value.replace("%", "*"); } diff --git a/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkQuery.java b/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkQuery.java index 2b9c848d3825..470d02b5c1c1 100644 --- a/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkQuery.java +++ b/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkQuery.java @@ -21,7 +21,7 @@ import org.apache.calcite.linq4j.AbstractEnumerable; import org.apache.calcite.linq4j.Enumerator; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.HashMap; import java.util.List; diff --git a/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkTable.java b/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkTable.java index 4c27074f58f9..fcb42a3c0738 100644 --- a/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkTable.java +++ b/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkTable.java @@ -29,7 +29,7 @@ import org.apache.calcite.schema.TranslatableTable; import org.apache.calcite.schema.impl.AbstractTableQueryable; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; diff --git a/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkTableScan.java b/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkTableScan.java index 996f4fe3c1f2..43d96b5b34c1 100644 --- a/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkTableScan.java +++ b/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkTableScan.java @@ -39,6 +39,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import org.jspecify.annotations.Nullable; + import java.lang.reflect.Method; import java.util.AbstractList; import java.util.Arrays; @@ -61,8 +63,8 @@ public class SplunkTableScan implements EnumerableRel { final SplunkTable splunkTable; final String search; - final String earliest; - final String latest; + final @Nullable String earliest; + final @Nullable String latest; final List fieldList; protected SplunkTableScan( @@ -70,8 +72,8 @@ protected SplunkTableScan( RelOptTable table, SplunkTable splunkTable, String search, - String earliest, - String latest, + @Nullable String earliest, + @Nullable String latest, List fieldList) { super( cluster, @@ -105,7 +107,8 @@ protected SplunkTableScan( getCluster().getTypeFactory().builder(); for (String field : fieldList) { // REVIEW: is case-sensitive match what we want here? - builder.add(table.getRowType().getField(field, true, false)); + builder.add( + requireNonNull(table.getRowType().getField(field, true, false), field)); } return builder.build(); } @@ -122,8 +125,8 @@ protected SplunkTableScan( @Override public Result implement(EnumerableRelImplementor implementor, Prefer pref) { Map map = ImmutableMap.builder() .put("search", search) - .put("earliest", Util.first(earliest, "")) - .put("latest", Util.first(latest, "")) + .put("earliest", Util.firstNonNull(earliest, "")) + .put("latest", Util.firstNonNull(latest, "")) .put("fieldList", fieldList) .build(); if (CalciteSystemProperty.DEBUG.value()) { diff --git a/splunk/src/main/java/org/apache/calcite/adapter/splunk/package-info.java b/splunk/src/main/java/org/apache/calcite/adapter/splunk/package-info.java index cfead242ef1e..930f6f7992d2 100644 --- a/splunk/src/main/java/org/apache/calcite/adapter/splunk/package-info.java +++ b/splunk/src/main/java/org/apache/calcite/adapter/splunk/package-info.java @@ -22,4 +22,7 @@ * "host", "index", "source", "sourcetype". It has a variable type, so other * fields are held in a map field called "_others". */ +@NullMarked package org.apache.calcite.adapter.splunk; + +import org.jspecify.annotations.NullMarked; diff --git a/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/SplunkConnection.java b/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/SplunkConnection.java index 6374f8d78c08..8631e9d25e08 100644 --- a/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/SplunkConnection.java +++ b/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/SplunkConnection.java @@ -18,7 +18,7 @@ import org.apache.calcite.linq4j.Enumerator; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Map; diff --git a/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/SplunkConnectionImpl.java b/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/SplunkConnectionImpl.java index b8498c8a7ffa..baddab789e91 100644 --- a/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/SplunkConnectionImpl.java +++ b/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/SplunkConnectionImpl.java @@ -24,7 +24,7 @@ import au.com.bytecode.opencsv.CSVReader; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -68,7 +68,7 @@ public class SplunkConnectionImpl implements SplunkConnection { final URL url; final String username; final String password; - String sessionKey; + @Nullable String sessionKey; final Map requestHeaders = new HashMap<>(); public SplunkConnectionImpl(String url, String username, String password) @@ -83,7 +83,10 @@ public SplunkConnectionImpl(URL url, String username, String password) { connect(); } - private static void close(Closeable c) { + private static void close(@Nullable Closeable c) { + if (c == null) { + return; + } try { c.close(); } catch (Exception ignore) { @@ -392,18 +395,20 @@ public SplunkResultEnumerator(InputStream in, } @Override public Object current() { - return current; + return requireNonNull(current, "current"); } @Override public boolean moveNext() { try { + final String[] fieldNames = this.fieldNames; String[] line; - while ((line = csvReader.readNext()) != null) { + while (fieldNames != null && (line = csvReader.readNext()) != null) { if (line.length == fieldNames.length) { switch (source) { case -3: // Re-map using sources - String[] mapped = new String[sources.length]; + final int[] sources = requireNonNull(this.sources, "sources"); + final @Nullable String[] mapped = new String[sources.length]; for (int i = 0; i < sources.length; i++) { int source1 = sources[i]; mapped[i] = source1 < 0 ? null : line[source1]; diff --git a/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/package-info.java b/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/package-info.java index c9c40b31a43c..7815db7a35eb 100644 --- a/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/package-info.java +++ b/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/package-info.java @@ -18,4 +18,7 @@ /** * Executes queries via Splunk's REST API. */ +@NullMarked package org.apache.calcite.adapter.splunk.search; + +import org.jspecify.annotations.NullMarked; diff --git a/splunk/src/main/java/org/apache/calcite/adapter/splunk/util/package-info.java b/splunk/src/main/java/org/apache/calcite/adapter/splunk/util/package-info.java index cc1ddc1e5e71..731f16ac2148 100644 --- a/splunk/src/main/java/org/apache/calcite/adapter/splunk/util/package-info.java +++ b/splunk/src/main/java/org/apache/calcite/adapter/splunk/util/package-info.java @@ -18,4 +18,7 @@ /** * Utilities for RPC to Splunk. */ +@NullMarked package org.apache.calcite.adapter.splunk.util; + +import org.jspecify.annotations.NullMarked; diff --git a/src/main/config/checkerframework/Collection.astub b/src/main/config/checkerframework/Collection.astub deleted file mode 100644 index ba953e5e6a68..000000000000 --- a/src/main/config/checkerframework/Collection.astub +++ /dev/null @@ -1,27 +0,0 @@ -/* - * 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 java.util; - -import java.util.function.Supplier; - -import org.checkerframework.checker.nullness.qual.*; - -interface Collection { - boolean contains(@Nullable Object o); - - boolean remove(@Nullable Object o); -} diff --git a/src/main/config/checkerframework/Constructor.astub b/src/main/config/checkerframework/Constructor.astub deleted file mode 100644 index 48818188520c..000000000000 --- a/src/main/config/checkerframework/Constructor.astub +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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 java.lang.reflect; - -import org.checkerframework.checker.nullness.qual.*; - -class Constructor { - public @NonNull T newInstance(@Nullable Object... initargs); -} diff --git a/src/main/config/checkerframework/Field.astub b/src/main/config/checkerframework/Field.astub deleted file mode 100644 index b0c6f3daa938..000000000000 --- a/src/main/config/checkerframework/Field.astub +++ /dev/null @@ -1,25 +0,0 @@ -/* - * 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 java.lang.reflect; - -import org.checkerframework.checker.nullness.qual.*; - -class Field { - @Nullable Object get(@Nullable Object obj); - - int getInt(@Nullable Object obj); -} diff --git a/src/main/config/checkerframework/InvocationHandler.astub b/src/main/config/checkerframework/InvocationHandler.astub deleted file mode 100644 index 4f3108f3b0f3..000000000000 --- a/src/main/config/checkerframework/InvocationHandler.astub +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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 java.lang.reflect; - -import org.checkerframework.checker.nullness.qual.*; - -interface InvocationHandler { - @Nullable Object invoke(Object proxy, Method method, @Nullable Object[] args); -} diff --git a/src/main/config/checkerframework/List.astub b/src/main/config/checkerframework/List.astub deleted file mode 100644 index f458349a108c..000000000000 --- a/src/main/config/checkerframework/List.astub +++ /dev/null @@ -1,31 +0,0 @@ -/* - * 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 java.util; - -import java.util.function.Supplier; - -import org.checkerframework.checker.nullness.qual.*; - -interface List { - boolean contains(@Nullable Object o); - - boolean remove(@Nullable Object o); - - int indexOf(@Nullable Object o); - - int lastIndexOf(@Nullable Object o); -} diff --git a/src/main/config/checkerframework/Map.astub b/src/main/config/checkerframework/Map.astub deleted file mode 100644 index 170cc7c33596..000000000000 --- a/src/main/config/checkerframework/Map.astub +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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 java.util; - -import java.util.function.Supplier; - -import org.checkerframework.checker.nullness.qual.*; - -interface Map { - boolean containsKey(@Nullable Object o); - - boolean containsValue(@Nullable Object value); - - boolean remove(@Nullable Object key, @Nullable Object value); - - @Nullable V remove(@Nullable Object o); - - @Nullable V get(@Nullable Object key); - - V getOrDefault(@Nullable Object key, V defaultValue); -} diff --git a/src/main/config/checkerframework/Method.astub b/src/main/config/checkerframework/Method.astub deleted file mode 100644 index 8b488bb44b95..000000000000 --- a/src/main/config/checkerframework/Method.astub +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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 java.lang.reflect; - -import org.checkerframework.checker.nullness.qual.*; - -class Method { - @Nullable Object invoke(@Nullable Object obj, @Nullable Object... args); -} diff --git a/src/main/config/checkerframework/MethodHandle.astub b/src/main/config/checkerframework/MethodHandle.astub deleted file mode 100644 index b6b938edfc43..000000000000 --- a/src/main/config/checkerframework/MethodHandle.astub +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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 java.lang.invoke; - -import org.checkerframework.checker.nullness.qual.*; - -class MethodHandle { - @Nullable Object invokeWithArguments(@Nullable Object... arguments); -} diff --git a/src/main/config/checkerframework/Objects.astub b/src/main/config/checkerframework/Objects.astub deleted file mode 100644 index c785a5265adb..000000000000 --- a/src/main/config/checkerframework/Objects.astub +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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 java.util; - -import java.util.function.Supplier; - -import org.checkerframework.checker.nullness.qual.*; - -class Objects { - /** - * The purpose of {@code requireNonNull} is to verify if given argument is non null. - * Unfortunately, checkerframework requires non-nullable arguments, so this stub overrides that. - * Then we can use {@code requireNonNull} for defensive programming, and the verifier won't - * complain. - */ - @EnsuresNonNull("#1") - public static @NonNull T requireNonNull(@Nullable T obj); - - @EnsuresNonNull("#1") - public static @NonNull T requireNonNull(@Nullable T obj, String message); - - @EnsuresNonNull("#1") - public static @NonNull T requireNonNull(@Nullable T obj, Supplier messageSupplier); -} diff --git a/src/main/config/checkerframework/Proxy.astub b/src/main/config/checkerframework/Proxy.astub deleted file mode 100644 index 108e54125dbb..000000000000 --- a/src/main/config/checkerframework/Proxy.astub +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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 java.lang.reflect; - -import org.checkerframework.checker.nullness.qual.*; - -class Proxy { - Object newProxyInstance(@Nullable ClassLoader loader, Class[] interfaces, InvocationHandler h); -} diff --git a/src/main/config/checkerframework/Set.astub b/src/main/config/checkerframework/Set.astub deleted file mode 100644 index a3901540015e..000000000000 --- a/src/main/config/checkerframework/Set.astub +++ /dev/null @@ -1,27 +0,0 @@ -/* - * 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 java.util; - -import java.util.function.Supplier; - -import org.checkerframework.checker.nullness.qual.*; - -interface Set { - boolean contains(@Nullable Object o); - - boolean remove(@Nullable Object o); -} diff --git a/src/main/config/checkerframework/String.astub b/src/main/config/checkerframework/String.astub deleted file mode 100644 index d35b0af309b7..000000000000 --- a/src/main/config/checkerframework/String.astub +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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 java.lang; - -import org.checkerframework.checker.nullness.qual.*; - -class String { - String join(CharSequence delimiter, Iterable elements); -} diff --git a/src/main/config/checkerframework/URI.astub b/src/main/config/checkerframework/URI.astub deleted file mode 100644 index 9e20e50e022c..000000000000 --- a/src/main/config/checkerframework/URI.astub +++ /dev/null @@ -1,24 +0,0 @@ -/* - * 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 java.net; - -import org.checkerframework.checker.nullness.qual.*; - -class URI { - public URI(@Nullable String scheme, @Nullable String host, @Nullable String path, - @Nullable String fragment); -} diff --git a/src/main/config/checkerframework/aggdesigner/Attribute.astub b/src/main/config/checkerframework/aggdesigner/Attribute.astub deleted file mode 100644 index d81e782ae598..000000000000 --- a/src/main/config/checkerframework/aggdesigner/Attribute.astub +++ /dev/null @@ -1,25 +0,0 @@ -/* - * 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.pentaho.aggdes.model; - -import org.checkerframework.checker.nullness.qual.*; - -interface Attribute { - @Nullable tring getCandidateColumnName(); - - @Nullable String getDatatype(Dialect dialect); -} diff --git a/src/main/config/checkerframework/aggdesigner/Table.astub b/src/main/config/checkerframework/aggdesigner/Table.astub deleted file mode 100644 index f5922d500376..000000000000 --- a/src/main/config/checkerframework/aggdesigner/Table.astub +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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.pentaho.aggdes.model; - -import org.checkerframework.checker.nullness.qual.*; - -interface Table { - @Nullable Table getParent(); -} diff --git a/src/main/config/checkerframework/avatica/AvaticaFactory.astub b/src/main/config/checkerframework/avatica/AvaticaFactory.astub deleted file mode 100644 index e84a514f2354..000000000000 --- a/src/main/config/checkerframework/avatica/AvaticaFactory.astub +++ /dev/null @@ -1,31 +0,0 @@ -/* - * 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.avatica; - -import org.checkerframework.checker.nullness.qual.*; - -import java.sql.*; - -interface AvaticaFactory { - AvaticaStatement newStatement(AvaticaConnection connection, - Meta.@Nullable StatementHandle h, int resultSetType, - int resultSetConcurrency, int resultSetHoldability); - - AvaticaPreparedStatement newPreparedStatement(AvaticaConnection connection, - Meta.@Nullable StatementHandle h, Meta.Signature signature, - int resultSetType, int resultSetConcurrency, int resultSetHoldability); -} diff --git a/src/main/config/checkerframework/avatica/AvaticaPreparedStatement.astub b/src/main/config/checkerframework/avatica/AvaticaPreparedStatement.astub deleted file mode 100644 index 74cc35944e72..000000000000 --- a/src/main/config/checkerframework/avatica/AvaticaPreparedStatement.astub +++ /dev/null @@ -1,28 +0,0 @@ -/* - * 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.avatica; - -import org.checkerframework.checker.nullness.qual.*; - -class AvaticaPreparedStatement { - AvaticaPreparedStatement(AvaticaConnection connection, - Meta.@Nullable StatementHandle h, - Meta.Signature signature, - int resultSetType, - int resultSetConcurrency, - int resultSetHoldability); -} diff --git a/src/main/config/checkerframework/avatica/AvaticaResultMetaData.astub b/src/main/config/checkerframework/avatica/AvaticaResultMetaData.astub deleted file mode 100644 index d43ac1aa3e54..000000000000 --- a/src/main/config/checkerframework/avatica/AvaticaResultMetaData.astub +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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.avatica; - -import org.checkerframework.checker.nullness.qual.*; - -class AvaticaResultSetMetaData { - AvaticaResultSetMetaData( - AvaticaStatement statement, - @Nullable Object query, - Meta.Signature signature); -} diff --git a/src/main/config/checkerframework/avatica/AvaticaResultSet.astub b/src/main/config/checkerframework/avatica/AvaticaResultSet.astub deleted file mode 100644 index e9079d0f32ce..000000000000 --- a/src/main/config/checkerframework/avatica/AvaticaResultSet.astub +++ /dev/null @@ -1,30 +0,0 @@ -/* - * 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.avatica; - -import org.checkerframework.checker.nullness.qual.*; - -import java.sql.*; - -class AvaticaResultSet { - AvaticaResultSet(AvaticaStatement statement, - @Nullable QueryState state, - Meta.Signature signature, - ResultSetMetaData resultSetMetaData, - TimeZone timeZone, - Meta.Frame firstFrame); -} diff --git a/src/main/config/checkerframework/avatica/AvaticaResultSetMetaData.astub b/src/main/config/checkerframework/avatica/AvaticaResultSetMetaData.astub deleted file mode 100644 index e9079d0f32ce..000000000000 --- a/src/main/config/checkerframework/avatica/AvaticaResultSetMetaData.astub +++ /dev/null @@ -1,30 +0,0 @@ -/* - * 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.avatica; - -import org.checkerframework.checker.nullness.qual.*; - -import java.sql.*; - -class AvaticaResultSet { - AvaticaResultSet(AvaticaStatement statement, - @Nullable QueryState state, - Meta.Signature signature, - ResultSetMetaData resultSetMetaData, - TimeZone timeZone, - Meta.Frame firstFrame); -} diff --git a/src/main/config/checkerframework/avatica/AvaticaSite.astub b/src/main/config/checkerframework/avatica/AvaticaSite.astub deleted file mode 100644 index fceb680a42f3..000000000000 --- a/src/main/config/checkerframework/avatica/AvaticaSite.astub +++ /dev/null @@ -1,61 +0,0 @@ -/* - * 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.avatica; - -import org.checkerframework.checker.nullness.qual.*; - -import java.sql.*; - -class AvaticaSite { - void setRowId(@Nullable RowId x); - - void setNString(@Nullable String o); - - void setNCharacterStream(@Nullable Reader value, long length); - - void setNClob(@Nullable NClob value); - - void setClob(@Nullable Reader reader, long length); - - void setBlob(@Nullable InputStream inputStream, long length); - - void setNClob(@Nullable Reader reader, long length); - - void setSQLXML(@Nullable SQLXML xmlObject); - - void setAsciiStream(@Nullable InputStream x, long length); - - void setBinaryStream(@Nullable InputStream x, long length); - - void setCharacterStream(@Nullable Reader reader, long length); - - void setAsciiStream(@Nullable InputStream x); - - void setBinaryStream(@Nullable InputStream x); - - void setCharacterStream(@Nullable Reader reader); - - void setNCharacterStream(@Nullable Reader value); - - void setClob(@Nullable Reader reader); - - void setBlob(@Nullable InputStream inputStream); - - void setNClob(@Nullable Reader reader); - - void setUnicodeStream(@Nullable InputStream x, int length); -} diff --git a/src/main/config/checkerframework/avatica/AvaticaStatement.astub b/src/main/config/checkerframework/avatica/AvaticaStatement.astub deleted file mode 100644 index 3ef5ce976bf4..000000000000 --- a/src/main/config/checkerframework/avatica/AvaticaStatement.astub +++ /dev/null @@ -1,29 +0,0 @@ -/* - * 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.avatica; - -import org.checkerframework.checker.nullness.qual.*; - -class AvaticaStatement { - AvaticaStatement(AvaticaConnection connection, - Meta.@Nullable StatementHandle h, int resultSetType, int resultSetConcurrency, - int resultSetHoldability); - - AvaticaStatement(AvaticaConnection connection, - Meta.@Nullable StatementHandle h, int resultSetType, int resultSetConcurrency, - int resultSetHoldability, Meta.Signature signature); -} diff --git a/src/main/config/checkerframework/avatica/ColumnMetaData.astub b/src/main/config/checkerframework/avatica/ColumnMetaData.astub deleted file mode 100644 index 77ecc21fb74c..000000000000 --- a/src/main/config/checkerframework/avatica/ColumnMetaData.astub +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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.avatica; - -import org.checkerframework.checker.nullness.qual.*; - -class ColumnMetaData { - ColumnMetaData( - int ordinal, - boolean autoIncrement, - boolean caseSensitive, - boolean searchable, - boolean currency, - int nullable, - boolean signed, - int displaySize, - String label, - @Nullable String columnName, - @Nullable String schemaName, - int precision, - int scale, - @Nullable String tableName, - @Nullable String catalogName, - AvaticaType type, - boolean readOnly, - boolean writable, - boolean definitelyWritable, - String columnClassName); -} diff --git a/src/main/config/checkerframework/avatica/ConnectionConfigImpl.astub b/src/main/config/checkerframework/avatica/ConnectionConfigImpl.astub deleted file mode 100644 index 0fe2baa53adf..000000000000 --- a/src/main/config/checkerframework/avatica/ConnectionConfigImpl.astub +++ /dev/null @@ -1,25 +0,0 @@ -/* - * 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.avatica; - -import org.checkerframework.checker.nullness.qual.*; - -class ConnectionConfigImpl { - public static class PropEnv { - public @PolyNull T getPlugin(Class pluginClass, @PolyNull T defaultInstance); - } -} diff --git a/src/main/config/checkerframework/avatica/ConnectionProperty.astub b/src/main/config/checkerframework/avatica/ConnectionProperty.astub deleted file mode 100644 index 30846a3f0a7a..000000000000 --- a/src/main/config/checkerframework/avatica/ConnectionProperty.astub +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 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.avatica; - -import org.checkerframework.checker.nullness.qual.*; - -interface ConnectionProperty { - enum Type { - NONE; - - Class deduceValueClass(@Nullable Object defaultValue, @Nullable Class valueClass); - - boolean valid(@Nullable Object defaultValue, Class clazz); - } - - @Nullable Object defaultValue(); - - @Nullable Class valueClass(); -} diff --git a/src/main/config/checkerframework/avatica/Handler.astub b/src/main/config/checkerframework/avatica/Handler.astub deleted file mode 100644 index c57d936d0d40..000000000000 --- a/src/main/config/checkerframework/avatica/Handler.astub +++ /dev/null @@ -1,27 +0,0 @@ -/* - * 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.avatica; - -import org.checkerframework.checker.nullness.qual.*; - -import java.sql.*; - -interface Handler { - void onStatementExecute( - AvaticaStatement statement, - @Nullable ResultSink resultSink); -} diff --git a/src/main/config/checkerframework/avatica/Meta.astub b/src/main/config/checkerframework/avatica/Meta.astub deleted file mode 100644 index af3e549be96a..000000000000 --- a/src/main/config/checkerframework/avatica/Meta.astub +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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.avatica; - -import org.checkerframework.checker.nullness.qual.*; - -interface Meta { - class Signature { - public Signature(List columns, - @Nullable String sql, - List parameters, - Map internalParameters, - CursorFactory cursorFactory, - Meta.StatementType statementType); - } - - class CursorFactory { - CursorFactory deduce(List columns, @Nullable Class resultClazz); - } - - interface PrepareCallback { - void assign(Signature signature, @Nullable Frame firstFrame, long updateCount); - } - - class MetaResultSet { - static MetaResultSet create(String connectionId, int statementId, - boolean ownStatement, Signature signature, @Nullable Frame firstFrame, long updateCount); - } -} diff --git a/src/main/config/checkerframework/avatica/MetaImpl.astub b/src/main/config/checkerframework/avatica/MetaImpl.astub deleted file mode 100644 index 501f29b01228..000000000000 --- a/src/main/config/checkerframework/avatica/MetaImpl.astub +++ /dev/null @@ -1,64 +0,0 @@ -/* - * 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.avatica; - -import org.checkerframework.checker.nullness.qual.*; - -class MetaImpl { - class MetaTable { - public MetaTable( - @Nullable String tableCat, - @Nullable String tableSchem, - @Nullable String tableName, - @Nullable String tableType); - } - - class MetaColumn { - MetaColumn( - String tableCat, - String tableSchem, - String tableName, - String columnName, - int dataType, - String typeName, - Integer columnSize, - @Nullable Integer decimalDigits, - Integer numPrecRadix, - int nullable, - Integer charOctetLength, - int ordinalPosition, - String isNullable); - } - - class MetaTypeInfo { - MetaTypeInfo( - String typeName, - int dataType, - Integer precision, - @Nullable String literalPrefix, - @Nullable String literalSuffix, - short nullable, - boolean caseSensitive, - short searchable, - boolean unsignedAttribute, - boolean fixedPrecScale, - boolean autoIncrement, - Short minimumScale, - Short maximumScale, - Integer numPrecRadix); - } -} diff --git a/src/main/config/checkerframework/avatica/TimeUnitRange.astub b/src/main/config/checkerframework/avatica/TimeUnitRange.astub deleted file mode 100644 index c5ed3c9dc92a..000000000000 --- a/src/main/config/checkerframework/avatica/TimeUnitRange.astub +++ /dev/null @@ -1,25 +0,0 @@ -/* - * 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.avatica.util; - -import org.checkerframework.checker.nullness.qual.*; - -enum TimeUnitRange { - YEAR; - - public TimeUnitRange of(TimeUnit startUnit, @Nullable TimeUnit endUnit); -} diff --git a/src/main/config/checkerframework/commons-dbcp2/BasicDataSource.astub b/src/main/config/checkerframework/commons-dbcp2/BasicDataSource.astub deleted file mode 100644 index b6f49c6fd2c0..000000000000 --- a/src/main/config/checkerframework/commons-dbcp2/BasicDataSource.astub +++ /dev/null @@ -1,29 +0,0 @@ -/* - * 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.commons.dbcp2; - -import org.checkerframework.checker.nullness.qual.*; - -interface BasicDataSource { - void setUrl(@Nullable String url); - - void setUsername(@Nullable String userName); - - void setPassword(@Nullable String password); - - void setDriverClassName(@Nullable String driverClassName); -} diff --git a/src/main/config/checkerframework/esri-geometry/OperatorBoundary.astub b/src/main/config/checkerframework/esri-geometry/OperatorBoundary.astub deleted file mode 100644 index a929df4c2756..000000000000 --- a/src/main/config/checkerframework/esri-geometry/OperatorBoundary.astub +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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 com.esri.core.geometry; - -import org.checkerframework.checker.nullness.qual.*; - -interface OperatorBoundary { - Geometry execute(Geometry geom, @Nullable ProgressTracker progress_tracker); -} diff --git a/src/main/config/checkerframework/esri-geometry/OperatorSimpleRelation.astub b/src/main/config/checkerframework/esri-geometry/OperatorSimpleRelation.astub deleted file mode 100644 index f98ed02582fa..000000000000 --- a/src/main/config/checkerframework/esri-geometry/OperatorSimpleRelation.astub +++ /dev/null @@ -1,24 +0,0 @@ -/* - * 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 com.esri.core.geometry; - -import org.checkerframework.checker.nullness.qual.*; - -interface OperatorSimpleRelation { - boolean execute(Geometry inputGeom1, Geometry inputGeom2, - SpatialReference sr, @Nullable ProgressTracker progressTracker); -} diff --git a/src/main/config/checkerframework/jackson/ObjectMapper.astub b/src/main/config/checkerframework/jackson/ObjectMapper.astub deleted file mode 100644 index a275a8bcc953..000000000000 --- a/src/main/config/checkerframework/jackson/ObjectMapper.astub +++ /dev/null @@ -1,25 +0,0 @@ -/* - * 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 com.fasterxml.jackson.databind; - -import org.checkerframework.checker.nullness.qual.*; - -interface ObjectMapper { - String writeValueAsString(@Nullable Object value); - - byte[] writeValueAsBytes(@Nullable Object value); -} diff --git a/src/main/config/checkerframework/jackson/ObjectWriter.astub b/src/main/config/checkerframework/jackson/ObjectWriter.astub deleted file mode 100644 index 9a428d2c9f83..000000000000 --- a/src/main/config/checkerframework/jackson/ObjectWriter.astub +++ /dev/null @@ -1,25 +0,0 @@ -/* - * 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 com.fasterxml.jackson.databind; - -import org.checkerframework.checker.nullness.qual.*; - -interface ObjectWriter { - String writeValueAsString(@Nullable Object value); - - byte[] writeValueAsBytes(@Nullable Object value); -} diff --git a/src/main/config/checkerframework/janino/ClassBodyEvaluator.astub b/src/main/config/checkerframework/janino/ClassBodyEvaluator.astub deleted file mode 100644 index 6d6222c4b87a..000000000000 --- a/src/main/config/checkerframework/janino/ClassBodyEvaluator.astub +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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.codehaus.janino; - -import org.checkerframework.checker.nullness.qual.*; - -public class ClassBodyEvaluator extends Cookable implements IClassBodyEvaluator { - public void setParentClassLoader(@Nullable ClassLoader parentClassLoader); -} diff --git a/src/main/config/checkerframework/janino/IClassBodyEvaluator.astub b/src/main/config/checkerframework/janino/IClassBodyEvaluator.astub deleted file mode 100644 index a3b143cd3aab..000000000000 --- a/src/main/config/checkerframework/janino/IClassBodyEvaluator.astub +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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.codehaus.commons.compiler; - -import org.checkerframework.checker.nullness.qual.*; - -public interface IClassBodyEvaluator extends ICookable { - void setParentClassLoader(@Nullable ClassLoader optionalParentClassLoader); -} diff --git a/src/main/config/checkerframework/janino/ISimpleCompiler.astub b/src/main/config/checkerframework/janino/ISimpleCompiler.astub deleted file mode 100644 index 3fa227320b2e..000000000000 --- a/src/main/config/checkerframework/janino/ISimpleCompiler.astub +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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.codehaus.commons.compiler; - -import org.checkerframework.checker.nullness.qual.*; - -public interface ISimpleCompiler { - void setParentClassLoader(@Nullable ClassLoader optionalParentClassLoader); -} diff --git a/src/main/config/checkerframework/janino/JavaSourceClassLoader.astub b/src/main/config/checkerframework/janino/JavaSourceClassLoader.astub deleted file mode 100644 index 2e13a2b4b5f6..000000000000 --- a/src/main/config/checkerframework/janino/JavaSourceClassLoader.astub +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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.codehaus.janino; - -import org.checkerframework.checker.nullness.qual.*; - -class JavaSourceClassLoader { - JavaSourceClassLoader( - ClassLoader parentClassLoader, - File @Nullable [] optionalSourcePath, - @Nullable String optionalCharacterEncoding - ); - - JavaSourceClassLoader( - ClassLoader parentClassLoader, - ResourceFinder sourceFinder, - @Nullable String optionalCharacterEncoding - ); - - protected @Nullable Map generateBytecodes(String name); -} diff --git a/src/main/config/checkerframework/janino/Scanner.astub b/src/main/config/checkerframework/janino/Scanner.astub deleted file mode 100644 index a2a1daee7e84..000000000000 --- a/src/main/config/checkerframework/janino/Scanner.astub +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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.codehaus.janino; - -import org.checkerframework.checker.nullness.qual.*; - -class Scanner { - Scanner(@Nullable String optionalFileName, Reader in); -} diff --git a/src/main/config/checkerframework/jdbc/Connection.astub b/src/main/config/checkerframework/jdbc/Connection.astub deleted file mode 100644 index 6dd9bf72dc0e..000000000000 --- a/src/main/config/checkerframework/jdbc/Connection.astub +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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 java.sql; - -import org.checkerframework.checker.nullness.qual.*; - -interface Connection { - @Nullable String getSchema() throws SQLException; -} diff --git a/src/main/config/checkerframework/jdbc/DatabaseMetaData.astub b/src/main/config/checkerframework/jdbc/DatabaseMetaData.astub deleted file mode 100644 index 212c72680bab..000000000000 --- a/src/main/config/checkerframework/jdbc/DatabaseMetaData.astub +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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 java.sql; - -import org.checkerframework.checker.nullness.qual.*; - -interface DatabaseMetaData { - ResultSet getSchemas(@Nullable String catalog, @Nullable String schemaPattern); -} diff --git a/src/main/config/checkerframework/jsonpath/JacksonJsonProvider.astub b/src/main/config/checkerframework/jsonpath/JacksonJsonProvider.astub deleted file mode 100644 index 3d262171638b..000000000000 --- a/src/main/config/checkerframework/jsonpath/JacksonJsonProvider.astub +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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 com.jayway.jsonpath.spi.json; - -import org.checkerframework.checker.nullness.qual.*; - -interface JacksonJsonProvider { - String toJson(@Nullable Object obj); -} diff --git a/src/main/config/checkerframework/slf4j/Logger.astub b/src/main/config/checkerframework/slf4j/Logger.astub deleted file mode 100644 index 7c709cef131b..000000000000 --- a/src/main/config/checkerframework/slf4j/Logger.astub +++ /dev/null @@ -1,101 +0,0 @@ -/* - * 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.slf4j; - -import org.checkerframework.checker.nullness.qual.*; - -interface Logger { - public void trace(String format, @Nullable Object arg); - - public void trace(String format, @Nullable Object arg1, @Nullable Object arg2); - - public void trace(String format, @Nullable Object... arguments); - - public void trace(String msg, @Nullable Throwable t); - - public void trace(Marker marker, String format, @Nullable Object arg); - - public void trace(Marker marker, String format, @Nullable Object arg1, @Nullable Object arg2); - - public void trace(Marker marker, String format, @Nullable Object... arguments); - - public void trace(Marker marker, String msg, @Nullable Throwable t); - - public void debug(String format, @Nullable Object arg); - - public void debug(String format, @Nullable Object arg1, @Nullable Object arg2); - - public void debug(String format, @Nullable Object... arguments); - - public void debug(String msg, @Nullable Throwable t); - - public void debug(Marker marker, String format, @Nullable Object arg); - - public void debug(Marker marker, String format, @Nullable Object arg1, @Nullable Object arg2); - - public void debug(Marker marker, String format, @Nullable Object... arguments); - - public void debug(Marker marker, String msg, @Nullable Throwable t); - - public void info(String format, @Nullable Object arg); - - public void info(String format, @Nullable Object arg1, @Nullable Object arg2); - - public void info(String format, @Nullable Object... arguments); - - public void info(String msg, @Nullable Throwable t); - - public void info(Marker marker, String format, @Nullable Object arg); - - public void info(Marker marker, String format, @Nullable Object arg1, @Nullable Object arg2); - - public void info(Marker marker, String format, @Nullable Object... arguments); - - public void info(Marker marker, String msg, @Nullable Throwable t); - - public void warn(String format, @Nullable Object arg); - - public void warn(String format, @Nullable Object arg1, @Nullable Object arg2); - - public void warn(String format, @Nullable Object... arguments); - - public void warn(String msg, @Nullable Throwable t); - - public void warn(Marker marker, String format, @Nullable Object arg); - - public void warn(Marker marker, String format, @Nullable Object arg1, @Nullable Object arg2); - - public void warn(Marker marker, String format, @Nullable Object... arguments); - - public void warn(Marker marker, String msg, @Nullable Throwable t); - - public void error(String format, @Nullable Object arg); - - public void error(String format, @Nullable Object arg1, @Nullable Object arg2); - - public void error(String format, @Nullable Object... arguments); - - public void error(String msg, @Nullable Throwable t); - - public void error(Marker marker, String format, @Nullable Object arg); - - public void error(Marker marker, String format, @Nullable Object arg1, @Nullable Object arg2); - - public void error(Marker marker, String format, @Nullable Object... arguments); - - public void error(Marker marker, String msg, @Nullable Throwable t); -} diff --git a/src/main/config/checkerframework/slf4j/MessageFormatter.astub b/src/main/config/checkerframework/slf4j/MessageFormatter.astub deleted file mode 100644 index 8ef43aa609c2..000000000000 --- a/src/main/config/checkerframework/slf4j/MessageFormatter.astub +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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.slf4j.helpers; - -import org.checkerframework.checker.nullness.qual.*; - -class MessageFormatter { - public FormattingTuple arrayFormat(String messagePattern, @Nullable Object[] argArray); -} diff --git a/testkit/build.gradle.kts b/testkit/build.gradle.kts index f164b4acfd30..3755e9c6c32c 100644 --- a/testkit/build.gradle.kts +++ b/testkit/build.gradle.kts @@ -20,7 +20,7 @@ plugins { dependencies { api(project(":core")) - api("org.checkerframework:checker-qual") + api("org.jspecify:jspecify") implementation(platform("org.junit:junit-bom")) implementation(kotlin("stdlib-jdk8")) diff --git a/testkit/src/main/java/org/apache/calcite/sql/parser/SqlParserFixture.java b/testkit/src/main/java/org/apache/calcite/sql/parser/SqlParserFixture.java index 34fc7ac1140e..2d775f2db7c3 100644 --- a/testkit/src/main/java/org/apache/calcite/sql/parser/SqlParserFixture.java +++ b/testkit/src/main/java/org/apache/calcite/sql/parser/SqlParserFixture.java @@ -25,8 +25,8 @@ import org.apache.calcite.sql.validate.SqlConformance; import org.apache.calcite.sql.validate.SqlConformanceEnum; -import org.checkerframework.checker.nullness.qual.Nullable; import org.hamcrest.Matcher; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.function.Consumer; diff --git a/testkit/src/main/java/org/apache/calcite/sql/parser/SqlParserListFixture.java b/testkit/src/main/java/org/apache/calcite/sql/parser/SqlParserListFixture.java index fd5e83eb2dd9..3a1b5a6f63ff 100644 --- a/testkit/src/main/java/org/apache/calcite/sql/parser/SqlParserListFixture.java +++ b/testkit/src/main/java/org/apache/calcite/sql/parser/SqlParserListFixture.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.function.UnaryOperator; diff --git a/testkit/src/main/java/org/apache/calcite/sql/parser/SqlParserTest.java b/testkit/src/main/java/org/apache/calcite/sql/parser/SqlParserTest.java index a64edcd6fb4d..4d5c9e806d49 100644 --- a/testkit/src/main/java/org/apache/calcite/sql/parser/SqlParserTest.java +++ b/testkit/src/main/java/org/apache/calcite/sql/parser/SqlParserTest.java @@ -56,11 +56,11 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableSortedSet; -import org.checkerframework.checker.nullness.qual.Nullable; import org.hamcrest.BaseMatcher; import org.hamcrest.CustomTypeSafeMatcher; import org.hamcrest.Description; import org.hamcrest.Matcher; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; diff --git a/testkit/src/main/java/org/apache/calcite/sql/test/AbstractSqlTester.java b/testkit/src/main/java/org/apache/calcite/sql/test/AbstractSqlTester.java index 00132a93118f..39b0b1e3fec3 100644 --- a/testkit/src/main/java/org/apache/calcite/sql/test/AbstractSqlTester.java +++ b/testkit/src/main/java/org/apache/calcite/sql/test/AbstractSqlTester.java @@ -50,8 +50,8 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; import org.hamcrest.Matcher; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; diff --git a/testkit/src/main/java/org/apache/calcite/sql/test/SqlOperatorFixture.java b/testkit/src/main/java/org/apache/calcite/sql/test/SqlOperatorFixture.java index 94436699b216..e2a0fb30ec5c 100644 --- a/testkit/src/main/java/org/apache/calcite/sql/test/SqlOperatorFixture.java +++ b/testkit/src/main/java/org/apache/calcite/sql/test/SqlOperatorFixture.java @@ -37,7 +37,7 @@ import org.apache.calcite.test.Matchers; import org.apache.calcite.util.Bug; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; diff --git a/testkit/src/main/java/org/apache/calcite/sql/test/SqlTestFactory.java b/testkit/src/main/java/org/apache/calcite/sql/test/SqlTestFactory.java index 9ecc8429c485..c2a65c6003d3 100644 --- a/testkit/src/main/java/org/apache/calcite/sql/test/SqlTestFactory.java +++ b/testkit/src/main/java/org/apache/calcite/sql/test/SqlTestFactory.java @@ -52,7 +52,7 @@ import com.google.common.base.Suppliers; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.function.Supplier; diff --git a/testkit/src/main/java/org/apache/calcite/sql/test/SqlTester.java b/testkit/src/main/java/org/apache/calcite/sql/test/SqlTester.java index c47839db623d..90d5e8a2c708 100644 --- a/testkit/src/main/java/org/apache/calcite/sql/test/SqlTester.java +++ b/testkit/src/main/java/org/apache/calcite/sql/test/SqlTester.java @@ -27,7 +27,7 @@ import org.apache.calcite.test.DiffRepository; import org.apache.calcite.util.Pair; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.sql.ResultSet; import java.util.function.Consumer; diff --git a/testkit/src/main/java/org/apache/calcite/sql/test/SqlTests.java b/testkit/src/main/java/org/apache/calcite/sql/test/SqlTests.java index 2cfaf8fc872d..021321c27350 100644 --- a/testkit/src/main/java/org/apache/calcite/sql/test/SqlTests.java +++ b/testkit/src/main/java/org/apache/calcite/sql/test/SqlTests.java @@ -29,7 +29,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Arrays; import java.util.List; diff --git a/testkit/src/main/java/org/apache/calcite/test/AbstractModifiableTable.java b/testkit/src/main/java/org/apache/calcite/test/AbstractModifiableTable.java index 59b9016a7b61..b7ab79cc5e7a 100644 --- a/testkit/src/main/java/org/apache/calcite/test/AbstractModifiableTable.java +++ b/testkit/src/main/java/org/apache/calcite/test/AbstractModifiableTable.java @@ -26,7 +26,7 @@ import org.apache.calcite.schema.ModifiableTable; import org.apache.calcite.schema.impl.AbstractTable; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; diff --git a/testkit/src/main/java/org/apache/calcite/test/CalciteAssert.java b/testkit/src/main/java/org/apache/calcite/test/CalciteAssert.java index aa27c7b77a8c..6a551a5957d0 100644 --- a/testkit/src/main/java/org/apache/calcite/test/CalciteAssert.java +++ b/testkit/src/main/java/org/apache/calcite/test/CalciteAssert.java @@ -103,8 +103,8 @@ import net.hydromatic.steelwheels.data.hsqldb.SteelwheelsHsqldb; import org.apiguardian.api.API; -import org.checkerframework.checker.nullness.qual.Nullable; import org.hamcrest.Matcher; +import org.jspecify.annotations.Nullable; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; diff --git a/testkit/src/main/java/org/apache/calcite/test/ConnectionSpec.java b/testkit/src/main/java/org/apache/calcite/test/ConnectionSpec.java index c354fcfbfa4f..e712ea197094 100644 --- a/testkit/src/main/java/org/apache/calcite/test/ConnectionSpec.java +++ b/testkit/src/main/java/org/apache/calcite/test/ConnectionSpec.java @@ -18,7 +18,7 @@ import com.google.errorprone.annotations.Immutable; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** Information necessary to create a JDBC connection. * diff --git a/testkit/src/main/java/org/apache/calcite/test/DiffRepository.java b/testkit/src/main/java/org/apache/calcite/test/DiffRepository.java index db60757f4bd9..7ca26a1df08a 100644 --- a/testkit/src/main/java/org/apache/calcite/test/DiffRepository.java +++ b/testkit/src/main/java/org/apache/calcite/test/DiffRepository.java @@ -29,7 +29,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSortedSet; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Assertions; import org.opentest4j.AssertionFailedError; import org.w3c.dom.CDATASection; diff --git a/testkit/src/main/java/org/apache/calcite/test/DiffTestCase.java b/testkit/src/main/java/org/apache/calcite/test/DiffTestCase.java index 57b9962a55c5..64fa1c6503c5 100644 --- a/testkit/src/main/java/org/apache/calcite/test/DiffTestCase.java +++ b/testkit/src/main/java/org/apache/calcite/test/DiffTestCase.java @@ -20,9 +20,9 @@ import org.apache.calcite.util.TestUtil; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; import org.incava.diff.Diff; import org.incava.diff.Difference; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; diff --git a/testkit/src/main/java/org/apache/calcite/test/MockDdlExecutor.java b/testkit/src/main/java/org/apache/calcite/test/MockDdlExecutor.java index 8d744d829bee..6c0215e38a21 100644 --- a/testkit/src/main/java/org/apache/calcite/test/MockDdlExecutor.java +++ b/testkit/src/main/java/org/apache/calcite/test/MockDdlExecutor.java @@ -65,7 +65,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.sql.PreparedStatement; diff --git a/testkit/src/main/java/org/apache/calcite/test/MockRelOptPlanner.java b/testkit/src/main/java/org/apache/calcite/test/MockRelOptPlanner.java index 74fcf5cec36a..40549361543c 100644 --- a/testkit/src/main/java/org/apache/calcite/test/MockRelOptPlanner.java +++ b/testkit/src/main/java/org/apache/calcite/test/MockRelOptPlanner.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.ArrayList; import java.util.Collections; diff --git a/testkit/src/main/java/org/apache/calcite/test/MockSqlOperatorTable.java b/testkit/src/main/java/org/apache/calcite/test/MockSqlOperatorTable.java index a2eaae23d2ab..7f73e74b9821 100644 --- a/testkit/src/main/java/org/apache/calcite/test/MockSqlOperatorTable.java +++ b/testkit/src/main/java/org/apache/calcite/test/MockSqlOperatorTable.java @@ -55,7 +55,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.util.List; import java.util.Map; diff --git a/testkit/src/main/java/org/apache/calcite/test/QuidemTest.java b/testkit/src/main/java/org/apache/calcite/test/QuidemTest.java index e9d18930d408..ac21cf102490 100644 --- a/testkit/src/main/java/org/apache/calcite/test/QuidemTest.java +++ b/testkit/src/main/java/org/apache/calcite/test/QuidemTest.java @@ -59,7 +59,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.TestInstance; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; diff --git a/testkit/src/main/java/org/apache/calcite/test/ReflectiveSchemaWithoutRowCount.java b/testkit/src/main/java/org/apache/calcite/test/ReflectiveSchemaWithoutRowCount.java index d87173a87197..2410d194a1b3 100644 --- a/testkit/src/main/java/org/apache/calcite/test/ReflectiveSchemaWithoutRowCount.java +++ b/testkit/src/main/java/org/apache/calcite/test/ReflectiveSchemaWithoutRowCount.java @@ -18,7 +18,7 @@ import org.apache.calcite.adapter.java.ReflectiveSchema; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * A ReflectiveSchema that does not return row count statistics. diff --git a/testkit/src/main/java/org/apache/calcite/test/RelOptFixture.java b/testkit/src/main/java/org/apache/calcite/test/RelOptFixture.java index 68a6111d0629..d65d3f2fb42f 100644 --- a/testkit/src/main/java/org/apache/calcite/test/RelOptFixture.java +++ b/testkit/src/main/java/org/apache/calcite/test/RelOptFixture.java @@ -48,7 +48,7 @@ import com.google.common.collect.ImmutableMap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; diff --git a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorFixtureImpl.java b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorFixtureImpl.java index 0f0ec67344c9..b491d6f7290f 100644 --- a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorFixtureImpl.java +++ b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorFixtureImpl.java @@ -30,8 +30,8 @@ import org.apache.calcite.sql.validate.SqlValidator; import org.apache.calcite.util.JdbcType; -import org.checkerframework.checker.nullness.qual.Nullable; import org.hamcrest.Matcher; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.function.UnaryOperator; diff --git a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorFixtures.java b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorFixtures.java index d6affd622e92..dc703d15afdd 100644 --- a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorFixtures.java +++ b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorFixtures.java @@ -19,7 +19,7 @@ import org.apache.calcite.sql.test.SqlOperatorFixture; import org.apache.calcite.util.DelegatingInvocationHandler; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Proxy; import java.util.regex.Pattern; diff --git a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java index 6082c27638df..fe5c32b7adaa 100644 --- a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java +++ b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java @@ -87,7 +87,7 @@ import com.google.common.base.Throwables; import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; diff --git a/testkit/src/main/java/org/apache/calcite/test/SqlRuntimeTester.java b/testkit/src/main/java/org/apache/calcite/test/SqlRuntimeTester.java index 8c641b3a98ee..e484fbcd99b2 100644 --- a/testkit/src/main/java/org/apache/calcite/test/SqlRuntimeTester.java +++ b/testkit/src/main/java/org/apache/calcite/test/SqlRuntimeTester.java @@ -24,7 +24,7 @@ import org.apache.calcite.sql.test.SqlTests; import org.apache.calcite.sql.validate.SqlValidator; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static org.junit.jupiter.api.Assertions.assertNotNull; diff --git a/testkit/src/main/java/org/apache/calcite/test/SqlToRelFixture.java b/testkit/src/main/java/org/apache/calcite/test/SqlToRelFixture.java index 784cb1eba1dd..a6840f6a2021 100644 --- a/testkit/src/main/java/org/apache/calcite/test/SqlToRelFixture.java +++ b/testkit/src/main/java/org/apache/calcite/test/SqlToRelFixture.java @@ -29,7 +29,7 @@ import org.apache.calcite.test.catalog.MockCatalogReaderExtended; import org.apache.calcite.util.TestUtil; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.function.Predicate; import java.util.function.UnaryOperator; diff --git a/testkit/src/main/java/org/apache/calcite/test/catalog/MockCatalogReader.java b/testkit/src/main/java/org/apache/calcite/test/catalog/MockCatalogReader.java index 87328381fe49..e0e84ae923ee 100644 --- a/testkit/src/main/java/org/apache/calcite/test/catalog/MockCatalogReader.java +++ b/testkit/src/main/java/org/apache/calcite/test/catalog/MockCatalogReader.java @@ -95,7 +95,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.util.AbstractList; diff --git a/testkit/src/main/java/org/apache/calcite/test/catalog/MockCatalogReaderDynamic.java b/testkit/src/main/java/org/apache/calcite/test/catalog/MockCatalogReaderDynamic.java index 5b859e578c80..2a7ef23ae267 100644 --- a/testkit/src/main/java/org/apache/calcite/test/catalog/MockCatalogReaderDynamic.java +++ b/testkit/src/main/java/org/apache/calcite/test/catalog/MockCatalogReaderDynamic.java @@ -23,7 +23,7 @@ import org.apache.calcite.schema.impl.ViewTable; import org.apache.calcite.sql.type.SqlTypeName; -import org.checkerframework.checker.nullness.qual.NonNull; +import org.jspecify.annotations.NonNull; import java.util.Arrays; import java.util.Collections; diff --git a/testkit/src/main/java/org/apache/calcite/test/catalog/MockCatalogReaderExtended.java b/testkit/src/main/java/org/apache/calcite/test/catalog/MockCatalogReaderExtended.java index 3a70e306aedf..fccf51db3e69 100644 --- a/testkit/src/main/java/org/apache/calcite/test/catalog/MockCatalogReaderExtended.java +++ b/testkit/src/main/java/org/apache/calcite/test/catalog/MockCatalogReaderExtended.java @@ -35,7 +35,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.NonNull; +import org.jspecify.annotations.NonNull; import java.util.ArrayList; import java.util.Arrays; diff --git a/testkit/src/main/java/org/apache/calcite/test/catalog/MockCatalogReaderSimple.java b/testkit/src/main/java/org/apache/calcite/test/catalog/MockCatalogReaderSimple.java index 1f7be1141091..e464c3855c5c 100644 --- a/testkit/src/main/java/org/apache/calcite/test/catalog/MockCatalogReaderSimple.java +++ b/testkit/src/main/java/org/apache/calcite/test/catalog/MockCatalogReaderSimple.java @@ -35,7 +35,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.NonNull; +import org.jspecify.annotations.NonNull; import java.math.BigDecimal; import java.util.Arrays; diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/bookstore/BookstoreSchema.java b/testkit/src/main/java/org/apache/calcite/test/schemata/bookstore/BookstoreSchema.java index 84c334c48bdd..55e8fd3c1ae4 100644 --- a/testkit/src/main/java/org/apache/calcite/test/schemata/bookstore/BookstoreSchema.java +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/bookstore/BookstoreSchema.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.test.schemata.bookstore; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.Arrays; diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/catchall/CatchallSchema.java b/testkit/src/main/java/org/apache/calcite/test/schemata/catchall/CatchallSchema.java index df1c8dbb9a4d..2aad0b3c4b8c 100644 --- a/testkit/src/main/java/org/apache/calcite/test/schemata/catchall/CatchallSchema.java +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/catchall/CatchallSchema.java @@ -23,7 +23,7 @@ import org.apache.calcite.test.schemata.hr.Employee; import org.apache.calcite.test.schemata.hr.HrSchema; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Field; import java.math.BigDecimal; diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/countries/CountriesTableFunction.java b/testkit/src/main/java/org/apache/calcite/test/schemata/countries/CountriesTableFunction.java index a918a69a5d6c..4a5a945590a2 100644 --- a/testkit/src/main/java/org/apache/calcite/test/schemata/countries/CountriesTableFunction.java +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/countries/CountriesTableFunction.java @@ -33,7 +33,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** A table function that returns all countries in the world. * diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/countries/StatesTableFunction.java b/testkit/src/main/java/org/apache/calcite/test/schemata/countries/StatesTableFunction.java index 69e6e95a7a6f..3c30cc876966 100644 --- a/testkit/src/main/java/org/apache/calcite/test/schemata/countries/StatesTableFunction.java +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/countries/StatesTableFunction.java @@ -33,7 +33,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** A table function that returns states and their boundaries; also national * parks. diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/foodmart/FoodmartSchema.java b/testkit/src/main/java/org/apache/calcite/test/schemata/foodmart/FoodmartSchema.java index 9c818709c581..4ff4ef972a7f 100644 --- a/testkit/src/main/java/org/apache/calcite/test/schemata/foodmart/FoodmartSchema.java +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/foodmart/FoodmartSchema.java @@ -18,7 +18,7 @@ import org.apache.calcite.test.CalciteAssert; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Objects; diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/hr/Department.java b/testkit/src/main/java/org/apache/calcite/test/schemata/hr/Department.java index a3bdc6002bef..f1a7cf47d2ef 100644 --- a/testkit/src/main/java/org/apache/calcite/test/schemata/hr/Department.java +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/hr/Department.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.test.schemata.hr; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Objects; diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/hr/DepartmentPlus.java b/testkit/src/main/java/org/apache/calcite/test/schemata/hr/DepartmentPlus.java index f93b3916dc78..83e968306b0e 100644 --- a/testkit/src/main/java/org/apache/calcite/test/schemata/hr/DepartmentPlus.java +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/hr/DepartmentPlus.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.test.schemata.hr; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.sql.Timestamp; import java.util.List; diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/hr/Employee.java b/testkit/src/main/java/org/apache/calcite/test/schemata/hr/Employee.java index 24864e810908..c3e045df4fc9 100644 --- a/testkit/src/main/java/org/apache/calcite/test/schemata/hr/Employee.java +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/hr/Employee.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.test.schemata.hr; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Objects; diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/hr/Event.java b/testkit/src/main/java/org/apache/calcite/test/schemata/hr/Event.java index 31cf4c616e48..269125a83a7f 100644 --- a/testkit/src/main/java/org/apache/calcite/test/schemata/hr/Event.java +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/hr/Event.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.test.schemata.hr; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.sql.Timestamp; import java.util.Objects; diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/hr/NullableTest.java b/testkit/src/main/java/org/apache/calcite/test/schemata/hr/NullableTest.java index baec4d397cfc..d6b87b97f63e 100644 --- a/testkit/src/main/java/org/apache/calcite/test/schemata/hr/NullableTest.java +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/hr/NullableTest.java @@ -16,7 +16,7 @@ */ package org.apache.calcite.test.schemata.hr; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Objects; diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/BaseOrderStreamTable.java b/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/BaseOrderStreamTable.java index c07f8e4e95d2..94e5b84fbb5e 100644 --- a/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/BaseOrderStreamTable.java +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/BaseOrderStreamTable.java @@ -31,7 +31,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Base table for the Orders table. Manages the base schema used for the test tables and common diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/InfiniteOrdersStreamTableFactory.java b/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/InfiniteOrdersStreamTableFactory.java index 4686a0500b15..20f7db39e768 100644 --- a/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/InfiniteOrdersStreamTableFactory.java +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/InfiniteOrdersStreamTableFactory.java @@ -21,7 +21,7 @@ import org.apache.calcite.schema.Table; import org.apache.calcite.schema.TableFactory; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Map; diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/InfiniteOrdersTable.java b/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/InfiniteOrdersTable.java index 2917c04f34e1..0c01004a2d48 100644 --- a/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/InfiniteOrdersTable.java +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/InfiniteOrdersTable.java @@ -22,7 +22,7 @@ import org.apache.calcite.schema.StreamableTable; import org.apache.calcite.schema.Table; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Iterator; diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/OrdersHistoryTable.java b/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/OrdersHistoryTable.java index c5c5e92ce9f5..dca1a92a5825 100644 --- a/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/OrdersHistoryTable.java +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/OrdersHistoryTable.java @@ -22,7 +22,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** Table representing the history of the ORDERS stream. */ public class OrdersHistoryTable extends BaseOrderStreamTable { diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/OrdersStreamTableFactory.java b/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/OrdersStreamTableFactory.java index b8d6202b53db..e305ef0a88d8 100644 --- a/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/OrdersStreamTableFactory.java +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/OrdersStreamTableFactory.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.Map; diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/OrdersTable.java b/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/OrdersTable.java index cf1c0e2aa700..36bafa2b990d 100644 --- a/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/OrdersTable.java +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/OrdersTable.java @@ -27,7 +27,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Table representing the ORDERS stream. diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/ProductsTable.java b/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/ProductsTable.java index a0c3dec42433..b2ef4d259709 100644 --- a/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/ProductsTable.java +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/ProductsTable.java @@ -33,7 +33,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Table representing the PRODUCTS relation. diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/ProductsTableFactory.java b/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/ProductsTableFactory.java index d306fc4f61b8..f3005cd8cf9d 100644 --- a/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/ProductsTableFactory.java +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/ProductsTableFactory.java @@ -23,7 +23,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Map; diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/ProductsTemporalTable.java b/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/ProductsTemporalTable.java index 92a7d6e7e45b..42fd5656e54b 100644 --- a/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/ProductsTemporalTable.java +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/ProductsTemporalTable.java @@ -30,7 +30,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Table representing the PRODUCTS_TEMPORAL temporal table. diff --git a/testkit/src/main/java/org/apache/calcite/util/Smalls.java b/testkit/src/main/java/org/apache/calcite/util/Smalls.java index 0184a0f1681a..20e210c7bb22 100644 --- a/testkit/src/main/java/org/apache/calcite/util/Smalls.java +++ b/testkit/src/main/java/org/apache/calcite/util/Smalls.java @@ -65,7 +65,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.IOException; import java.lang.reflect.Method;